我有一个支持所有界面方向的视图控制器。但是,呈现视图控制器应仅支持纵向模式。
到目前为止一切顺利。
然而,在iOS8中,当我在横向模式中关闭视图控制器WHILE时,横向模式保持不变。由于我shouldAutorotate
设置为NO
,因此永远不会回转。
问题是,如何强制呈现VC返回肖像?
我目前已实施此解决方法:
- (BOOL)shouldAutorotate
{
if ([self interfaceOrientation] != UIInterfaceOrientationPortrait)
{
return YES;
}
else
{
return NO;
}
}
它允许将设备移动到纵向,并且它将保留在此处,因为在它的纵向自动旋转被禁用之后。
但在用户转动手机之前,它看起来很难看。
如何强迫它?
答案 0 :(得分:2)
我们遇到了完全相同的问题。 您可以通过代码以编程方式旋转它 -
if ([UIApplication sharedApplication].statusBarOrientation != UIInterfaceOrientationPortrait) {
NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
}
有两种可能的选择 -
1)在您关闭呈现的viewController之前,如果是,则旋转为纵向 需要
2)解雇后,在" viewDidAppear"中旋转为肖像。提出的viewController。
这个问题的一个问题是你无法通过完成块,但你可以在iOS8中使用下一个回调:
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
if (self.needToDismissAfterRotatation)
self.needToDismissAfterRotatation = NO;
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
} completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
// dismiss
}];
}
}
顺便说一下,在iOS8中苹果对屏幕旋转的方式做了很大的改变,当应用程序旋转,屏幕旋转,UIWindow中的所有元素也旋转,这就是为什么当呈现的viewController旋转到风景,即使它只支持肖像,呈现viewController也会旋转...
我们在这个问题上苦苦挣扎了很多天,最后我们提出了一个解决方案,将呈现的viewController放在一个新的UIWindow中,这样它就能一直保持呈现viewController的肖像 < / p>
示例项目: "modalViewController" in UIWindow
答案 1 :(得分:0)
此代码将强制UI回到纵向,假设您尝试强制纵向的视图控制器已经是根视图控制器(如果它不是根视图,则此代码将恢复根视图控制器,但没有任何其他已推送到其上的视图控制器):
UIInterfaceOrientation orientation = [[UIApplication
sharedApplication] statusBarOrientation];
if (orientation != UIInterfaceOrientationPortrait) {
// HACK: setting the root view controller to nil and back again "resets"
// the navigation bar to the correct orientation
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIViewController *vc = window.rootViewController;
window.rootViewController = nil;
window.rootViewController = vc;
}
它不是很漂亮,因为它在顶级视图控制器被解散后突然跳跃,但它比在风景中留下更好。