【问题标题】:UIStackView programmatically filled with UIViews doesn't scroll inside UIScrollView以编程方式填充 UIViews 的 UIStackView 不会在 UIScrollView 内滚动
【发布时间】:2019-07-02 19:55:47
【问题描述】:

我仍然是 SO 和 Swift 新手,所以请耐心等待 :-)

我有一个UIViewController

在这个viewcontroller 里面有一个UIScrollView

UIScrollView 内部有一个UIStackView(与AutoLayout 固定在0,0,0,0 并垂直和水平居中),带有水平轴。

我的目标是将子视图添加到 stackview 并使滚动视图水平滚动。

所以,我做了以下事情:

import UIKit

    class ViewController: UIViewController, UIScrollViewDelegate {

        @IBOutlet weak var scroller: UIScrollView!
        @IBOutlet weak var stack: UIStackView!

        override func viewDidLoad() {

            super.viewDidLoad()
            scroller.delegate = self

            for i in 0..<10 {

                let customView = UIView(frame: CGRect(x: 0, y: 0, width: 240, height: 128))
                // .random is unimportant here
                customView.backgroundColor = .random()
                stack.addArrangedSubview(customView)

            }

        }

        override func viewDidLayoutSubviews(){
            self.scroller.contentSize = CGSize(width:2400,height:128)
            print(self.scroller.contentSize) // 2400
            print(self.stack.subviews)
        }

        func scrollViewDidScroll(_ scrollView: UIScrollView) {
            print("scrollin'")
        }


    }

问题是我必须缺少一些东西,因为滚动视图根本不滚动。我只看到一个视图(当然,任何时候都有不同的颜色)。

我确定视图已加载,因为这是第二个打印输出:

[<UIView: 0x159e01a10; frame = (0 0; 240 128); layer = <CALayer: 0x28115d7a0>>, <UIView: 0x159e03f10; frame = (0 0; 240 128); layer = <CALayer: 0x28115d800>>, <UIView: 0x159e046d0; frame = (0 0; 240 128); layer = <CALayer: 0x28115d960>>, <UIView: 0x159e0e410; frame = (0 0; 240 128); layer = <CALayer: 0x28115da80>>, <UIView: 0x159e0e7c0; frame = (0 0; 240 128); layer = <CALayer: 0x28115db20>>, <UIView: 0x159e0e9a0; frame = (0 0; 240 128); layer = <CALayer: 0x28115da60>>, <UIView: 0x159e0eb80; frame = (0 0; 240 128); layer = <CALayer: 0x28115dbe0>>, <UIView: 0x159e0ed60; frame = (0 0; 240 128); layer = <CALayer: 0x28115dc80>>, <UIView: 0x159e0ef40; frame = (0 0; 240 128); layer = <CALayer: 0x28115dd20>>, <UIView: 0x159e0f120; frame = (0 0; 240 128); layer = <CALayer: 0x28115ddc0>>]

那么,到底发生了什么?为什么滚动视图不滚动?

【问题讨论】:

  • @matt:我能问你为什么删除你的答案吗?

标签: ios swift uiview uiscrollview


【解决方案1】:

试试这个代码,希望对你有帮助。

override func viewDidLoad() {

    super.viewDidLoad()
    scroller.delegate = self

        for i in 0..<10 {
            let xPosition = 240 * CGFloat(i)
            let customView = UIView(frame: CGRect(x: xPosition, y: 0, width: 240, height: 128))
            // .random is unimportant here
            customView.backgroundColor = .random()
            scroller.addSubview(customView)
        }
    scroller.contentSize.width = 2400
}

【讨论】:

  • 我在viewDidLayoutSubviews中设置了contentSize:不行吗?
  • 我不是那个投反对票的人!我来到这里,发现两个反对票和一个答案被删除。如果可以,我会支持您的回答
【解决方案2】:

替换这个

  let customView = UIView(frame: CGRect(x: 0, y: 0, width: 240, height: 128))

let customView = UIView(frame: CGRect(x: CGFloat( i * 240 ) , y: 0, width: 240, height: 128))

我认为不需要 stackView ,并且

scroller.addSubview(customView)

看看这个Scroller

【讨论】:

  • 这是我的第一次尝试,但没有成功(我确认它不起作用)
  • 不要错过super.viewDidLayoutSubviews() 你对IB中的滚动视图有什么限制?
  • 你是对的 viewDidLayoutSubviews。 IB中scrollview的约束:垂直和水平居中,width=240,height=128(同单个子视图)
  • @Planemo 查看演示
  • 我不是那个投反对票的人!我投赞成票(如果可以,目前看来我不能),因为我不喜欢那些真正想帮助别人的人投反对票
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 2021-05-31
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多