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术语中的父类)中覆盖了shouldAutorotate
和supportedInterfaceOrientations
:
- (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是唯一一个获取其shouldAutorotate
和supportedInterfaceOrientations
方法调用,我决定注册每隔一个视图控制器得到通知任何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并覆盖supportedInterfaceOrientations
和shouldAutorotate
以支持导航堆栈的顶视图控制器,如Apple的示例项目AlternateViews 。
实现这个方法,为你所需要的返回YES。
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation