SLayoutConstraint的第二個類方法
其中format就是VFL字符串,比如@"H:|-10-[view]-20-|",一會詳細說明。opts是枚舉參數,默認是0。
typedef NS_OPTIONS(NSUInteger, NSLayoutFormatOptions) {
NSLayoutFormatAlignAllLeft = (1 << NSLayoutAttributeLeft),
NSLayoutFormatAlignAllRight = (1 << NSLayoutAttributeRight),
NSLayoutFormatAlignAllTop = (1 << NSLayoutAttributeTop),
NSLayoutFormatAlignAllBottom = (1 << NSLayoutAttributeBottom),
NSLayoutFormatAlignAllLeading = (1 << NSLayoutAttributeLeading),
NSLayoutFormatAlignAllTrailing = (1 << NSLayoutAttributeTrailing),
NSLayoutFormatAlignAllCenterX = (1 << NSLayoutAttributeCenterX),
NSLayoutFormatAlignAllCenterY = (1 << NSLayoutAttributeCenterY),
NSLayoutFormatAlignAllBaseline = (1 << NSLayoutAttributeBaseline),
NSLayoutFormatAlignAllLastBaseline = NSLayoutFormatAlignAllBaseline,
NSLayoutFormatAlignAllFirstBaseline NS_ENUM_AVAILABLE_IOS(8_0) = (1 << NSLayoutAttributeFirstBaseline),
NSLayoutFormatAlignmentMask = 0xFFFF,
/* choose only one of these three
*/
NSLayoutFormatDirectionLeadingToTrailing = 0 << 16, // default
NSLayoutFormatDirectionLeftToRight = 1 << 16,
NSLayoutFormatDirectionRightToLeft = 2 << 16,
NSLayoutFormatDirectionMask = 0x3 << 16,
};
metrics是自定義的一個字典,這個字典裡面的key可以寫在format字串中。編譯器解析時,自動替換為metrics字典中的value。比如:
NSDictionary * metrics = @{@"left":@5,@"right":@5,@"height":@150.0};
NSString * format = @"|-left-[view]-right-|";
這個一看就明白的,不用這個,設置為nil。views是設置約束所有view的字典。比如:
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(view);
這個宏的作用是把view映射成字典[NSDictionary dictionaryWithObjectsAndKeys:view, @"view", nil];
VFL
蘋果開發團隊可能覺得添加單個
constraint的API比較長,於是就有了
VFL(Visual format language)。
上面提到的@"H:|-10-[view]-20-|",意思就是
view距離
superview的左邊
10點,右邊
20點,這樣是不是就可以確定了這個
view的寬度了?
其中H:表示橫向,
|表示父視圖邊緣,
-10-表示
10點距離,
[view]表示子視圖。
下面詳細說明:
V:表示縱向
H:表示橫向
|表示父視圖邊緣
-表示距離
>=表示視圖間距、寬度或高度必須大於或等於某個值
<=表示視圖間距、寬度或高度必須小宇或等於某個值
==表示視圖間距、寬度或高度必須等於某個值
@表示
>=、
<=、
==限制,最大為
1000
示例:
|-[view]-|視圖處在父視圖的左右邊緣內|-[view]視圖處在父視圖的左邊緣|[view]視圖和父視圖左邊對齊-[view]-設置視圖的寬度高度|-30.0-[view]-30.0-|表示離父視圖 左右間距30[view(200.0)]表示視圖寬度為200.0|-[view(view1)]-[view1]-|表示視圖寬度一樣,並且在父視圖左右邊緣內V:|-[view(50.0)]視圖高度為50V:|-(==padding)-[imageView]->=0-[button]-(==padding)-|表示離父視圖的距離
為Padding,這兩個視圖間距必須大於或等於0並且距離底部父視圖為padding。[wideView(>=60@700)]視圖的寬度為至少為60不能超過 700如果沒有聲明方向默認為水平H:(原文寫的V:)
代碼
UIView *view = [[UIView alloc] init];
view.backgroundColor = [UIColor brownColor];
view.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:view];
//通過宏映射成[NSDictionary dictionaryWithObjectsAndKeys:v1, @"v1", v2, @"v2", nil];
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(view);
//約束1 橫向
[self.view addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[view]-20-|"
options:0
metrics:nil
views:viewsDictionary]];
//約束2 縱向
[self.view addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-100-[view]-200-|"
options:0
metrics:nil
views:viewsDictionary]];