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

Я пытаюсь скрыть изображение в контроллере вида при повороте устройства.Я публикую уведомление в 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 Ответ

0 голосов
/ 26 сентября 2011

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

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

Теперь вызов willAnimate... возвращает toInterfaceOrientation - ориентацию, которая будет происходить .

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

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

...