Ориентация iOS6 все еще вращается, даже когда говорят не делать этого

Кажется, у меня проблемы с моим приложением для iOS.

Его целью развертывания является iOS5.0, однако я использую SDK для iOS 6.0.

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

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationMaskPortrait;
}

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}

Это отлично работает при работе в симуляторе iOS5. Вид не будет вращаться в ландшафтном режиме или вверх ногами.

Однако в симуляторе IOS6 (и на устройстве) он будет продолжать вращаться.

Я использовал NSLog, чтобы проверить, вызывается ли -supportedInterfaceOrientations, и это происходит дважды, однако он по-прежнему вращается в LandScape (вправо или влево).

Что я делаю неправильно?

Я также расширил UINavigationController (My Root View Controller), включив в него следующее:

@implementation UINavigationController (Rotation_IOS6)

-(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{    
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}

@end

Но пока безуспешно.

Спасибо.

Редактировать

Согласно ответу Мэтта. Мне также нужно было расширить UITabBarController реализацией, аналогичной моему UINavigationController, и это сработало.

Надеюсь, это поможет кому-то еще.


person Moe    schedule 07.12.2012    source источник


Ответы (3)


Проблема может заключаться в том, что у вас есть навигационный интерфейс. Ты? Если это так, вам нужно создать подкласс UINavigationController и использовать экземпляр этого подкласса в качестве навигационного контроллера. В этом подклассе здесь вы реализуете supportedInterfaceOrientations. То же самое и для любого родительского контроллера представления (например, UITabBarController).

Причина в том, что способ осмысления поворота в iOS 6 полностью отличается от iOS 5. Ничего из того, что, как вы думаете, вы знаете из iOS 5, больше не применимо. В iOS 6 мы начинаем с уровня самого приложения и продвигаемся вниз посредством делегата приложения к корневому контроллеру представления или другому контроллеру полноэкранного представления (например, представленному контроллеру представления) и stop . Родитель больше не советуется со своими детьми.

Более того, само приложение (посредством info.plist или делегата приложения) должно перечислить каждую ориентацию, которую любая часть приложения может когда-либо предположить; контроллеры представления могут запрашивать только подмножество из них.

См. примечания к выпуску:

http://developer.apple.com/library/ios/#releasenotes/General/RN-iOSSDK-6_0/_index.html

Однако обратите внимание, что это предложение является ложью:

Для совместимости контроллеры представлений, которые по-прежнему реализуют метод shouldAutorotateToInterfaceOrientation:, не получают новых режимов автоповорота.

Наоборот, в iOS 6 старые методы автоповорота полностью игнорируются; все получают новое поведение авторотации. Это не "согласие".

person matt    schedule 07.12.2012
comment
Бинго! Я не знал, что UITabBar также повлияет на авторотацию - я расширил UITabBar, и бум, это сработало! - person Moe; 07.12.2012

Если вы не хотите, чтобы приложение когда-либо вращалось, вы можете удалить альбомную ориентацию из поддерживаемых ориентаций интерфейса в своем info.plist, и это должно сделать это.

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

-Брэндон

person Stakenborg    schedule 07.12.2012

Проверьте настройки вашего проекта и info.plist, они имеют более высокий приоритет, чем делегат приложения. убедитесь, что выбраны только нужные вам ориентации

person ehanna    schedule 09.01.2013