支持iOS 6和iOS 5自转

任何人都可以证实,支持iOS 6和iOS 5,没有必要添加新的iOS 6自动旋转方法,因为苹果文档build议如果您也实现iOS 5方法,这些方法完全被忽略了吗?

特别是,我讲的方法- (NSUInteger)supportedInterfaceOrientations- (BOOL) shouldAutorotate – 这些被编译器忽略和合成,如果你还实现了- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

如果要在新的SDK中打包应用程序,则需要为自动旋转添加新的callback。 但是,只有在iOS 6设备上运行此类应用程序时,才会收到这些callback。 对于在较早的iOS版本上运行的设备,将会收到较早的callback。 如果您不实现新的callback,默认行为是您的应用在iPad上的所有方向上运行,除iPhone上的UpsideDown方向外。

对于iOS5旋转。 检查你想要的方向,并返回YES

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { if ((interfaceOrientation==UIInterfaceOrientationPortrait)||(interfaceOrientation==UIInterfaceOrientationPortraitUpsideDown)) { return YES; } else return NO; } 

iOS 6.0 Autorotation支持

 - (BOOL)shouldAutorotate { return NO; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationIsPortrait(UIInterfaceOrientationMaskPortrait|| UIInterfaceOrientationMaskPortraitUpsideDown); } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationIsPortrait(UIInterfaceOrientationPortrait|| UIInterfaceOrientationPortraitUpsideDown); } 
  - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationMaskAll; } -(void)viewWillLayoutSubviews { if([self interfaceOrientation] == UIInterfaceOrientationPortrait||[self interfaceOrientation] ==UIInterfaceOrientationPortraitUpsideDown) { if (screenBounds.size.height == 568) { //set the frames for 4"(IOS6) screen here } else { ////set the frames for 3.5"(IOS5/IOS6) screen here } } else if ([self interfaceOrientation] == UIInterfaceOrientationLandscapeLeft||[self interfaceOrientation] == UIInterfaceOrientationLandscapeRight) { if (screenBounds.size.height == 568) { //set the frames for 4"(IOS6) screen here } else { ////set the frames for 3.5"(IOS5/IOS6) screen here } } //it is for IOS5 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return YES; } 

– (void)viewWillLayoutSubviews这个方法会调用ios5 / ios6。 此代码是有用的ios6 / ios5 / ios6与3.5“屏幕/ 4”与ios6屏幕。

我认为最优雅的解决scheme是:

 - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return ((1 << toInterfaceOrientation) & self.supportedInterfaceOrientations) != 0; } 

我想念什么?

你必须在某个地方设置一个标志(我相信你的Info.plist),它指出你使用的是哪一个。 如果你使用新的,你不能为iOS 5构build(或者至less不能在iOS 5上运行)。 如果使用旧的方法,则不会调用新的方法。 所以是的,你几乎必须select你想使用的方法,如果你想支持iOS 5,你不能使用新的方法。

支持ios5和ios6自动旋转我们需要在ios6情况下提供callback….

 [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil]; 

我们需要打电话

 - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } -(BOOL)shouldAutoRotate{ return YES; } 

为ios5

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return ((toInterfaceOrientation == UIInterfaceOrientationPortrait) || (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)); }