使用 Auto Layout 后何时可以获取到正确的 frame?

使用autoLayout后,我们在平常使用的方法

viewDidLoad , viewWillAppear,方法中获取的Frame会不正确,这时候我们可以通过两种途径获取到正确的Frame。

1:在想获取真实 frame 之前调用一下self.view.layoutIfNeeded(),这是一个能用但是并不好的方法:因为它进行了额外的毫不需要的 frame 计算。不推荐

2:从试图控制器的生命周期来看这个问题:

loadView--->viewDidLoad--->viewWillAppear--->viewWillLayoutSubviews--->viewDidLayoutSubviews
--->viewDidAppear--->viewWillDisappear--->viewDidDisappear

Auto Layout 的布局是从外到内的,即从屏幕尺寸开始布局,一直布局到最里面的元素。

viewDidLayoutSubviews 时当前视图已经把子元素布局完毕,frame 已经形成

viewDidAppear 时,渲染系统把当前视图加入父视图中,显示在屏幕上

所以,解决方案已经有了:

避免调用 layoutSubviews,在 viewDidLayoutSubviews 和 viewDidAppear 中进行 frame 的获取

如果你需要尽早地做一些大动作,推荐在 viewDidLayoutSubviews,此时用户还没有看到 UI,用法可以更灵活

注意 viewDidLayoutSubviews 可能会被多次调用,所以添加元素之类的操作尽量避免在这里做

viewDidAppear 中可以干一切你想干的事情,但是一些需要用户看到的东西例如动画只能在这里做。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 172.简述视图控制器的生命周期。 1)init函数(init;initWithFrame;initWithCod...
    AlanGe阅读 389评论 0 0
  • 使用过 Auto Layout 的人肯定都遇到过获取不到真实 frame 的情况,而大部分人经过简单搜索都能得到一...
    Smallwolf_JS阅读 2,023评论 2 3
  • 目录 0、前言 一、Auto Layout前世今生 二、Auto Layout基础知识 1.Auto Layout...
    浮游lb阅读 24,905评论 3 89
  • 在iOS开发中我们会经常使用UIView的addSubView方法,将一个子视图添加到父视图中。在进行addSub...
    效宇笑语阅读 2,935评论 0 2
  • OC的动态性:会把编译和链接是需要执行的逻辑延迟到运行时,例如使用 id 所修饰的变量会在运行的时候才确定具体类型...
    allen852阅读 657评论 0 1