Проблемы с вращением ModalViewController в TabBarController

Я не совсем понимаю, почему у меня возникла эта проблема, но я… По сути, у меня есть контроллер панели вкладок с navigationController на одной из вкладок. На этой конкретной вкладке я хочу, чтобы пользователь мог повернуть устройство и увидеть совершенно другой вид, не повернутый исходный вид!

Для этого (в полноэкранном режиме) у меня есть LandscapeViewController, который я представляю модально, когда устройство находится в альбомной ориентации. Проблема возникает, когда я представляю modalViewController

В LandscapeViewController я также проверяю ориентацию, поэтому я могу закрыть себя, когда пользователь вернется в портретный режим. Однако, когда я представляю его, я получаю обратный вызов, говорящий, что он переходит в портретный режим, что полностью его портит!

Вот код и операторы журнала, чтобы прояснить, что происходит.

Портретвиевконтроллер

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

Ландшафтвиевконтроллер

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

и это текст журнала:

Нормативный пейзаж

2010-08-24 15:29:40.024 Приложение[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, но затем он думает, что это в портретном режиме, и пытается отклонить.

Может ли кто-нибудь увидеть, где я ошибаюсь? (И извините за длину этого, но иначе форматирование кода не работало бы должным образом.)


person Jules    schedule 24.08.2010    source источник


Ответы (1)


Вы реализовали метод shouldAutorotateToInterfaceOrientation: в контроллере ландшафтного вида? Если нет, этот контроллер представления будет вынужден оставаться в портретном режиме, что, в свою очередь, приведет к срабатыванию вашего кода отклонения.

Также стоит отметить, что иногда контроллеры представления добавляются в окно в определенной ориентации, а затем поворачиваются. Стоит проверить ориентацию, которую willRotate передает вам, относительно вашего текущего поворота. Я не проверял это довольно давно, но в конце 2.x / начале 3.0 это было обычным явлением.

person Jerry Jones    schedule 24.08.2010
comment
Спасибо за ответ, да, я реализовал shouldAutorotateToInterfaceOrientation:. В конце концов я отказался от автоповорота и просто сделал это в соответствующем viewController. [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(detectOrientation) name:@UIDeviceOrientationDidChangeNotification object:nil]; и поворачивается при необходимости. Большое спасибо Жюль - person Jules; 31.08.2010