我有一个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,但没有成功。 任何帮助是极大的赞赏。 谢谢。
答案 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)
- (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。