ios - UIScrollView 中的 UIStackView 不滚动

标签 ios swift uiscrollview nslayoutconstraint uistackview

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

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

我有间隔 View ,如果内容比屏幕的整个高度短,则内容会垂直居中。我布局 NSLayoutConstraints如下 V:|-[spacer1]-[scrollview]-[spacer2(==spacer1)]-[footerView]-|

UIStackView 得到了 UIViews每个高度为 50(基本上是一个有行的表格)。

到目前为止一切顺利。一旦我的堆栈 View 的行数多于“房间”,我就会收到源源不断的错误消息,指出必须打破约束(单个行的高度)。 错误消息不断地来回出现新的对象内存 ID——它基本上永远不会完成。 我假设我的 ScrollView 的内容高度设置不正确。

在我的 viewDidLoad我这样设置了 spacer 和 scrollview:

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 添加到堆栈 View 后,我使用

调整 ScrollView 的大小
extension UIScrollView {
    func resizeScrollViewContentSize() {
        var contentRect = CGRect.zero
        for view in self.subviews {
            contentRect = contentRect.union(view.frame)
        }
        self.contentSize = contentRect.size
    }
}

它给出了约束破坏错误。

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

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

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

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

谢谢

最佳答案

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

关于ios - UIScrollView 中的 UIStackView 不滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57197545/

相关文章:

ios - NSSortDescriptor 评估升序数字(Swift)

ios - 更改 Storyboard中拖动的导航栏的标题

iphone - 如何将录制的视频保存到相册?

objective-c - 核心数据未正确重置数据库

swift - 如何在 UISearchBar 中搜索结果?

ios - 显示和滚动比屏幕长的 UIImageView(图像)

ios - 从 AFImageRequestOperation 随机返回的照片

ios - 我需要知道 firebase 观察何时完全完成

iphone - 如果您的 UIScrollView 已经处于该缩放级别,zoomToRect 不会执行任何操作

ios - 使用 CGAffineTransform 将 UILabel 字体大小减小到精确点