UIViewController загружает повернутую в альбомную ориентацию, но поддерживает только портретную ориентацию

Есть ли способ загрузить контроллер просмотра только для портретной ориентации в портретной ориентации, даже если родительский контроллер просмотра (и телефон) находится в альбомной ориентации?

Этот конкретный UIViewController подходит только для портретного режима (это средство выбора цвета), поэтому код в shouldAutorotateToInterfaceOrientation: возвращает YES только для портретной ориентации. Это прекрасно работает, если вы поворачиваете телефон, когда представление уже загружено, оно остается в портретном, но это не помогает, если телефон уже находится в альбомной ориентации, когда загружен NIB представления.

Когда экран уже находится в альбомной ориентации при загрузке ViewController, представление находится в книжной ориентации, а нижняя половина представления обрезана. Я попытался придумать альбомную раскладку, но сегментированный элемент управления - проблема.

РЕДАКТИРОВАТЬ. Я пробовал использовать setStatusBarOrientation в viewWillAppear, но это влияет только на строку состояния, панель навигации и представление по-прежнему поворачиваются для альбомной ориентации.

Это происходит с версиями 3.1.3 и 4.0 на iPhone.


person progrmr    schedule 21.06.2010    source источник
comment
Я не единственный человек с этой проблемой, и ни один из предыдущих вопросов (например, здесь и здесь) есть полезные ответы. Этот говорит, что это невозможно. Это просто ограничение, с которым мы должны жить?   -  person progrmr    schedule 22.06.2010


Ответы (4)


Если это работает для вашего приложения, вы можете вместо этого использовать модальный контроллер представления. IIRC, представляющий контроллер модального представления, правильно обрабатывает вращение.

person Johan Kool    schedule 26.06.2010
comment
Бинго !! Это работает, это ориентируется и выкладывается в портретной ориентации. Нет панели навигации, но с этим легко справиться. - person progrmr; 26.06.2010

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


@implementation MyView
-(void)layoutSubviews {
    // Set subview frames here
    switch ([UIDevice currentDevice].orientation) {
        case UIDeviceOrientationUnknown:
        case UIDeviceOrientationPortrait:
        case UIDeviceOrientationPortraitUpsideDown:
        case UIDeviceOrientationFaceUp:
        case UIDeviceOrientationFaceDown:
            self.transform = CGAffineTransformMakeRotation(M_PI/2.0);
            self.transform = CGAffineTransformTranslate(self.transform, -80.0f, 80.0f);
            break;
        case UIDeviceOrientationLandscapeLeft:
        case UIDeviceOrientationLandscapeRight:
            self.transform = CGAffineTransformIdentity;
            break;
    }
}
@end

@implementation MyController -(void)willAnimateSecondHalfOfRotationFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation duration:(NSTimeInterval)duration { [self.view setNeedsLayout]; } @end

person cyborch    schedule 02.03.2011

В нормальных условиях при отображении нового UIViewController он должен автоматически повернуться в портретную ориентацию, если он поддерживает только портретную ориентацию, а приложение в настоящее время находится в альбомной ориентации. Это применимо только к более новым версиям ОС (но я предполагаю, что вы, вероятно, используете 3.1.3?).

В любом случае, чтобы заставить приложение работать в портретной ориентации:

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:YES];
person Ed Marty    schedule 21.06.2010
comment
Я пробовал это, но это не сработало. Строка состояния перемещается, но панель навигации по-прежнему находится в неправильном месте, а представление по-прежнему поворачивается. - person progrmr; 21.06.2010
comment
Как отображается контроллер навигации? Это контроллер корневого представления изначально добавлен в окно? Или это как-то иначе преподносится? Все ли родительские контроллеры представления поддерживают поворот в портретную ориентацию? А как палитра цветов отображается на контроллере навигации? Это корневое представление или перенесено на существующий контроллер? - person Ed Marty; 21.06.2010
comment
Контроллер навигации - это корневой VC, добавленный в делегат приложения. Все контроллеры представления поддерживают портретную и альбомную ориентацию, кроме этого. Палитра цветов отображается путем вызова pushViewController: animated: на навигационном контроллере. Контроллер корневого и родительского представления находится в альбомной ориентации во время нажатия палитры цветов. - person progrmr; 22.06.2010

Я думаю, что невозможно перенести контроллер портретного вида на контроллер навигации, который уже находится в ландшафтном режиме.
Попробуйте представить его анимацию (панель навигации) ...

Я бы посоветовал вам добавить ландшафтный режим для палитры цветов.

Другим решением может быть поворот всего вида при входе в палитру цветов в альбомном режиме.
Вы можете выбрать текущую ориентацию с помощью [[UIDevice currentDevice] orientation].

person Michael Kessler    schedule 24.06.2010
comment
Возможно, вы правы, но если вы нажмете UIImagePickerController (который поддерживает только портретную ориентацию) из альбомной ориентации, он будет правильно анимировать и сдвинуть средство выбора с навигационной панелью в портретной ориентации. Возможно, они используют для этого внутренние API-интерфейсы, или это может иметь какое-то отношение к тому факту, что UIImagePickerController также является UINavigationController. - person progrmr; 25.06.2010