tabBarController和navigationControllers在横向模式中,第二集

时间:2009-04-16 14:59:31

标签: iphone uiviewcontroller uitabbarcontroller landscape

我有一个UITabBarController,每个标签处理一个不同的UIViewController,根据需要推送堆栈的新控制器。在其中两个选项卡中,当达到特定控制器时,我需要能够旋转iPhone并以横向模式显示视图。经过艰苦的努力,我发现必须继承UITabBarController以覆盖shouldAutorotateToInterfaceOrientation。但是,如果我只是在实现中返回YES,则会出现以下不良副作用:

旋转iPhone时,每个标签中的每个控制器都会自动进入横向模式。

甚至覆盖每个控制器中的allAutorotateToInterfaceOrientation返回NO也不起作用:当iPhone旋转时,控制器处于横向模式。

我在子类UITabBarController中实现了如下的shouldAutorotateToInterfaceOrientation:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if([self selectedIndex] == 0 || [self selectedIndex] == 3)
        return YES;

    return NO;
}

因此,只有我感兴趣的两个标签实际上支持横向模式。 有没有办法支持特定选项卡堆栈上特定控制器的横向模式?

我试过,但没有成功,像是

(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

if([self selectedIndex] == 0 || [self selectedIndex] == 3)
{   
   if ([[self selectedViewController] isKindOfClass: [landscapeModeViewController class]])
           return YES;
    }

     return NO;

}

另外,我尝试使用委托方法didSelectViewController,但没有成功。 任何帮助是极大的赞赏。 谢谢。

7 个答案:

答案 0 :(得分:7)

这是UITabBarController的扩展,它将对shouldAutorotateToInterfaceOrientation的调用委托给当前选定的子控制器。使用此扩展,您不再需要继承UITabBarController,并且可以像控制器一样在控制器中使用shouldAutorotateToInterfaceOrientation

的UITabBarController + Autorotate.h:

#import <UIKit/UIKit.h>

@interface UITabBarController (Autorotate)
@end

的UITabBarController + Autorotate.m:

#import "UITabBarController+Autorotate.h"

@implementation UITabBarController (Autorotate)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    UIViewController *controller = self.selectedViewController;
    if ([controller isKindOfClass:[UINavigationController class]])
        controller = [(UINavigationController *)controller visibleViewController];
    return [controller shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end

答案 1 :(得分:4)

这对我有用:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    if(self.selectedIndex == 0 && [[[self.viewControllers objectAtIndex:0] visibleViewController] isKindOfClass:[MyViewController class]])
        return YES;
    else
        return NO;
}

答案 2 :(得分:3)

我已经能够使用它一段时间(从我的应用程序的标签栏控制器)没有问题:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

这样,在相应的VC中,我们可以进行真实的检查,在这种情况下是照片库视图(还有什么?):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

我的图库视图甚至不在给定导航控制器的堆栈顶部。它仍然被调用。

唉,我刚刚发现,当VC潜伏在 MoreViewController (而不是四个主要标签页)中时, 不能正常工作。在这种情况下,我的画廊VC永远不会被调用。我认为这是因为我一直在调用的VC实际上是选定选项卡中的导航控制器,然后将内容传播到相应的VC,在本例中是我的照片库VC。但对于更多的VC来说,事情并没有那么顺利...... aaaand事情从那里开始走下坡路。 :\

我尝试使用Andreas的修改(参见本主题的其他部分),但无济于事。线索欢迎!

答案 3 :(得分:2)

我遇到了与使用UITabBarController时相同的问题。我需要控制允许哪些UIViewControllers旋转,哪些不允许。我的主要问题是更多选项卡。我不想让MORE选项卡中包含的任何UIViewControllers旋转。

我的解决方案是创建我自己的UITabBarController,我称之为MyTabBarController:

@interface MyTabBarController : UITabBarController <UITabBarDelegate> {

}

然后我实现了shouldAutorotateToInterfaceOrientation方法:

@implementation MyTabBarController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 UIViewController *controller = [self selectedViewController];

 if ((controller == [self moreNavigationController]) || ([self selectedIndex] == 4))
 {
  return interfaceOrientation == UIInterfaceOrientationPortrait;
 }

 return [controller shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end

我需要发现是否选择了MORE选项卡。这是一个两步过程;当最初选择MORE选项卡时,API会返回一个高于4的selectedIndex,因此我需要将所选控制器与moreNavigationController进行比较。

如果从MORE选项卡中选择了UIViewController,那么selectedIndex最终为4,但selectedController不再是moreNavigationController,而是选择了UIViewController。

if((controller == [self moreNavigationController])||([self selectedIndex] == 4))负责此问题。

现在,当我运行我的应用程序时,不会旋转MORE选项卡中的UIViewControllers。我希望这将有助于其他开发人员遇到与我相同的问题。

埃米利奥

答案 4 :(得分:1)

从我在这里和其他地方看到的,我已经将使用方法shouldAutorotate的解决方案拼接在一起,因为旧的shouldAutorotateToInterfaceOrientation已被弃用。

我已将它放在UITabBarController的类别中。 我希望这是可以接受的!

// call to method shouldAutorotate replaces call to method shouldAutorotateToInterfaceOrientation (deprecated)
-(BOOL)shouldAutorotate
{ // check whether selected view controller should autorotate    
  UIViewController *controller = self.selectedViewController;
  if ([controller isKindOfClass:[UINavigationController class]])
    { // in case it is a navigation controller: get visible view of that
      controller = [(UINavigationController *)controller visibleViewController];
    }
  return [controller shouldAutorotate];
}

答案 5 :(得分:0)

谢谢,谢谢,谢谢。这已经是2天了解如何做到这一点。当你有一个带有navigationControllers的tabBarController时,这是我对你的所有帮助。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

UIViewController *controller = self.selectedViewController;
if ([controller isKindOfClass:[UINavigationController class]])
    controller = [(UINavigationController *)controller visibleViewController];

if([controller isKindOfClass:[LOCviewcontroller class]])
    return YES;
else
    if([controller isKindOfClass:[personWebSiteView class]])
        return YES;
else return NO; 

}

任何对neophite编码器代码的批评总是受到赞赏......杰克

答案 6 :(得分:0)

是否真的可以继承UITabBarController(如上面接受的答案所示)?

我知道Apples说过“你永远不应该继承UITabBarController或UINavigationController” - 或者我误解了吗?

反正;我找到了this tutorial,它们将UIViewController子类化为UITabBarController。