layoutSubviews小结

文章也同时在简书更新

引言

iOS开发深入到一定阶段,大家可能就会尝试自己写一些控件,其中layoutSubviews的使用非常重要,特在此给出总结。

可能有人会问:“为什么要用layoutSubviews?它有什么用?”

简单说来,使用layoutSubviews主要就是为了在自定义控件的布局、视图层次等属性发生形变时,使该控件能够及时地作出调整,保证画面的平滑显示。而控件之所以能够及时作出反馈,就要归功于layoutSubviews这个方法。在控件发生形变时,我们就可以进入该方法,在其中重新计算一些布局要素,必要时进行重绘。 (重绘是一个较深的课题,涉及到更底层的绘图,以及一些优化方面的东西,之后会另写一篇文章说明)

接下来,如何能够进入layoutSubviews,怎样才能触发,时机是什么?可能就会成为大家想要知道的,本文将会focus on该方法的触发时机。

此外,虽然使用layoutSubviews是自定义控件进行布局时较为规范的做法,但仍旧需要合理使用。而关于如何自定义一个控件,会在下一篇文章中,结合一个简易的自定义progressView来说明。

示例代码

关于layoutSubviews更多实际使用的时机,可以参考我写的一个小例子:模仿QQ消息气泡拉扯弄破它!(A jellyView like QQ message bubble)

先来看一下别人的总结

When is layoutSubviews called?
谈谈UIView的几个layout方法
iOS开发之layoutSubviews的作用和调用机制

layoutSubviews以下情况会被调用

[When is layoutSubviews called?](http://stackoverflow.com/questions/728372/when-is-layoutsubviews-called)

  1. 初始化不会触发layoutSubviews,但是如果设置了不为CGRectZero的frame的时候就会触发。
  2. addSubview会触发layoutSubviews
  3. 设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
  4. 滚动一个UIScrollView会触发layoutSubviews
  5. 旋转Screen会触发父UIView上的layoutSubviews事件
  6. 改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

个人补充

  • 自定义view继承自UIView时,一般都会重写UIView的initWithFrame,如果调用者在使用时,没有调用你写的initWithFrame,而是直接init,系统也会在super init(即UIView init)之后,调用UIView的initWithFrame,然后因为你重写了,所以会调用你写的。
    顺序就是
    customView init -> UiView init -> UIView initWithFrame -> CustomView initWithFrame

  • 注意下述三条语句都可能会导致进入layoutSubviews,但有时候还要满足后续的两个条件。
    [customView addSubView:aLabel];
    [aLabel removeFromSuperview];
    [aSuperView addSubview:customView];

  • 创建一个customView后,必须找到 着陆床 ,让它能够被addSubview到一个父层,否则永远不会进入layoutSubviews,不管你怎么改变它的frame,使用[customView addSubView:aLabel];或者[aLabel removeFromSuperview];

  • 在没有上述customView操作子层的前提下,customView调用initWithFrame时,如果frame为0,等同于没有空间大小,那么即便[aSuperView addSubview:customView];它也不会进入layoutSubviews。但是只要被add到了父层,在customView上操作子层仍然有效。
  • 上述对应UIView的说明同样适用于CALayer。

总结

为了能够进入layoutSubviews:
首先你必须能够[aSuperView addSubview:customView];
其次请设置frame不为0,但是操作子层不受frame为0的影响。

微信公众号

第一时间获取最新内容,欢迎关注微信公众号:「洛斯里克的大书库」。
微信公众号「洛斯里克的大书库」

周鶏🐣(Kimiko) wechat
拿起手机扫一扫,欢迎关注我的个人微信公众号:「洛斯里克的大书库」。
坚持原创技术分享,您的支持将鼓励我继续创作!