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

时间:2012-09-27 15:28:48

标签: objective-c ios cocoa-touch ipad uikit

我现在真的很乱。我使用了苹果示例代码来执行此操作:

  1. 创建纵向视图控制器和横向视图控制器
  2. Potrait事件控制器然后注册设备方向更改通知
  3. 当设备旋转时,它会为横向视图显示模态视图控制器,或者如果旋转回纵向,则会解除横向视图。
    除了一点点问题外,每个人都应该工作....
  4. 现在我的问题。我用这个从表格视图启动一个可旋转的视图控制器。它可以旋转,工作正常。但如果我最初以横向模式启动它,它仍将作为肖像启动。如果我想要风景我必须在之后再将它旋转到风景。我试图很难解决这个但是失败了。您可以从Apple Developer Site Here下载并运行示例代码。任何人都可以修复此代码,以便在横向模式下启动时,它会呈现横向视图的模态视图吗?否则我将不得不重写所有内容以使用单个视图控制器。 这些是苹果代码的相关部分:

    - (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];
    

    }

    - (void)orientationChanged:(NSNotification *)notification
    {
    // We must add a delay here, otherwise we'll swap in the new view
    // too quickly and we'll get an animation glitch
    [self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0];
    }
    
    - (void)updateLandscapeView
    {
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(deviceOrientation) && !isShowingLandscapeView)
    {
        [self presentModalViewController:self.landscapeViewController animated:YES];
        isShowingLandscapeView = YES;
    }
    else if (deviceOrientation == UIDeviceOrientationPortrait && isShowingLandscapeView)
    {
        [self dismissModalViewControllerAnimated:YES];
        isShowingLandscapeView = NO;
    }    
    }
    
    // override to allow orientations other than the default portrait orientation
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {return (interfaceOrientation == UIInterfaceOrientationPortrait); // support only portrait}
    

2 个答案:

答案 0 :(得分:1)

我知道这可能与您无关,但我遇到了同样的故障,这是我的解决方案。

从您设置代码的方式开始(包括Apple如何设置代码)

- (void)updateLandscapeView
只有在发出通知告诉ViewController方向改变时才会调用

:这里的问题是,这是负责检查自身方向的方法。 (即启动应用程序时不调用此方法,因此不检查设备是否处于任何其他方向)

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

[self  updateLandscapeView]

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

希望这有助于某人

答案 1 :(得分:0)

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

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