当UIView的帧改变时是否有回调函数?

时间:2015-02-27 08:25:23

标签: ios objective-c autolayout

假设每当视图的宽度或高度发生变化时,我都需要执行操作。不使用autoLayout时,我可以通过实现layoutSubviews来实现。但我发现使用autoLayout时并不总是调用此函数。

现在,我正在使用以下代码,其中某些内容可能导致视图的框架发生变化:

[self setNeedsLayout];
[self layoutIfNeeded];

并在layoutSubviews做我必须做的事情。但我想知道这是不是最好的方法。有没有更简单的解决方案,例如我可以使用的回调函数?

2 个答案:

答案 0 :(得分:2)

您不必一次调用这两种方法。调用setNeedsLayout会在下次布局运行时安排视图进行布局,您不知道何时会发生这种情况。

另一方面,layoutIfNeeded会立即布局视图及其所有子视图。然后应该为层次结构中的所有视图调用layoutSubviews,从您调用layoutIfNeeded的视图开始。

如果您更改了约束并且需要更新视图,则应该在动画块中调用layoutIfNeeded,以便视图不会跳过"跳过",使用类似的东西

// Update constraints ...

[UIView animateWithDuration:0.3 animations:^{
    [view layoutIfNeeded];
}];

如果你不改变你的框架"手动" (意思是使用setFrame:)并仅通过约束更新您的视图,之后您调用layoutIfNeeded,每次都应调用layoutSubviews

如果您使用setFrame:,如果使用自动布局,则不应该这样做,那么您可以尝试使用观察者。

答案 1 :(得分:1)

我认为您应该检查viewDidLayoutSubviews是否有回调。 Apple的文档说

  

调用以通知视图控制器其视图刚刚布局   它的子视图。

仔细查看:https://developer.apple.com/library//ios/documentation/UIKit/Reference/UIViewController_Class/index.html

快乐的编码! ž。

<强>更新

我以前回答过错误的问题! :) 对于UIView,您可以覆盖bounds'setter setBounds(不是frame / setFrame,这是从bounds派生的值),并且你会收到任何尺寸变化的通知。 不要忘记在实施中致电[super setBounds:bounds]:)

Ž。