iOS:简单的AutoLayout,带有1个标签和3个按钮

时间:2012-11-16 14:43:41

标签: ios autolayout

我正在玩AutoLayout,而且我真的正在撞墙,看起来它应该是一个非常简单的解决方案。

  1. 我有一个垂直的控件列:1个标签和3个按钮。
  2. 我希望标签高40像素(点)并根据其超视图的宽度自动调整其宽度(左侧,顶部和右侧的标准间距)。
  3. 我希望3个按钮垂直排列在该标签下方。
  4. 我希望它们的宽度与标签一样自动调整大小。
  5. 我希望他们的间距是标准的(浅绿色?)间距(8分,对吧?)。
  6. 我希望3个按钮的高度相同。
  7. 我可以得到我想要发生的事情,但是我在运行时一直在控制台中遇到错误,我想知道为什么我得到它们以及如何避免得到它们。我在AutoLayout上观看了WWDC视频,这是我到目前为止所尝试的内容:

    UILabel *label = [self Label];
    MMGlossyButton *button1 = ...
    MMGlossyButton *button2 = ...
    MMGlossyButton *button3 = ...
    [[self view] addConstraints:
        [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label]-|"
        options:0
        metrics:nil
        views:NSDictionaryOfVariableBindings(label)]];
    [[self view] addConstraints:
        [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[button1]-|"
        options:0
        metrics:nil
        views:NSDictionaryOfVariableBindings(new)]];
    [[self view] addConstraints:
        [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[button2]-|"
        options:0
        metrics:nil
        views:NSDictionaryOfVariableBindings(existing)]];
    [[self view] addConstraints:
        [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[button3]-|"
        options:0
        metrics:nil
        views:NSDictionaryOfVariableBindings(provider)]];
    [[self view] addConstraints:
        [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[label(40)]-[button1(>=25)]-[button2(==button1)]-[button3(==button1)]-|"
        options:0
        metrics:nil
        views:NSDictionaryOfVariableBindings(label, button1, button2, button3)]];
    

    因此,这适用于以动态大小的方式显示视图,但控制台中会弹出以下错误:

    Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
            (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you 
                   don't understand, refer to the documentation for the UIView 
                   property translatesAutoresizingMaskIntoConstraints) 
    
    // A whole bunch of constraint stuff that doesn't appear to be important...
    
    Will attempt to recover by breaking constraint
    <NSLayoutConstraint:0x7554c40 V:[MMGlossyButton:0x7554b40(99)]>
    

    所以,最后一位似乎表明我在视图上的第一个按钮静态大小为99点高。
    它在视图上的大小是多少。
    这完全是武断的。
    我不想分配,但无法找到解除分配的方法。

    虽然我得到了我想要的东西(最终是这样),但它似乎是一种非常简单的迂回方式来完成一些非常简单的事情。我是否遗漏了一些关于AutoLayout的基本知识,或者它的功能是否需要如此复杂?

1 个答案:

答案 0 :(得分:7)

您遇到错误,因为您正在混合和匹配代码中生成的约束以及接口构建器添加的约束。界面构建器不允许您生成不明确的布局,因此几乎按照定义,如果添加其他约束,您将收到"Unable to simultaneously satisfy"错误,这是许多婚姻的垮台。

要解决此问题,您需要在界面构建器中定义所需的所有约束,或者需要将特定的约束标记为出口并在添加自己的代码之前将其删除。

在您的情况下,约束很简单,可以在IB中创建。

您可以在选择标签时使用IB中的此按钮固定到特定高度:

enter image description here

中间的那个,看起来像一个大梁。这为您提供了以下有用的菜单:

enter image description here

选择其中一个允许您为标签创建一个新约束,然后您可以通过选择它来编辑它:

enter image description here

然后,您可以添加按钮,选择所有这三个按钮,然后使用相同的菜单创建相等的高度约束。

在IB中创建的约束不是特别灵活,因此如果您确定需要在代码中创建或修改它们,最好为特定约束创建出口,然后删除并重新创建它们,或在运行时修改constant值。