Autoresizing
一個在AutoLayout之前處理布局的技術 處理的層面為父子層面的控件 和Autolayout不兼容
基本實現(xiàn)
xib
和storyboard
中使用Autoresizing
相對比較簡單-
代碼實現(xiàn):
- (void)viewDidLoad { [super viewDidLoad]; UIView *blueView = [[UIView alloc] init]; blueView.backgroundColor = [UIColor blueColor]; blueView.frame = CGRectMake(0, 0, 250, 250); [self.view addSubview:blueView]; self.blueView = blueView; UIView *redView = [[UIView alloc] init]; redView.backgroundColor = [UIColor redColor]; redView.frame = CGRectMake(0, 150, 250, 100); redView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth; [blueView addSubview:redView];
}
- 常見的mask:
```objc
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0, 距離父控件左邊的間距是伸縮的(不固定的)
UIViewAutoresizingFlexibleRightMargin = 1 << 2, 距離父控件右邊的間距是伸縮的(不固定的)
UIViewAutoresizingFlexibleTopMargin = 1 << 3, 距離父控件頂部的間距是伸縮的(不固定的)
UIViewAutoresizingFlexibleBottomMargin = 1 << 5, 距離父控件底部的間距是伸縮的(不固定的)
UIViewAutoresizingFlexibleWidth = 1 << 1, 寬度跟隨父控件的寬度進行自動伸縮
UIViewAutoresizingFlexibleHeight = 1 << 4, 高度跟隨父控件的高度進行自動伸縮
Autolayout
- Autolayout用來處理父子和同級層面的問題
- 6.0推出,7.0火起來
- 核心概念:約束、參照
- 實現(xiàn)方式:
-
xib
和storyboard
中使用Autolayout
相對比較簡單 -
NSLayoutConstraint
實現(xiàn)Autolayout
-
VFL
實現(xiàn)Autolayout
代碼添加Autolayout
先禁止autoresizing功能
view.translatesAutoresizingMaskIntoConstraints = NO;
這句代碼的作用是將view自帶的一些autoresizing轉換為AutoLayout的約束,可能會與自己添加的約束產生沖突等其他問題
為什么先添加到父控件上然后再添加約束?
因為有些約束需要添加到父控件上,如果沒有父控件那就不知道該往哪里添加了,so crash
約束添加在哪個view上?
一般來說一個view的約束只要有具體數值機會可以而不需要和其他的view產生關聯(lián),那么這個約束就會添加到這個view上。比如view的寬和高約束
如果一個view的一些約束關聯(lián)了父控件的一些值,那么這個約束會被添加到父控件上。比如view的左邊和父控件的左邊對齊
如果一個view和一個兄弟級別的view產生關聯(lián),那么約束會被添加到父控件身上。比如一個view和一個同級別的view的高度相等。但是如果他們沒有共同的父控件,那么會添加到最近的父控件身上
NSLayoutConstraint的基本使用
obj1.property1 =(obj2.property2 * multiplier)+ constant value
+(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 :乘數
c :常量
//以上的約束在生成后一定要添加在對應的view身上
VFL - Visual Format Language
H:[cancelButton(72)]-12-[acceptButton(50)]
:canelButton
寬72,acceptButton
寬50,它們之間間距12H:[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)]-|
:水平方向上,Find
距離父view
左邊緣默認間隔寬度,之后是FindNext
距離Find
間隔默認寬度;再之后是寬度不小于20的FindField
,它和FindNext
以及父view
右邊緣的間距都是默認寬度。(豎線“|” 表示superview
的邊緣)VFL的使用
//使用VFL來創(chuàng)建約束數組
+ (NSArray *)constraintsWithVisualFormat:(NSString *)format
options:(NSLayoutFormatOptions)opts
metrics:(NSDictionary *)metrics
views:(NSDictionary *)views;
format :VFL語句
opts :約束類型
metrics :VFL語句中用到的具體數值
views :VFL語句中用到的控件
創(chuàng)建一個字典(內部包含`VFL`語句中用到的控件)的快捷宏定義 這個宏可以生成和對象同名的key的字典
NSDictionaryOfVariableBindings(...)
Autolayout的常見應用
label的Autolayout
label只要有位置就可以
label設置寬度,然后高度會根據文字自適應
有的時候在xib約束label的寬度,但是代碼中設置的文字又不足以填滿整個label,這個時候往往想文字有多寬label就有多寬,這個時候在設置label的寬度約束的時候不要設置等于某個值,而是設置小于等于某個值
一個控件的高度、寬度可以設置多個約束,比如可以設置小于等于100,大于等于50這樣子
一個控件的Y值可以參照上面的view1和view2兩個約束,為了避免沖突將距離view2的約束值的優(yōu)先級改為750,假如view1被從父控件中移除,那么控件的Y值將會參照view2的那個約束
父控件的大小隨著子控件的內容的大小變化而變化
在一個父控件的UIView設置除了高度以外的約束,然后添加子控件label,label設置除了高度以外的約束并且設置label的底部距離父控件的底部的距離是固定的,然后如果更改label的文字,那么label的高度會變化,父控件的高度也會變化
NSLayoutConstaints和VFL的使用
NSLayoutConstraints的使用 :NSLayoutConstraints 密碼:vg9y
VFL的使用:VFL 密碼:irrn