我可以更改NSLayoutConstraint的multiplier属性吗?

我在一个超级视图中创建了两个视图,然后在视图之间添加了约束:


_indicatorConstrainWidth = [NSLayoutConstraint constraintWithItem:self.view1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view2 attribute:NSLayoutAttributeWidth multiplier:1.0f constant:0.0f];

[_indicatorConstrainWidth setPriority:UILayoutPriorityDefaultLow];

_indicatorConstrainHeight = [NSLayoutConstraint constraintWithItem:self.view1 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view2 attribute:NSLayoutAttributeHeight multiplier:1.0f constant:0.0f];

[_indicatorConstrainHeight setPriority:UILayoutPriorityDefaultLow];

[self addConstraint:_indicatorConstrainWidth];

[self addConstraint:_indicatorConstrainHeight];

现在,我想用动画更改乘子属性,但是我不知道如何更改乘子属性。(我在头文件NSLayoutConstraint.h的私有属性中找到了_coefficient,但它是私有的。)


如何更改多重属性?


我的解决方法是删除旧的约束,并为添加新的约束multipler。


噜噜哒
浏览 495回答 3
3回答

忽然笑

这是Swift中的NSLayoutConstraint扩展,可以轻松设置新的乘数:import UIKitextension NSLayoutConstraint {    func setMultiplier(multiplier:CGFloat) -> NSLayoutConstraint {        NSLayoutConstraint.deactivateConstraints([self])        let newConstraint = NSLayoutConstraint(            item: firstItem,            attribute: firstAttribute,            relatedBy: relation,            toItem: secondItem,            attribute: secondAttribute,            multiplier: multiplier,            constant: constant)        newConstraint.priority = priority        newConstraint.shouldBeArchived = shouldBeArchived        newConstraint.identifier = identifier        NSLayoutConstraint.activateConstraints([newConstraint])        return newConstraint    }}在Swift 3.0中import UIKitextension NSLayoutConstraint {    /**     Change multiplier constraint     - parameter multiplier: CGFloat     - returns: NSLayoutConstraint    */    func setMultiplier(multiplier:CGFloat) -> NSLayoutConstraint {        NSLayoutConstraint.deactivate([self])        let newConstraint = NSLayoutConstraint(            item: firstItem,            attribute: firstAttribute,            relatedBy: relation,            toItem: secondItem,            attribute: secondAttribute,            multiplier: multiplier,            constant: constant)        newConstraint.priority = priority        newConstraint.shouldBeArchived = self.shouldBeArchived        newConstraint.identifier = self.identifier        NSLayoutConstraint.activate([newConstraint])        return newConstraint    }}演示用法:@IBOutlet weak var myDemoConstraint:NSLayoutConstraint!override func viewDidLoad() {    let newMultiplier:CGFloat = 0.80    myDemoConstraint = myDemoConstraint.setMultiplier(newMultiplier)    //If later in view lifecycle, you may need to call view.layoutIfNeeded() }

PIPIONE

我用来更改现有布局约束的乘数的辅助函数。它创建并激活了一个新的约束,并停用了旧的约束。struct MyConstraint {  static func changeMultiplier(_ constraint: NSLayoutConstraint, multiplier: CGFloat) -> NSLayoutConstraint {    let newConstraint = NSLayoutConstraint(      item: constraint.firstItem,      attribute: constraint.firstAttribute,      relatedBy: constraint.relation,      toItem: constraint.secondItem,      attribute: constraint.secondAttribute,      multiplier: multiplier,      constant: constraint.constant)    newConstraint.priority = constraint.priority    NSLayoutConstraint.deactivate([constraint])    NSLayoutConstraint.activate([newConstraint])    return newConstraint  }}用法,将乘数更改为1.2:constraint = MyConstraint.changeMultiplier(constraint, multiplier: 1.2)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS