假设每当视图的宽度或高度发生变化时,我都需要做。当不使用autoLayout时,可以通过实现layoutSubviews
来实现。但是我发现使用autoLayout时并不总是调用此函数。
现在,我正在使用以下代码,其中某些内容可能会导致视图框架发生更改:[self setNeedsLayout];
[self layoutIfNeeded];
并做我必须在layoutSubviews
中做的事情。但是我想知道这是否是最好的方法。有没有更简单的解决方案,例如我可以使用的回调函数?
最佳答案
您不必一次调用两个方法。调用setNeedsLayout
可以安排视图在下一次布局运行时进行布局,您不知道何时会发生这种情况。
另一方面,layoutIfNeeded
立即布局视图及其所有子视图。然后,应为层次结构中的所有视图(从您调用layoutSubviews
的视图开始)调用layoutIfNeeded
。
如果更改了约束并需要更新视图,则应该在动画块中调用layoutIfNeeded,以使视图不会“跳转”,使用类似的方法
// Update constraints ...
[UIView animateWithDuration:0.3 animations:^{
[view layoutIfNeeded];
}];
如果您没有“手动”更改框架(即使用
setFrame:
),而仅通过约束条件更新视图,那么您将调用layoutIfNeeded
,每次都应调用layoutSubviews
。如果您确实使用
setFrame:
,而在使用自动布局时则不应该这样做,那么您可以尝试使用观察者。