Скрыть 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
вызывается до изменения вращения.