Can I change multiplier property for NSLayoutConstraint? Can I change multiplier property for NSLayoutConstraint? ios ios

Can I change multiplier property for NSLayoutConstraint?


Here is an NSLayoutConstraint extension in Swift that makes setting a new multiplier pretty easy:

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

Demo usage:

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


If you have only have two sets of multipliers that need to be applied, from iOS8 onwards you can add both sets of constraints and decide which should be active at any time:

NSLayoutConstraint *standardConstraint, *zoomedConstraint;// ...// switch between constraintsstandardConstraint.active = NO; // this line should always be the first line. because you have to deactivate one before activating the other one. or they will conflict.zoomedConstraint.active = YES;[self.view layoutIfNeeded]; // or using [UIView animate ...]

Swift 5.0 version

var standardConstraint: NSLayoutConstraint!var zoomedConstraint: NSLayoutConstraint!// ...// switch between constraintsstandardConstraint.isActive = false // this line should always be the first line. because you have to deactivate one before activating the other one. or they will conflict.zoomedConstraint.isActive = trueself.view.layoutIfNeeded() // or using UIView.animate


The multiplier property is read only. You have to remove the old NSLayoutConstraint and replace it with a new one to modify it.

However, since you know you want to change the multiplier, you can just change the constant by multiplying it yourself when changes are needed which is often less code.