屏幕適配—約束的添加

我們知道,現(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í)和使用了掀亩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舔哪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子槽棍,更是在濱河造成了極大的恐慌捉蚤,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刹泄,死亡現(xiàn)場離奇詭異外里,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)特石,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門盅蝗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姆蘸,你說我怎么就攤上這事丈钙≡钇剑” “怎么了幻碱?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵蚯涮,是天一觀的道長。 經(jīng)常有香客問我推捐,道長裂问,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮堪簿,結(jié)果婚禮上痊乾,老公的妹妹穿的比我還像新娘。我一直安慰自己椭更,他們只是感情好哪审,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虑瀑,像睡著了一般湿滓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舌狗,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天叽奥,我揣著相機(jī)與錄音,去河邊找鬼把夸。 笑死而线,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的恋日。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嘹狞,長吁一口氣:“原來是場噩夢啊……” “哼岂膳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起磅网,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谈截,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后涧偷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體簸喂,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年燎潮,在試婚紗的時候發(fā)現(xiàn)自己被綠了喻鳄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡确封,死狀恐怖除呵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爪喘,我是刑警寧澤颜曾,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站秉剑,受9級特大地震影響泛豪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一诡曙、第九天 我趴在偏房一處隱蔽的房頂上張望吕粹。 院中可真熱鬧,春花似錦岗仑、人聲如沸匹耕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稳其。三九已至,卻和暖如春炸卑,著一層夾襖步出監(jiān)牢的瞬間既鞠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工盖文, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嘱蛋,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓五续,卻偏偏與公主長得像洒敏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疙驾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容