Почему 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
}