使用自动布局和约束设置按钮

Posted

技术标签:

【中文标题】使用自动布局和约束设置按钮【英文标题】:set the button with usage autolayout and constraint 【发布时间】:2016-04-19 09:33:41 【问题描述】:

屏幕上有 4 个按钮。 我想将所有 4 个按钮放置在屏幕中,与所有屏幕中的图像所示的距离相同,即 4s、5s、6 和 6plus。

我添加的约束

Button 1 : 
Top , leading and trailing

Button 4: 
Bottom , leading and trailing

Button 2 : 
Leading
trailing
top to button 1

Button 3: 
    Leading
    trailing
    top to button 2
    bottom to button 4

但我无法以相同的距离实现按钮 2 和按钮 3。 我只想通过使用自动布局和约束来实现这一点。

请指教。

【问题讨论】:

您搜索过这个问题的答案吗?使用堆栈视图或填充视图? technet.weblineindia.com/mobile/…最佳解决方案 Evenly space multiple views within a container view的可能重复 @Wain 是的,我做到了。但解决方案是使用 spaceview 或编码。我想通过自动布局和约束来完全实现这一点。 @EICaptain 感谢您的评论。但解决方案是使用 spaceview 或编码。我想通过自动布局和约束来完全实现这一点。 【参考方案1】:

使用自动布局的完整解决方案。

由于您在视图中使用偶数个按钮,因此您需要在视图的中心(X 和 Y)位置添加高度为 2 的 UILabel。 以下约束适用于所有屏幕,即 4s、5s、6 和 6plus。

[注意:如果是奇怪的按钮,中心按钮将用于代替标签]

约束:

标签: 1. 中心-X 2. 中心-Y 3. 固定高度和宽度(高度=2,宽度=无限制)

按钮 1:

    底部到按钮 2(例如 70)

    中心-X

    固定高度宽度

按钮 2:

    顶部到按钮 3(例如 70)

    标签底部(例如 34)

    中心-X

    固定高度宽度

按钮 3:

    顶部到标签(例如 34)

    底部到按钮 4(例如 70)

    中心 X

    固定高度宽度

按钮 4:

    顶部到 BUTTON-3(例如 70)

    中心-X

    固定高度宽度

【讨论】:

【参考方案2】:

这完全可以通过 Interface Builder 来实现:

如果你想支持iOS9之前的iOS版本

    您需要使用隐藏的间隔 UIViews(下图中橙色) 它们的高度应该相等 按钮与其相邻间隔视图之间的距离应设置为 0

这使您能够为每种设备类型创建自适应布局(如果您将 spacer 的视图高度设置为与 superview 的高度成比例):

对于 iOS9+ 只需使用 UIStackView 与垂直轴和所需的分布空间

【讨论】:

为什么要使用不需要的元素。我认为这不是一个好方法。 "隐藏间隔 UIViews" @BhavukJain 您可能不相信,但它们用于分发。没有问题时不要试图解决问题 - UIViews 是免费的,不会造成任何性能损失,在这种情况下它们的使用是明确的,易于支持并且不需要任何硬编码值或数百行代码。 在没有任何隐藏视图的情况下更容易做到这一点,它使您的故事板看起来更干净。将一个按钮放在中心并为其垂直常数赋予一些值,然后将所有按钮都放在它的参考上,并且所有按钮都具有相等的间距。完成! 我相信如果我们想要对布局有更多的控制,尤其是在动画的情况下,这种方法会有所帮助。我们可以只使用隐藏视图属性来为按钮设置动画。这也提供了更简单的方法来播放按钮位置。【参考方案3】:

这样试试,

你的约束应该是这样的,

按钮 1 - 顶部、前导和尾随或容器中的水平中心。

按钮 2 - 顶部、前导和尾随或容器中的水平中心。

按钮 4 - 底部、前导和尾随或容器中的水平中心。

按钮 3 - 底部、前导和尾随或容器中的水平中心。

现在按钮 2 采用顶部约束的出口(ctrl+从约束拖动到类)和按钮 3 采用底部约束的出口。

例如,您的插座分别是 button2Outlet 和 button3Outlet。

所以,从 viewdidload,

CGFloat constantVslue = self.view.frame.size.height - (4 * buttonHeight) - 40 (top distance of button 1 + bottom distance of button 4); 

//40 is distance from top and bottom of 1st and 4th button respactively in my case (20+20) and in my case my button height is 30 so total 120.

CGFloat distance = constantVslue/3;

self.button2Outlet.constant = distance;
self.button3Outlet.constant = distance;

希望这会有所帮助:)

【讨论】:

谢谢你的回答我想完全由xib实现 然后告诉我你是否得到了预期的输出 非常感谢,我试过了,但在所有分辨率下都不起作用 我认为你犯了一些错误,否则这在我的演示中运行良好

以上是关于使用自动布局和约束设置按钮的主要内容,如果未能解决你的问题,请参考以下文章

等宽和设置优先级的自动布局

为按钮提供相等宽度约束时,自动布局设置不正确

LayerView 自动布局上的约束按钮

为啥我的第二个按钮在使用自动布局约束时表现不同?

代码中的 UIImageView 和自动布局

自动布局问题