Почему UIView (на iPad) по умолчанию имеет портретную ориентацию, даже если в раскадровке установлен альбомный пейзаж

Эта тема поднималась раньше ( контроллер модального вида iPad, работающий в портретном режиме, хотя он и в альбомной ориентации), но я не нашел четкого ответа - поэтому я не знаю, является ли это дубликатом или нет.

В новом проекте с одним представлением я установил основной вид на ландшафт в xcode:

И инспектор свойств подтверждает это (а также то, как представление отображается в раскадровке):

А для свойства ориентации ViewController установлено значение landscape:

Тем не менее, когда я проверяю рамку вида в 'viewDidLoad', он сообщает о портретном режиме:

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGRect theRect = self.view.frame;

    NSLog(@" frame %f  %f  %f  %f", theRect.origin.x,
          theRect.origin.y,
          theRect.size.width,
          theRect.size.height);
}

2012-08-26 16: 42: 45.045 Проверка [2320:f803] ячейка 0,000000 20,000000 768,000000 1004,000000

Я также включаю ландшафт в shouldAutorotateToInterfaceOrientation:

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

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

Я что-то упустил здесь?

2 ответа

Решение

Каждое приложение в iOS запускается в портретном режиме изначально, даже если вы указали поддерживаемые ориентации устройства и дали правильные "ответы" в shouldAutorotateToInterfaceOrientation:, Он всегда будет начинаться в портретной ориентации и будет вращаться в горизонтальной плоскости, если устройство. Пользователь, возможно, не увидит, потому что это так быстро. Из-за этого ваше приложение должно иметь возможность вращаться через shouldAutorotateToInterfaceOrientation даже если вы поддерживаете только ориентации ландшафта.

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

  • установить поддерживаемые ориентации интерфейса в Xcodes Interface Builder
  • overide shouldAutorotateToInterfaceOrientation:

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)io {
    return (io == UIInterfaceOrientationLandscapeRight); 
}
  • дать интерфейсу возможность вращаться и впоследствии настраивать вид

Относительно вашего вопроса о конфигурации Xcode контроллера представления для ландшафта: обратите внимание на заголовок меню в раскадровке - там написано: Симулированные метрики
Это означает, что каждая ваша модификация предназначена только для того, чтобы смоделировать ее в раскадровке. Но если вы не внесете необходимые изменения, чтобы перейти к этому состоянию в коде, это не будет иметь никакого эффекта.

Добавьте ниже код в вашем контроллере вида с swift 4.2

override var shouldAutorotate: Bool {
    return true
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .landscapeRight
}
Другие вопросы по тегам