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