3

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

4

6 回答 6

10

在您的 Navigation Controller 子类中,将决定转发到堆栈中的顶部视图控制器:

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

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

于 2012-09-26T12:56:21.943 回答
1

您应该观看WWDC'2012 视频,尤其是“基本要素”部分中有关轮换的视频。

一个叫做“iOS中视图控制器的T演进”的文章非常详细地解释了关于旋转的主题(以及如何使它们与各种iOS版本兼容),并附有解释和代码示例,我无法比Apple更好地解释它; )

于 2012-09-22T18:55:31.633 回答
0

好吧,我有点破解了这个问题。这是我的子类 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

我只是在每个视图控制器的默认值中为 @"Should Rotate" 设置了一个整数

- (void)viewWillAppear:(BOOL)animated

奇迹般有效!

于 2012-09-23T23:52:23.780 回答
0

如果您使用的是本机 rootViewController,则必须对其进行扩展以优雅地支持 iOS5。这在上面提到的 WWDC 视频中说。

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

您需要这样做以向后兼容的原因有两件事: - 他们已经弃用了旋转东西的旧方式 - 只有 rootViewController 曾经获得旋转调用。父母应该为它的孩子决定它需要处于什么方向。所有这些变化都与新的 AutoLayout 内容一致。

扩展导航控制器后,转到故事板-> 选择根控制器(在本例中为导航控制器)-> 将类设置为新编写的类。

高温高压

于 2012-09-24T01:15:53.350 回答
0

这是我用来支持 iOS 5 设备和 iOS 6 设备(以及 iPhone 5)的 hack。在您的前缀文件中,添加以下 #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:

于 2012-11-14T01:07:43.207 回答
0

这是我的子类 RootNavController.h

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

    return UIInterfaceOrientationMaskAll;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationMaskPortrait;
}
于 2012-12-22T09:23:15.887 回答