ios - 为什么我用masonry的时候不能立马拿到相框?

标签 ios objective-c

这段代码:

[self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.mas_equalTo(UIEdgeInsetsMake(0, 0, 0, 0));
}];
NSLog(@"%@", self.scrollView);

结果是:<UIScrollView: 0x7faad400cc00; frame = (0 0; 0 0)

但是这段代码:

[self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.mas_equalTo(UIEdgeInsetsMake(0, 0, 0, 0));
}];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    NSLog(@"%@", self.scrollView);
});

结果是:<UIScrollView: 0x7ff8d1043200; frame = (0 0; 375 667);

为什么我不能立即获取到帧,但我可以在 0.1 秒后获取?

最佳答案

Masonry 是自动布局的包装器,自动布局在 - (void)layoutSubviews; 方法中计算自己的框架,只有在那之后你才能获得所有 View 的框架。

砌体方法 mas_makeConstraints 和类似的只是设置约束。

如果你需要更新约束,你必须调用mas_remakeConstraints:它只是更新约束,为了更新 View 的框架,我们必须调用方法setNeedsLayout来设置一个关于重新计算的标志在下一个显示周期中,如果我们想立即更新帧,我们必须调用 layoutIfNeeded 方法。

关于ios - 为什么我用masonry的时候不能立马拿到相框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46387298/

相关文章:

ios - 从 ios 6 更新到 ios 7 推送通知停止工作

iOS 将视频修剪为固定长度

ios - 通过检查像 SKStoreProductParameterAffiliateToken 这样的常量的地址来完成什么?

ios - 使用自动布局为 UIView 应用渐变背景

objective-c - 我如何理解 Cocoa 库类中的性能权衡?

iphone - 创建一个饼图并传递一些值

ios - 向 UITableView 添加多个页脚

ios - UIView翻转动画问题

ios - iOS XMPPFramework:如何解析didReceiveIQ?

ios - 使用 cocoa pod 将 Quickblox 连接到应用程序