Handling interface rotation in iOS 7
autolayout, autoresizingmask, ios, objective-c, uiviewcontroller
Solution
Since iOS6, you should not be using `willRotateToInterfaceOrientation:` and `didRotateFromInterfaceOrientation:`. These are only called on the front-most presented view controller, and will not be called on others. This means if you have a pushed view controller or a presented view controller, all others will not layout correctly.
Instead, you should always use `viewWillLayout` and `viewDidLayout` to handle rotation. They are both called inside an animation block, so anything you do which is animatable, will be animated.
For positioning views, you can either set the frames yourself, or use auto-layout constraints and adjust the constraints in `viewDidLayout`. If you go the auto-layout route, never remove and add constraints. Use the same constraints as much as possible and just adjust their `constant` values.
Problem
Very simple question, but I'm asking as there seems to be a lot of conflicting views and I've been completely unable to find a definitive answer, let alone a modern one. I use Auto Layout for 99% of my handling of the user changing from portrait to landscape or vice-versa in a `UIViewController`. Works great. But sometimes, I have to rely on frames still for one reason or another. How would I best handle this? You have `willAnimateRotationToInterfaceOrientation`, `willRotateToInterfaceOrientation`, the `NSNotification` methods with checking status bar, and I'm sure there's some others. If I want to change the position of a view when the user rotates, which method should I be changing the frame in? And is it best to do it with a simple `setFrame:` or should I be using autoresizing masks?