使用 AutoLayout/UIScrollView 设置约束时了解 UIView 高度

Understanding UIView Height When Constraints Are Set with AutoLayout/UIScrollView

我希望这 能有所帮助,但我正在努力思考一个概念。我有一个 UIScrollView,添加到我的 ViewController 中的 self.view,其顶部、前导、尾随和底部边缘固定到 self.view 的边缘。这是 viewA.

我有第二个 UIView,viewB,有几个子视图。这些子视图中的每一个都使用 AutoLayout 添加到 viewB,为了简洁起见,每个子视图都有一个高度约束设置为一个值。

我想将 viewB 添加到 viewAviewA 可以垂直滚动。由于 viewB 无疑比 viewA 高,它应该滚动。

我正在这样添加viewB

viewB.topAnchor.constraint(equalTo: viewA.topAnchor).isActive = true
viewB.leadingAnchor.constraint(equalTo: viewA.leadingAnchor).isActive = true
viewB.trailingAnchor.cosntraint(equalTo: viewA.trailingAnchor).isActive = true

这就是我卡住的地方。如果我设置底部锚点 (viewB.bottomAnchor.constraint(equalTo: viewA.bottomAnchor).isActive = true),我的 UIScrollView 不会滚动,并且 viewB 被明显截断。

如果我为 viewB 设置随机高度(使用 viewB.heightAnchor.constraint(equalToConstant: 2000.0).isActive = true),UIScrollView 会滚动,尽管这个常量太高了。

我很困惑如何为 viewB 获得合适的高度。由于 viewB 确实有一个实际高度(带有硬编码的子视图),我认为 AutoLayout 没有理由不能计算 viewB 的高度,即使没有设置底部锚点,但可以'找出正确的代码。

1- 您需要将 viewB 的前导、尾随、顶部和底部挂接到 viewA ,加上 viewB 的宽度设置 = main vc 视图的宽度

2- viewB 中的所有约束都应该从上到下正确挂钩

3- 而不是重复使用 .isActive = true 考虑将所有约束包装在 NSLayoutConstraint.activate([<#ConstraintsHere#>])

4- 可能对于您当前的方法 UITableView 更合适

如果高度约束完成,就不用考虑viewA的contentSize了。 你不需要使用ViewB,子视图添加到viewA,subview1的顶部等于viewA的顶部,设置subview1的高度,subview1的底部等于subview2的顶部或偏移一些高度。等等。直到最后一个subview,subview4的bottom等于viewA的bottom。无需设置内容高度,即可获得合适的内容大小。