我一直在网上寻找解决方案,但一无所获。我正在尝试使我的iOS 5应用iOS 6兼容。我无法让定位的东西正常工作。我无法检测到旋转何时发生。这是我正在尝试的代码:
- (BOOL)shouldAutorotate {
return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
// pre-iOS 6 support
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}
新的supportedInterfaceOrientation:方法被调用就好了。但是,shouldAutorotate方法不会触发。我需要在旋转时进行一些图像交换,但我无法得到旋转即将发生的任何迹象。
提前致谢。
答案 0 :(得分:80)
查看您的应用启动时是否收到以下错误。
应用程序窗口应在应用程序启动结束时具有根视图控制器
如果是这样,修复它的方法是在AppDelegate.m
文件中进行以下更改(尽管似乎有很多答案如何解决这个问题):
// Replace
[self.window addSubview:[navigationController view]]; //OLD
// With
[self.window setRootViewController:navigationController]; //NEW
应正确调用此shouldAutoRotate
。
答案 1 :(得分:45)
当使用UINavigationController作为应用程序的基础时,我使用以下子类给予我灵活性,允许最顶层的子视图控制器决定旋转。
@interface RotationAwareNavigationController : UINavigationController
@end
@implementation RotationAwareNavigationController
-(NSUInteger)supportedInterfaceOrientations {
UIViewController *top = self.topViewController;
return top.supportedInterfaceOrientations;
}
-(BOOL)shouldAutorotate {
UIViewController *top = self.topViewController;
return [top shouldAutorotate];
}
@end
答案 2 :(得分:15)
该方法不是确定该方法的正确方法。正确的方法是willRotateToInterfaceOrientation:duration:
应该不推荐使用旋转方向(与shouldAutorotate相反)方法,并且从iOS 6开始不再调用它,但它无论如何都不能按照您使用它的方式使用。
编辑对重复的downvotes的回应。请解释为什么使用我指出的方法不是(引用OP)“指示即将发生轮换”。问题和标题的内容不匹配。
答案 3 :(得分:10)
看起来在iOS 6上,容器导航控制器在旋转时不会查询子视图控制器:
iOS 6 release notes中的:
现在,iOS容器(例如UINavigationController)不会参考 他们的孩子,以确定他们是否应该自转。通过 默认,应用程序和视图控制器支持的界面 方向设置为iPad的UIInterfaceOrientationMaskAll 适用于iPhone的idiom和UIInterfaceOrientationMaskAllButUpsideDown 成语。
此行为很容易测试。我所做的是使用相同的自定义视图控制器
在第一种情况下,在shouldAutorotate
和supportedInterfaceOrientations
的组合下,一切都是在自定义导航控制器中决定的,因为supportedInterfaceOrientations
同意应用程序支持的方向。
在第二种情况下,即使UIPageViewController调用自定义视图控制器的supportedInterfaceOrientations
,也不会考虑返回值。如果在UIPageViewController的子类中覆盖这两个方法,它就可以工作。我不确定它的副作用,因为这个类不应该是子类。
答案 4 :(得分:10)
如果viewController
中的viewController
是小孩UINavigationController
,那么您可以执行以下操作:
UINavigationController
shouldAutoRotate
topViewController
此消息 //此方法位于UINavigationController
子类
- (BOOL)shouldAutorotate
{
if([self.topViewController respondsToSelector:@selector(shouldAutorotate)])
{
return [self.topViewController shouldAutorotate];
}
return NO;
}
答案 5 :(得分:1)
我的应用程序启动时也出现以下错误。
“应用程序窗口应在应用程序启动结束时具有根视图控制器”
我正在使用UISplitViewController * splitViewController
如果是这样,修复它的方法是在AppDelegate.m文件中进行以下更改:
替换
[self.window addSubview:[splitViewController view]];
使用
[self.window setRootViewController:splitViewController];
此shouldAutoRotate
被调用并正常工作后。
答案 6 :(得分:1)
我使用的是iOS 7,但我相信我的情况对其他人有帮助。
我有一个以UITabBarController为根的深视图控制器层次结构。保证调用shouldAutorotate的唯一地方是UITabBarController。所以我只是将UITabBarController子类化,并将我的旋转控制逻辑放在我的shouldAutorotate方法中。
答案 7 :(得分:0)
我就是这样做的
如果要检查当前方向,请将此行添加到viewconrtoller.m文件中
#define isPortrait [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown
然后你想检查方向,写下面的条件
- (void)viewDidLoad
{
if(isPortrait)
{
//portrait mode....
NSLog(@"its in IsPotraitMode");
}
else
{
//landscape mode....
NSLog(@"its in IsLandscapeMode");
}
}
答案 8 :(得分:0)
如果使用UINavigationController作为应用程序的基础。我创建UINavigationController的类别,并将其命名为“ UINavigationController + autoRotate”。 将其放入您的UINavigationController + autoRotate.h:
#import <UIKit/UIKit.h>
@interface UINavigationController (autoRotate)
-(BOOL)shouldAutorotate;
-(NSUInteger)supportedInterfaceOrientations;
@end
将其放在UINavigationController + autoRotate.m中:
#import "UINavigationController+autoRotate.h"
@implementation UINavigationController (autoRotate)
- (BOOL)shouldAutorotate
{
return [self.visibleViewController shouldAutorotate];
}
- (NSUInteger)supportedInterfaceOrientations
{
return [self.topViewController supportedInterfaceOrientations];
}
@end