【问题标题】:Updating AutoLayout Constraints When UIView Height Changes当 UIView 高度改变时更新 AutoLayout 约束
【发布时间】:2019-10-12 10:50:31
【问题描述】:

我目前有一个 UIView(我们称之为 viewB)添加到父 UIScrollView,我们称之为 scrollView。这按预期运行,viewB 像这样添加;

viewB.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
viewB.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
viewB.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
viewB.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true

viewBscrollView 高,因此可以垂直滚动。

在我的应用程序的某个时刻,用户可能会点击一个按钮,这会向viewB 添加更多内容,从而改变viewB 的高度。在该按钮点击时,scrollView 似乎不知道要更新其任何约束,而viewB 最终会改变位置并且不会按预期显示。

我会调用哪些方法(以及在哪些视图上)强制 AutoLayout 告诉 scrollView viewB 已更改大小?还是从scrollView 中删除viewB 然后重新添加新的约束会更有效?

【问题讨论】:

  • 滚动视图会自行处理内容大小的变化,所以我不会专注于此。 IMO,自定义视图应负责其大小。您是在自定义视图中添加额外的子视图还是扩展现有的子视图?
  • 在定义其高度的更新之前和之后,您对 viewB 有哪些限制?
  • viewB 有许多子视图,每个子视图都有一个定义的高度常数(其中最低的也固定到 viewB 的底部锚点)。所有这些功能正常,直到我改变viewB,通过在其最低子视图的底部添加一个新的子视图,更新bottomAnchor约束,并在其父级中调用self.view.layoutIfNeeded(),此时它的位置完全改变(它似乎正在失去它的 topAnchor)。

标签: ios swift uiscrollview autolayout


【解决方案1】:

滚动视图内的视图内的子视图应随时从上到下正确挂钩,因此当您向 viewB 添加新子视图时,您需要将其正确插入该链中然后调用

self.view.layoutIfNeeded()

如果你将它添加到底部,那么你应该使用 viewB 删除大多数底部子视图的底部约束并将其挂钩到新视图的顶部并将新的子视图的底部重新挂钩到 viewB 的底部加上高度和宽度 & x 约束最终再次刷新布局,这是一个乏味的问题,因此您要么使用它,要么使用此提示

提示:您可以使用 UITableView 或将 viewB 替换为具有轻松删除/添加/插入功能的 UIStackView,而不是使用 UIScrollView 手动管理约束

【讨论】:

  • 我会在我的子视图 (viewB) 还是在我的父视图 scrollview 中调用 self.view.layoutIfNeeded()?在采纳您的建议后,我在父视图 (scrollView) 中进行了尝试(删除 viewB 的最低子视图的底部锚点,添加我的新视图,连接相关约束),但行为没有改变。
  • 我假设 scrollView 在 vc 中,所以 view 是 vc 的主视图(scrollView 的父视图),你能分享一下你做了什么
猜你喜欢
  • 1970-01-01
  • 2019-10-11
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 2015-04-02
  • 1970-01-01
  • 2018-06-15
相关资源
最近更新 更多