willAnimateRotationToInterfaceOrientation不会在ios6 / 7上调用

我有一个旧的应用程序,仍然生活在iTunes上,写在iOS 5.我想更新它在iOS 6和7上运行。一切都很好,我已经更新我的代码使用ARC。 然而,当试图保持相同的自转理念时,我一直打砖墙。 我已经在SO中检查了相关的主题:

在iOS 7中强制横向和自动旋转 ,

iOS 6中的自动旋转具有奇怪的行为

并遵循类似的话题,我发现这一点:

iOS 6 Autorotation问题和帮助

这导致我做到以下几点:

我在我的AppDelegate中设置了rootViewController,如下所示:

self.preloadingViewController = [[PreloadingViewController alloc] initWithNibName:@"PreloadingViewController" bundle:nil]; self.window.rootViewController = self.preloadingViewController; 

我已经放置:

 - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ return UIInterfaceOrientationMaskAllButUpsideDown; 

}

在我的AppDelegate。 我在所有应用程序的UIViewControllers(包括上面提到的PreloadingViewController)的SuperViewController(inheritance术语中的父类)中覆盖了shouldAutorotatesupportedInterfaceOrientations

 - (BOOL)shouldAutorotate{ return YES; } - (NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskAllButUpsideDown; } 

并在每个孩子UIViewController,我重写

 - (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

用代码来以理想的方式布置UI元素以用于纵向和横向取向。

最后我的应用程序的plist文件下

支持的接口方向

包含:

肖像(底部主页button),风景(左主页button),风景(右主页button)

所有的方向我想支持。

尽pipe如此,即使supportInterfaceOrientations和willAnimateRotationToInterfaceOrientation被调用,我的rootViewController每个方向的变化, willAnimateRotationToInterfaceOrientation永远不会被调用。 我甚至在我的SuperViewController中重写shouldAutomaticallyForwardRotationMethods返回YES,但无济于事。

我在这里做错了什么? 有任何想法吗? 我甚至认为旧的ios5型xib会引起这个问题,但我不认为是这样。

提前致谢。

在iOS 6中,将调用willAnimateRotationToInterfaceOrientation方法。

使用:

 - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; // Something } - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; // Something } 

在你的rootController

编辑:

新的main.m

 #import <UIKit/UIKit.h> #import "yourAppDelegate.h" int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([yourAppDelegate class])); } } 

由于我的rootViewController是唯一一个获取其shouldAutorotatesupportedInterfaceOrientations方法调用,我决定注册每隔一个视图控制器得到通知任何UIDeviceOrientationDidChangeNotification

 [NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil]; - (void)orientationChanged:(NSNotification *)notification { NSLog(@"Orientation changed!"); [self layoutForOrientation:[[UIDevice currentDevice] orientation]]; } 

在我的layoutForOrientation:方法中,我处理了uview的控件方向。

但是,尽pipe我确实收到了UIDeviceOrientationDidChangeNotification通知,但是我的视图方向实际上并不会改变以匹配当前的方向,也就是说,如果新方向是UIInterfaceOrientationLandscapeRight ,则视图方向将保留在UIInterfaceOrientationPortrait并且其子视图将旋转90度。 这当然看起来不正确。 拉了很多头发后,我决定放弃这条路线。

相反,我已经将我的rootViewController设置为一个UINavigationController,并将它连续的UIViewControllers放在它上面。 由于我不想在我的应用程序中显示导航栏,因此我将导航控制器的navigationBarHidden属性设置为YES。 这样,方法willAnimateRotationToInterfaceOrientation被当前位于navigationCotroller控制器堆栈顶部的每个UIViewController调用,并且其相应的视图和视图控件正确旋转以获得所需的方向。

这是UIInterfaceOrientationMaskAllButUpsideDown ,因为我的大多数视图控制器支持界面方向匹配掩码: UIInterfaceOrientationMaskAllButUpsideDown ,这是iPhone的默认行为。 如果我需要支持不同的方向,我将不得不inheritanceUINavigationController并覆盖supportedInterfaceOrientationsshouldAutorotate以支持导航堆栈的顶视图控制器,如Apple的示例项目AlternateViews 。

实现这个方法,为你所需要的返回YES。

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation