iOS 自動布局詳細介紹

來源:互聯網
上載者:User

標籤:

1. 自動布局的理解

iOS自動布局很有用,可以在不同size的螢幕上運行,原先看的頭痛,還是習慣用最蠢的[UIScreen mainScreen].bounds.size.width等來布局,後來實在不行了,開始好好地看自動布局,發現理解後真的很好用,現在就來分享分享我的心得吧。

 

首先要明白一個控制項在螢幕上的位置怎麼樣才能真正地確定。最簡單的情況是:

1. 例如一個矩形,只要知道它左上方點的座標,寬,高,那麼位置就固定了。

2. 例如一個圓,只要知道它的圓心座標,半徑,那麼位置就固定了。

自動布局就是這個意思,它可以理解為活的布局,因為確定一個控制項的位置有很多方法,死死地確定位置,那麼螢幕size變了,可能位置就不是我們想要的。

所以做自動布局的時候,需要思考的就是螢幕變的情況下,我設定的約束條件還能使它在我想要的位置,那麼這些約束條件就是好的。

舉個最簡單的例子。讓一個矩形在螢幕正中。

設定它的左上方座標,寬,高。那麼螢幕變了位置肯定變了。

設定它的中心為螢幕的中心,寬,高,那麼螢幕size變了,它肯定還在中心,這就是好的約束。

所以我的理解就是,自動布局的核心就在於,設定好的約束,讓螢幕的size變化時,它所在的位置仍然是我們想要的

2. 自動布局的實現

自動布局的實現只有兩種。

1. storyboard 

2. 純程式碼控制

在storyboard上設定約束條件很容易,按住Ctrl拖動就可以了。如果你設定的約束條件不足或者衝突,那麼會有紅色的提示;如果你設定的約束條件和你控制項所在的位置有誤差,那麼會有黃色的提示,按下讓系統更改就行了。

最容易的方法就是,拖控制項的時候讓它和螢幕上顯示的藍線對齊,最後reset to suggested constraints就行了。

不過有些情況還是需要自己來設定。

3. 純程式碼設定約束

很多人是純程式碼流,如果用純程式碼來設定約束,也有很多方法,比較常見的是3種。

1.  constraints with visualFormat

例如

//給文字框添加約束    self.sendTextView.translatesAutoresizingMaskIntoConstraints = NO;    NSString *sendStringH = [NSString stringWithFormat:@"H:|-(%d)-[_sendTextView(%f)]",padding,textViewWidth];    NSString *sendStringV = [NSString stringWithFormat:@"V:|-(%d)-[_sendTextView]-(%d)-|",padding,padding];    NSArray *sendTextViewConstraintH = [NSLayoutConstraint constraintsWithVisualFormat:sendStringH options:0 metrics:0 views:NSDictionaryOfVariableBindings(_sendTextView)];    [self addConstraints:sendTextViewConstraintH];        NSArray *sendTextViewConstraintV = [NSLayoutConstraint constraintsWithVisualFormat:sendStringV options:0 metrics:0 views:NSDictionaryOfVariableBindings(_sendTextView)];    [self addConstraints:sendTextViewConstraintV];

有兩個需要注意的地方:

因為大部分情況是相對於父視圖和兄弟視圖的布局,所以一定要先讓父視圖addSubView,然後在設定約束。

[]裡要用_View,不要用self.view,這個stackOverflow上有解釋。

 

它的用法主要是constraintsWithVisualFormat的參數的指定參數為NSString型,指定Contsraint的屬性,是垂直方向的限定還是水平方向的限定,參數定義一般如下:

V:|-(>=x)-[_view(x)]-((>=x))-| :表示垂直方向上相對於SuperView左右間距大於、等於、小於某個距離

若是要定義水平方向,則將V:改成H:就可以了。
options:字典類型的值;這裡的值一般在系統定義的一個enum裡面選取
metrics:nil;一般為nil ,參數類型為NSDictionary,從外部傳入 //衡量標準
views:就是上面所加入到NSDictionary中的綁定的View

在這裡要注意的是 AddConstraints  和 AddConstraint 之間的區別,一個添加的參數是NSArray,一個是NSLayoutConstraint

使用的一些規則

|: 表示父視圖

  -:表示距離

 V:  :表示垂直

 H:  :表示水平

>= :表示視圖間距、寬度和高度必須大於或等於某個值

<= :表示視圖間距、寬度和高度必須小宇或等於某個值

== :表示視圖間距、寬度或者高度必須等於某個值

@  :>=、<=、==  限制   最大為  1000


一些使用例子:


1.|-[view]-|:  視圖處在父視圖的左右邊緣內

2.|-[view]  :   視圖處在父視圖的左邊緣

3.|[view]   :   視圖和父視圖左邊對齊

4.-[view]-  :  設定視圖的寬度高度

5.|-30.0-[view]-30.0-|:  表示離父視圖 左右間距  30

6.[view(200.0)] : 表示視圖寬度為 200.0

7.|-[view(view1)]-[view1]-| :表示視圖寬度一樣,並且在父視圖左右邊緣內

8. V:|-[view(50.0)] : 視圖高度為  50

9: V:|-(==padding)-[imageView]->=0-[button]-(==padding)-| : 表示離父視圖的距離

為Padding,這兩個視圖間距必須大於或等於0並且距離底部父視圖為 padding。

10:  [wideView(>[email protected])]  :視圖的寬度為至少為60 不能超過  700 ,最大為1000

2. 通過函數顯示地添加一個個約束
@interface NSLayoutConstraint : NSObject...@property (readonly, assign) id firstItem;@property (readonly) NSLayoutAttribute firstAttribute;@property (readonly) NSLayoutRelation relation;@property (readonly, assign) id secondItem;@property (readonly) NSLayoutAttribute secondAttribute;@property (readonly) CGFloat multiplier;@property CGFloat constant;...+(instancetype)constraintWithItem:(id)firstItem attribute:(NSLayoutAttribute)firstAttribute  relatedBy:(NSLayoutRelation)relation  toItem:(id)secondItem attribute:(NSLayoutAttribute)secondAttribute  multiplier:(CGFloat)multiplier constant:(CGFloat)constant;

主要是通過上面的類函數顯示地添加約束。

這個我也是學習的別人的,地址:http://www.2cto.com/kf/201504/391282.html

這個寫的很詳細,大家看了應該就會了。

3. 第三方開源架構:masonry

這個主要用塊來做的,很清晰明了,大家可以去學習源碼,很有益。

不過我自己也還沒看,只是把別人寫的學習了下,大家有興趣地也可以去學習

地址:http://adad184.com/2014/09/28/use-masonry-to-quick-solve-autolayout/

iOS 自動布局詳細介紹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.