基礎 (十二) : Autolayout

適配

什么是適配?

適應、兼容各種不同的情況

移動開發(fā)中掌逛,適配的常見種類

系統(tǒng)適配

針對不同版本的操作系統(tǒng)進行適配

屏幕適配

針對不同大小的屏幕尺寸進行適配

iOS 4:autoResizing做屏幕適配

iOS 6 autoLayout 使用最廣泛的屏幕適配

iOS 8 sizeClass 最新的屏幕適配

屏幕適配

iPhone的尺寸

3.5inch畏线、4.0inch、4.7inch究流、5.5inch

iPad的尺寸

7.9inch、9.7inch

屏幕方向

豎屏

橫屏

適配的歷史:

4S以前:

坐標都是寫死的

Uibutton *btn = nil;

Btn.frame = CGRectMake(20,20,320,480);

注意:之前高度寬度都是寫死的

點和像素

在用戶眼中

屏幕是由無數(shù)個像素組成的

像素越多动遭,屏幕越清晰

在開發(fā)者眼中

屏幕是由無數(shù)個點組成的芬探,點又是由像素組成的

像素越多,屏幕越清晰


未命名圖片.png

未命名圖片.png

什么是Autolayout ?

Autolayout是一種“自動布局”技術厘惦,專門用來布局UI界面的

Autolayout自iOS 6開始引入偷仿,由于Xcode 4的不給力哩簿,當時并沒有得到很大推廣

自iOS 7(Xcode 5)開始,Autolayout的開發(fā)效率得到很大的提升

蘋果官方也推薦開發(fā)者盡量使用Autolayout來布局UI界面

Autolayout能很輕松地解決屏幕適配的問題

簡介

Autoresizing(局限性很大不能很好的滿足開發(fā)者,所以有了Autolayou的產(chǎn)生)

在Autolayout之前酝静,有Autoresizing可以作屏幕適配节榜,但局限性較大,有些任務根本無法完成

相比之下别智,Autolayout的功能比Autoresizing強大很多

Autolayout的2個核心概念

參照

約束

未命名圖片.png

未命名圖片.png

未命名圖片.png

未命名圖片.png

Autolayout的警告和錯誤

警告

控件的frame不匹配所添加的約束,
比如

比如約束控件的寬度為100,
而控件現(xiàn)在的寬度是110

錯誤

缺乏必要的約束, 比如

只約束了寬度和高度,
沒有約束具體的位置

(就是只有給這個控件設置了寬度和高度,但是沒告訴它具體顯示在哪個位置,這時候會報錯)

兩個約束沖突, 比如

1個約束控件的寬度為100, 1個約束控件的寬度為110

代碼實現(xiàn)Autolayout

代碼實現(xiàn)Autolayout的步驟

利用NSLayoutConstraint類創(chuàng)建具體的約束對象

添加約束對象到相應的view上

(void)addConstraint:(NSLayoutConstraint *)constraint;

(void)addConstraints:(NSArray *)constraints;

例:

NSLayoutConstraint
*blueRightLc = [NSLayoutConstraint
constraintWithItem:blueView

attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual
toItem:redView attribute:NSLayoutAttributeLeft
multiplier:1.0 constant:-20];

[self.view

addConstraint:blueRightLc];

NSLayoutConstraint

一個NSLayoutConstraint對象就代表一個約束

創(chuàng)建約束對象的常用方法

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

view1 :要約束的控件

attr1 :約束的類型(做怎樣的約束)

relation :與參照控件之間的關系

view2 :參照的控件

attr2 :約束的類型(做怎樣的約束)

multiplier :乘數(shù)

c :常量

代碼實現(xiàn)Autolayout的注意點

要先禁止autoresizing功能宗苍,設置view的下面屬性為NO,不設置否則無法實現(xiàn)

view.translatesAutoresizingMaskIntoConstraints= NO;

添加約束之前,一定要保證相關控件都已經(jīng)在各自的父控件上

不用再給view設置frame

自動布局的核心計算公式

自動布局的核心計算公式

obj1.property1 =(obj2.property2 * multiplier)+ constant
value

未命名圖片.png

未命名圖片1.png

未命名圖片2.png

未命名圖片3.png

VFL示例

H:[cancelButton(72)]-12-[acceptButton(50)]

canelButton寬72薄榛,acceptButton寬50讳窟,它們之間間距12

H:[wideView(>=60@700)]

wideView寬度大于等于60point,該約束條件優(yōu)先級為700(優(yōu)先級最大值為1000敞恋,優(yōu)先級越高的約束越先被滿足)

V:[redBox][yellowBox(==redBox)]

豎直方向上丽啡,先有一個redBox,其下方緊接一個高度等于redBox高度的yellowBox

H:|-10-[Find]-[FindNext]-[FindField(>=20)]-|

水平方向上硬猫,F(xiàn)ind距離父view左邊緣默認間隔寬度补箍,之后是FindNext距離Find間隔默認寬度;再之后是寬度不小于20的FindField浦徊,它和FindNext以及父view右邊緣的間距都是默認寬度馏予。(豎線“|” 表示superview的邊緣)

VFL的使用

使用VFL來創(chuàng)建約束數(shù)組

(NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary
*)metrics views:(NSDictionary *)views;

format :VFL語句

opts :約束類型

metrics :VFL語句中用到的具體數(shù)值

views :VFL語句中用到的控件

創(chuàng)建一個字典(內(nèi)部包含VFL語句中用到的控件)的快捷宏定義

NSDictionaryOfVariableBindings(...)

基于Autolayout的動畫:

在修改了約束之后,只要執(zhí)行下面代碼盔性,就能做動畫效果

[UIView animateWithDuration:1.0 animations:^{

[添加了約束的view layoutIfNeeded];(強制自動布局)

}];

Masonry

目前最流行的Autolayout第三方框架

用優(yōu)雅的代碼方式編寫Autolayout

省去了蘋果官方惡心的Autolayout代碼

大大提高了開發(fā)效率

框架地址:
https://github.com/SnapKit/Masonry

mas_equalTo和equalTo

默認情況下

mas_equalTo有自動包裝功能霞丧,比如自動將20包裝為@20

equalTo沒有自動包裝功能

如果添加了下面的宏,那么mas_equalTo和equalTo就沒有區(qū)別

define MAS_SHORTHAND_GLOBALS

// 注意:這個宏一定要添加到#import "Masonry.h"前面

mas_width和width

默認情況下

width是make對象的一個屬性冕香,用來添加寬度約束用的蛹尝,表示對寬度進行約束

mas_width是一個屬性值,用來當做equalTo的參數(shù)悉尾,表示某個控件的寬度屬性

如果添加了下面的宏突那,mas_width也可以寫成width

define MAS_SHORTHAND

mas_height、mas_centerX以此類推

可有可無的用法

以下方法都僅僅是為了提高可讀性构眯,可有可無

  • (MASConstraint*)with {

    return
    self;

}

  • (MASConstraint*)and {

    return
    self;

}

***********************NO6******************************

***********************NO6******************************

  1. 適配的歷史

4s 以前 不需要適配

  坐標都是寫死的

[uiScreen mainScreen ].bounds.size

UIButton *btn = nil;

btn.frame = CGRectMake(20,20,320,480)

ios 4

autoResizing 做屏幕適配

ios 6

autoLayout 使用最廣泛的屏幕適配

ios 8

sizeClass 最新的屏幕適配

  1. autoResizing

注意點 不能跟autoLayout 共存

高度/寬度 跟著父控件的高度/寬度進行縮放

四根線 固定那個位置 一般兩根線就能確定一個位置

局限性 兄弟控件不能設置間距 只能是相對于父控件

使用代碼 實現(xiàn)autoResizing 控件.autoresizingMask與storyboard中相反的 storyboard中是 固定那個方向 代碼是拉伸那個方向

UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingFlexibleRightMargin = 1 << 2,
UIViewAutoresizingFlexibleTopMargin = 1 << 3,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
UIViewAutoresizingFlexibleHeight = 1 << 4,
UIViewAutoresizingFlexibleWidth = 1 <<1,

  1. autoLayout:

概念

  1. 參照
      相對哪個控件設置約束
      哪個控件離當前空間最近,就參照哪個控件
  2. 約束
      尺寸
          寬高
      位置
      xy

trailing 右邊
leading 左邊

思路
1. 如果是兩個控件的話 那么先搞定一個

4.autoLayout使用代碼布局

autoLayout 與 autoResizing 不能共存

view.translatesAutoresizingMaskIntoConstraints = NO;(關閉autoResizing功能)

使用NSLayoutConstrain 調(diào)用 constrainWithItem

第一個參數(shù) 需要約束的控件

第二個參數(shù) 控件的屬性

第三個參數(shù) 等于 / <= / 大于等于

第四個參數(shù) 相對那個控件的約束

第五個參數(shù) 相對哪個控件的屬性

第六個參數(shù) multiplier 乘以??

第七個參數(shù) 常量 需要加還是減

注意點 以上操作哪個控件最大 就添加到哪個控件上,如果是兄弟那么就添加到老爸身上, 同一個爺爺?shù)牟煌陌职?br> 添加到爺爺身上

"添加約束到最大的控件上"
  1. vfl 布局子控件

抽象語言知道是神馬東西就可以了
H:|(控制器左邊)-20(間距)-redView-20(間距)-[blueView(顯示的控件)(==redView(控件的寬度等于紅色控件的寬度))]-20-|(控制器的右邊)

使用NSLayoutConstrain constraintsWithVisualFormat

第一個參數(shù) 水平或者是垂直方向的約束(字符串)

第二個參數(shù) 對齊的選項

第三個參數(shù) 使用到數(shù)字可以添加到字典中

第四個參數(shù) 將所有的控件的添加到字典中, 鍵值對
名字都是一樣的
"添加數(shù)組到self.view"

6.masonry使用

使用步驟

  1. 導入masonry的頭文件


  2. A控件需要約束


      使用A 調(diào)用mas_makeConstrain


      在block中設置約束


      make 就相當于

調(diào)用者(控件)

  1. 優(yōu)先級
    & 動畫

優(yōu)先級最高是的1000

  最低的是0

只要是優(yōu)先級小于1000的 那么就第二次執(zhí)行(當最高優(yōu)先級不存在)

動畫
當界面發(fā)生改變的時候 如果需要動畫重新布局
[self.view layoutIfNeeded]


**************************筆記****************************


注意:

如果使用autolayout來約束控件,
那fraem就失效了, 官方也不建議我們再設置frame了

寬度: 100

高度: 100

水平居中: X

垂直居中: Y

注意: 如果利用autolayout約束一個控件, 和我們以前使用frame約束控件一樣, 必須設置寬度/高度/X/Y , 如果缺少某一個約束就會報錯, 報錯有可能會引發(fā)一些未知的bug

如果有紅色警告:

代表缺少約束

如果有黃色警告:

代表控件當前的位置大小和約束的位置大小不一樣

距離頂部: 20 相當于設置了Y

距離左邊:20 相當于設置了X

距離右邊:20 相當于設置了寬度

距離底部:20 相當于設置了高度

注意:

在使用Autolayout時,最好給每個控件起一個名稱, 方便閱讀

紅色:

距離左邊:20 X

距離底部:20 Y

高度: 50

寬度:

紅色距離藍色有20的間隙

設置紅色的寬度和藍色的寬度一樣

藍色:

距離右邊:20 X

距離底部:20 Y

高度: 50

寬度:

iOS8,默認情況下,
左右兩邊會留出一段距離,,

紅色:

距離底部和左邊20 x/y

高度: 50

紅色距離藍色20 ((自動根據(jù)屏幕的寬度- 紅色左邊的20 + 藍色右邊的20 + 紅色和藍色之間的20 ) / 2)

藍色:

距離右邊20 x

Y: 設置藍色的頂部和紅色對齊

高度: 設置藍色的底部和紅色對齊

寬度: 50

藍色:

距離頂部:20 Y

距離左邊:20 X

距離右邊:20 寬

高度: 50

紅色:

高度和藍色一樣 高度

紅色右邊和藍色右邊對齊 X

距離藍色20 Y

first
item 紅色

relation
等于

second
item 藍色

constant
加上多少

multiplier
乘以多少

priority
優(yōu)先級

藍色:

距離頂部:20 Y

距離左邊:20 X

距離右邊:20 寬

高度: 50

紅色:

高度和藍色一樣 高度

紅色右邊和藍色右邊對齊 X

距離藍色20 Y

水平居中

圖片:

水平居中

垂直居中

距離左右為0

高度: 568 == 4inch

如果設置紅色View的寬度, 約束會自動添加到紅色VIew中

如果是設置紅色View和綠色View的左邊距離固定,約束會自動添加到綠色中(父子關系)

如果是設置紅色View和黑色View之間的距離固定, 約束會自動添加到控制器的View上(兄弟)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愕难,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惫霸,更是在濱河造成了極大的恐慌猫缭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壹店,死亡現(xiàn)場離奇詭異猜丹,居然都是意外死亡,警方通過查閱死者的電腦和手機硅卢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門射窒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藏杖,“玉大人,你說我怎么就攤上這事脉顿◎螋铮” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵弊予,是天一觀的道長祥楣。 經(jīng)常有香客問我开财,道長汉柒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任责鳍,我火速辦了婚禮碾褂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘历葛。我一直安慰自己正塌,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布恤溶。 她就那樣靜靜地躺著乓诽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咒程。 梳的紋絲不亂的頭發(fā)上鸠天,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音帐姻,去河邊找鬼稠集。 笑死,一個胖子當著我的面吹牛饥瓷,可吹牛的內(nèi)容都是我干的剥纷。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼呢铆,長吁一口氣:“原來是場噩夢啊……” “哼晦鞋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起棺克,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤悠垛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逆航,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鼎文,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年因俐,在試婚紗的時候發(fā)現(xiàn)自己被綠了拇惋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片周偎。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖撑帖,靈堂內(nèi)的尸體忽然破棺而出蓉坎,到底是詐尸還是另有隱情,我是刑警寧澤胡嘿,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布蛉艾,位于F島的核電站,受9級特大地震影響衷敌,放射性物質(zhì)發(fā)生泄漏勿侯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一缴罗、第九天 我趴在偏房一處隱蔽的房頂上張望助琐。 院中可真熱鬧,春花似錦面氓、人聲如沸兵钮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掘譬。三九已至,卻和暖如春呻拌,著一層夾襖步出監(jiān)牢的瞬間葱轩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工柏锄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酿箭,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓趾娃,卻偏偏與公主長得像缭嫡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抬闷,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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