请仔细阅读此内容,否则您可能会因为发疯、打架、摇晃、转动您的测试设备而失去 1-2 天的生命,就像动物园里的黑猩猩抓住游客的手机一样!迟早......承诺:)
在 iOS 6 中
shouldAutorotateToInterfaceOrientation:
已弃用并替换为
shouldAutorotate
这意味着 iOS 6 永远不会调用shouldAutorotateToInterfaceOrientation
:
因此,如果您在应用程序中使用了以下内容
iOS6 之前(iOS5、iOS4 等)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if (interfaceOrientation == UIInterfaceOrientationPortrait) {
// your code for portrait mode
}
return YES;
}
你应该使用
iOS 6+之后
- (BOOL)shouldAutorotate {
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
if (orientation == UIInterfaceOrientationPortrait) {
// your code for portrait mode
}
return YES;
}
意识到
UIInterfaceOrientation
是一个属性,UIApplication
并且仅包含 4 种与状态栏方向相对应的可能性:
UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait,
UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight,
UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft
不要将其与
UIDeviceOrientation
这是UIDevice
类的一个属性,包含 7 个可能的值:
UIDeviceOrientationUnknown - Can not be determined
UIDeviceOrientationPortrait - Home button facing down
UIDeviceOrientationPortraitUpsideDown - Home button facing up
UIDeviceOrientationLandscapeLeft - Home button facing right
UIDeviceOrientationLandscapeRight - Home button facing left
UIDeviceOrientationFaceUp - Device is flat, with screen facing up
UIDeviceOrientationFaceDown - Device is flat, with screen facing down
即使你理论上可以使用UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
which 返回UIDeviceOrientation
- 设备实际方向 - 但你必须知道这UIDeviceOrientation
并不总是相等的UIInterfaceOrientation
!例如,当您的设备放在普通桌子上时,您可能会收到意想不到的价值。
您也可以使用UIInterfaceOrientation orientation = self.interfaceOrientation;
which 返回UIInterfaceOrientation
界面的当前方向,但它是 的属性UIViewController
,因此您只能在UIViewController
类中访问它。
如果您想同时支持之前的 iOS6 (iOS3/4/5) 和 iOS6 设备 - 这可能很明显 - 只需在您的代码中同时使用shouldAutorotateToInterfaceOrientation:
和。shouldAutorotate
从 iOS 6开始,设备在应用启动期间会检查 3 个级别和 3 个步骤,如果您愿意,您必须对其进行控制。
1. Info.plist - Supported Interface Orientations
您可以在“摘要”选项卡中以图形方式设置。允许的方向顺序很重要,您可以通过编辑 手动更改它info.plist
,并且设备将在应用程序启动时选择第一个!这一点至关重要,因为当有可能[UIDevice currentDevice].orientation
未知时,应用程序的启动总是会出现问题,尤其是当我们在平坦的表面上测试我们的应用程序时。
请注意
(iPad) 或 (iPhone) 扩展程序还有其他两种设置可能性,如果您使用其中任何一种,它将使用当前设备或模拟器的设置,而忽略没有扩展程序的常规设置。因此,如果您运行仅 iPhone 的应用程序并且不小心在 plist 中的某处留下了“支持的界面方向 (iPad)”行,即使没有任何数据,它也会忽略您之前在常规设置中建立的规则(在我的 iPhone 示例中) ) 并且即使您的应用不打算在 iPhone 上使用给定的方向,但 iPad将使用它,这可能会导致无法预料的错误,
2. AppDelegate - application:supportedInterfaceOrientationsForWindow
返回您希望允许的每个方向的位掩码列表,它会覆盖 info.plist 设置。每次设备旋转时至少调用一次。
3. Top-level view controller or RootViewController - supportedInterfaceOrientations
它与应用程序和应用程序委托的集合产生交集,该集合必须具有非零结果以避免崩溃。每次设备旋转时至少调用一次,除非我们的控制器中安装了另一种方法:
shouldAutorotate
这会干扰应用程序允许的方向,并给出BOOL
默认值YES
。
BE CAREFUL when you use `NavigationController`
作为您的最顶层控制器AppDelegate
,如下所示:
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
UINavigationController *navigationController=[[UINavigationController alloc] initWithRootViewController:detailViewController];
self.window.rootViewController =nil;
self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];
return YES;
在这种情况下,您必须将以下代码AppDelegate
作为类的类别附件放置在您的NavigationController
类中,因为这是最顶层的控制器,如果您没有对其子类别,则没有可以设置其方向的位置/代码设置,因此rootViewController
在这种情况下,您需要强制它检查您的真实情况detailViewController
:
@implementation UINavigationController (OrientationSettings_IOS6)
-(BOOL)shouldAutorotate {
return [[self.viewControllers lastObject] shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations {
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}
@end
在此之后,您可以使用 iOS 6 中可用的任何方法在“最顶部” ViewController
(在我的示例中为)中设置首选方向,如下所示:detailViewController
ViewControllers
1. (BOOL)shouldAutorotate
2. (NSUInteger)supportedInterfaceOrientations
3. (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation