Objective c 在iOS中使用单独的视图控制器支持两个方向

Objective c 在iOS中使用单独的视图控制器支持两个方向,objective-c,ios,cocoa-touch,ipad,uikit,Objective C,Ios,Cocoa Touch,Ipad,Uikit,我现在真的一团糟。我使用了苹果的示例代码,实现了以下功能: 创建纵向视图控制器和横向视图控制器 Potrait事件控制器然后注册设备方向更改通知 当设备旋转时,它会为横向视图显示一个模式视图控制器,或者如果将横向视图旋转回纵向视图,则会取消横向视图。 除了一个小问题之外,一切都正常运行 现在来谈谈我的问题。我使用它从表视图启动可旋转视图控制器。它可以旋转,工作正常。但如果我最初以横向模式启动它,它仍将以纵向模式启动。如果我想要风景画,我必须在之后再次将它旋转到风景画。我很努力地修复它,但失败了。

我现在真的一团糟。我使用了苹果的示例代码,实现了以下功能:

  • 创建纵向视图控制器和横向视图控制器
  • Potrait事件控制器然后注册设备方向更改通知
  • 当设备旋转时,它会为横向视图显示一个模式视图控制器,或者如果将横向视图旋转回纵向视图,则会取消横向视图。
    除了一个小问题之外,一切都正常运行
  • 现在来谈谈我的问题。我使用它从表视图启动可旋转视图控制器。它可以旋转,工作正常。但如果我最初以横向模式启动它,它仍将以纵向模式启动。如果我想要风景画,我必须在之后再次将它旋转到风景画。我很努力地修复它,但失败了。您可以从下载并运行示例代码。是否有人可以修复此代码,以便在以横向模式启动时显示横向视图的模态视图?否则,我将不得不重写所有内容以使用单个视图控制器。 以下是Apple代码的相关部分:

    - (void)viewDidLoad
    {
    self.view.backgroundColor = [UIColor colorWithRed:197.0/255.0 green:204.0/255.0 blue:211.0/255.0 alpha:1.0];
    
    LandscapeViewController *viewController = [[LandscapeViewController alloc]
                                                    initWithNibName:@"LandscapeView" bundle:nil];
    self.landscapeViewController = viewController;
    [viewController release];
    
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:)
                                                    name:UIDeviceOrientationDidChangeNotification object:nil];
    
    }


    除非您仅在“设置”中指定“横向”,否则设备似乎采用纵向。您唯一的选择是在loadview方法的纵向视图中检测方向并在启动期间交换视图

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
            {
               if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown ) {
            //Load vertical interface
               }
        else
        {
        //load landscape
        }
            }
    

    除非您仅在“设置”中指定“横向”,否则设备似乎采用纵向。您唯一的选择是在loadview方法的纵向视图中检测方向并在启动期间交换视图

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
            {
               if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown ) {
            //Load vertical interface
               }
        else
        {
        //load landscape
        }
            }
    

    我知道这可能与你无关,但我只是遇到了同样的问题,下面是我的解决方案

    从你的代码设置方式(包括苹果如何设置代码)

    仅在发出通知告知ViewController方向更改后才会调用:这里的问题是,这是负责自身检查方向的方法。(即,启动应用程序时不会调用此方法,因此不会检查设备是否处于任何其他方向)

    解决方案非常简单:在启动时强制校准方法,即在viewDidLoad中

    [self  updateLandscapeView]
    
    这将强制调用该方法并检查接口方向,在第一次之后,当该方法收到更改方向的通知时,将再次调用该方法


    希望这对其他人有所帮助

    我知道这可能与您无关,但我只是遇到了同样的问题,下面是我的解决方案

    从你的代码设置方式(包括苹果如何设置代码)

    仅在发出通知告知ViewController方向更改后才会调用:这里的问题是,这是负责自身检查方向的方法。(即,启动应用程序时不会调用此方法,因此不会检查设备是否处于任何其他方向)

    解决方案非常简单:在启动时强制校准方法,即在viewDidLoad中

    [self  updateLandscapeView]
    
    这将强制调用该方法并检查接口方向,在第一次之后,当该方法收到更改方向的通知时,将再次调用该方法


    希望这能帮助别人

    我知道,但我做不到。上面的代码是针对iPhone的,所以这不是问题。但我正在为iPad开发。“探测然后旋转”,怎么能做到?我知道,但我做不到。上面的代码是针对iPhone的,所以这不是问题。但我正在为iPad开发。“检测然后旋转”,怎么做?