假设我需要做某事每当 View 的宽度或高度发生变化。当不使用 autoLayout 时,我可以通过实现 layoutSubviews
来做到这一点.但是我发现在使用 autoLayout 时并不总是调用这个函数。
现在,我正在使用以下代码,其中某些东西可能会导致 View 的框架发生变化:
[self setNeedsLayout];
[self layoutIfNeeded];
做我必须做的
layoutSubviews
.但我想知道这是否是最好的方法。有没有更简单的解决方案,例如我可以使用的回调函数?
最佳答案
您不必同时调用这两种方法。调用setNeedsLayout
安排 View 在下一次布局运行时进行布局,您不知道什么时候会发生。
另一方面,layoutIfNeeded
立即布局 View 及其所有 subview 。然后layoutSubviews
应该为层次结构中的所有 View 调用 layoutIfNeeded
.
如果您更改了约束并且需要更新您的 View ,您应该在动画 block 中调用 layoutIfNeeded,以便 View 不会“跳转”,使用类似这样的东西
// Update constraints ...
[UIView animateWithDuration:0.3 animations:^{
[view layoutIfNeeded];
}];
如果您不“手动”更改框架(意味着使用
setFrame:
)并且仅通过约束更新您的 View ,之后您调用 layoutIfNeeded
, layoutSubviews
每次都应该调用。如果你使用
setFrame:
,如果您使用自动布局,则不应该这样做,那么您可以尝试使用观察者。
关于ios - UIView的frame改变时有回调函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28760471/