iOS change auto layout constraints when device rotates

autolayout, ios, nslayoutconstraint, objective-c

Solution

In `willRotateToInterfaceOrientation:duration:`, send `setNeedsUpdateConstraints` to any view that needs its constraints modified.

Alternatively, make a `UIView` subclass. In your subclass, register to receive `UIApplicationWillChangeStatusBarOrientationNotification`. When you receive the notification, send yourself `setNeedsUpdateConstraints`.

This sets the `needsUpdateConstraints` flag on the view. Before the system performs layout (by sending `layoutSubviews` messages), it sends an `updateConstraints` message to any view that has the `needsUpdateConstraints` flag set. This is where you should modify your constraints. Make a `UIView` subclass and override `updateConstraints` to update your constraints.

Problem

I want to modify the layout constraints when the device rotates. My `UIViewController` is composed of 2 `UIViews`, in landscape they are horizontally aligned, and in portrait they are vertically aligned. It does work actually, in `willAnimateRotationToInterfaceOrientation`, I remove the desired constraints and replaced them with others to have the right layout... But there are problems, during rotation auto layout starts breaking constraints before `willAnimateRotationToInterfaceOrientation` is called, so where are we meant to replace our constraints when the device reorientation occurs ? Another issue is performance, after a few rotations the system doesn't break anymore constraints, but I have a huge performance drop, especially in portrait mode...

Original source