У меня есть приложение для контроллера навигации. И сначала я нажимаю FirstViewController (поддерживает портретную ориентацию), а затем SecondViewController (поддерживает все ориентации). Когда я нахожусь в ландшафтном режиме SecondViewController и нажимаю кнопку «Назад», FirstViewController появляется в ландшафтном режиме. Вот почему я вручную поворачиваю представление навигации, но когда я хочу установить для setStatusBarOrientation значение «Портрет» (контроллер первого представления должен отображаться только в портретном режиме), ориентация контроллера представления по-прежнему будет альбомной, и даже если повернуть устройство в портретный режим, ориентация остается ландшафтной. Вот мой код FirstViewController:
- (void)viewWillAppear:(BOOL)animated
{
if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation))
{
if (self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
prevInterfaceOrientation = UIInterfaceOrientationLandscapeLeft;
self.navigationController.view.transform = CGAffineTransformIdentity;
self.navigationController.view.transform =
CGAffineTransformMakeRotation(degreesToRadians(90));
}
else if (self.interfaceOrientation ==
UIInterfaceOrientationLandscapeRight) {
prevInterfaceOrientation = UIInterfaceOrientationLandscapeRight;
self.navigationController.view.transform = CGAffineTransformIdentity;
self.navigationController.view.transform =
CGAffineTransformMakeRotation(degreesToRadians(-90));
}
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO];
[self.tableViewDetail reloadData];
}
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
if (toInterfaceOrientation == UIInterfaceOrientationPortrait)
{
if (prevInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
self.navigationController.view.transform = CGAffineTransformIdentity;
}
else if (prevInterfaceOrientation ==
UIInterfaceOrientationLandscapeRight) {
self.navigationController.view.transform = CGAffineTransformIdentity;
}
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
[self.tableViewDetail reloadData];
}
}
Я даже пробовал использовать:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
if (UIInterfaceOrientationIsLandscape(prevInterfaceOrientation))
{
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
}
}
но self.interfaceOrientation по-прежнему остается альбомной при повороте в портретную ориентацию. Но мне действительно нужно вручную повернуть представление в портретный режим, чтобы пользователи могли видеть, что FirstViewController поддерживает только портретную ориентацию. У меня есть возможность разместить представление SecondViewController в MainWindow (например, в модальном окне), но мне не нравится эта идея, потому что, если у Apple есть метод setStatusBarOrientation, мне кажется, что это должно быть правильное решение этой проблемы.