我有一个iPhone应用程序我更新到被具有旋转问题的iOS 6。 我有一个UITabBarController
有16个UINavigationCotrollers
。 大部分子视图可以在纵向或横向的工作,但他们中的一些仅画像。 随着iOS 6的事情时,他们不应该转动。
我试着子类的tabBarController返回supportedInterfaceOrienations
当前navigationController的选择的viewController的:
- (NSUInteger)supportedInterfaceOrientations{
UINavigationController *navController = (UINavigationController *)self.selectedViewController;
return [navController.visibleViewController supportedInterfaceOrientations];
}
这让我更接近。 视图控制器不转出的位置时可见的,但如果我在景观和切换标签,新标签将横向即使不支持它。
理想情况下,应用程序将只能在当前可见视图控制器的支持orienation。 有任何想法吗?
继承您UITabBarController
重写这些方法:
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// You do not need this method if you are not supporting earlier iOS Versions
return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}
-(NSUInteger)supportedInterfaceOrientations
{
return [self.selectedViewController supportedInterfaceOrientations];
}
-(BOOL)shouldAutorotate
{
return YES;
}
继承您UINavigationController
重写这些方法:
-(NSUInteger)supportedInterfaceOrientations
{
return [self.topViewController supportedInterfaceOrientations];
}
-(BOOL)shouldAutorotate
{
return YES;
}
然后实现这些方法在你viewControllers,你不想旋转:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
-(BOOL)shouldAutorotate
{
return NO;
}
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
并为你想旋转viewControllers:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskAllButUpsideDown;
}
-(BOOL)shouldAutorotate
{
return YES;
}
你tabbarController应该作为应用程序窗口的RootViewController的。 如果您计划支持默认的方向,但一切是颠倒默认的iPhone,那么你不需要做任何事情。 如果你想支持上下颠倒,或者如果你不想再支持的方向,那么你需要设置的应用程序委托和/或info.plist中相应的值。
我有问题,在导航堆栈支持一些视图控制器的所有方向,有的只是画像,但UINavigationController
是返回所有的应用程序支持的方向,这个小黑客帮我。 我不知道如果这是预期的行为或者是什么
@implementation UINavigationController (iOS6OrientationFix)
-(NSUInteger) supportedInterfaceOrientations {
return [self.topViewController supportedInterfaceOrientations];
}
@end
我认为是更好的类似的东西(如一个类中的方法)
-(NSUInteger) supportedInterfaceOrientations {
if([self.topViewController respondsToSelector:@selector(supportedInterfaceOrientations)])
{
return [self.topViewController supportedInterfaceOrientations];
}
return UIInterfaceOrientationMaskPortrait;
}
这确保了该方法的实施。 如果你没有做这样的检查,该方法不(在iOS5中ENV等)来实现应用程序应该崩溃!
如果您打算启用或全部观点不能旋转控制器,你并不需要继承UINavigationController
。 而是使用:
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
在你AppDelegate
。
如果您计划支持父视图控制器应用中的所有方向,但不同的方向( UINavigationController
栈为例),你应该使用
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
从AppDelegate
与您的父视图控制器下面的方法相结合。
- (BOOL)shouldAutorotate
和
- (NSUInteger)supportedInterfaceOrientations
但是,如果你打算在同一个导航堆栈(像我)在不同的孩子ViewControllers不同的方向设置你需要检查当前的ViewController导航堆栈。
我创建了以下在我UINavigationController
子类:
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
int interfaceOrientation = 0;
if (self.viewControllers.count > 0)
{
DLog(@"%@", self.viewControllers);
for (id viewController in self.viewControllers)
{
if ([viewController isKindOfClass:([InitialUseViewController class])])
{
interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}
else if ([viewController isKindOfClass:([MainViewController class])])
{
interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}
else
{
interfaceOrientation = UIInterfaceOrientationMaskAllButUpsideDown;
}
}
}
return interfaceOrientation;
}
既然你不能从孩子ViewControllers了控制呈现视图控制器的旋转设置,你必须以某种方式拦截什么视图控制器是目前在导航堆栈。 所以这是我做了什么:)。 希望帮助!
文章来源: iOS 6 UITabBarController supported orientation with current UINavigation controller