2011-09-25 8 views
0

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

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

ответ

0

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

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

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

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

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

+0

Похоже, я прыгнул с пистолета. Данг все еще отображается, хотя я переместил уведомление на willRotateToInterfaceOrientation: duration: –

+1

Ах, извините, что, возможно, это сработает: UIDevice возвращает ориентацию самого устройства, не обязательно ваш пользовательский интерфейс, так что есть также 'UIDeviceOrientationFaceUp 'и' FaceDown'. Попробуйте бросить точку останова в свой метод, возможно, это будет возвращено и испортит ваш условный. – lxt

+0

Вы, сэр, гений! –