Для лучшего пользовательского опыта в моем коде было следующее:
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.