Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS8 Interface Rotation Methods not called

Since willAnimateRotationToInterfaceOrientation:duration: is deprecated in iOS8, one needs to use viewWillTransitionToSize:withTransitionCoordinator: instead.

However, this method does not get called in my view controller on iOS8. Is there anything else, I need to implement, in order for this callback to work?

I cannot find anything in the documentation. The only thing I could find, was that it belongs to the new UIContentContainer protocol. However, even if I am adding this to the protocols of my controller explicitly, it does not work.

Any ideas?

like image 234
tschubotz Avatar asked Sep 19 '14 13:09

tschubotz


2 Answers

The viewWillTransitionToSize:withTransitionCoordinator: seems to only work if the interface is actually going to change size, meaning we have rotated 90 degrees. If you have a mask on your layout that only allows landscape, when rotation 180 degrees, the interface size doesn't change, so this method doesn't seem to be called.

I have worked around this in my app by instead registering to the UIDeviceOrientationDidChangeNotification notification like:

(In my view controller's viewWillAppear):

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil]; [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

(An in my viewWillDisappear [remember to unsubscribe])

[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; 

My deviceOrientationDidChange: looks like:

- (void)deviceOrientationDidChange:(NSNotification *)notification {     UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];     [self willRotateToInterfaceOrientation:orientation duration:1.0]; } 
like image 156
line72 Avatar answered Sep 19 '22 18:09

line72


As per the docs, remember to call super

- (void)viewWillTransitionToSize:(CGSize)size        withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {     [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];      // ... } 

Otherwise child view controllers will not get the message forwarded on to them.

like image 30
Robert Avatar answered Sep 17 '22 18:09

Robert