6

我有一个 UITabBarController,每个选项卡处理一个不同的 UIViewController,它根据需要推送堆栈新控制器。在其中两个选项卡中,当到达特定控制器时,我需要旋转 iPhone 并在横向模式下可视化视图的能力。经过一番挣扎后,我发现必须将 UITabBarController 子类化以覆盖 shouldAutorotateToInterfaceOrientation。但是,如果我在实现中简单地返回 YES,则会出现以下不良副作用:

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

即使在每个控制器中覆盖 shouldAutorotateToInterfaceOrientation 以返回 NO 也不起作用:当 iPhone 旋转时,控制器处于横向模式。

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

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

    return NO;
}

这样只有我感兴趣的两个选项卡才能真正获得对横向模式的支持。有没有办法支持特定选项卡堆栈上特定控制器的横向模式?

我试过了,但没有成功,比如

(BOOL)应该自动旋转到接口方向:(UI接口方向)接口方向{

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

     return NO;

}

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

4

7 回答 7

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
于 2009-07-31T10:43:29.763 回答
4

这对我有用:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    if(self.selectedIndex == 0 && [[[self.viewControllers objectAtIndex:0] visibleViewController] isKindOfClass:[MyViewController class]])
        return YES;
    else
        return NO;
}
于 2009-04-21T13:34:26.287 回答
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。但是对于 More VC 来说,事情并没有那么顺利...... aaaand 事情从那里轮流走下坡路。:\

我尝试使用 Andreas 的修改(请参阅此线程的其他地方),但无济于事。欢迎提供线索!

于 2009-08-12T23:20:37.337 回答
2

在使用 UITabBarController 时,我遇到了与您相同的问题。我需要控制哪些 UIViewController 可以旋转,哪些不可以。我的主要问题是更多选项卡。我不希望 MORE 选项卡中包含的任何 UIViewController 旋转。

我的解决方案是创建自己的 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 选项卡时,API 返回一个大于 4 的 selectedIndex,因此我需要将所选控制器与 moreNavigationController 进行比较。

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

if ( (controller == [self moreNavigationController]) || ([self selectedIndex] == 4))解决了这个问题。

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

埃米利奥

于 2010-01-09T20:11:31.270 回答
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];
}
于 2013-04-04T09:40:48.937 回答
0

谢谢你,谢谢你,谢谢你。弄清楚如何做到这一点已经有 2 天了。当你有一个带有导航控制器的 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; 

}

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

于 2010-08-04T23:37:07.033 回答
0

继承 UITabBarController 真的可以吗(如上面接受的答案中所建议的那样)?

我知道 Apples 说过类似“你永远不应该继承 UITabBarController 或 UINavigationController”之类的话——还是我误解了?

反正; 我找到了本教程,他们将 UIViewController 子类化,并在其中放置了 UITabBarController。

于 2011-02-18T07:35:56.633 回答