UIScrollView 中的 UIStackView 不滚动
UIStackView in UIScrollView not scrolling
我在 UIScrollView
中实现 UIStackView
时遇到了一些麻烦。
我的视图层次结构如下所示:
┌─────────────────────────────┐
│ViewController │
│┌───────────────────────────┐│
││Spacer UIView ││
│└───────────────────────────┘│
│┌───────────────────────────┐│
││ UIScrollView ││
││┌─────────────────────────┐││
│││UIStackView │││
│││ │││
│││ │││
││└─────────────────────────┘││
│└───────────────────────────┘│
│┌───────────────────────────┐│
││Spacer UIView ││
│└───────────────────────────┘│
│┌───────────────────────────┐│
││UIView with other content ││
││height: 300 ││
│└───────────────────────────┘│
└─────────────────────────────┘
我有 spacer 个视图,以便内容垂直居中,如果它比屏幕的整个高度短。我按如下方式布置 NSLayoutConstraints
V:|-[spacer1]-[scrollview]-[spacer2(==spacer1)]-[footerView]-|
UIStackView 填充了 UIViews
,每个高度为 50(基本上是 table 行)。
到目前为止一切顺利。一旦我的堆栈视图的行数超过 "room",我就会收到源源不断的错误消息,指出必须打破约束(单个行的高度)。
错误消息不断地来回出现新的对象内存 ID——它基本上永远不会完成。
我假设我的滚动视图的内容高度设置不正确。
在我的 viewDidLoad
中,我设置了 spacer 和滚动视图:
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
在从另一个 class 调用的另一个方法中,我然后将 UIViews
添加到 UIStackView
,只需添加它们,例如: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
。但这也没有用。
我还尝试先将行添加到堆栈视图,然后将堆栈视图添加到滚动视图。这样堆栈视图应该知道它的大小要求,但这也不起作用。
如前所述,只要行的总高度小于可能的 space,此方法就可以正常工作。只要我再添加一行或在屏幕尺寸较小的设备上执行应用程序,我就会得到 Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x600000b29fe0 MyApp.RowView:0x7fc571e840f0.height == 50 (active)>
.
基本上 UIScrollView
的滚动功能不适用于我的堆栈视图。我怎样才能强制滚动视图重新计算其内容的需要高度。
我错过了什么或做错了什么?
谢谢
要解决此问题,stackView 高度必须是动态的。尝试设置height constraint priority为750,subviews布局后,一切正常
我在 UIScrollView
中实现 UIStackView
时遇到了一些麻烦。
我的视图层次结构如下所示:
┌─────────────────────────────┐
│ViewController │
│┌───────────────────────────┐│
││Spacer UIView ││
│└───────────────────────────┘│
│┌───────────────────────────┐│
││ UIScrollView ││
││┌─────────────────────────┐││
│││UIStackView │││
│││ │││
│││ │││
││└─────────────────────────┘││
│└───────────────────────────┘│
│┌───────────────────────────┐│
││Spacer UIView ││
│└───────────────────────────┘│
│┌───────────────────────────┐│
││UIView with other content ││
││height: 300 ││
│└───────────────────────────┘│
└─────────────────────────────┘
我有 spacer 个视图,以便内容垂直居中,如果它比屏幕的整个高度短。我按如下方式布置 NSLayoutConstraints
V:|-[spacer1]-[scrollview]-[spacer2(==spacer1)]-[footerView]-|
UIStackView 填充了 UIViews
,每个高度为 50(基本上是 table 行)。
到目前为止一切顺利。一旦我的堆栈视图的行数超过 "room",我就会收到源源不断的错误消息,指出必须打破约束(单个行的高度)。 错误消息不断地来回出现新的对象内存 ID——它基本上永远不会完成。 我假设我的滚动视图的内容高度设置不正确。
在我的 viewDidLoad
中,我设置了 spacer 和滚动视图:
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
在从另一个 class 调用的另一个方法中,我然后将 UIViews
添加到 UIStackView
,只需添加它们,例如: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
。但这也没有用。
我还尝试先将行添加到堆栈视图,然后将堆栈视图添加到滚动视图。这样堆栈视图应该知道它的大小要求,但这也不起作用。
如前所述,只要行的总高度小于可能的 space,此方法就可以正常工作。只要我再添加一行或在屏幕尺寸较小的设备上执行应用程序,我就会得到 Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x600000b29fe0 MyApp.RowView:0x7fc571e840f0.height == 50 (active)>
.
基本上 UIScrollView
的滚动功能不适用于我的堆栈视图。我怎样才能强制滚动视图重新计算其内容的需要高度。
我错过了什么或做错了什么?
谢谢
要解决此问题,stackView 高度必须是动态的。尝试设置height constraint priority为750,subviews布局后,一切正常