Ios 当UIView高度更改时更新自动布局约束

Ios 当UIView高度更改时更新自动布局约束,ios,swift,uiscrollview,autolayout,Ios,Swift,Uiscrollview,Autolayout,我目前有一个UIView(我们称之为viewB)添加到父UIScrollView,我们称之为scrollView。这与预期的一样,添加了viewB viewB.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true viewB.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true viewB.trailingAnchor

我目前有一个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
viewB
scrollView
高,因此它可以垂直滚动

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


我将调用什么方法(以及在哪些视图上)来强制AutoLayout告诉
scrollView
viewB
大小已更改?或者从
scrollView
中删除
viewB
,然后使用新约束重新添加会更有效吗?

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

self.view.layoutIfNeeded()
如果在e.x中,将其添加到底部,则应使用viewB删除大多数底部子视图的底部约束,并将其挂接到新视图的顶部,然后将该新子视图的底部重新挂接到viewB的底部,再加上给定高度和宽度&x约束,最后再次刷新布局,这是一个繁琐的问题,因此您要么使用它,要么使用此选项小费

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


滚动视图将自行处理内容大小的更改,因此我不会重点讨论这个问题。在IMO中,自定义视图应负责其大小调整。您是向自定义视图添加其他子视图还是扩展现有子视图?在定义其高度的更新之前和之后,您对viewB有哪些约束?
viewB
有许多子视图,每个子视图都有一个定义的高度常量(其中最低的一个也固定在
viewB
的底部锚定上)。所有这些功能都正常工作,直到我更改
viewB
,方法是在其最低子视图的底部添加一个新的子视图,更新bottomAnchor约束,并在其父视图中调用
self.view.layoutifneedd()
,此时它的位置完全改变(似乎失去了它的顶部锚定)。我是在我的子视图(
viewB
)中调用self.view.layoutifneed(),还是在我的父视图
scrollview
?在采纳了您的建议(删除
viewB
的最低子视图的底部锚点,添加我的新视图,连接相关约束)后,我尝试了父视图(
scrollView
),但行为没有改变。我假设scrollView在vc中,因此视图是vc的主视图(scrollView的父视图),你能分享你所做的吗