對auto layout的一些說明
很多人在剛剛學習auto layout的時候總是設置不好約束,主要原因是沒有對其深刻的理解。
frame和auto layout是兩種不同的布局方式,auto layout很像Android里的Relative Layout的布局樣式,Android做的更純粹。說回來,無論哪種布局樣式,最終的目都是唯一、沒有歧義的標識一個UI控件(包括位置和大小),道理和我們高中學過的笛卡爾坐標系(即直角坐標系用P(x,y)表示平面上的點)與極坐標系(用P(ρ,θ)表示平面上的點)是一樣的,兩個坐標系用不同的參數去唯一、沒有歧義的表示一個點。
我們學習auto layout核心點就有兩個:
1.學會用約束(約束相當于極坐標系中的參數)的思想去唯一、沒有歧義的設置UI布局。
2.記住約束的公式:view1.attr1relationview2.attr2 xmultiplier+constant
relation、multiplier、constant都是可以設置的。
很多人在剛剛學習auto layout的時候總是很困惑,為什么代碼修改frame不生效,下面詳細的說明一下原因:
不使用auto layout時是可以在viewDidLoad:里設置frame的,一旦開啟了auto layout,就要注意,通常在viewDidLoad:中設置frame就不再生效,因為iOS5加入的viewWillLayoutSubviews會在viewDidLoad之后調用,而該函數會在執行的時候去加載該文件對應的xib設置的約束,就是說在viewDidLoad:中設置frame的時機太早了,沒有生效就又改成了xib中的樣子,而且在viewWillLayoutSubviews中修改frame也是不生效的,那么,如何才能用代碼修改布局生效?
方法一:
在viewDidLayoutSubviews中修改frame,這是最簡單的方法。
方法二:
選中xib中的約束(藍色線段,左邊欄Constants里的item)像拖動其他控件一樣,將其拖動成為IBOutlet的屬性或全局變量,eg:
property (weak, nonatomic) IBOutlet NSLayoutConstraint *testViewWidthConstraint;
- (void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
//通過修改約束達到修改布局的效果
self.testViewWidthConstraint.constant = 200;
}
方法二中這種修改約束constant屬性的方法還可以產生動畫效果,eg:
[UIView animateWithDuration:1 animations:^{
self.testViewWidthConstraint.constant = 200;
[self.view layoutIfNeeded]; //這句話很重要,只有重新布局才會產生動畫效果,否則沒有動畫效果
}];
代碼與xib設置約束的優缺點分析:
根據auto layout的公式(簡單表示成a=bxc+d)可以看出用代碼添加一個約束至少要指定五個參數(公式中黑體),十分麻煩,如果約束添加多了,就自然成了膠水代碼,網上雖然有很多開源的auto layout的庫,但最大的意義不過是對iOS系統api的封裝,使其更好用了罷了,并不能從本質上解決他的復雜性的問題。
xib只需點一個按鈕就能添加一個約束,十分方便,而且可視化,很容易把握整體布局中約束的設置,而且有錯誤和警告都有提示,修改沖突也非常容易,非要說有什么不好的地方,如果你對xib運用不熟練,看到那么多的約束都表現在xib上會有一些混亂的感覺。
作者:二亮子
鏈接:http://www.lxweimin.com/p/69159c878399
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。