UIView的frame变化时有回调函数吗?
Is there a callback function when UIView's frame change?
假设我需要在每当视图的宽度或高度发生变化时做一些事情。当不使用 autoLayout 时,我可以通过实现 layoutSubviews
来做到这一点。但是我发现这个函数在使用autoLayout的时候并不总是被调用。
现在,我正在使用以下代码,其中某些内容可能会导致视图的框架发生变化:
[self setNeedsLayout];
[self layoutIfNeeded];
然后做我在 layoutSubviews
必须做的事。但我想知道这是否是最好的方法。有没有更简单的解决方案,例如我可以使用的回调函数?
我认为您应该检查 viewDidLayoutSubviews
是否有回调。 Apple 的文档说
Called to notify the view controller that its view has just laid out
its subviews.
编码愉快!
Z.
更新:
我之前回答错问题了! :)
对于 UIView
,您可以覆盖 bounds
' setter setBounds
(不是 frame
/setFrame
,这是从 bounds
派生的值),并且您会在其中收到任何大小更改的通知。
不要忘记在您的实施中调用 [super setBounds:bounds]
:)
Z.
您不必同时调用这两种方法。调用 setNeedsLayout
安排视图在下一次布局 运行 进行布局,你不知道这会发生在什么时候。
另一方面,layoutIfNeeded
立即布局视图及其所有子视图。然后应该为层次结构中的所有视图调用 layoutSubviews
,从您调用 layoutIfNeeded
的视图开始。
如果您更改了约束并且需要更新视图,您应该在动画块中调用 layoutIfNeeded,这样视图就不会 "jump",使用类似这样的东西
// Update constraints ...
[UIView animateWithDuration:0.3 animations:^{
[view layoutIfNeeded];
}];
如果你不改变你的框架"by hand"(意思是使用setFrame:
)并且只通过约束更新你的视图,之后你调用layoutIfNeeded
,layoutSubviews
应该每次都被调用。
如果您确实使用了 setFrame:
,如果您使用的是自动布局则不应该这样做,那么您可以尝试使用观察器。
假设我需要在每当视图的宽度或高度发生变化时做一些事情。当不使用 autoLayout 时,我可以通过实现 layoutSubviews
来做到这一点。但是我发现这个函数在使用autoLayout的时候并不总是被调用。
现在,我正在使用以下代码,其中某些内容可能会导致视图的框架发生变化:
[self setNeedsLayout];
[self layoutIfNeeded];
然后做我在 layoutSubviews
必须做的事。但我想知道这是否是最好的方法。有没有更简单的解决方案,例如我可以使用的回调函数?
我认为您应该检查 viewDidLayoutSubviews
是否有回调。 Apple 的文档说
Called to notify the view controller that its view has just laid out its subviews.
编码愉快! Z.
更新:
我之前回答错问题了! :)
对于 UIView
,您可以覆盖 bounds
' setter setBounds
(不是 frame
/setFrame
,这是从 bounds
派生的值),并且您会在其中收到任何大小更改的通知。
不要忘记在您的实施中调用 [super setBounds:bounds]
:)
Z.
您不必同时调用这两种方法。调用 setNeedsLayout
安排视图在下一次布局 运行 进行布局,你不知道这会发生在什么时候。
另一方面,layoutIfNeeded
立即布局视图及其所有子视图。然后应该为层次结构中的所有视图调用 layoutSubviews
,从您调用 layoutIfNeeded
的视图开始。
如果您更改了约束并且需要更新视图,您应该在动画块中调用 layoutIfNeeded,这样视图就不会 "jump",使用类似这样的东西
// Update constraints ...
[UIView animateWithDuration:0.3 animations:^{
[view layoutIfNeeded];
}];
如果你不改变你的框架"by hand"(意思是使用setFrame:
)并且只通过约束更新你的视图,之后你调用layoutIfNeeded
,layoutSubviews
应该每次都被调用。
如果您确实使用了 setFrame:
,如果您使用的是自动布局则不应该这样做,那么您可以尝试使用观察器。