要了解autolayout 首先要知道程序視圖啟動順序:
-(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; NSLog(@"1");}-(void)updateViewConstraints{ [super updateViewConstraints]; NSLog(@"2");}-(void)viewDidLayoutSubviews{ //調用不止一次 跟子視圖的數量有關 [super viewDidLayoutSubviews]; NSLog(@"3");}-(void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; NSLog(@"4");}updateViewConstraints方法中進行視圖上布局計算,得出各個控件的frame.但是此時并沒有將這些frame賦值給各個控件。在viewDidLayoutSubviews方法中,各個控件的frame賦值已經完成,但是并不是在這個方法中賦值的。
如果我們要代碼添加控件和約束,別忘了先去除控件的autoresizing ,否則會報出警告,因為二者會存在約束沖突。translatesAutoresizingMaskIntoConstraints=NO 代碼添加控件還應注意,控件的創建和添加應在updateViewConstraints 方法之前。否則 每次添加控件都會觸發updateViewConstraints方法,導致界面會抖動,以及出現不期望的結果。當我們使用自動布局時還應注意,控件分為兩種,一種是固定寬高的,另一種是不固定的依靠自身內容決定寬高的。比如 開關控件就是個固定大小的,它的大小就是那么大,不會改變。對于這種控件,我們只需要設定它的左邊和上邊的位置就可以了,設置好之后,這個控件還可以作為其他控件的約束參照。但是比如label 這樣根據內容決定寬高的控件,雖然在有內容時候,它也可以只設置左邊和上邊的距離,但是它不能作為其他控件的參照了,除非鎖定了它的寬高。比如 我們設定label ,距離左邊父控件 20 ,距離上邊父控件20.那么假如我們有另一個控件(假定為button)我們不可以設定button 距離左邊這個label 20。<span style="font-family: Arial, Helvetica, sans-serif;">自動布局中大多數控件都是好設定的,但是比較難搞的時scrollview 。因為它是靠自身內容的大小來決定它的大小的。比如,我們設定了scrollview 距離左上下右的距離都是20 ,那么它會提示警告。解決的辦法之一就是在scrollView內部再添加一個容器view,將這個view設定為與scrollview 完全貼近。然后將這個view的大小改為我們所需要的contentView的大小。最后再這個view中添加控件即可實現滾動。</span>
總體來說自動布局很好地解決了屏幕適配 ,尤其是橫豎屏切換的問題。大大簡化了我們的計算代碼,但是我們又有多少應用是同時支持橫豎屏的呢?而且自動布局使我們界面的動畫及控件的動態創建都收到了極大的影響,盡管這些影響都能解決,但是還是不如計算frame方便。而且自動布局盡管引入了vfl 語言簡化代碼,但是約束設置錯誤的話真的是很難查,如果我們需要使用動畫的話,需要將約束設置為屬性。設置成屬性的話,不如計算frame方便。如果你數學不是很差的話,建議你還是使用計算frame 來布局吧</span>
新聞熱點
疑難解答