我将从我的控制器呈现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点)。
请告知如何处理这种情况。
答案 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时,选择共享选项后,屏幕不再旋转为纵向,而是保持横向显示。