iOS - 通过Swift更改约束的乘数

ryo*_*ryo 27 ios swift

如何使用Swift更改约束的乘数.

someConstraint.multiplier = 0.6 // error: 'multiplier' is get-only property
Run Code Online (Sandbox Code Playgroud)

我想知道如何更改代码中的乘数(Swift).

Kli*_*akM 68

由于multiplier是只读属性而您无法更改它,因此需要将约束替换为其已修改的克隆.

您可以编写扩展来执行此操作,例如:

extension NSLayoutConstraint {
    func constraintWithMultiplier(_ multiplier: CGFloat) -> NSLayoutConstraint {
        return NSLayoutConstraint(item: self.firstItem!, attribute: self.firstAttribute, relatedBy: self.relation, toItem: self.secondItem, attribute: self.secondAttribute, multiplier: multiplier, constant: self.constant)
    }
}
Run Code Online (Sandbox Code Playgroud)

Swift 3+版本:

let newConstraint = constraintToChange.constraintWithMultiplier(0.75)
view.removeConstraint(constraintToChange)
view.addConstraint(newConstraint)
view.layoutIfNeeded()
constraintToChange = newConstraint
Run Code Online (Sandbox Code Playgroud)

用法:

extension NSLayoutConstraint {
    func constraintWithMultiplier(_ multiplier: CGFloat) -> NSLayoutConstraint {
        return NSLayoutConstraint(item: self.firstItem!, attribute: self.firstAttribute, relatedBy: self.relation, toItem: self.secondItem, attribute: self.secondAttribute, multiplier: multiplier, constant: self.constant)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 它正在崩溃 - “'无法在视图上安装约束。该约束是否引用了视图子树外部的某些内容?这是非法的。” (7认同)
  • 当您将逻辑语句作为参数时,您如何编译?`addConstraint(self.constraintToChange = newConstraint)`? (4认同)
  • 非常感谢您的回复!我尝试做你的代码.但是因为'self.view!',我无法实现我想要的.在我的情况下,我修复了"self.view!".但我使用Andrew Schreiber先生的方式"我可以改变NSLayoutConstraint的乘数属性吗?" 它运作良好.我需要更多地搜索它. (2认同)
  • 在 swift4.2 中使应用程序崩溃 (2认同)
  • 另外,对于iOS 8或更高版本,最好使用`constraint.isActive = true/false`而不是`removeConstraint`和`addConstraint`方法。API 表示“在针对 iOS 8.0 或更高版本进行开发时,将约束的 isActive 属性设置为 true,而不是直接调用 addConstraint(_:) 方法。 isActive 属性会自动在正确的视图中添加和删除约束。” (2认同)