【问题标题】:Auto Layout: Y Position as the Max of Two Values自动布局:Y 位置作为两个值的最大值
【发布时间】:2015-01-11 21:58:35
【问题描述】:

我有一个按钮 playButton 和两个 UIView,myView1 和 myView2,它们的位置在执行过程中可能会发生变化。

我希望 playButton 的顶部比 UIView1 的底部或 UIView2 的底部低 10 个单位,以较大的值为准(进一步向下)。

如何在代码中使用自动布局来表达这一点?我尝试将一个约束设置为大于或等于,但它似乎没有效果。

【问题讨论】:

  • 一个约束设置按钮顶部到view1底部的距离大于10,另一个约束设置按钮顶部到view2底部的距离为大于 10?
  • 我试过了,但收到了关于歧义的警告。 Ken Thomases 的回答对此有解决方案。谢谢。
  • 对,我只是在处理第三个约束。 :)

标签: ios objective-c autolayout


【解决方案1】:

这里有一个思路:创建一个playButton顶部大于等于myView1底部加10的约束,另一个约束playButton顶部大于等于myView2底部加10,然后是第三个约束,即 playButton 的顶部处于低优先级的共享父视图的顶部。

这两个不等式将确保按钮位于两个视图下方。然而,这留下了歧义。该按钮可以在两者下方的任何地方。第三个约束不能这样满足,但自动布局系统会尽量靠近。这解决了歧义。该按钮将尽可能靠近顶部,同时仍位于两个视图下方。

这实际上可以简化。您可以将其中一种不等式与低优先级的等式结合起来。有一个约束,即 playButton 的顶部大于或等于 myView1 的底部加 10。有第二个约束,即 playButton 的顶部等于 myView2 的底部加 10,但在优先级较低。

如果 myView1 的底部低于 myView2,则第一个约束要求 playButton 低于它。不能满足第二个约束,但系统会尽量靠近 myView2 的底部。这使按钮保持在尽可能高的位置,同时仍低于 myView1 的底部。如果 myView2 的底部低于 myView1 的底部,则第二个约束直接确定按钮的位置。第一个约束也得到满足,因为它是一个不等式。

【讨论】:

  • 简单但很好的答案。 !!
  • 这种“系统试图尽可能接近”的行为是否记录在任何地方?
  • @algrid 你可以在这里找到它link 当它说 “如果约束 a == b 是可选的,基于约束的布局系统将尝试最小化 abs(a-b)”
  • @lucianoenrico 谢谢!
【解决方案2】:

KenThomases 答案图解:

view1-> 蓝色

查看 2-> 红色

查看 3-> 粉红色

view1 和 view 3 之间的约束:大于或等于 20,优先级为 1000。

view2 和 view 3 之间的约束:等于 20,优先级为 999。

Ken 在他的回答中解释了这项工作。看看吧。

如果视图 1 大于视图 2

如果视图 2 大于视图 1

【讨论】:

    猜你喜欢
    • 2021-01-09
    • 1970-01-01
    • 2017-09-23
    • 2016-03-21
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    相关资源
    最近更新 更多