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

Posted

技术标签:

【中文标题】为按钮提供相等宽度约束时,自动布局设置不正确【英文标题】:Auto layout not set properly when give equal width constrains to buttons 【发布时间】:2016-10-05 13:30:42 【问题描述】:

我看到了许多解决方案并应用了自动布局约束,但我仍然没有得到想要的解决方案。

当前结果:

给所有按钮的约束:

查看层次结构:

【问题讨论】:

您想要的解决方案是什么? 你能告诉我们你的故事板控制器上是否有警告吗? @Damien:它没有给出任何警告 @Rajan:希望解决方案与故事板中显示的所有按钮宽度相等 @user2017279 能否显示视图层次结构并显示此设计中所有设备的预览。 【参考方案1】:

假设您想要的是让 3 个按钮彼此相等并使用 Interface Builder 填充屏幕宽度(没有代码,即:不是以编程方式),这是一个解决方案:

您不需要将它们添加到视图中。只需按照以下步骤操作:

让我们从这个开始:

请注意,按钮还没有任何约束,只需将它们添加到视图底部(或者您想要显示它们的任何位置,对于此解决方案,我将它们显示在底部屏幕)。确保它们中的 3 个具有相同的大小。

橙色按钮添加约束:

添加以下约束: 前导、底部空间和等高。

蓝色按钮添加约束:

添加以下约束: 尾随、底部空间和等高。

青色按钮添加约束:

ctrl + 从青色按钮拖动到橙色按钮并添加以下约束:水平间距和垂直居中。

ctrl + 从青色按钮拖动到蓝色按钮并添加以下约束:水平间距。

底部空间和等高。

到目前为止一切顺利,我们几乎完成了!

现在,选择 3 个按钮并添加以下约束:等宽。

您的按钮应如下所示:

现在,您所要做的就是选择两个水平间距约束中的每一个,并将它们的常量设置为 0(来自尺寸检查器):

你去吧:

我希望这会有所帮助,干杯。

【讨论】:

【参考方案2】:

对不起,代码中的解决方案..Swift 3.0:

    let button1 = UIButton()
    let button2 = UIButton()
    let button3 = UIButton()
    let buttons = [button1, button2, button3]
    button1.backgroundColor = .red
    button2.backgroundColor = .blue
    button3.backgroundColor = .green
    buttons.forEach 
        $0.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview($0)
    
    buttons.forEach 
        let cnt1 = NSLayoutConstraint(item: $0, attribute: .centerY, relatedBy: .equal, toItem: view, attribute: .centerY, multiplier: 1, constant: 0)
        let cnt2 = NSLayoutConstraint(item: $0, attribute: .height, relatedBy: .equal, toItem: view, attribute: .height, multiplier: 0.2, constant: 0)
        view.addConstraints([cnt1, cnt2])
    
    let cnt1 = NSLayoutConstraint(item: button1, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1, constant: 0)
    let cnt2 = NSLayoutConstraint(item: view, attribute: .trailing, relatedBy: .equal, toItem: button3, attribute: .trailing, multiplier: 1, constant: 0)
    let cnt3 = NSLayoutConstraint(item: button2, attribute: .width, relatedBy: .equal, toItem: button1, attribute: .width, multiplier: 1, constant: 0)
    let cnt4 = NSLayoutConstraint(item: button3, attribute: .width, relatedBy: .equal, toItem: button2, attribute: .width, multiplier: 1, constant: 0)
    let cnt5 = NSLayoutConstraint(item: button2, attribute: .leading, relatedBy: .equal, toItem: button1, attribute: .trailing, multiplier: 1, constant: 0)
    let cnt6 = NSLayoutConstraint(item: button3, attribute: .leading, relatedBy: .equal, toItem: button2, attribute: .trailing, multiplier: 1, constant: 0)
    view.addConstraints([cnt1, cnt2, cnt3, cnt4, cnt5, cnt6])

【讨论】:

【参考方案3】:

您是否要在水平方向布置三个高度和宽度相等的按钮?我认为你可以在不使用 UIViews 的情况下实现这一点。我设置了如下约束。

这是一个模拟器截图。

【讨论】:

以上是关于为按钮提供相等宽度约束时,自动布局设置不正确的主要内容,如果未能解决你的问题,请参考以下文章

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

如何通过自动布局进行四分之一

如何正确设置 4s 的自动布局约束?

如何使用固定宽度和自动布局正确缩放图像?

UILabel 有时不能正确换行(自动布局)

iOS - 滚动视图和相等宽度不起作用