Autolayout降低某些视图的高度

时间:2014-01-22 19:14:46

标签: ios objective-c autolayout

我有以下观点: enter image description here

对于iPhone 4尺寸的屏幕,我希望将灰色顶部和绿色下部按钮保持相同的尺寸,分别固定在顶部和底部。中间的按钮网格应减小尺寸以适应新的显示。

由于视图尺寸小了88px(548 - 460 = 88),并且有4行按钮,我会以编程方式将每个按钮减少22px并将其移动到位。

但是如果可能的话,我想通过自动布局来实现。

如何指定约束以保持与顶部和底部相同的距离相同,并仅降低视图的高度?

我将它们全部锚定在顶部和底部,但这只会导致:

enter image description here

任何帮助,非常感谢!

1 个答案:

答案 0 :(得分:1)

您可以使用自动布局执行此操作。基本上,您应该将灰色标题和调用按钮页脚锚定到超级视图的顶部和底部(分别),并将每个按钮锚定到其邻居。然后指定每个按钮的高度应与第一个按钮的高度相同。

这是约束的可视化格式语言(我认为比试图解释约束更清晰)。 headerView是顶部的灰色条,footerView是包含绿色按钮的视图,按钮名称相应。

V:|-[headerView]-0-[buttonOne]-0-[buttonFour(==buttonOne)]-0-[buttonSeven(==buttonOne)]-[buttonPlus(==buttonOne@800)]-0-[footerView]-|

请注意,buttonPlus的高度约束优先级较低。这是因为页眉和页脚视图之间的空间可能不会在按钮之间平均分配。将优先级设置为低于“required”(优先级== 1000),允许加号按钮比单个按钮略短或更高,但自动布局仍会尽量使其尽可能接近。

水平大小调整与垂直大小调整类似。请注意,此处buttonTwo的大小与其他大小略有不同,以防水平空间不均匀划分。

H:|-0-[buttonOne]-0-[buttonTwo(==buttonOne@800)]-0-[buttonThree(==buttonOne)]-0-|

一个视图的高度/宽度等于另一个视图的计算是昂贵的,并且可能需要多次通过。最好只在第一列按钮上设置上述约束,然后约束其他列,使每个按钮的顶部和底部与其行中的第一个按钮对齐。您可以在为每行创建水平约束时将NSLayoutFormatAlignAllTop|NSLayoutFormatAlignAllBottom作为options参数执行此操作,并在创建垂直约束时将NSLayoutFormatAlignAllLeft| NSLayoutFormatAlignAllRight作为{{1}}。

编辑:这仍然可以用于IB。