作為ViewController的根視圖view,其上邊兒呈現給用戶內容,但是一般都是以滾動視圖tableView和collectionView為主要視圖。一直以來,小編都在viewDidLoad此編程時機去布局頁面。后來慢慢的發現這樣的代碼不容易維護,界面的創建和布局應盡量能夠分開,這樣一來,代碼結構條理、思路清晰,而且易於迭代(比如動態布局self.View的子視圖)。如下圖所示:
常用編程時機順序打印結果
在viewWillAppear此編程時機之后,系統又提供了viewWillLayoutSubviews這個編程時機來布局self.view的子視圖,在這里我們就可以動態的實現self.view的子視圖布局了。
但是需要注意一點:viewWillLayoutSubviews並不是每次切換視圖都調用,見下圖。
push頁面及其back回來之后的調用順序
官方文檔說明---When a view's bounds change, the view adjusts the position of its subviews. Your view controller can override this method to make changes before the view lays out its subviews. The default implementation of this method does nothing.(當一個視圖的邊界發生變化,也就是調整其子視圖的位置。你的視圖控制器可以重寫此方法在layoutSubViews之前生效以重新布局子視圖。該方法的默認實現不執行任何操作。)
也就是說:有以下幾種情況會調用(init初始化不會觸發layoutSubviews)
1、addSubview會觸發viewWillLayoutSubviews
2、設置self.view及子視圖的frame.size會觸發layoutSubviews,當然前提是frame.size的值設置前后發生了變化,注意,此處不是origin,呼應官方文檔上的邊界發生變化
3、滾動一個UIScrollView(該scrollview有子視圖的時候)會觸發layoutSubviews
4、橫豎屏幕切換會觸發
作者:三線小奮青
鏈接:https://www.jianshu.com/p/a2df933b4ad6
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。