ios - UIView的frame改变时有回调函数吗?

标签 ios objective-c autolayout

假设我需要做某事每当 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/

相关文章:

ios - IOS 中使用 NSString 的 IF 语句问题

ios - 如何使用AFNetworking3.0同步plist数据到web服务器?

ios - 内切 View 的自动布局约束

ios - 如何在后台以固定时间间隔重启 CoreBluetooth 管理器实例

cocoa - 'NSDictionary' 可能无法响应 '+dictionaryWithJSONString' ... 使用 TouchJSON 时

iphone - 如何在不使用命令提示符的情况下在 Windows XP 中编写和运行 Objective-C 程序

ios - Objective-C 中的 cURL 请求 (POST)

ios - 跨不同模拟器打印 View 的 bounds.width 属性时的常量值 od 375

ios - 在纵向和横向中为 UIView 设置适当的约束

iphone - iOS - 从 block 中返回变量