我目前在应用程序商店中有一个几乎只有风景的iPad应用程序,并且在处理旋转锁定时遇到了一些新的iOS 6方式问题。
这是一个基于UINavigationController的应用程序,因为iOS处理rootViewController
的{{1}}的大部分责任,我必须手动询问每个UIViewController它想要的旋转。
由于我有非常大量的UIWindow
s手动添加代码到每个控制器这样做会花费我很多年,所以我做了UINavigationController和UIViewController的扩展来覆盖这些调用,在那里我可以手动设置我想要阻止肖像的视图以及允许它的内容。
的UINavigationController-Extension.m:
UIViewController
我认为这已解决了问题(我还将应用程序锁定在info.plist中的横向,以便它将启动到lanscape,然后在应用程序委托中调用//
// UINavigationController-Extension.m
// DrivingInstructor
//
// Created by Liam Nichols on 06/12/2012.
// Copyright (c) 2012 Liam Nichols. All rights reserved.
//
#import "UINavigationController-Extension.h"
@implementation UINavigationController (Extension)
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return [self.topViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}
-(NSUInteger)supportedInterfaceOrientations
{
return self.topViewController.supportedInterfaceOrientations;
}
-(BOOL)shouldAutorotate
{
return YES;
}
@end
@implementation UIViewController (Extension)
-(BOOL)shouldAutorotate
{
return NO;
}
-(NSUInteger)supportedInterfaceOrientations
{
if ([[self portraitClasses] containsObject:NSStringFromClass([self class])])
{
return UIInterfaceOrientationMaskAll;
}
return UIInterfaceOrientationMaskLandscape;
}
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
if ([[self portraitClasses] containsObject:NSStringFromClass([self class])])
{
return YES;
}
return (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight);
}
-(NSArray*)portraitClasses
{
static NSArray *classes;
if (classes == nil)
{
classes = @[ @"MockTestController", @"PLUILibraryViewController", @"PhotoViewController" ];
}
return classes;
}
@end
并返回所有方向这样我的选择视图可以在需要时访问肖像。
所以这似乎有效,所有锁定到lanscape的视图控制器接受我在扩展类中指定的3 ..我正在监视扩展,每当我推到新控制器时它检查方向并锁定应用程序到指定的方向。
我找到的一个问题似乎无法解决的问题是,当我在我允许的视图控制器上进行纵向处理时,尝试弹回到上一个视图控制器锁定到横向的内容,{{1}永远不会再次调用,应该锁定到横向的视图不会(这会导致问题)。
根据apple文档,这是它应该如何工作,因为处理旋转的责任传递给rootViewController,并且由于用户没有旋转他们的设备并且rootViewController没有改变,所以不需要请求{{ 1}} ..
我的问题是,有没有办法让应用程序强制调用application:supportedInterfaceOrientationsForWindow:
,还是应该以不同方式执行此操作?
感谢阅读,如果我能找到最后一个bug的解决方案,那么这段代码可能是对同样情况的人的一个很好的参考。
- - - - - - - - 编辑
正在进行一些进一步的调查,发现在supportedInterfaceOrientations
函数之前,supportedInterfaceOrientations
实际上实际上是在控制器上调用的,我试图弹回并确实返回正确的掩码{{1尝试让它自动从肖像中旋转回来,但它似乎没有听到这个响应,仍然留下supportedInterfaceOrientations
的肖像......
所以这意味着我不需要再次调用viewWillAppear:
,而是让设备旋转回到横向!
答案 0 :(得分:0)
根据您可以致电的文件:
+ (void)attemptRotationToDeviceOrientation
如果我正确理解了文档,那么将再次向不同的视图控制器查询旋转。