国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

AutoLayout的三種設置方式之——NSLayoutConstraint代碼篇

2019-11-14 19:30:38
字體:
來源:轉載
供稿:網友

AutoLayout是從IOS 6開始蘋果引入來取代autoresizing的新的布局技術,該技術有三種設置方式,等下我來為大家一一敘述一下。

在說三種設置方式前,我們先簡單的說一下autolayout能夠設置哪些行為。

1.視圖的大小(即視圖的絕對大小)。

2.視圖的位置(視圖相對于父視圖或者兄弟視圖的位置)。

3.視圖的對齊方式(相對于父視圖或者相對于兄弟視圖)。

  可以看到autolayout相比autoresizing技術來說要靈活的多,該技術有很多布局的約束設置。這次主要講的用代碼來設置AutoLayout,代碼向我們需要添加autoLayout視圖使用該方法

+(instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;

該方法實際上就是滿足一個數學關系

item1 =(>=,<=) multiplier * item2 + constant。

參數說明:

view1:第一個視圖即item1。

attr1:是第一個視圖選擇的屬性

relation:即中間的關系(= , >= , <=)

view2:第二個視圖即item2。

attr2:是第二個視圖選擇的屬性

c:就是常熟constant。

  舉個簡單的例子來說我們想設置第一個視圖的寬度是第二個視圖寬度的2倍,我們可以這樣寫:

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:view2 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:view1 attribute:NSLayoutAttributeWidth multiplier:2 constant:0]];

可以看到這里我們item1是view1,item2是view2,attr1是attribute:NSLayoutAttributeWidth,attr2是attribute:NSLayoutAttributeWidth,relation是NSLayoutRelationEqual,mutiplier 是2,constant是0.

帶入上面的公式得:

第一個視圖(寬度) = 2 * 第二個視圖(寬度) + 0 

如下是我們所有可以控制的屬性:

NSLayoutAttributeLeft視圖的左邊
NSLayoutAttributeRight視圖的右邊
NSLayoutAttributeTop視圖的上邊
NSLayoutAttributeBottom視圖的下邊
NSLayoutAttributeLeading視圖的前邊
NSLayoutAttributeTrailing視圖的后邊
NSLayoutAttributeWidth視圖的寬度
NSLayoutAttributeHeight視圖的高度
NSLayoutAttributeCenterX視圖的中點的X值
NSLayoutAttributeCenterY視圖中點的Y值
NSLayoutAttributeBaseline視圖的基準線
NSLayoutAttributeNotAnAttribute無屬性

 

  

 

 

 

 

 

 

 

 

 

 

 

這里解釋一下前邊NSLayoutAttributeLeading和后邊NSLayoutAttributeTrailing,這里前邊和后邊并不是總是為左邊和右邊的,有些國家的前邊是右邊后邊是左邊所以這樣設定是為了國際化考慮。還有視圖基準線NSLayoutAttributeBaseline通常是指視圖的底部放文字的地方。

  接下我們一起來看一個demo

  我們想讓兩個視圖Y方向居中,第一個視圖距離左邊緣20,第一個視圖以第二個視圖等大并且X方向距離為100。

 1 UIView *view1 = [[UIView alloc] init]; 2     UIView *view2 = [[UIView alloc] init]; 3     [self.view addSubview:view1]; 4     [self.view addSubview:view2]; 5     view1.translatesAutoresizingMaskIntoConstraints = NO; 6     view2.translatesAutoresizingMaskIntoConstraints = NO; 7     view1.backgroundColor = [UIColor blueColor]; 8     view2.backgroundColor = [UIColor grayColor]; 9     //set view1 height and width10     [view1 addConstraint:[NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:100]];11     [view1 addConstraint:[NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:100]];12     //set view2 height and width13     [self.view addConstraint:[NSLayoutConstraint constraintWithItem:view2 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:view1 attribute:NSLayoutAttributeWidth multiplier:1 constant:0]];14     [self.view addConstraint:[NSLayoutConstraint constraintWithItem:view2 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:view1 attribute:NSLayoutAttributeHeight multiplier:1 constant:0]];15     //set relationship between view1 and view216     [self.view addConstraint:[NSLayoutConstraint constraintWithItem:view2 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:view1 attribute:NSLayoutAttributeRight multiplier:1 constant:100]];17     [self.view addConstraint:[NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:view2 attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]];18     //set relationship between topView and view119     [self.view addConstraint:[NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:20]];20     [self.view addConstraint:[NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]];

下面我們一起來看一下這段代碼

注意 5、6行設置view的 translatesAutoresizingMaskIntoConstraints 屬性為NO,意思就是遵循autoLayout拋棄原有設置的高度寬度等,使用autolayout的視圖必須要設置該屬性。

10、11行設置view1的寬和高,大家可能已經發現item2為nil并且attrbute為attribute:NSLayoutAttributeNotAnAttribute,這樣做我們帶入公式就會明白

item1 = m * 0 + constant。也就是直接設置本視圖的寬和高。

13、14行是設置view2的寬高和view1相同,這里細心的同學可能會發現添加約束的對象并不是像上面設置寬高時的view1,而是它們共同的父視圖self.view。因為在autolayout中有這樣的規定,如果是一元約束,即只針對自己的約束,那么就直接添加在該視圖上。如果是二元約束,那么就必須要添加在它們的共同最近的父視圖上面。

15、16行是設置view1和view2的關系,設置view1和view2具有相同的Y,并且view2在view1右邊距離100的位置。

18、19行最后我們設置了view1左邊距離父視圖左邊20的距離,并且view1的Y等于父視圖Y的中點值。

通過以上的設置,我們運行的結果就是:

如圖,視圖1在距左邊20的位置,視圖1視圖2都Y方向居中并且相距100的距離。

刪除約束:

  removeConstraint:(NSLayoutConstraint *) constraint;

在刪除約束時要找準約束的綁定對象。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西林县| 水富县| 当阳市| 广平县| 那坡县| 疏勒县| 遂平县| 钦州市| 镇远县| 威信县| 旌德县| 绥棱县| 龙泉市| 英超| 天峨县| 图木舒克市| 海门市| 河间市| 松潘县| 巴马| 广水市| 柳林县| 神农架林区| 七台河市| 宁安市| 格尔木市| 乌拉特中旗| 马尔康县| 永新县| 内黄县| 三穗县| 松江区| 荃湾区| 秭归县| 米林县| 伊金霍洛旗| 昌吉市| 昌吉市| 大埔县| 崇仁县| 苏尼特右旗|