如何在初始化期间正确设置子视图约束?

时间:2019-05-20 15:19:42

标签: swift layout uiview constraints

我知道如何设置约束,但是我真的需要知道如何正确设置约束。

基本上,我有一个自定义的视图子类,它继承了UIView,我需要指定约束,例如,标签必须始终在按钮上方10pts。

这样的约束,该在哪里设置?现在,我在listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, final View view, int position, long id) { Object item = adapter.getItem(position); } }); 函数中设置约束,在指定约束后我在其中调用init。但是我也读过您应该在layoutIfNeeded中设置约束,但是我再次在某个地方阅读了它,layoutSubviews将被调用很多次,因此在此处设置约束真的没有意义。

我还玩了一点layoutsubviews,我意识到我在layoutsubviews中设置的约束实际上对布局没有任何影响。到目前为止,我仅通过直接调用layoutIfNeeded成功设置了约束。

我也很好奇,是否只需要设置约束一次或每次刷新?

我这样做正确吗?在自定义类中应该在哪里设置约束?

1 个答案:

答案 0 :(得分:0)

每次刷新时设置约束(例如在LayoutSubviews内部)将破坏约束并导致大量不必要的工作。 WWDC上有很多关于高性能自动布局的话题。

https://developer.apple.com/videos/play/wwdc2018/220

但是,通常使用Interface Builder可以使您摆脱自己;也就是说,系统将在View生命周期的适当时间处理添加的约束。

如果必须以编程方式添加约束,则将它们添加到初始化程序中并调用layoutIfNeeded()是一个很好的解决方案。

相关问题