I am making an iOS app that needs to do a little interface rearrangement upon rotation. I am trying to detect this by implementing - (void)orientationChanged:(NSNotification *)note
, but this gives me notifications for when the device is face up or face down.
I want a way to just get notified when the interface changes orientations.
Since iOS 8, above methods were deprecated, and the proper way to handle and detect device rotation is:
-(void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id )coordinator;
To detect device orientation, you should (according to documentation): call the statusBarOrientation method to determine the device orientation
There are several method where you can do that, you can find them in the UIViewController class reference:
– willRotateToInterfaceOrientation:duration:
– willAnimateRotationToInterfaceOrientation:duration:
– didRotateFromInterfaceOrientation:
You could also do it in the viewWillLayoutSubviews
method, but be careful with it, because it is called on the screen appearance too, and whenever you add a subview.
Edit:
Solution now deprecated, see accepted answer.
Swift 3:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
}
Since iOS 8 this is the correct way to do it.
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: { context in
// This is called during the animation
}, completion: { context in
// This is called after the rotation is finished. Equal to deprecated `didRotate`
})
}
来源:https://stackoverflow.com/questions/14369251/detect-rotation-changes-in-ios