I've set up multiple sets of constraints in IB, and I'd like to programmatically toggle between them depending on some state. There's a constraintsA
outlet collection all of which are marked as installed from IB, and a constraintsB
outlet collection all of which are uninstalled in IB.
I can programmatically toggle between the two sets like so:
NSLayoutConstraint.deactivateConstraints(constraintsA)
NSLayoutConstraint.activateConstraints(constraintsB)
But... I can't figure out when to do that. It seems like I should be able to do that once in viewDidLoad
, but I can't get that to work. I've tried calling view.updateConstraints()
and view.layoutSubviews()
after setting the constraints, but to no avail.
I did find that if I set the constraints in viewDidLayoutSubviews
everything works as expected. I guess I'd like to know two things...
The relationship between two user interface objects that must be satisfied by the constraint-based layout system.
I activate and deactivate NSLayoutConstraints
in viewDidLoad
, and I do not have any problems with it. So it does work. There must be a difference in setup between your app and mine :-)
I'll just describe my setup - maybe it can give you a lead:
@IBOutlets
for all the constraints that I need to activate/deactivate.ViewController
, I save the constraints into class properties that are not weak. The reason for this is that I found that after deactivating a constraint, I could not reactivate it - it was nil. So, it seems to be deleted when deactivated.NSLayoutConstraint.deactivate/activate
like you do, I use constraint.active = YES
/NO
instead.view.layoutIfNeeded()
.Maybe you could check your @properties
, replace weak
with strong
.
Sometimes it because active = NO
set self.yourConstraint = nil
, so that you couldn't use self.yourConstraint
again.
override func viewDidLayoutSubviews() {
// do it here, after constraints have been materialized
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With