我們知道,現(xiàn)在已經(jīng)不像以前那樣只有一個尺寸涤垫,現(xiàn)在最少的iPhone開發(fā)需要最少需要適配三個以上尺寸漾肮。因此以前我們可以使用硬坐標(biāo)去設(shè)定各個控件的位置,但是現(xiàn)在的話已經(jīng)不可以了灸眼,我們需要去做適配卧檐,也許你說可以使用兩套UI或兩套以上的UI,但那樣不高效也不符合設(shè)計焰宣。iOS有兩大自動布局利器:autoresizing和autolayout(autolayout是IOS6以后新增)霉囚。autoresizing是UIView的屬性,一直存在匕积,使用也比較簡單盈罐,但是沒有autolayout那樣強(qiáng)大。如果你的界面比較簡單闪唆,要求的細(xì)節(jié)沒有那么高盅粪,那么你完全可以使用autoresizing去進(jìn)行自動布局。也就意味著苞氮,現(xiàn)在湾揽,做IOS開發(fā),屏幕適配是必須考慮的問題笼吟,而實(shí)現(xiàn)屏幕的適配的主要方式就是autolayout库物,而使用autolayout的關(guān)鍵步驟就是為控件添加相應(yīng)的約束,
下面贷帮,我們就對約束的添加做一些說明戚揭。
一:通過系統(tǒng)提供的面板實(shí)現(xiàn)約束的添加
現(xiàn)在IOS6以上,系統(tǒng)會自動選擇使用autolayout,在“show the file
inspector”面板中可以找到這個屬性:
撵枢,如果選擇了這個屬性民晒,那么在編輯區(qū)域的右下方就可以看到一些有關(guān)autolayout的選項了:
首先精居,我們對對autolayout主要使用選項做一些說明,其實(shí)常用的主要是三個選項:
1.Align面板:
2.Pin面板:
細(xì)節(jié)說明:constraint to margin:選項的作用潜必。這個屬性是IOS8才添加的靴姿,它默認(rèn)會在屏幕左右添加8個點(diǎn)的邊距,也就意味著參考不是從屏幕邊緣0的位置開始的磁滚,而是從8個點(diǎn)的位置開始的佛吓。一般來說,對于直接參考屏幕的控件垂攘,可以選擇這個選項维雇,如果是對于子控件,就沒有必要選擇了晒他。
3.Resolve面板:
之后吱型,我們介紹一下約束的添加方式。說白了陨仅,所謂的約束的本質(zhì)就是為控件設(shè)置好frame屬性值津滞,只不過它添加了參照,而不像frame屬性一樣掂名,只是針對控件本身据沈。所謂參照就是它可以在其它控件或者父容器(如屏幕)有變化的時候,讓自身的frame也產(chǎn)生合理的變化饺蔑。下面以一個簡單案例來說明一下約束的添加:
1.案例結(jié)果圖:
2.添加相應(yīng)的view控件锌介,選擇Pin面板,添加左和上的約束:
注意猾警,不要選擇更新約束孔祸,因?yàn)椋绻s束不能正確的得到控件的frame屬性发皿,那么系統(tǒng)將很有可能不能正確的繪制出控件崔慧,只有當(dāng)frame有四個屬性(size(width.height),origin:(x,y))都能通過約束正確的計算出來才能更新約束。
3穴墅,設(shè)置寬高惶室,我們需要view的寬度和高度都是屏幕的一半,但是玄货,通過寬高屬性卻不能進(jìn)行設(shè)置皇钞,否則就是固定寬高數(shù)值,以后不能進(jìn)行屏幕的自動適配了松捉。這個時候夹界,面板就不夠用,我們還需要使用到約束的修改屬性面板隘世,具體實(shí)現(xiàn)如下:
3.1先為view添加與屏幕右和下邊距為0--view會填充整個屏幕
3.2找到約束可柿,選擇想修改的約束鸠踪,我們想修改view與屏幕右和下的約束關(guān)系,那就一個一個選擇這些約束進(jìn)行修改复斥,例如我們先選擇右邊距約束:
然后营密,查看約束的具體的屬性:
那么一切都一目了然了。根據(jù)里面的序號讀一遍就可以得到約束這個結(jié)果:紅色view的最右邊等于父容器的最右邊數(shù)值乘以1加上0永票,很明顯卵贱,就是紅色view的最右邊與父容器的最右邊對齊滥沫,也就是等寬侣集。所以根據(jù)示例結(jié)果,只需要將Multiplier修改為0.5兰绣,紅色view的寬度就是父容器寬度的一半了世分,對于高度也是同樣的處理方式。
說到這里缀辩,就不得不說一下在sb中還有一種方面的添加約束的方式:拖線臭埋。還是上面那個案例,剛才我們是通過添加四個方向的邊距約束(特別是右臀玄,下)達(dá)到紅色view的寬高和高度為父容器的一半瓢阴,我們也可以通過直接設(shè)置紅色view的寬高和父容器的寬高之間的關(guān)系來達(dá)到同樣的效果。
1.拖線:
2.這里需要說明的是健无,拖線的方向決定了顯示出的菜單項荣恐,如果往左下方向拖線,那么就可以看到添加當(dāng)前控件與父容器左邊距和底邊距的選項累贤。其它方向的拖線一樣的道理叠穆。這里我們選擇等寬等高(按住shift鍵可以同時添加多個約束):
添加后的約束列表:
3.修改添加了等寬等高約束:
讀出來就是這樣的:blueView的寬度等于父容器的寬度乘以0.5加上0,也就是寬度為父容器寬度一半。
其它幾個view的制作方式基本一樣啦臼膏。
二:通過代碼實(shí)現(xiàn)約束的添加
代碼添加約束其實(shí)就是將約束的屬性面板所表達(dá)的含義使用代碼進(jìn)行描述硼被,官方文檔中,它的基本公式為:
意思是:第一個item的屬性=(所參照的item的屬性*倍數(shù))+常量值渗磅。
1.添加約束的類: NSLayoutConstraint
2.添加約束的常用方法:
[NSLayoutConstraint
constraintWithItem:<#(第一個item)#> attribute:<#(某個屬性)#> relatedBy:<#(屬性與屬性之間的關(guān)系)#> toItem:<#(參照的item)#> attribute:<#(被參照item的指定屬性)#> multiplier:<#(倍數(shù))#> constant:<#(增加的常量)#>];
3.參數(shù)的一些說明:
3.1.NSLayoutRelation:這是一個枚舉嚷硫,說明了屬性之間的關(guān)系,需要注意的是始鱼,如果關(guān)系設(shè)置為等于仔掸,但是后期因?yàn)槟承┰蛟斐蓪傩灾挡辉偈堑扔冢瑒t系統(tǒng)會給出相應(yīng)的警告风响。
NSLayoutRelationLessThanOrEqual = -1,---小于等于
NSLayoutRelationEqual = 0,---等于
NSLayoutRelationGreaterThanOrEqual = 1, --大于等于
3.2. NSLayoutAttribute:item的屬性:
NSLayoutAttributeLeft = 1,左
NSLayoutAttributeRight,右
NSLayoutAttributeTop,頂
NSLayoutAttributeBottom,底
NSLayoutAttributeLeading,左
NSLayoutAttributeTrailing,右
NSLayoutAttributeWidth,寬
NSLayoutAttributeHeight,高
NSLayoutAttributeCenterX,水平中心
NSLayoutAttributeCenterY,垂直中心
NSLayoutAttributeBaseline,基線
NSLayoutAttributeLastBaseline = NSLayoutAttributeBaseline,相當(dāng)于嘉汰,兩者等價
------------下面是ios8之后的如果想添加默認(rèn)邊距的屬性列表--------------
NSLayoutAttributeFirstBaseline NS_ENUM_AVAILABLE_IOS(8_0),
NSLayoutAttributeLeftMargin NS_ENUM_AVAILABLE_IOS(8_0),
NSLayoutAttributeRightMargin NS_ENUM_AVAILABLE_IOS(8_0),
NSLayoutAttributeTopMarginNS_ENUM_AVAILABLE_IOS(8_0),
NSLayoutAttributeBottomMargin NS_ENUM_AVAILABLE_IOS(8_0),
NSLayoutAttributeLeadingMargin NS_ENUM_AVAILABLE_IOS(8_0),
NSLayoutAttributeTrailingMargin NS_ENUM_AVAILABLE_IOS(8_0),
NSLayoutAttributeCenterXWithinMarginsNS_ENUM_AVAILABLE_IOS(8_0),
NSLayoutAttributeCenterYWithinMargins NS_ENUM_AVAILABLE_IOS(8_0),
NSLayoutAttributeNotAnAttribute = 0這不是一個屬性状勤,如果一個item的約束不需要參照其它的item,那么就使用這個鞋怀。
說明:NSLayoutAttributeLeft| NSLayoutAttributeLeading双泪,NSLayoutAttributeRight| NSLayoutAttributeTrailing的區(qū)別:
NSLayoutAttributeLeft和NSLayoutAttributeRight代表從左到右進(jìn)行布局,NSLayoutAttributeLeading和NSLayoutAttributeTrailing代表從前到后進(jìn)行布局密似,在我國NSLayoutAttributeLeft和NSLayoutAttributeLeading是一個效果的焙矛,布局習(xí)慣從左到右,但在有些國家地區(qū)(如中東地區(qū)等)残腌,布局習(xí)慣從右往左村斟。那么NSLayoutAttributeRight反而和NSLayoutAttributeLeading是一個效果了,為了避免這些地區(qū)的問題抛猫,我們推薦使用:NSLayoutAttributeLeading和NSLayoutAttributeTrailing(比較安全和常用)
4.使用代碼實(shí)現(xiàn)剛才的案例示例:
4.1一定要去除autoresizing屬性
4.2創(chuàng)建約束
4.3根據(jù)約束添加規(guī)則添加約束到控件或者父容器
4.4代碼:
-(void)viewDidLoad {
[superviewDidLoad];
//去除autoresizing屬性
self.redView.translatesAutoresizingMaskIntoConstraints=NO;
self.view.translatesAutoresizingMaskIntoConstraints=NO;
//添加頂部約束
NSLayoutConstraint*constraintT=[NSLayoutConstraintconstraintWithItem:self.redViewattribute:NSLayoutAttributeToprelatedBy:NSLayoutRelationEqualtoItem:self.redView.superviewattribute:NSLayoutAttributeTop multiplier:1constant:0];
//添加左邊約束
NSLayoutConstraint*constraintL=[NSLayoutConstraintconstraintWithItem:self.redViewattribute:NSLayoutAttributeLeftrelatedBy:NSLayoutRelationEqualtoItem:self.redView.superviewattribute:NSLayoutAttributeLeft multiplier:1constant:0];
//添加寬度約束
NSLayoutConstraint*constraintW=[NSLayoutConstraintconstraintWithItem:self.redViewattribute:NSLayoutAttributeWidthrelatedBy:NSLayoutRelationEqualtoItem:self.redView.superviewattribute:NSLayoutAttributeWidth multiplier:0.5constant:0];
////添加高度約束
NSLayoutConstraint*constraintH=[NSLayoutConstraintconstraintWithItem:self.redViewattribute:NSLayoutAttributeHeightrelatedBy:NSLayoutRelationEqualtoItem:self.redView.superviewattribute:NSLayoutAttributeHeight multiplier:0.5constant:0];
//添加約束到控件--根據(jù)規(guī)則蟆盹,添加到父容器
[self.redView.superview addConstraints:@[constraintT,constraintL,constraintW,constraintH]];
}
蘋果還提供一種添加約束的VFL語言,有興趣的也可以去看一下相關(guān)的文檔說明闺金。
當(dāng)然逾滥,以后在進(jìn)行開發(fā)過程中,效率至上败匹,一般會使用第三個框架寨昙。如常用的框架有Masonry,一般第三方框架找到框架的幫助文檔就能方便的學(xué)習(xí)和使用了掀亩。