iOS 6自动旋转混乱

时间:2012-09-22 18:20:53

标签: iphone rotation ios6 auto-rotation

我将整个界面放在一个故事板中。如何让大多数ViewControllers仅支持纵向方向,而只有一对支持所有方向。我无法理解苹果新的自动旋转系统。另外,我怎样才能使这个向后兼容iOS 5?

6 个答案:

答案 0 :(得分:10)

在导航控制器子类中,将决策转发到堆栈中的顶视图控制器:

-(NSUInteger) supportedInterfaceOrientations {
   return [self.topViewController supportedInterfaceOrientations];
}

为此创建单独的故事板文件是最糟糕的路径,维护它们与应用更新保持同步将是一个维护噩梦。

答案 1 :(得分:1)

您应该观看WWDC'2012 videos,尤其是“精华”部分中有关轮换的内容。

一个名为“iOS视图控制器的T演变”的内容,详细解释了关于旋转(以及如何使它们与各种iOS版本兼容)的主题,包括解释和代码示例,我无法更好地解释它比苹果;)

答案 2 :(得分:0)

嗯,我有点黑客攻击这个。 这是我的Subclassed NavController.h

#import "RootVC.h"

@implementation RootVC

-(BOOL)shouldAutorotate {
    def = [NSUserDefaults standardUserDefaults];
    return YES;
}
-(NSUInteger)supportedInterfaceOrientations {
    if ([def integerForKey:@"Should Rotate"] == 1) {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    } else {
        return UIInterfaceOrientationMaskPortrait;
    }
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationMaskPortrait;
}
@end

我只是为

中每个视图控制器的默认设置@“应该旋转”设置了一个整数
- (void)viewWillAppear:(BOOL)animated

就像一个魅力!

答案 3 :(得分:0)

如果您使用的是原生rootViewController,则必须将其扩展为优雅地支持iOS5。这在上面提到的WWDC视频中说过。

基本上,如果您使用的是UINavigationViewController,请对其进行扩展并覆盖其- (NSUInteger)supportedInterfaceOrientations方法。在那里,看看你的孩子(你可以只查询旧方法的界面方向),并确定应该支持什么,并返回正确的值。

你需要这样做才能向后兼容是两件事: - 他们已经弃用旧的旋转方式了 - 只有rootViewController才能获得旋转调用。家长应该为孩子决定它需要的方向。所有这些变化都与新的AutoLayout内容一致。

扩展导航控制器后,转到故事板 - >选择根控制器(在这种情况下为导航控制器) - >将课程设置为新写的课程。

HTH

答案 4 :(得分:0)

这是我用来支持iOS 5设备和iOS 6设备(以及iPhone 5)的黑客攻击。在前缀文件中,添加以下#define

#ifdef __IPHONE_6_0 // Only do the rotation fix if we are building with iOS 6 API
@protocol DeprecatedRotationSupported
@optional
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toOrientation;
- (BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;
@end

#define shouldAutorotateToInterface_fixed shouldAutorotate \
{ \
    UIViewController <DeprecatedRotationSupported> *selfTyped = (UIViewController <DeprecatedRotationSupported> *) self; \
\
    if(![self respondsToSelector:@selector(shouldAutorotateToInterfaceOrientation:)]) \
        return NO; \
    int optionCount = 0; \
    for(UIInterfaceOrientation orientation = UIInterfaceOrientationPortrait; orientation <= UIDeviceOrientationLandscapeLeft; orientation++) \
    { \
        if(![selfTyped shouldAutorotateToInterfaceOrientation:orientation]) continue; \
        if(optionCount==1) return YES; \
        optionCount++; \
    } \
    return NO; \
} \
\
- (NSUInteger)supportedInterfaceOrientations \
{ \
    UIViewController <DeprecatedRotationSupported> *selfTyped = (UIViewController <DeprecatedRotationSupported> *) self; \
\
    if(![self respondsToSelector:@selector(shouldAutorotateToInterfaceOrientation:)]) return UIInterfaceOrientationMaskPortrait; \
    \
    NSUInteger supported = 0; \
    \
    if([selfTyped shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationPortrait]) supported |= UIInterfaceOrientationMaskPortrait; \
    if([selfTyped shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationLandscapeLeft]) supported |= UIInterfaceOrientationMaskLandscapeLeft; \
    if([selfTyped shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationLandscapeRight]) supported |= UIInterfaceOrientationMaskLandscapeRight; \
    if([selfTyped shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationPortraitUpsideDown]) supported |= UIInterfaceOrientationMaskPortraitUpsideDown; \
    return supported;  \
} \
\
- (BOOL)shouldAutorotateToInterfaceOrientation
#else // We are building with the older API, leave shouldAutorotateToInterfaceOrientation alone.
#define shouldAutorotateToInterface_fixed shouldAutorotateToInterfaceOrientation
#endif // __IPHONE_6_0

然后,你在任何地方使用shouldAutorotateToInterfaceOrientation:改为使用shouldAutorotateToInterface_fixed:

答案 5 :(得分:0)

这是我的Subclassed RootNavController.h

-(BOOL)shouldAutorotate
{
    return YES;
}
-(NSUInteger) supportedInterfaceOrientations
{
    if (self.topViewController.view.superview)
    {
        return [self.topViewController supportedInterfaceOrientations];
    }

    return UIInterfaceOrientationMaskAll;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationMaskPortrait;
}