iOS - 用Swift修改约束的乘数

54

如何使用Swift更改限制条件的乘数。

someConstraint.multiplier = 0.6 // error: 'multiplier' is get-only property

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


4
使用不同的乘数创建多个约束,并在适当的时间激活/停用相应的约束。 - luk2302
8
https://dev59.com/omIk5IYBdhLWcg3wG6o6 - Bhavin Bhadani
1
你可以这样做: someConstraint.constant *= 0.6 - Gulshan Kumar
1个回答

128

由于 multiplier 是只读属性,不能更改它,因此您需要使用其修改后的克隆替换约束。

您可以使用扩展来实现,如下所示:

Swift 4/5:

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)
    }
}

使用方法:

let newConstraint = constraintToChange.constraintWithMultiplier(0.75)
view.removeConstraint(constraintToChange)
view.addConstraint(newConstraint)
view.layoutIfNeeded()
constraintToChange = newConstraint

2
非常感谢您的回复!我尝试执行您的代码。但是我无法达到我想要的效果,因为涉及到 self.view!。在我的情况下,我已经解决了 self.view! 的问题。但是在现有的“Can i change multiplier property for NSLayoutConstraint?”中,我使用了Andrew Schreiber先生的方法,它运行得很好。我需要更多地搜索它。 - ryo
4
当你将逻辑语句作为参数时,你是如何编译的?addConstraint(self.constraintToChange = newConstraint) - ScottyBlades
2
在Swift4.2中崩溃应用程序 - Paresh. P
7
它正崩溃了 - “无法在视图上安装约束。 约束是否引用视图子树之外的内容? 这是不合法的。” - iGatiTech
3
另外,在iOS 8或更高版本中,最好使用constraint.isActive = true/false代替removeConstraintaddConstraint方法。API表示:"在开发iOS 8.0或更高版本时,应将约束的isActive属性设置为true,而不是直接调用addConstraint(_ :)方法。isActive属性会自动从正确的视图中添加和删除约束。" - Zhou Haibo
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接