Пейзаж, показывающий, когда не должен - PullRequest
0 голосов
/ 09 сентября 2010

Я просто хочу спросить, есть ли у кого-то еще проблемы с этим;

Раньше приложение с вкладками по умолчанию не разрешало горизонтальное представление, если оно не было включено для всех представлений в приложении., но можно добавить

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotateFromInterfaceOrientation) name:@"UIDeviceOrientationDidChangeNotification" object:nil];

, чтобы перехватить сообщения об изменении ориентации и затем соответствующим образом отреагировать на эти сообщения.

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

Таким образом, наклоненный телефон View1 (не поддерживает альбомную ориентацию) показывает View1 сбоку, View2 (поддерживает альбомную ориентацию) наклоненный телефон показывает Landscapeview2, теперь этоландшафтное представление показывалось один раз, наклоненный View1 показывает Landscapeview2

Я освобождаю viewcontroller после presentModalViewController и отключаю viewcontroller, когда ландшафтный вид больше не нужен, поэтому его следует пропустить, но при любом изменении ориентации после первого отображенияпродолжает показывать, как будто presentModalViewControИлеру снова звонили.

Есть идеи?У кого-нибудь еще есть такая же проблема?(Это никогда не происходило с версиями ОС 3.x)

1 Ответ

0 голосов
/ 13 сентября 2010

для всех, кто заинтересован;Кажется, что контроллер вида с включенным ландшафтом оставался наблюдателем изменений ориентации, даже когда он больше не был активным видом, в основном он отвечал на изменения для каждого вида.

Мое решение состояло в том, чтобы создать 2 новых BOOL, 1называется isActiveView, а 1 называется isShowingLandscape и использует их для обеспечения того, чтобы контроллер представления реагировал только тогда, когда он или его альбомное представление были показаны.

Соответствующий код:

-(void)viewDidAppear:(BOOL)animated
{
  isActiveView = TRUE;
}

-(void)viewDidDisappear:(BOOL)animated
{
  isActiveView = FALSE;
}

-(void)didRotateFromInterfaceOrientation
{
  if ((orientation == UIDeviceOrientationPortrait) && ((isActiveView) || (showingLandscape)))
  {
    [self dismissModalViewControllerAnimated:YES];
    showingLandscape = FALSE;
  }
  else if ((orientation == UIDeviceOrientationLandscapeLeft) && (isActiveView))
  {
    LandscapeViewController *landscapeViewControllerObject = [[LandscapeViewController alloc] initWithNibName:@"LandscapeView" bundle:[NSBundle mainBundle]];
    [self presentModalViewController:landscapeViewControllerObject animated:YES];
    [landscapeViewControllerObject release];
    showingLandscape = TRUE;
  }
  else if ((orientation == UIDeviceOrientationPortraitUpsideDown) && ((isActiveView) || (showingLandscape)))
  {
    [self dismissModalViewControllerAnimated:YES];
    showingLandscape = FALSE;
  }
  else if ((orientation == UIDeviceOrientationLandscapeRight) && (isActiveView))
  {
    LandscapeViewController *landscapeViewControllerObject = [[LandscapeViewController alloc] initWithNibName:@"LandscapeView" bundle:[NSBundle mainBundle]];
    [self presentModalViewController:landscapeViewControllerObject animated:YES];
    [landscapeViewControllerObject release];
    showingLandscape = TRUE;
  }
}

Надеюсь, это поможету кого-то еще такие же проблемы.

...