如何使用Visual语言来描述子视图在垂直和水平关系中的布局?
答案 0 :(得分:1)
这是一种方式。假设:视图1和2具有固定的像素宽度,视图3填充剩余宽度,全方位和视图之间的固定边距。视图1和2的高度相等。
如果这些是错误的假设,那么扩展这个例子非常简单。
夫特:
let views = ["view1": view1, "view2": view2, "view3": view3]
let metrics = ["m":12,"w":100]
let format0 = "H:|-(m)-[view1(w)]-(m)-[view3]-(m)-|"
let format1 = "H:|-(m)-[view2(w)]-(m)-[view3]-(m)-|"
let format2 = "V:|-(m)-[view1]-(m)-[view2(==view1)]-(m)-|"
let format3 = "V:|-(m)-[view3]-(m)-|"
for string in [format0,format1,format2,format3] as [String] {
self.view.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
string,
options:nil,
metrics:metrics,
views:views))
}
目标-C:
NSDictionary* views = NSDictionaryOfVariableBindings(view1,view2,view3);
NSDictionary* metrics = @{@"m":@(12),@"w":@(100)};
NSString* format0 = @"H:|-m-[view1(w)]-m-[view3]-m-|";
NSString* format1 = @"H:|-m-[view2(w)]-m-[view3]-m-|";
NSString* format2 = @"V:|-m-[view1]-m-[view2(==view1)]-m-|";
NSString* format3 = @"V:|-m-[view3]-m-|";
for (NSString* string in @[format0,format1,format2,format3]) {
[self.view addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:string
options:0
metrics:metrics
views:views]];
}
自动布局控件下的视图需要将translatesAutoresizingMaskIntoConstraints
属性设置为NO
(默认为YES
)。
在你的一条评论中,你说视图'已经知道了它们的框架'。这听起来有点混乱:当使用自动布局时,视图不设置帧,帧是自动布局方程的结果(自动布局机制设置它们)。
在任何情况下,无论您是否使用自动布局,视图都不应设置自己的帧,这应该是视图的超级视图上下文的作用。 superview或其viewController将做出帧决策,因为框架相对于superview定位视图。
听起来您可能意味着视图已根据其内容了解其尺寸(与按钮和标签知道其尺寸的方式相同)。在这种情况下,他们可以通过覆盖UIView子类中的-(CGSize) intrinsicContentSize
来返回大小值。然后,您可以从格式字符串中省略大小度量标准,将它们简化为:
夫特:
let format0 = "H:|-m-[view1]-m-[view3]-m-|"
let format1 = "H:|-m-[view2]-m-[view3]-m-|"
let format2 = "V:|-m-[view1]-m-[view2]-m-|"
let format3 = "V:|-m-[view3]-m-|"
目标-C:
NSString* format0 = @"H:|-m-[view1]-m-[view3]-m-|";
NSString* format1 = @"H:|-m-[view2]-m-[view3]-m-|";
NSString* format2 = @"V:|-m-[view1]-m-[view2]-m-|";
NSString* format3 = @"V:|-m-[view3]-m-|";
然而如果尺码并非全部加起来(例如3 * m + view1.height + view2.height!= superview.height)某些东西会破裂,而你正在失去优势使用autolayout灵活排列视图以填充可用空间。