I am presenting UIActivityViewController from my controller. I've encountered issues with rotations. After some data sharing option is chosen, let's say "Mail", mail compose view controller is presented. But if I rotate the device and dismiss the mail controller afterwards, my VC is not rotated to the current orientation. I've tried to set up the completion handler for UIActivityViewController as following:
1)
[activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed){
[UIViewController attemptRotationToDeviceOrientation];
}];
or
2)
[activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed){
UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];
[self layoutForInterfaceOrientation:currentOrientation];
}];
The first solution did not help at all. The second solution left the navigation bar unrotated (12 points difference in height).
Please advise how to handle this situation.
I've resolved the issue. First of all, I should say that my VC is always rotated to portrait after MailComposeVC is dismissed regardless of the current device orientation and its state before showing a mail...
And the only VC method that gets called during auto rotation when MailComposeVC is on screen is viewWillLayoutSubviews/viewDidLayoutSubviews
. (willAnimateRotationToInterfaceOrientation
is not called!)
So, I reset the navigation bar to recover its height and call my custom layout method if my VC is invisible, like that:
(void) viewDidLayoutSubviews {
// HACK: forcing the bars to refresh themselves - this helps to get the shorter version when switching to landscape and the taller one when going back!!!
if (amIhidden) {
[self.navigationController setNavigationBarHidden:YES animated:NO];
[self.navigationController setNavigationBarHidden:NO animated:NO];
UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];
[self layoutForInterfaceOrientation:currentOrientation];
}
}
amIhidden BOOL
is set when presenting MailComposeViewController, as following:
UIActivityViewController *activityViewController = [[UIActivityViewController alloc]
initWithActivityItems:@[self]
applicationActivities:nil];
amIhidden = YES;
[activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed){
amIhidden = NO;
}];
[self presentViewController:activityViewController animated:YES completion:nil];
Hope, my solution will help to somebody else!