【问题标题】:Understanding UIView Height When Constraints Are Set with AutoLayout/UIScrollView了解使用 AutoLayout/UIScrollView 设置约束时的 UIView 高度
【发布时间】:2019-10-11 22:03:59
【问题描述】:

我希望 有所帮助,但我正试图围绕一个概念展开思考。我有一个 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 的高度,即使没有设置底部锚点,但无法弄清楚正确的代码。

【问题讨论】:

标签: ios swift uiscrollview autolayout


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的评论 1,已在帖子中修复了该问题,这是我的错字。关于评论 3;如果viewB 中的最低子视图(在我的情况下,Subview4)具有固定高度,我如何将其挂接到其底部锚点。如果 Subview4 有subview4.heightAnchor.constraint(equalToConstant: 1200.0).isActive = true,在将它添加到 viewB 时我是否也要设置一个subview4.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive=true
  • 这就像一条链 subviews1 的顶部约束到 viewB 的顶部,然后 subview1 的底部到 subview2 的顶部,依此类推,直到最后一个子视图的底部到底部viewB
  • 谢谢,但是如果 subview4 也有高度,我如何将 subview4 的底部固定到 viewB 的底部?我可以同时设置两个约束吗?
  • 当然,您必须同时设置两者,高度为视图提供了它的内容,但底部使主视图B知道它是所有子视图的累积高度,这就是滚动发生的方式
  • 这解决了我的问题。谢谢你的澄清。设置viewB 的最底部子视图的bottomAnchor,即使它的高度不变,也允许这项工作。如果viewB 的高度在任何时候发生变化,我将发布一个关于如何更新viewA 的后续问题。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-10-12
    • 2013-12-11
    • 1970-01-01
    • 2015-04-02
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多