Ориентация iOS6

У меня есть вопрос об ориентации iOS 6. Вот мой файл https://www.dropbox.com/s/f8q9tghdutge2nu/Orientations_iOS6.zip

В этом примере кода я хочу, чтобы MasterViewController имел только портретную ориентацию, а DetailViewController имел книжную ориентацию, альбомную ориентацию.

Я знаю, что ориентация iOS 6 контролируется самым верхним контроллером.

Поэтому я настраиваю UINavigationController(CustomNavigationController), устанавливаю supportInterfaceOrientations и shouldAutorotate в этом классе.

-(NSUInteger)supportedInterfaceOrientations{
    if([[self topViewController] isKindOfClass:[DetailViewController class]]){
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }else{
        return UIInterfaceOrientationMaskPortrait;
    }
}

-(BOOL)shouldAutorotate
{
    return YES;
}

Все в порядке, за исключением того, что когда DetailViewController в альбомной ориентации нажмите кнопку «Назад», MasterViewController отобразится альбомная ориентация.

Могу ли я разрешить MasterViewController всегда показывать портретную ориентацию, а DetailViewController может иметь много ориентаций?

Спасибо!


person Hanpo    schedule 22.09.2012    source источник
comment
Я нахожу решение сегодня. установите это в свой CustomNavigationController - (NSUInteger)supportedInterfaceOrientations { return [[self topViewController]supportInterfaceOrientations]; } затем установите это в MasterViewController - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; }   -  person Hanpo    schedule 23.09.2012
comment
Если вы нашли ответ на свой вопрос, вы должны опубликовать свой ответ как ответ и отметить его как правильный, все в порядке.   -  person JP Illanes    schedule 01.10.2012


Ответы (2)


Я сделал эту работу, как вы предложили в своем комментарии к вопросу. Проблема в том, что UINavigatonController по умолчанию не использует значение контроллера вида сверху, поэтому вам нужно переопределить его, создав базовый класс и установив его в раскадровке в качестве базового класса.

Ниже приведен код, который я использую.

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

У меня также есть базовый класс для остальных моих контроллеров представления, чтобы по умолчанию использовать портретную ориентацию. Я могу переопределить эти методы для iOS 5 и 6 в любых контроллерах представления, которые поддерживают не только портретную ориентацию.

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

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

- (BOOL)shouldAutorotate {
    return FALSE;
}
person Brennan    schedule 08.10.2012

Спасибо! Бреннан,
я также собираю другие способы сделать это в своем блоге.
http://blog.hanpo.tw/2012/09/ios-60-orientation.html

Вот два других способа.

1.Добавить категорию в UINavigationController

    @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

2. Реализации метода Swap (сделано spoletto)

https://gist.github.com/3725118

person Hanpo    schedule 10.10.2012
comment
Проголосуйте за, потому что чтение вашего поста привело меня к окончательному исправлению проблем с ротацией устройств ios6, которые у меня были. Я хочу, чтобы мое приложение было только портретным, ЗА ИСКЛЮЧЕНИЕМ представления полноэкранного видео. Мое решение состояло в том, чтобы установить для поддерживаемых ориентаций значение «Портрет» в info.plist, переопределив подкласс панели вкладок, чтобы вернуть портретную ориентацию/маску портретной ориентации/автоповорот НЕТ. Это сработало, потому что панель вкладок является родительским контроллером представления! Спасибо. - person maz; 28.10.2012