取消UIActivityViewController后正确的方向

时间:2013-01-30 17:19:51

标签: ios rotation orientation uideviceorientation uiactivityviewcontroller

我将从我的控制器呈现UIActivityViewController。我遇到了旋转问题。选择一些数据共享选项后,让我们说“邮件”,显示邮件撰写视图控制器。但是如果我之后旋转设备并关闭邮件控制器,我的VC就不会旋转到当前方向。我试图为UIActivityViewController设置完成处理程序如下:

1)

[activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed){
            [UIViewController attemptRotationToDeviceOrientation];
        }];

2)

[activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed){
        UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];
        [self layoutForInterfaceOrientation:currentOrientation];
    }];

第一种解决方案根本没有帮助。第二种解决方案是导航栏未旋转(高度差12点)。

请告知如何处理这种情况。

3 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。首先,我应该说,在MailComposeVC被解散后,无论当前设备方向及其显示邮件之前的状态,我的VC总是旋转到纵向... 当MailComposeVC在屏幕上时,在自动轮换期间调用的唯一VC方法是viewWillLayoutSubviews/viewDidLayoutSubviews。 (willAnimateRotationToInterfaceOrientation未被调用!) 所以,我重置导航栏以恢复其高度,如果我的VC不可见,则调用我的自定义布局方法,如下所示:

(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];
    }
}
在呈现MailComposeViewController时设置

amIhidden BOOL,如下所示:

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];

希望,我的解决方案对其他人有帮助!

答案 1 :(得分:0)

如果接受的解决方案对你不起作用(像我一样),我已经回答了类似的问题,这个问题既简单又干净。 Objective c - UIActivityViewController orientation mode

答案 2 :(得分:0)

我在Swift 3中找到了一个解决方案。但我认为它也适用于Objective-C。

AppDelegate函数application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask中,返回特定视图控制器的正确方向。

棘手的部分是你必须挖掘你希望方向基于的视图控制器。就像我的情况一样,当UIActivityViewController出现时,{{1 }和window?.currentViewController()都是window?.topMostController()。因为我在其他地方使用UIActivityViewController,我不能用它作为线索。然后我检查了UIActivityViewController,发现它是window?.currentViewController()?.presentingViewController。由于我知道我想要的视图控制器是UINavigationController的顶视图控制器,我的解决方案如下:

UINavigationController

使用此代码,在显示MyLandscapeViewController时,选择共享选项后,屏幕不再旋转为纵向,而是保持横向显示。

相关问题