TabBarController中的ModalViewController旋转问题

时间:2010-08-24 14:48:24

标签: iphone cocoa-touch uitabbarcontroller modalviewcontroller screen-rotation

我不明白为什么我有这个问题,但我......基本上我有一个Tabr栏控制器,其中一个选项卡中有一个navigationController。在这个特定的标签中,我希望用户能够旋转设备并看到完全不同的视图,不是原始视图旋转!为了实现这一点(全屏)我有一个LandscapeViewController当设备处于横向时,我会以模态方式呈现。当我在LandscapeViewController中呈现modalViewController时出现问题我还检查方向,以便当用户返回纵向模式时我可以解除自我。然而,当我呈现它时,我得到一个回调,说它进入肖像模式,这完全搞砸了! 这里是代码和日志声明,以澄清最新情况。

//in PortraitViewContoller

(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    if(toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
  NSLog(@"Norm going Portrait");

  [self changeTheViewToPortrait:YES andDuration:duration];

    }
    else if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft){
  NSLog(@"Norm going Landscape");
  [self changeTheViewToPortrait:NO andDuration:duration];
    }
}


(void) changeTheViewToPortrait:(BOOL)portrait andDuration:(NSTimeInterval)duration {

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:5.];

    if(portrait){ 
  NSLog(@"dismissed");
  [self dismissModalViewControllerAnimated:NO];
    }
    else{ 
  NSLog(@"presented");
  LandscapeOverviewViewController *land = [[LandscapeOverviewViewController alloc]initWithNibName:@"LandscapeOverviewViewController" bundle:nil];
  land.delegate = self;
  [self presentModalViewController:land animated:NO]; 
  [land release];
    }

    [UIView commitAnimations];
}

//in LandscapeViewController

 (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{

    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    if(toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
  NSLog(@"Modal is going Portrait");
  [self changeTheViewToPortrait:YES andDuration:duration];

    }
    else if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft){
  NSLog(@"Modal is going Landscape");

  [self changeTheViewToPortrait:NO andDuration:duration];
    }
}

 (void) changeTheViewToPortrait:(BOOL)portrait andDuration:(NSTimeInterval)duration{

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:duration];

    if(portrait){ 
  NSLog(@"calling delegate to dismiss");
  [delegate landscapeViewController:self didRotateBack:(YES)]; 
    }

    [UIView commitAnimations];
}

这是日志文本

Norm going Landscape

2010-08-24 15:29:40.024 App [32461:207]提出

2010-08-24 15:29:40.026 App [32461:207]莫代尔正在进行肖像

2010-08-24 15:29:40.026 App [32461:207]呼吁代表解雇

2010-08-24 15:29:40.027 App [32461:207]代表致电

正如你所看到的那样,在肖像中我旋转它会通过呈现landscapevc来做正确的事情,但是它会认为它是纵向的并试图解雇?

任何人都可以看到我出错的地方,以及对此长度的apoligies但是代码的格式化无法正常工作。

非常感谢

1 个答案:

答案 0 :(得分:1)

您是否在横向视图控制器中实现了shouldAutorotateToInterfaceOrientation:方法?如果没有,该视图控制器将被强制保持纵向模式,这将触发您的解雇代码。

值得注意的是,有时视图控制器会以特定方向添加到窗口中,然后旋转。值得检查一下willRotate根据您当前的旋转传递给您的方向。我在相当长的一段时间内没有证实这一点,但是在2.x / 3.0的早期,这很常见。