【问题标题】:Objective C ViewController rotating to Landscape unexpectedlyObjective C ViewController 意外旋转到横向
【发布时间】:2014-04-09 22:05:01
【问题描述】:

我的视图存在一些问题,我只想允许纵向视图。这是我的代码:

-(BOOL)shouldAutorotate
{
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}

这很有效,直到在这个视图上呈现另一种视图。当下一个视图控制器被关闭时,第一个视图控制器似乎忽略了 shouldAutorotate 并且它意外地进入了横向和纵向。我该如何解决这个问题?

编辑:请注意,我正在使用其他使用横向的视图控制器。

【问题讨论】:

    标签: ios objective-c orientation uiinterfaceorientation portrait


    【解决方案1】:

    如果您使用的是最新版本的 XCode。只需转到项目目标 -> 部署信息 -> 设备方向,只需检查纵向并取消选中其余部分:)

    【讨论】:

    • 看起来这会起作用。不过我想补充一点,似乎我必须为我只想显示纵向的视图制作另一个故事板,因为我还有其他使用横向的视图控制器。
    • 好吧,我错了。这行不通。它只允许您以这种方式为整个项目设置设备方向,而不是单个故事板。如果您需要对某些视图使用横向,这将不起作用。
    【解决方案2】:

    我的解决方案有点老套,但它确实有效。如果其他人有更好的,请告诉我。

    首先我选择了我的项目并选择了目标,然后像@Bejibun 建议的那样进入 General -> Deployment Info。我没有选中除肖像以外的所有内容。

    然后我添加了以下代码:

    AppDelegate.h:

    #import "ViewControllerClass.h"
    

    AppDelegate.m:

    -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
    {
        if ([[[[window.rootViewController presentedViewController] presentedViewController] presentedViewController] isKindOfClass:[ViewControllerClass class]] && ![[[[window.rootViewController presentedViewController] presentedViewController] presentedViewController] presentedViewController])
        {
            return UIInterfaceOrientationMaskPortrait;
        }
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
    

    这个

    [[[[window.rootViewControllerpresentViewController] 呈现视图控制器]呈现视图控制器] isKindOfClass:[ViewControllerClass 类]]

    告诉我根视图控制器的下一个视图控制器的下一个视图控制器是否属于我只想拥有纵向视图的类类型。这就是它应该始终呈现的方式,但这是我希望有一些方法返回最底部的视图控制器,所以我不必做 [[presentedViewController]presentedViewController] 等......

    这个

    ![[[[window.rootViewControllerpresentViewController] 呈现视图控制器]呈现视图控制器] 呈现视图控制器]

    允许我确保没有另一个视图控制器在这个之上,因为在这个应用程序中我可能有更多的视图控制器。

    【讨论】:

      【解决方案3】:
      1. 最好使用 UINavigationController 在视图控制器之间导航,然后再显示它们。
      2. 要强制以不同方向显示视图控制器,您应该继承 UINavigationController 并将代码添加到它的子类(将强制导航控制器使用顶部视图控制器的方向):

        -(BOOL)shouldAutorotate
        {
            return [[self topViewController] shouldAutorotate];
        }
        
        -(NSUInteger)supportedInterfaceOrientations
        {
            return [[self topViewController] supportedInterfaceOrientations];
        }
        
        -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
        {
            return [[self topViewController] preferredInterfaceOrientationForPresentation];
        }
        

      【讨论】:

        【解决方案4】:

        在顶部横向视图控制器关闭之前,向 AppDelegate 发送通知,设置变量 allowViewToRotate = NO,然后

        -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window NS_AVAILABLE_IOS(6_0)
        {
        if(self.allowViewToRotate)
        {
            return UIInterfaceOrientationMaskAll;
        }
        else
        {
            return UIInterfaceOrientationMaskPortrait;
        }
        }
        

        这对我有用,在顶部横向视图控制器关闭后,屏幕上的下一个控制器仍保持纵向。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-05
          • 1970-01-01
          • 2014-12-24
          • 2011-03-01
          • 2023-04-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多