iosrotationorientationuideviceorientationuiactivityviewcontroller

Correct orientation after UIActivityViewController is dismissed


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.


Solution

  • 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!