2016-08-05 96 views
1

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

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中心锚上使用乘数选项?

+0

如果你的约束已经存在激活此约束,那么你不能改变自己“乘数“参数,你只能改变”常数“ –

+0

你不错过.isActive = true? –

回答

1

您不能在NSLayoutXAxisAnchor上使用乘数锚 - 乘以沿线的位置并不符合约束系统可以理解的方式。您只能使用与NSLayoutDimension锚点相乘的乘数,这些锚点的长度将与宽度一样,为,长度为

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

+0

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

1

看起来在IB中,您可以对Center X使用倍增选项并获得您要查找的效果(将button1的中心设置为其所在视图的宽度的1/4,并将button2的中心在视图宽度的2/3处):
setting the center of a button at 1/4 the width of the view it's in, using the Interface Buildersetting the center of a button at 2/3 the width of the view it's in, in StoryBoard

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

0

这有相同的结果:

//old settingsButton.centerXAnchor.constraintEqualToAnchor(self.centerXAnchor, multiplier: 1.5) 
//working settingsButton.centerXAnchor.constraintEqualToAnchor(self.centerXAnchor, constant: self.frame.width/2 * 0.5) 
+0

不是,因为如果帧宽度更改,约束将不会反映该内容。 –

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