iOS开发笔记 | 由使用Masonry布局不能立即获取到frame想到的一些问题

本文通过实例代码探讨了在使用Masonry进行布局后,为何无法立即获取到正确的frame,并解释了调用`layoutIfNeeded`或延迟0.1秒后才能获取frame的原因。内容涉及Autolayout与frame的关系,以及布局完成的判断时机。
摘要由CSDN通过智能技术生成

前言

我相信很多同学曾经都遇到过这样的问题:明明用masonry布好局了,怎么获取到的frame就是0呢?

解决问题不难,百度一下就能找到答案,但如果只是单纯的解决问题而不去想为什么或许会制约我们的成长。

问题重现

在这里我还是要推荐下我自己建的iOS开发学习群:680565220,群里都是学ios开发的,如果你正在学习ios ,小编欢迎你加入,今天分享的这个案例已经上传到群文件,大家都是软件开发党,不定期分享干货(只有iOS软件开发相关的),包括我自己整理的一份2018最新的iOS进阶资料和高级开发教程

1. 先看下面这段代码:

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

打印结果:

2. 再看一段代码:

[self.scrollViewmas_makeConstraints:^(MASConstraintMaker*make) {    make.edges.mas_equalTo(UIEdgeInsetsMake(0,0,0,0));}];// 先调用superView的layoutIfNeeded方法再获取frame[self.viewlayoutIfNeeded];NSLog(@"%@", self.scrollView);

打印结果:

3. 最后看一段代码:

[self.scrollViewmas_makeConstraints:^(MASConstraintMaker*make) {    make.edges.mas_equalTo(UIEdgeInsetsMake(0,0,0,0));}];//0.1秒后获取framedispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{    NSLog(@"%@", self.scrollView);});

打印结果:

问:为什么要调用superView的layoutIfNeeded或者延迟0.1秒后才能获取到frame?

iOS高端妓术裙的裙主:锤神 告诉我:

首先你要知道autolayout和frame的关系,autolayout最终也是转成frame,masonry是建立在autolayout之上的。你没获取到正确的值,那是因为约束还没布局完成。相当于就是我们给一定的约束,系统内部自己去根据约束条件转成对应的frame,而这需要一个过程。想要拿到正确的frame最好的就是让autolayout完成之后,什么时候完成呢?那就是在layoutsubviews for view or didlayoutsubviews for controller 里获取,当然在控制器的viewdidappear里也拿得到,但是正确做法和最佳做法还是在控制器里的viewdidlayout里获取最好~因为autolayout会根据约束,不停的去改变frame,这方法里最后拿到的frame就是最终姿势.

锤神最后补充了一句:

可能有些需要纠正,但这基本是我一个大概的理解~~

看,多么谦虚~


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值