繁体   English   中英

UIScrollView 中的 UIStackView 不滚动

[英]UIStackView in UIScrollView not scrolling

我在UIScrollView实现UIStackView时遇到了一些麻烦。 我的视图层次结构如下所示:

 ┌─────────────────────────────┐
 │ViewController               │
 │┌───────────────────────────┐│
 ││Spacer UIView              ││
 │└───────────────────────────┘│
 │┌───────────────────────────┐│
 ││ UIScrollView              ││
 ││┌─────────────────────────┐││
 │││UIStackView              │││
 │││                         │││
 │││                         │││
 ││└─────────────────────────┘││
 │└───────────────────────────┘│
 │┌───────────────────────────┐│
 ││Spacer UIView              ││
 │└───────────────────────────┘│
 │┌───────────────────────────┐│
 ││UIView with other content  ││
 ││height: 300                ││
 │└───────────────────────────┘│
 └─────────────────────────────┘

我有间隔视图,以便内容垂直居中,如果它短于屏幕的整个高度。 我将NSLayoutConstraints布局如下V:|-[spacer1]-[scrollview]-[spacer2(==spacer1)]-[footerView]-|

该UIStackView GET充满了UIViews每50的高度(基本上与行的表)。

到现在为止还挺好。 一旦我的堆栈视图的行数超过“房间”,我就会收到一连串无休止的错误消息,指出必须打破约束(单行的高度)。 错误消息会随着不断新的对象内存 id 不断来回传递 - 它基本上永远不会完成。 我假设我的滚动视图的内容高度没有正确设置。

在我的viewDidLoad我设置了垫片和滚动视图:

let spacer1 = UIView()
spacer1.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(spacerView1)
spacerView1.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive = true

let scroll = UIScrollView()
scroll.translatesAutoresizingMaskIntoConstraints = false
scroll.showsHorizontalScrollIndicator = false
self.view.addSubview(scroll)
scroll.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive = true

let stack = UIStackView()
stack.axis = .vertical
stack.translatesAutoresizingMaskIntoConstraints = false
stack.alignment = .center
stack.spacing = 2
stack.distribution = .equalSpacing
scroll.addSubview(stack)
stack.topAnchor.constraint(equalTo: scroll.topAnchor).isActive = true
stack.leftAnchor.constraint(equalTo: scroll.leftAnchor).isActive = true
stack.rightAnchor.constraint(equalTo: scroll.rightAnchor).isActive = true
stack.bottomAnchor.constraint(equalTo: scroll.bottomAnchor).isActive = true
stack.widthAnchor.constraint(equalTo: scroll.widthAnchor).isActive = true
stack.heightAnchor.constraint(equalTo: scroll.heightAnchor).isActive = true

在从另一个类调用另一方法中,我然后添加UIViewsUIStackView :简单地将其添加像stack.addArrangedSubview(rowView)

将 UIView 添加到堆栈视图后,我调整滚动视图的大小

extension UIScrollView {
    func resizeScrollViewContentSize() {
        var contentRect = CGRect.zero
        for view in self.subviews {
            contentRect = contentRect.union(view.frame)
        }
        self.contentSize = contentRect.size
    }
}

这给出了约束破坏错误。

如果我删除堆栈视图的高度约束,那么它会折叠并且调试视图层次结构告诉我 UIStackView 的高度和垂直位置不明确。 一旦所有行都添加到堆栈视图中,我还尝试简单地设置scroll.contentSize = stack.frame.size 但这也不起作用。 我还尝试先将行添加到堆栈视图,然后将堆栈视图添加到滚动视图。 这样堆栈视图应该知道它的大小要求,但这也不起作用。

如前所述,只要行的总高度小于可能的空间,就可以正常工作。 一旦我再添加一行或在屏幕尺寸较小的设备上执行应用程序,我Will attempt to recover by breaking constraint <NSLayoutConstraint:0x600000b29fe0 MyApp.RowView:0x7fc571e840f0.height == 50 (active)>

基本上UIScrollView的滚动功能不适用于我的堆栈视图。 如何强制滚动视图重新计算其内容所需的高度。

我错过了什么或做错了什么?

谢谢

为了解决这个问题,stackView 高度必须是动态的。 尝试将高度约束优先级设置为 750,子视图布局后,一切正常

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM