AutoLayout混合V + H

时间:2015-05-20 11:15:37

标签: ios swift autolayout

如何使用Visual语言来描述子视图在垂直和水平关系中的布局?

enter image description here

1 个答案:

答案 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灵活排列视图以填充可用空间。