ios開發中關于約束的介紹

關于布局約束的發展史:

1.通過代碼計算frame

2.Autoresizing(設置控件與父控件的相對關系,從而實現間接設置frame,iOS系統在運行時會根據設置的規則,計算出對應的frame,無需手動計算frame)

–通過設置子控件與父控件的關系來決定如何顯示控件

3.AutoLayout

–通過設置某控件與任意其他控件間的關系來決定如何顯示這個控件,不僅僅局限與父子控件

4.SizeClasses –通過SizeClasses+Auto

Layout實現針對不同屏幕為控件設置不同的約束

關于約束的總結:

?總結:如果添加的約束和其它控件沒有關系,會添加到自己身上

?總結:如果是父子關系,設置子控件的約束,約束會添加到父控件上

?注意:兩個控件是兄弟關系

?總結:如果是兄弟關系,設置兩兄弟的約束,約束會添加到它們最近的共同父控件上

代碼如何實現AutoLayout:

Layout的步驟

p利用NSLayoutConstraint類創建具體的約束對象

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

-(void)addConstraint:(NSLayoutConstraint *)constraint;

-(void)addConstraints:(NSArray *)constraints;

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

?創建約束對象的常用方法

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

pview1:要約束的控件pattr1:約束的類型(做怎樣的約束)prelation:與參照控件之間的關系pview2:參照的控件pattr2:約束的類型(做怎樣的約束)pmultiplier:乘數

pc:常量

?自動布局有個核心公式

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

?代碼實現Auto Layout的注意點

p1》要先禁止Autoresizing功能,設置view的下面屬性為NO

view.translatesAutoresizingMaskIntoConstraints = NO;

p2》添加約束之前,一定要保證相關控件都已經在各自的父控件上

p3》不用再給view設置frame

VFL的使用

?使用VFL來創建約束數組

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

pformat:VFL語句popts:約束類型pmetrics:VFL語句中用到的具體數值pviews:VFL語句中用到的控件

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

NSDictionaryOfVariableBindings(...)

基于Autolayout的動畫

?在修改了約束之后,只要執行下面代碼,就能做動畫效果

[UIView animateWithDuration:1.0 animations:^{

[添加了約束的viewlayoutIfNeeded];}];

思路:通過添加約束后,在修改約束的值,來實現動畫。

注意:調用 某個 view 的layoutIfNeeded方法, 會先更新這個 view 的約束, 這個 view 的子控件的約束。

?蘋果強烈建議使用AutoLayout,所以在創建新的項目時已經默認幫我們選擇使用AutoLayout,由于Autoresizing和AutoLayout二者是互斥的,同時只能使用其中一種,要想使用Autoresizing的時候必須先禁用AutoLayout,

pVFL全稱是VisualFormatLanguage,翻譯過來是“可視化格式語言”

pVFL是蘋果公司為了簡化Autolayout的編碼而推出的抽象語言

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

p水平方向上canelButton寬72,acceptButton寬50,它們之間間距12

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

p水平方向上,wideView寬度大于等于60point,該約束條件優先級為700(優先級最大值為1000,優先級越高的約束越先被滿足)

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

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

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

水平方向上,Find距離父view左邊間距為10,之后Find后面是FindNext它們之間是默認寬度;再之后是寬度不小于20的FindField,它和FindNext以及父view右邊緣的間距都是默認寬度。(豎線“|”表示superview的邊緣

他的使用

?使用VFL來創建約束數組

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

pformat:VFL語句popts:約束類型pmetrics:VFL語句中用到的具體數值pviews:VFL語句中用到的控件創建一個字典(內部包含VFL語句中用到的控件)的快捷宏定義

NSDictionaryOfVariableBindings(...)

關于約束

1.autoresizing

1.1 六根線

外邊四根線,設置的是距離四周是否固定

中間兩根線,設置的是子控件的寬高是否隨著父控件的變化而變化(默認是按照一定比例變化)

1.2 中間兩根線

先放一個控件,然后在這個控件里面添加一個自控件,改變外層控件的大小,讓里面的子控件根據約束自動變化

1.3 autoresizing的弊端

autoresizing都是相對于父控件進行設置的,當想設置兄弟控件的大小和間距的時候,就會發現無法設置

1.4 代碼使用autoresizing

self.redView.autoresizingMask

2.autolayout

四個按鈕

1. stack 將控件按照類似于集裝箱的樣式堆起來

2. 按鈕 設置的是多個按鈕的相對位置

3. 設置控件具體的信息(距離左右 寬高具體的值是多少)

4. 更新約束或者frame(針對約束可能出現的問題,進行調整的按鈕)

2.1 約束的使用(切記:以后frame僅僅在創建控件的時候使用,后期改變千萬不要用)

當使用frame的時候,需要設置 x y w h 四個信息

當使用約束的時候,也必須包含 x y w h 四個信息

2.2 紅色警告和黃色警告

紅色警告出現的原因:

1. 約束條件不足(如果約束沒有包含 x y 寬高 四個信息的時候)

增加約束

2. 約束有沖突(如果要增加約束,先刪除掉之前的約束)

黃色警告出現的原因: X Y 寬高 都有設置,但是展現的位置與約束不一致

解決方式:updata frame

2.3 刪除約束的四種方式

2.4 設置兄弟控件的約束

1. 建議,如果控件是出于界面的邊界處,建議以父控件為基準進行設置

2. 如果控件中包含具體值的約束和相對的約束,先設置具體值的約束,最后在設置相對的約束

3. 設置約束的時候建議一個一個控件的進行設置,不要多個一起,

4. 另外如果控件已經設置了約束,建議不要直接復制,如果復制,也建議把復制后的約束都刪除在添加

2.5 案例:

1.在界面上有一個藍色View 距離屏幕上 左 右 各有20個距離 高度是70

2.在藍色View的下方有一個紅色View,紅色View距離藍色View 有20個距離

3.并且紅色View和藍色View右邊對齊

4.紅色View的高度 與藍色一致,寬度是藍色一半

2.6 重要(約束計算的核心公式)

firstItem = secondItem * multiplier + constant

2.7 當一個控件,如果控件里面有內容的時候,可以只設置X Y 不設置寬高

這個時候寬高會根據 內容自動獲取

2.8 設置控件的某個位置是固定的

設置的時候有兩個注意點:

1. 找到相對的控件是哪一個

2. 相對的約束要明確哪一個

2.9 代碼添加約束

2.9.1. 先取消autoresizing

blueView.translatesAutoresizingMaskIntoConstraints = NO;

2.9.2. 設置約束 firstItem = secondItem * multiplier + constant

//第一個參數:WithItem :代表的是 firstItem

//第二個參數:attribute:NSLayoutAttributeTop 要做約束的線是那一條

//第三個參數:relatedBy? 比較的方式? =? <= >=

//第四個參數:toItem 代表的是secondItem 第二個控件

//第五個參數:attribute:<#(NSLayoutAttribute)#> 相對于第二個控件的什么位置

NSLayoutConstraint *blueViewTop = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:20];

2.9.3. 添加約束(約束由哪個控件進行添加),如果不存在比較關系->放在自身

如果存在比較關系—>就去找比較控件它們相同的父控件然后添加

[self.view addConstraint:blueViewTop];

2.10 VFL的使用

2.11 Masonry的使用

2.11.1 導入第三方框架

#import "Masonry.h"

2.11.2 pch文件

如果多個文件,使用的資源是一樣的,那就可以將相同的東西,作為宏命令定義的pch文件中

這樣多個文件就可以共享

3. SizeClasses的作用

如果想讓不同的尺寸界面,顯示的內容不一樣的話,就是用SizeClasses

3.1 QQ登陸

3.2 界面有一個圖片,在橫屏和豎屏下顯示的圖片不一樣

1. 在不同的sizeClassses中,不同的屏幕中放入不同的控件

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容