iOS 之自動佈局

      項目要作iPhone版和iPad的適配,就找了一些資料 關於iOS的自動佈局,學習的一些收穫以及心得給你們分享一下。
      xib的佈局就不說了,就是線的鏈接,主要分享一下純代碼的一些自動佈局的學習心得。
      Autolayout的強大是毋庸質疑的,當你熟悉了它以後,你確定會以爲它很方便的實現佈局,佈局將會比使用frame的絕對座標時還方便。
     UIView *superview = self;
UIView *view1 = [[UIView alloc] init];
 view1.translatesAutoresizingMaskIntoConstraints = NO; view1.backgroundColor = [UIColor greenColor]; [superview addSubview:view1]; UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10); [superview addConstraints:@[ //view1 constraints [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeTop multiplier:1.0 constant:padding.top], [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeLeft multiplier:1.0 constant:padding.left], [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-padding.bottom], [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeRight multiplier:1 constant:-padding.right], ]];
最初,我在許多地方看到佈局的時候,關於這句話一直不太理解 UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);以後找了一些資料,UIEdgeInsets 是控件的屬性,由函數 UIEdgeInsetsMake ( CGFloat top, CGFloat left, CGFloat bottom, CGFloat right );  構造出,分別表示其中的內容/標題/圖片離各邊的距離。
這只是其中一種寫法,如下還有一個例子來說解一下:

         UIView *redView = [[UIView alloc] init];git

         redView.backgroundColor = [UIColor redColor];github

         [self.view addSubview:redView];ide

         [redView setTranslatesAutoresizingMaskIntoConstraints:NO]; //標明將使用autolayout方式來佈局函數

         NSMutableArray *tmpConstraints = [NSMutableArray array];佈局

 constraintsWithVisualFormat:參數爲NSString型,指定Contsraint的屬性,是垂直方向的限定仍是水平方向的限定,參數定義通常以下:

          V:|-(>=XXX) :表示垂直方向上相對於SuperView大於、等於、小於某個距離;學習

          如果要定義水平方向,則將V:改爲H:便可;  在接着後面-[]中括號裏面對當前的View/控件 的高度/寬度進行設定;spa

          options:字典類型的值;這裏的值通常在系統定義的一個enum裏面選取orm

        metrics:nil;通常爲nil ,參數類型爲NSDictionary,從外部傳入 //衡量標準

          views:就是上面所加入到NSDictionary中的綁定的View圖片

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

       使用規則:

            |: 表示父視圖

           -: 表示距離

           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(>=60@700)]  :視圖的寬度爲至少爲60 不能超過  700 ,最大爲1000
 例子:

          NSArray *array0 = [NSLayoutConstraint constraintsWithVisualFormat:@"|-50-[redView(>=100)]" options:1 metrics:nil views:NSDictionaryOfVariableBindings(redView)];

          [tmpConstraints addObjectsFromArray:array0];

          NSArray *array1 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-100-[redView(==150)]" options:1 metrics:nil views:NSDictionaryOfVariableBindings(redView)];   

          [tmpConstraints addObjectsFromArray:array1];

        [self.view addConstraints:tmpConstraints];

          greenView = [[UIView alloc] init];

          greenView.backgroundColor = [UIColor greenColor];

        [self.view addSubview:greenView]; 
      [greenView setTranslatesAutoresizingMaskIntoConstraints:NO];
       NSMutableArray *tmpConstrains = [NSMutableArray array];
      [tmpConstrains addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[redView]-[greenView(>=100)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(redView,greenView)]];
        [tmpConstrains addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-100-[greenView(==150)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(greenView)]];

           [self.view addConstraints:tmpConstrains];

           [self setTopLayout:[array1 objectAtIndex:0]];

    [self setLeftLayout:[array0 objectAtIndex:1]];

固然這種寫的比較繁瑣,也比較耗時,以後發現了一個第三方庫,會使得自動佈局變的簡單 ,https://github.com/SnapKit/Masonry,具體使用就不詳解了,裏面有例子介紹。
相關文章
相關標籤/搜索