日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

layoutSubviews 详解

發布時間:2023/12/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 layoutSubviews 详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ios?layout機制相關方法

  • - (CGSize)sizeThatFits:(CGSize)size
  • - (void)sizeToFit
  • ——————-

  • - (void)layoutSubviews
  • - (void)layoutIfNeeded
  • - (void)setNeedsLayout
  • ——————–

  • - (void)setNeedsDisplay
  • - (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秒后重繪

    總結

    以上是生活随笔為你收集整理的layoutSubviews 详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。