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 约束不允许使用乘数的主要内容,如果未能解决你的问题,请参考以下文章