1. 程式人生 > >UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之間的關係解釋

UIView的setNeedsLayout, layoutIfNeeded 和 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秒後重繪 

相關推薦

UIView的setNeedsLayout, layoutIfNeeded layoutSubviews 方法之間關係解釋

ios layout機制相關方法 - (CGSize)sizeThatFits:(CGSize)size - (void)sizeToFit ——————- - (void)layoutSubviews - (void)layoutIfNeeded - (void)setNeedsLayout ——————

UIView的setNeedsLayout, layoutIfNeeded layoutSubviews 方法之間的關系解釋(轉)

frame 旋轉 display dds 設置 負責 oop 周期 scroll layoutSubviews總結ios layout機制相關方法- (CGSize)sizeThatFits:(CGSize)size- (void)sizeToFit——————-- (vo

jquery中使元素顯示隱藏方法之間的區別

第一個 設置 不可見 效果 三種 透明 元素 實現 使用 在實際的項目開發中,要使一個元素隱藏的方法有很多,比如css的多種屬性和jquery的多種方法,雖然他們的作用都是使元素不可見,但是各個方法實現的原理是不一樣的。下面主要介紹jquery各個元素隱藏方法之間的區別。

Python的例項方法、類方法靜態方法之間的區別與聯絡

Python的例項方法、類方法和靜態方法 class Test: def test1(self): print('test......') @classmethod def test2(cls): print('test2......c

關於Handler的post方法send方法的區別解釋

先看原始碼 /** * Causes the Runnable r to be added to the message queue. * The runnable wil

正交矩陣旋轉矩陣之間關係性質總結

正交矩陣之所以叫正交矩陣,是因為一套正交基向量在該矩陣變換下仍然是正交的,這是正交矩陣的充分必要條件。很明顯的,任何兩個向量在旋轉矩陣的變換下,這兩個向量仍然是正交的,所以旋轉矩陣是正交矩陣。 --------------------------------------------------------

雲端計算三種服務模式SaaS、PaaSIaaS及其之間關係

     它們之間的關係主要可以從兩個角度進行分析:其一是使用者體驗角度,從這個角度而言,它們之間關係是獨立的,因為它們面對不同型別的使用者。其二是技術角度,從這個角度而言,它們並不是簡單的繼承關係(Saa..... 三種服務模式 根據現在最常用,也是比較權威的NI

1:總結並剖析malloc/freenew/delete之間關係差異。 2:剖析new/delete、new[]/delete[]到底做了些什麼事情。 3:實現NEW_ARRAY/DE

1:總結並剖析malloc/free和new/delete之間關係和差異。 2:剖析new/delete、new[]/delete[]到底做了些什麼事情。 3:實現NEW_ARRAY/DELETE_ARRAY巨集,模擬new[]/delete[]申請

"靜態方法裏僅僅能調用靜態變量靜態方法"具體解釋

release java 調用 fix temp lin 方法 -s ews 靜態方法裏能夠調用靜態方法和靜態變量,同一時候也能調用非靜態方法和非靜

關於子類父類之間方法,構造方法呼叫關係

子類繼承了父類之後,父類的所有方法都可以被子類呼叫,父類的所有(除私有外)方法都可以被重寫; 但是父類中私有資料域不能在子類中被修改,只能通過呼叫父類的公共修改方法來修改; 例如下面圓幾何繼承了簡單幾何: 以上幾點說明: 簡單幾何類中的構造方法其實不需要寫,因

CWNDHWND之間關係轉換 獲取方法

一、區別 HWND是控制代碼,CWnd是MFC窗體類,CWnd中包含HWND控制代碼成員物件是m_hWnd. HWND是Windows系統中對所有視窗的一種標識,即視窗控制代碼。這是一個SDK概念。    CWnd是MFC類庫中所有視窗類的基類。微軟在MFC中將所有視窗的通用操作都封裝到了這個類中,如:S

C# .net中json字符串對象之間的轉化方法

tools ade href start 反射 serialize lan serializa serial http://blog.csdn.net/xuexiaodong009/article/details/46998069 json作為作為一種最常用的數據,

jQuery物件DOM物件之間的區別以及轉換方法

jQuery物件和DOM物件之間的區別以及轉換方法 在實現<script>標籤中的程式碼內容的時候,經常都會使用DOM物件和jQuery物件。當實現的物件多的時候就容易搞混,這裡做一下總結 jQuery物件是包裝DOM物件後產生的,

JDBC上關於資料庫中多表操作一對多關係多對多關係的實現方法--轉

  原文地址---- https://www.cnblogs.com/pangguoming/p/7028322.html 黑馬程式設計師 我們知道,在設計一個Java bean的時候,要把這些BEAN 的資料存放在資料庫中的表結構,然而這些資料庫中的表直接又有些特殊

Focusable 屬性IsTabStop 屬性之間關係

原文: Focusable 屬性和IsTabStop 屬性之間的關係 控制元件的Focusable 屬性確定控制元件是否允許接收鍵盤輸入焦點,控制元件的 IsTabStop 屬性確定是否允許通過Tab鍵導航到控制元件。在預設情況下,Focusable 屬性位true的控制元件IsTabSto

@Autowired註解靜態方法以及new的關係

一、@autowired 與new   new出來的物件無法呼叫@Autowired注入的Spring Bean,否則報空指標異常, @Autowired注入Spring Bean,則當前類必須也是Spring Bean才能呼叫它,不能用new xxx()來獲得物件,這種

Python:UnicodeUTF-8之間關係

一、Unicode和UTF-8 參考網址:https://blog.csdn.net/xiaolei1021/article/details/52093706/ 例項: 開啟"記事本"程式Notepad.exe,新建一個文字檔案,內容就是一個"嚴"字,依次採用ANSI,Unicode

主表附表的關聯關係,普通欄位就可以實現為什麼還要有主鍵外來鍵?之間有什麼關係

主鍵和外來鍵是把多個表組織為一個有效的關係資料庫的粘合劑。主鍵和外來鍵的設計對物理資料庫的效能和可用性都有著決定性的影響。必須將資料庫模式從理論上的邏輯設計轉換為實際的物理設計。而主鍵和外來鍵的結構是這個設計過程的癥結所在。一旦將所設計的資料庫用於了生產環境,就很難對這些鍵進行修改,所以在開發階段就

檔案系統中的邏輯塊、物理塊扇區之間關係

轉載:https://blog.csdn.net/aspirinvagrant/article/details/11365209 扇區(sector):硬體(磁碟)上的最小的操作單位,是作業系統和塊裝置(硬體、磁碟)之間傳送資料的單位。 block由一個或多個sect

JVM堆記憶體、方法棧記憶體的關係

以下程式碼展示Java堆記憶體、方法區和Java棧記憶體之間的關係 package cn.liang.jvm; public class SimpleHeap { private int id; public SimpleHeap(int id){ this.id = id;