我在Xcode 5上的iOS 7项目中遇到autolayout困难。假设我想显示这些按钮:
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中布置我的按钮(带有故事板)。
然后我开始添加约束:
问题是Autolayout抱怨我的按钮,说“预期:身高= 30”。为什么?我想要一个50分的按钮,为什么这是一个问题?当然,我可以通过添加高度约束来解决这个问题,但是如果屏幕高度降低,我希望降低高度。并且,如果我运行它,即使在4“显示器上,按钮的高度设置为30,因为autolayout说它”应该“..而我甚至没有设置第二个按钮的约束,这将使它均匀差。
我怎样才能实现这样的目标?它似乎非常基本,我仍然不明白发生了什么。
请注意,我可以手动设置代码中的所有高度,但我真的想避免这种情况。
答案 0 :(得分:2)
好的,我想我成功了。
这是我做的:
我在故事板中设置了所有约束,使用Retina 4“外形。
某事视图的约束:固定高度&宽度,固定顶部空间和前导空间。这个观点是绝对固定的。
按钮1的约束:将垂直空间固定到某物视图,固定前导空格,固定宽度。 2 身高限制:30 <=身高<= 50。
按钮2的约束:固定垂直空间到按钮1,固定前导空间,固定宽度。此外 2 高度限制:30&lt; = height&lt; = 50. 将底部空间固定到底部布局。
所有约束的最高优先级为1000,除了最后一个(固定底部空间到底部布局),设置为900!
这样,按钮保持高度> = 30并向上移动,但由于其他约束更为重要,因此会垂直缩小。
非常感谢@VasiliyDeych和@ P.Sami的建议。它帮助了很多。
答案 1 :(得分: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 :),括号中的数字表示点数,后跟@和保持该点数的所需优先级。 |符号表示超视图的顶部和底部边缘。所以] - (&gt; = 300 @ 50) - | 说,我想在button2和superview底部之间保持300或更多像素,但我优先考虑它50. button1(&lt; = 50,&gt; = 30 @ 100)表示我真的关心这个按钮的高度在30到50像素之间,优先级为100. button2 (button1)表示我希望button2与button1的高度相同。我也非常关心保持我的元素之间的10点距离。而且我有点担心某些东西(超级视图的上边缘,因此 | [)会保持在100点高。
这不适用于您打算做什么吗?
答案 2 :(得分:1)
解决垂直约束问题的方法是为 button1 和 button2 提供等于约束,并提供固定的垂直约束到某物视图,从第二个按钮到超级视图的底部。
所以这样你就不需要为它们中的任何一个提供一个固定的高度,它们与其他元素之间的距离(超级视图的某些部分和底部)将是标准。
我希望这有帮助!