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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

25、UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释

發(fā)布時(shí)間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 25、UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

layoutSubviews總結(jié)

ios layout機(jī)制相關(guān)方法

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

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

- (void)setNeedsDisplay
- (void)drawRect
layoutSubviews在以下情況下會(huì)被調(diào)用:

1、init初始化不會(huì)觸發(fā)layoutSubviews

?? 但是是用initWithFrame 進(jìn)行初始化時(shí),當(dāng)rect的值不為CGRectZero時(shí),也會(huì)觸發(fā)

2、addSubview會(huì)觸發(fā)layoutSubviews

3、設(shè)置view的Frame會(huì)觸發(fā)layoutSubviews,當(dāng)然前提是frame的值設(shè)置前后發(fā)生了變化

4、滾動(dòng)一個(gè)UIScrollView會(huì)觸發(fā)layoutSubviews

5、旋轉(zhuǎn)Screen會(huì)觸發(fā)父UIView上的layoutSubviews事件

6、改變一個(gè)UIView大小的時(shí)候也會(huì)觸發(fā)父UIView上的layoutSubviews事件

在蘋(píng)果的官方文檔中強(qiáng)調(diào):

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

layoutSubviews, 當(dāng)我們?cè)谀硞€(gè)類的內(nèi)部調(diào)整子視圖位置時(shí),需要調(diào)用。

反過(guò)來(lái)的意思就是說(shuō):如果你想要在外部設(shè)置subviews的位置,就不要重寫(xiě)。

刷新子對(duì)象布局

-layoutSubviews方法:這個(gè)方法,默認(rèn)沒(méi)有做任何事情,需要子類進(jìn)行重寫(xiě)
-setNeedsLayout方法: 標(biāo)記為需要重新布局,異步調(diào)用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定會(huì)被調(diào)用
-layoutIfNeeded方法:如果,有需要刷新的標(biāo)記,立即調(diào)用layoutSubviews進(jìn)行布局(如果沒(méi)有標(biāo)記,不會(huì)調(diào)用layoutSubviews)

如果要立即刷新,要先調(diào)用[view setNeedsLayout],把標(biāo)記設(shè)為需要布局,然后馬上調(diào)用[view layoutIfNeeded],實(shí)現(xiàn)布局

在視圖第一次顯示之前,標(biāo)記總是“需要刷新”的,可以直接調(diào)用[view layoutIfNeeded]

重繪

-drawRect:(CGRect)rect方法:重寫(xiě)此方法,執(zhí)行重繪任務(wù)
-setNeedsDisplay方法:標(biāo)記為需要重繪,異步調(diào)用drawRect
-setNeedsDisplayInRect:(CGRect)invalidRect方法:標(biāo)記為需要局部重繪

sizeToFit會(huì)自動(dòng)調(diào)用sizeThatFits方法;

sizeToFit不應(yīng)該在子類中被重寫(xiě),應(yīng)該重寫(xiě)sizeThatFits

sizeThatFits傳入的參數(shù)是receiver當(dāng)前的size,返回一個(gè)適合的size

sizeToFit可以被手動(dòng)直接調(diào)用

sizeToFit和sizeThatFits方法都沒(méi)有遞歸,對(duì)subviews也不負(fù)責(zé),只負(fù)責(zé)自己

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

layoutSubviews對(duì)subviews重新布局

layoutSubviews方法調(diào)用先于drawRect

setNeedsLayout在receiver標(biāo)上一個(gè)需要被重新布局的標(biāo)記,在系統(tǒng)runloop的下一個(gè)周期自動(dòng)調(diào)用layoutSubviews

layoutIfNeeded方法如其名,UIKit會(huì)判斷該receiver是否需要layout.根據(jù)Apple官方文檔,layoutIfNeeded方法應(yīng)該是這樣的

layoutIfNeeded遍歷的不是superview鏈,應(yīng)該是subviews鏈

drawRect是對(duì)receiver的重繪,能獲得context

setNeedDisplay在receiver標(biāo)上一個(gè)需要被重新繪圖的標(biāo)記,在下一個(gè)draw周期自動(dòng)重繪,iphone device的刷新頻率是60hz,也就是1/60秒后重繪?

轉(zhuǎn)載于:https://www.cnblogs.com/qiangzheVSruozhe/p/6513387.html

總結(jié)

以上是生活随笔為你收集整理的25、UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。