使用 Auto Layout 之后什么时候才能获得正确的 frame?

使用过 Auto Layout 的人肯定都遇到过获取不到真实 frame 的情况,而大部分人经过简单搜索都能得到一个满意的解决方案:在想获取真实 frame 之前调用一下 self.view.layoutIfNeeded(),这是一个能用但是并不好的方法:进行了额外的毫不需要的 frame 计算。

我们从 View Controller 的生命周期来分析这个问题:

viewDidLoad
viewWillAppear
viewWillLayoutSubviews
viewDidLayoutSubviews
viewDidAppear
viewWillDisappear
viewDidDisappear

Auto Layout 的布局是从外到内的,即从屏幕尺寸开始布局,一直布局到最里面的细节元素,我们的目光自然地落在了 viewDidLayoutSubviews 和 viewDidAppear 上了:

  1. viewDidLayoutSubviews 时当前视图已经把子元素布局完毕,frame 已经形成
  2. viewDidAppear 时,渲染系统把当前视图加入父视图中,显示在屏幕上

所以,解决方案其实已经水落石出了:

  1. 避免调用 layoutSubviews,在 viewDidLayoutSubviews 和 viewDidAppear 中进行 frame 的获取
  2. 如果你需要尽早地做一些大动作,推荐在 viewDidLayoutSubviews,此时用户还没有看到 UI,用法可以更灵活
  3. 注意 viewDidLayoutSubviews 可能会被多次调用,所以添加元素之类的操作尽量避免在这里做
  4. viewDidAppear 中可以干一切你想干的事情,但是一些需要用户看到的东西例如动画只能在这里做
  5. 更推荐把需要做的事情尽量全部放到 viewDidAppear 中来做,让用户尽早地看到界面,这是人机交互的基本原则

回到标题中的问题:什么时候才能获得正确的 frame? 在 viewDidLayoutSubviews 和 viewDidAppear 中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值