把 View 添加到父控件上。git
添加約束到相應的 View 上。github
- (void)addConstraint:(NSLayoutConstraint *)constraint;
- (void)addConstraints:(NSArray<__kindof NSLayoutConstraint *> *)constraints;
複製代碼
自動佈局核心公式: obj1.property1 =(obj2.property2 * multiplier)+ constant value
objective-c
/**
view1 :要約束的控件
attr1 :約束的類型(作怎樣的約束)
relation :與參照控件之間的關係
view2 :參照的控件
attr2 :約束的類型(作怎樣的約束)
multiplier :乘數
c :常量
*/
+ (instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;
複製代碼
- (void)testAutolayout1 {
UIView *redV = [[UIView alloc] init];
redV.backgroundColor = [UIColor redColor];
redV.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:redV];
/**
view1 :要約束的控件
attr1 :約束的類型(作怎樣的約束)
relation :與參照控件之間的關係
view2 :參照的控件
attr2 :約束的類型(作怎樣的約束)
multiplier :乘數
c :常量
*/
/// 左間距100:
NSLayoutConstraint *consLeft = [NSLayoutConstraint constraintWithItem:redV attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:100];
[self.view addConstraint:consLeft];
/// 上間距200:
NSLayoutConstraint *consTop = [NSLayoutConstraint constraintWithItem:redV attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:200];
[self.view addConstraint:consTop];
/// 寬150:
NSLayoutConstraint *consWidth = [NSLayoutConstraint constraintWithItem:redV attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeWidth multiplier:1.0 constant:150];
[redV addConstraint:consWidth];
/// 高64:
NSLayoutConstraint *consHeight = [NSLayoutConstraint constraintWithItem:redV attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1.0 constant:64];
[redV addConstraint:consHeight];
}
複製代碼
UIView *blueV = [[UIView alloc] init];
blueV.backgroundColor = [UIColor blueColor];
blueV.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:blueV];
/// 和 redV 右間距爲0
NSLayoutConstraint *b_consRight = [NSLayoutConstraint constraintWithItem:blueV attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:redV attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0];
[self.view addConstraint:b_consRight];
/// 和 redV 等高
NSLayoutConstraint *b_consHeight = [NSLayoutConstraint constraintWithItem:blueV attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:redV attribute:NSLayoutAttributeHeight multiplier:1.0 constant:0.0];
[self.view addConstraint:b_consHeight];
/// 寬度是 redV 的一半
NSLayoutConstraint *b_consWidth = [NSLayoutConstraint constraintWithItem:blueV attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:redV attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0.0];
[self.view addConstraint:b_consWidth];
/// 頂部距離 redV 20
NSLayoutConstraint *b_consTop = [NSLayoutConstraint constraintWithItem:blueV attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:redV attribute:NSLayoutAttributeBottom multiplier:1.0 constant:20.0];
[self.view addConstraint:b_consTop];
複製代碼
最終效果: ide
在建立約束以後,須要將其添加到做用的view上。 在添加時要注意目標view須要遵循如下規則:佈局
#####(1)對於兩個同層級view之間的約束關係,添加到它們的父view上 #####(2)對於兩個不一樣層級view之間的約束關係,添加到他們最近的共同父view上 #####(3)對於有層次關係的兩個view之間的約束關係,添加到層次較高的父view上flex
VFL全稱是Visual Format Language,翻譯過來是「可視化格式語言」,是蘋果公司爲了簡化Autolayout的編碼而推出的抽象語言。編碼
/*
format :VFL語句
opts :約束類型
metrics :VFL語句中用到的具體數值
views :VFL語句中用到的控件
*/
+ (NSArray<__kindof NSLayoutConstraint *> *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary<NSString *,id> *)metrics views:(NSDictionary<NSString *,id> *)views;
複製代碼
@{@"redV" : redV}
等價於 NSDictionaryOfVariableBindings(redV)
spa
NSDictionary *views =
NSDictionaryOfVariableBindings(blueView, redView);
NSArray *conts2 =
[NSLayoutConstraint constraintsWithVisualFormat:
@"V:[blueView(==blueHeight)]-margin-|" options:0 metrics:
@{@"blueHeight" : @40, @"margin" : @20} views:views];
複製代碼
水平方向 H: 垂直方向 V: Views [view] SuperView | 關係 >=,==,<= 空間,間隙 - 優先級 @value翻譯
水平方向距離左邊距100,寬度2003d
垂直方向距離頂部200,高度64
水平方向redV 寬度72,blueV 寬度50,他們之間間距12
水平方向redV寬度大於等於60,優先級爲700 (優先級最大1000)
豎直方向上,先有一個redBox,其下方緊接一個高度等於redBox高度的yellowBox
水平方向上,Find距離父view左邊緣默認間隔寬度,以後是FindNext距離Find間隔默認寬度;再以後是寬度不小於20的FindField,它和FindNext以及父view右邊緣的間距都是默認寬度。(豎線「|」 表示superview的邊緣)
建立這種字符串時須要注意一下幾點:
表達佈局約束的規則可使用一些簡單的數學術語,以下表
類型 | 描述 | 值 |
---|---|---|
屬性 | 視圖位置 | NSLayoutAttributeLeft, NSLayoutAttributeRight, NSLayoutAttributeTop, NSLayoutAttributeBottom |
屬性 | 視圖前面後面 | NSLayoutAttributeLeading, NSLayoutAttributeTrailing |
屬性 | 視圖的寬度和高度 | NSLayoutAttributeWidth, NSLayoutAttributeHeight |
屬性 | 視圖中心 | NSLayoutAttributeCenterX, NSLayoutAttributeCenterY |
屬性 | 視圖的基線,在視圖底部上方放置文字的地方 | NSLayoutAttributeBaseline |
屬性 | 佔位符,在與另外一個約束的關係中沒有用到某個屬性時可使用佔位符 | NSLayoutAttributeNotAnAttribute |
關係 | 容許將屬性經過等式和不等式相互關聯 | NSLayoutRelationLessThanOrEqual, NSLayoutRelationEqual, NSLayoutRelationGreaterThanOrEqual |
數學運算 | 每一個約束的乘數和相加性常數 | CGFloat值 |
- (void)testVFL {
UIView *redV = [[UIView alloc] init];
redV.backgroundColor = [UIColor redColor];
redV.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:redV];
UIView *blueV = [[UIView alloc] init];
blueV.backgroundColor = [UIColor blueColor];
blueV.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:blueV];
/*
format :VFL語句
opts :約束類型
metrics :VFL語句中用到的具體數值
views :VFL語句中用到的控件
*/
//水平方向 redV 左右間距爲20
NSArray *cons1 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[redV]-20-|" options:0 metrics:nil views:@{@"redV":redV}];
[self.view addConstraints:cons1];
//垂直方法redV距離頂部 100, redV 高度爲64, blueV頂部距離redV 100 像素, blueV的高度等於redV
NSArray *cons2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-margin-[redV(64)]-margin-[blueV(==redV)]" options:NSLayoutFormatAlignAllRight metrics:@{@"margin" : @100} views:NSDictionaryOfVariableBindings(redV,blueV)];
[self.view addConstraints:cons2];
NSLayoutConstraint *cons = [NSLayoutConstraint constraintWithItem:blueV attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:redV attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0.0];
[self.view addConstraint:cons];
}
複製代碼
運行結果: