iOS 约束不允许使用乘数

Posted

技术标签:

【中文标题】iOS 约束不允许使用乘数【英文标题】:iOS constraints doesn't allow to use multiplier 【发布时间】:2016-08-05 12:00:31 【问题描述】:

我正在尝试布局一些自定义视图,当我尝试激活约束时,Xcode 说我不能使用乘数。下面是代码示例:

class MenuView: UIView 

    var addButton: AddButton!
    var settingsButton: SettingsButton!

    // ........

    func setConstraints (withBarReference reference: NSLayoutYAxisAnchor) 
        NSLayoutConstraints.activateConstraints([
             // ........
             addButton.centerXAnchor.constraintEqualToAnchor(self.centerXAnchor, multiplier: 0.5),
             // ........
             settingsButton.centerXAnchor.constraintEqualToAnchor(self.centerXAnchor, multiplier: 1.5)
        ])
    


这里的问题是 Xcode 在 contraintEqualToAnchor: 函数上给出了一个语法错误,并说我应该将“乘数”替换为“常数”。

为什么我不能对 X 中心锚点使用乘数选项?

【问题讨论】:

如果你的约束已经存在,那么你不能改变他们的“乘数”参数,你只能改变“常数” 你没有错过 .isActive = true 吗? 【参考方案1】:

您不能使用辅助函数设置乘数,但可以使用 NSLayoutConstraint 初始化程序设置乘数。我自己也被这个卡住了,但找到了答案。

您的代码:addButton.centerXAnchor.constraintEqualToAnchor(self.centerXAnchor, multiplier: 0.5)

正确代码:NSLayoutConstraint(item: addButton, attribute: .centerX, relatedBy: .equal, toItem: self, attribute: .centerX, multiplier: 0.5, constant: 0)

另外,不要忘记通过输入 isActive = true 来激活此约束

【讨论】:

【参考方案2】:

以前的答案现在很奇怪。

您可以简单地使用视图创建具有乘数宽度/高度的 UILayoutGuid,并将 guid.trailing 设置为等于子视图的 centerX。

例如,如果您需要将 addButton 放置在视图的前 1/3 处,并将 settingsButton 放置在 2/3 处,您可以简单地设置两个布局指南

let addButtonGuid = UILayoutGuide()
self.addLayoutGuide(guid)
addButtonGuid.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 1/3).isActive = true
addButtonGuid.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
addButton.centerXAnchor.constraint(equalTo: addButtonGuid.trailingAnchor).isActive = true
// same for settingsButton

但真正最好的方法是使用 UIStackView 并将其 distribution 属性设置为 equalCentering

【讨论】:

UILayoutGuide 正是我想要的,先生,你让我开心!【参考方案3】:

您不能在NSLayoutXAxisAnchor 锚点上使用乘数 - 以约束系统可以理解的方式乘以沿线的位置没有意义。您只能使用带有 NSLayoutDimension 锚点的乘数,它测量 长度,例如宽度。

使用堆栈视图可以更好地实现您尝试制作的布局。

【讨论】:

IB 允许你这样做,即使它“没有意义”。它确实如此,有时它是实现结果的最有效方式。例如,将视图的左侧与父视图的四分之一线对齐。这将是 view.leftAnchor 约束到 superview.centerX,乘数为 0.5 或第三季度线为 1.5。如果没有这个,您将不得不创建仅用于导向捕捉的不可见视图。请参阅下面关于如何通过代码执行此操作的答案:)【参考方案4】:

似乎在 IB 中,您可以使用带有 Center X 的乘数选项并获得您正在寻找的效果(将 button1 的中心设置为它所在视图宽度的 1/4,将 button2 的中心设置为视图宽度的 2/3):。

我尝试在代码和 IB 中都使用它,在代码中我遇到了和你一样的错误。 令人惊讶的是,在 IB 中它工作正常,没有错误,没有警告。 (我正在使用 Xcode 7,将在 Xcode 8 中尝试它是否仍然有效)。

【讨论】:

以上是关于iOS 约束不允许使用乘数的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 通过 Swift 更改约束乘数 [重复]

使用乘数的 Swift 约束与尾随但不领先

IOS自动布局中位置属性约束方程的非恒等式

无法将 iOS 自动布局乘数设置为零

如何使用两个不同的乘数更改单个高度约束的乘数

如何在 iOS 8 中更改 NSLayoutConstraint 的“乘数”属性的值