同一iOS应用程序中同时存在纵向和横向视图

同一iOS应用程序中同时存在纵向和横向视图,ios,objective-c,Ios,Objective C,我有一个UIAbbarController控制多个UIViewController 显示不同的ui视图 除一个视图外,所有视图都应仅以纵向模式显示,而不能旋转,而只有一个视图应仅以横向模式显示,而不能旋转 这似乎微不足道,但我无法做到这一点。。。要么所有视图都处于纵向模式,要么所有视图都处于横向模式。它们要么全部旋转,要么都不旋转 下面是横向视图的代码,但是编译器完全忽略了这些指令,当设备旋转时,视图会旋转到纵向模式 -(UIInterfaceOrientation)preferredInter

我有一个
UIAbbarController
控制多个
UIViewController

显示不同的
ui视图

除一个视图外,所有视图都应仅以纵向模式显示,而不能旋转,而只有一个视图应仅以横向模式显示,而不能旋转

这似乎微不足道,但我无法做到这一点。。。要么所有视图都处于纵向模式,要么所有视图都处于横向模式。它们要么全部旋转,要么都不旋转

下面是横向视图的代码,但是编译器完全忽略了这些指令,当设备旋转时,视图会旋转到纵向模式

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation  
{
     return UIInterfaceOrientationLandscapeRight;  
}

-(BOOL) shouldAutorotate 
{
     return NO; 
}
停止自动旋转的唯一方法是在IB中的
设备方向
中勾选一个框,但该设置将应用于所有视图,并且所有视图均不旋转

我最近读到,不再可能对每个视图应用单独的设置,这似乎很荒谬

有什么解决办法吗

用更多信息编辑: @有胡子的人,我想不出如何使你的代码适应我的。。My UITabBarController控制不同的UIViewController,在其标题中定义如下:

@interface Portrait_ViewController : UIViewController
@interface LandscapeViewController : UIViewController
AppDelegate使用

[self.tabBarController setSelectedViewController: Portrait_ViewController]
然后,从任何ViewContoller,使用

[self.tabBarController setSelectedIndex:index]

我不明白如何按照您的建议将
UITabBarController
应用到带有
@interface childorientationabbarcontroller:UITabBarController
的UIViewController。

应用程序只要求顶部控制器提供接口方向

在您的情况下,
UITabBarController
是顶级控制器,其他控制器是它的子控制器

您需要创建自己的
UITabBarController
子类来覆盖此方法,并从当前选定的控制器传递值

此类容器的示例:
迅捷的

类ChildOrientationAbbarController:UIAbbarController{
覆盖var支持的接口方向:UIInterfaceOrientationTask{
返回所选的ViewController?支持的界面方向?纵向
}
覆盖变量应自动旋转:布尔{
返回selectedViewController?是否应自动旋转?错误
}
}
类ChildOrientationNavigationController:UINavigationController{
覆盖var支持的接口方向:UIInterfaceOrientationTask{
返回topViewController?支持的界面方向???纵向
}
覆盖变量应自动旋转:布尔{
返回topViewController?是否应自动旋转?错误
}
}
目标-C

@interface ChildOrientationAbbarController:UIAbbarController
@结束
@AbbarController的实现
-(UIInterfaceOrientationTask)支持接口方向{
返回[支持界面方向的self.selectedViewController]?:UIInterfaceOrientationMaskPortrait;
}
-(BOOL)应该自动旋转{
返回[self.selectedViewController shouldAutorotate]?:否;
}
@结束
@接口子方向导航控制器:UINavigationController
@结束
@实现ChildOrientationNavigationController
-(UIInterfaceOrientationTask)支持接口方向{
返回[self.topViewController supportedInterfaceOrientations]?:UIInterfaceOrientationMaskPortrait;
}
-(BOOL)应该自动旋转{
返回[self.topViewController shouldAutorotate]?:否;
}
@结束
AppDelegate应该将
支持的接口方向
方法重写为:
迅捷的

func应用程序(application:UIApplication,Windows:UIWindow的支持接口方向?->UIInterfaceOrientationTask{
返回窗口?.rootViewController.supportedInterfaceOrientations???.portrait
}
目标-C

-(UIInterfaceOrientationTask)应用程序:(UIApplication*)应用程序支持的InterfaceOrientationsforWindow:(UIWindow*)窗口的接口方向{
返回[[window rootViewController]支持的界面方向]?:UIInterfaceOrientationMaskPortrait;
}
我最近读到,不再可能对每个视图应用单独的设置,这似乎很荒谬

这并不荒谬,事实确实如此。不能使选项卡视图控制器的不同子级采用不同的强制方向


强制方向与当前方向不同的唯一方法是通过显示的视图控制器。

它肯定是重复的,但我找不到原始问题抱歉,我不熟悉Swift。你能发布目标c代码吗?@jeddi我不知道该怎么做:D我会给它一个try@jeddi补充。请随时报告任何语法错误。我尽了最大的努力:)非常感谢你在objective c中发布代码。然而,我不明白这一点:如果我在AppDelegate中放入“SupportedInterfaceOrientationMaskPortrait]?:UIInterfaceOrientationMaskPortrait;“这不会将整个应用程序限制为纵向模式吗?@jeddi否,它将尝试从
rootViewController
(我假设它将是
childorientAbbarController
)如果失败,则返回纵向。但是你可以返回你想要的任何内容,我只是以它为例。你能详细介绍一下怎么做吗?我肯定需要某些视图仅在纵向模式下,而其他视图在横向模式下,不能自动旋转。如果我以这种方式将它们分开:所有纵向视图都在tabcontroller;tabcontroller外部的单个横向视图,通过按下tabcontroller的一个选项卡触发,保持不变。然后要返回,需要重新初始化TabCarController。这是否会阻止自动旋转?我不知道还能说什么。显示的视图控制器是显示的视图控制器。我已经给出了相同的