【问题标题】:Autolayout is expecting a different height自动布局期望不同的高度
【发布时间】:2014-04-01 13:59:00
【问题描述】:

我在 Xcode 5 上的 iOS 7 项目中遇到自动布局问题。假设我想显示这些按钮:

    Something
        -
        |                      10 pts fixed space from top
        -
     Button 1                  50 pts height on 4" display, reduce height if 3"5
        -
        |                      10 pts fixed space
        -
     Button 2                  50 pts height on 4" display, reduce height if 3"5

我在 Interface Builder 中布局我的按钮(带有故事板)。

然后我开始添加约束:

  • “按钮 1”到“某物”的垂直间距
  • “按钮 1”容器的前导空格
  • “按钮 1”的固定宽度

问题是 Autolayout 抱怨我的按钮,说“预期:高度 = 30”。为什么 ?我想要一个 50 分的按钮,为什么这是个问题?当然,我可以通过添加高度约束来解决这个问题,但是如果屏幕高度降低,我希望高度降低。而且,如果我运行它,即使在 4" 显示器上,按钮的高度也设置为 30,因为自动布局说它“应该”.. 我什至还没有设置第二个按钮的约束,这将使它均匀更糟。

我怎样才能做到这一点?这似乎很基本,我仍然不明白发生了什么。

请注意,我可以在代码中手动设置所有高度,但我真的想避免这种情况。

【问题讨论】:

  • 你想在故事板或代码中实现这一点吗?
  • 另外,您对顶部 somethig 的垂直限制是什么?

标签: ios xcode5 autolayout


【解决方案1】:

您需要向我们展示您的约束是如何设置的。

约束是视图必须遵循的一组规则。如果没有规定按钮必须随父视图收缩,则不会发生。

根据您的示例,如果我理解正确,您会想要一组这样的约束(为方便起见,在VFL 中定义):

[yourParentView addVisualConstraints:@"V:|[something(100@75)]-(10@100)-[button1(<=50,>=30@100)]-(10@100)-[button2(button1@100)]-(>=300@50)-|"
                  forViews:NSDictionaryOfVariableBindings(something,button1,button2)];

这里的所有约束都是垂直的 (V:),括号中的数字代表点数,然后是 @ 以及保持该点数的所需优先级。该|符号表示超级视图的顶部和底部边缘。所以 ]-(>=300@50)-| 是说,我想在 button2 和超级视图底部之间保持 300 或更多像素,但我关心它的优先级为50. button1(=30@100) 表示我真的很关心这个按钮的高度在 30 到 50 像素之间,优先级为 100。button2(button1) 表示我希望 button2 与 button1 的高度相同。我也非常关心在我的元素之间保持 10 点的距离。而且我有点在意某些东西(与超级视图的顶部边缘齐平,因此 |[)将保持在 100 点高。

这不适合您打算做的事情吗?

【讨论】:

  • 非常感谢,我添加了您的限制条件,但还是一样。它抱怨我的按钮的高度(“预期:高度 = 30”),它在运行时将高度设置为 30..
  • 感谢您的帮助,处理优先事项是要走的路,我用我的工作方式回答了这个问题。
【解决方案2】:

解决垂直约束问题的方法是为 button1button2 提供 Equal 约束,并提供固定的垂直约束到 something 视图,然后从第二个按钮到超级视图的底部。

因此,这样您就不需要为它们中的任何一个指定固定高度,并且它们与其他元素(超级视图的某物和底部)之间的距离将是标准

我希望这会有所帮助!

【讨论】:

  • 不,我在遵循 Vasiliy 的回答时添加了这些约束,它给出了相同的结果。感谢您的尝试! :]
  • 请注意,如果您对 something 元素没有任何类型的高度限制,自动布局会尝试通过赋予它一些值来解决它。这可能是您解决垂直约束的问题。
  • 我确实对 something 元素有高度限制,因为它不应该调整大小。这东西太疯狂了!
  • 感谢您的帮助,我成功了。我发布了解决方案,即处理优先事项。
【解决方案3】:

好吧,我想我做到了。

这就是我所做的:

  • 我在情节提要中设置了所有约束,采用 Retina 4" 外形尺寸。

  • something 视图的约束:固定高度和宽度、固定顶部空间和前导空间。这种观点是绝对固定的。

  • 按钮 1 的约束:固定垂直空间到 something 视图,固定前导空间,固定宽度。 2 高度限制:30

  • 按钮 2 的约束:固定按钮 1 的垂直空间、固定前导空间、固定宽度。还有 2 高度限制:30 并且将底部空间固定到底部布局。

所有约束的最大优先级为 1000,除了最后一个(固定底部空间到底部布局)设置为 900 !

这样,按钮保持高度 >=30 并向上移动,但由于其他约束更重要,因此垂直收缩。

非常感谢@VasiliyDeych 和@P.Sami 的建议。帮了大忙。

【讨论】:

  • 我参加聚会有点晚了,但对于未来,UIStackView 会为你处理很多这样的事情。
猜你喜欢
  • 2013-10-21
  • 2018-05-09
  • 2016-04-18
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
相关资源
最近更新 更多