Скрыть UIView при вращении устройства - не работает, когда устройство находится в горизонтальном положении

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

- (void)orientationChanged:(NSNotification *)notification {     

  UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

if ((orientation == UIDeviceOrientationLandscapeLeft) ||
    (orientation == UIDeviceOrientationLandscapeRight)) {

    bannerView.hidden = ([[self.navigationController visibleViewController] isKindOfClass:[PlayerViewController class]]) ? YES : NO;

} else {
    bannerView.hidden = NO;
}
}

PlayerViewController отправляет уведомление, а делегат приложения скрывает bannerView. Однако, когда устройство положено на стол, изображение показывает. Работает нормально, когда устройство удерживается вертикально, но горизонтально изображение выглядит... странно.

Вот код для отправки уведомления:

 - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                                     duration:(NSTimeInterval)duration {

if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) {
 ... hide other stuff in this view controller
 }

Есть идеи, почему происходит такое странное поведение?

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

- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)interfaceOrientation
 {
if (interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIDeviceOrientationPortrait) {
    return YES;
} else {
    return NO;
}
}

1 ответ

Решение

Ваша ошибка может возникать из-за того, что вы публикуете уведомление.

willAnimateRotationToInterfaceOrientation вызывается до того, как произойдет изменение ориентации (отсюда и "воля" в имени метода). Так что, если мы идем от портрета к ландшафту, текущая ориентация все равно может быть представлена ​​как портретная (это может и не быть, это зависит).

Теперь willAnimate... вызов возвращает toInterfaceOrientation - ориентация, которая произойдет.

Вы активируете свое уведомление при получении willAnimate... позвоните, и внутри этого звонка уведомления [[UIDevice currentDevice]orientation]: который вернет портрет. Вместо того, чтобы запрашивать ориентацию в вашем методе уведомления, вы должны вместо этого передать ориентацию, указанную в willAnimate вызов.

Если это не ясно, резюме одного предложения: willAnimateRotationToInterfaceOrientation вызывается до изменения вращения.

Другие вопросы по тегам