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

时间:2019-05-25 17:42:04

标签: ios swift uiscrollview autolayout

我希望这个this graphic会有所帮助,但我正在尝试围绕一个概念。我有一个UIScrollView,它已添加到ViewController的self.view中,并且其上边缘,前边缘,后边缘和下边缘固定到self.view的边缘。这是viewA

我有第二个UIView viewB,其中包含几个子视图。这些子视图中的每个子视图都通过AutoLayout添加到viewB中,为简便起见,这些子视图中的每个子视图都将高度限制设置为一个值。

我想将viewB添加到viewA,并使viewA能够垂直滚动。由于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的高度,但是可以找不到正确的代码。

2 个答案:

答案 0 :(得分:1)

1-您需要将viewB的前导,尾随,顶部和底部连接到viewA,并将viewB的宽度设置为=主vc视图的宽度

2-应该将ViewB内部的所有约束从上到下正确挂钩

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

4-可能是您当前使用的方法,UITableView更合适

答案 1 :(得分:1)

如果高度限制已完成,则不必考虑viewA的contentSize。 您不需要使用ViewB,子视图添加到viewA,subview1的顶部equalTo到viewA的顶部,设置subview1的高度,subview1的底部equalTo到subview2的顶部,或偏移一些Height。等等。直到最后一个子视图,subview4的底部等于viewA的底部。您无需设置内容的高度即可获得合适的内容大小。