UIViewController меняет ориентацию с помощью кода

#cocoa-touch #uiviewcontroller #uiinterfaceorientation #interface-orientation

#cocoa-touch #uiviewcontroller #uiinterfaceorientation #интерфейс-ориентация

Вопрос:

Для улучшения пользовательского интерфейса в моем коде было следующее:

 if (allowLandscape) {
    return UIInterfaceOrientationIsLandscape(toInterfaceOrientation) || toInterfaceOrientation == UIInterfaceOrientationPortrait;
}
else {
    return toInterfaceOrientation == UIInterfaceOrientationPortrait;
}
  

Итак, если для параметра allowLandscape установлено значение YES, пользователь может играть с приложением во всех типичных ориентациях устройства. Но для allowLandscape можно в любое время установить значение NO, и я хочу повернуть UIViewController обратно в книжную ориентацию.

Следующий код работает только в том случае, если пользователь вручную изменяет ориентацию устройства. Итак, если allowLandscape был YES, он мог поворачивать устройство, и ориентация интерфейса следовала за изменением ориентации. Но если он останется в альбомной ориентации, а для allowLandscape будет установлено значение NO, он останется в альбомной ориентации, пока не переведет iPhone в книжную ориентацию — теперь книжная ориентация не может быть изменена, если allowLandscape по-прежнему NO .

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

Вызов метода:

 [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:YES];
  

изменяет только строку состояния, но интерфейс остается в предыдущей ориентации. Я не хочу использовать какие-либо недокументированные API.

Комментарии:

1. Лично я бы не стал реализовывать функцию, которая уже встроена в ОС.

2. Хм, какую функцию вы имеете в виду? Как я могу отключить альбомную ориентацию и изменить ориентацию на портретную с помощью кода с анимацией? Я говорю об одном UIViewController.

3. Возможно, я неправильно понял ваш вопрос (даже после его перечитывания). Пользователи могут блокировать и разблокировать ориентацию через меню задач (дважды щелкните кнопку «Домой», затем проведите пальцем вправо).

Ответ №1:

Вот решение:

     [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
  

Добавляя этот код, контроллер представления снова запрашивает, в какой ориентации он должен представлять свое представление.