zoukankan      html  css  js  c++  java
  • layoutSubviews总结

    ios layout机制相关方法

    1. - (CGSize)sizeThatFits:(CGSize)size
    2. - (void)sizeToFit

    ——————-

    1. - (void)layoutSubviews
    2. - (void)layoutIfNeeded
    3. - (void)setNeedsLayout

    ——————–

    1. - (void)setNeedsDisplay
    2. - (void)drawRect

    layoutSubviews在下面情况下会被调用:

    1、init初始化不会触发layoutSubviews

       可是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会触发

    2、addSubview会触发layoutSubviews

    3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化

    4、滚动一个UIScrollView会触发layoutSubviews

    5、旋转Screen会触发父UIView上的layoutSubviews事件

    6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

    在苹果的官方文档中强调:

          You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.

     layoutSubviews, 当我们在某个类的内部调整子视图位置时,须要调用。

    反过来的意思就是说:假设你想要在外部设置subviews的位置,就不要重写。

     刷新子对象布局

    -layoutSubviews方法:这种方法,默认没有做不论什么事情,须要子类进行重写
    -setNeedsLayout方法: 标记为须要又一次布局,异步调用layoutIfNeeded刷新布局,不马上刷新,但layoutSubviews一定会被调用
    -layoutIfNeeded方法:假设,有须要刷新的标记,马上调用layoutSubviews进行布局(假设没有标记,不会调用layoutSubviews)

    假设要立即刷新,要先调用[view setNeedsLayout],把标记设为须要布局,然后立即调用[view layoutIfNeeded],实现布局

    在视图第一次显示之前,标记总是“须要刷新”的,能够直接调用[view layoutIfNeeded]

    重绘

    -drawRect:(CGRect)rect方法:重写此方法,运行重绘任务
    -setNeedsDisplay方法:标记为须要重绘,异步调用drawRect
    -setNeedsDisplayInRect:(CGRect)invalidRect方法:标记为须要局部重绘

     

    sizeToFit会自己主动调用sizeThatFits方法;

    sizeToFit不应该在子类中被重写,应该重写sizeThatFits

    sizeThatFits传入的參数是receiver当前的size,返回一个适合的size

    sizeToFit能够被手动直接调用

    sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,仅仅负责自己

    ———————————-

    layoutSubviews对subviews又一次布局

    layoutSubviews方法调用先于drawRect

    setNeedsLayout在receiver标上一个须要被又一次布局的标记,在系统runloop的下一个周期自己主动调用layoutSubviews

    layoutIfNeeded方法如其名,UIKit会推断该receiver是否须要layout.依据Apple官方文档,layoutIfNeeded方法应该是这种

     layoutIfNeeded遍历的不是superview链,应该是subviews链

    drawRect是对receiver的重绘,能获得context

    setNeedDisplay在receiver标上一个须要被又一次画图的标记,在下一个draw周期自己主动重绘,iphone device的刷新频率是60hz,也就是1/60秒后重绘

  • 相关阅读:
    LeetCode 264. Ugly Number II
    LeetCode 231. Power of Two
    LeetCode 263. Ugly Number
    LeetCode 136. Single Number
    LeetCode 69. Sqrt(x)
    LeetCode 66. Plus One
    LeetCode 70. Climbing Stairs
    LeetCode 628. Maximum Product of Three Numbers
    Leetcode 13. Roman to Integer
    大二暑假周进度报告03
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4555473.html
Copyright © 2011-2022 走看看