Ориентация Пейзаж -> Портрет не работает

У меня другая проблема с ориентацией. Но этот очень сложный. Мой RootViewController — это обычный NavigationController.

self.window.rootViewController = _naviController;

внутри которого есть еще один ViewController, назовем его VC1. В VC1 есть несколько кнопок и меток. Это как обзор с папками.

Если я нажму кнопку, я перейду к следующему ViewController с 3 ViewController (Page) и еще одним набором кнопок (например, внутри папки, просматривающей изображения/миниатюры внутри):

Archiv *archiv = [[Archiv alloc] init];
[self.navigationController pushViewController:archiv animated:YES];
[archiv release];

в loadView:

firstPage = [[Page alloc] initViewWithFrame:CGRectMake(0, 0, 768, 960)];
[firstPage setRootViewController:self];
secondPage = [[Page alloc] initViewWithFrame:CGRectMake(0, -960, 768, 960)];
[secondPage setRootViewController:self];
thirdPage = [[Page alloc] initViewWithFrame:CGRectMake(0, 960, 768, 960)];
[thirdPage setRootViewController:self];

Если я сейчас снова нажму кнопку, активная страница нажмет мой третий ViewController (изображение с изменением размера, перетаскиванием...):

Picture *pic = [[Picture alloc] initWithPicURLString:urlString];
[rootViewController.navigationController pushViewController:pic animated:YES];
[pic release];

С помощью BackButton NavigationController я всегда могу вернуться к предыдущему представлению.

Еще немного информации:

Теперь сложная задача:

Если я переключаюсь со 2-й ВК на 3-ю, меняю там ориентацию с книжной на альбомную и нажимаю кнопку «Назад», все работает (shouldAutorotateToInterfaceOrientation звонит, размер кадра и происхождение меняются ...). НО если я сделаю это наоборот, я нахожусь в ландшафтном режиме, переключаюсь со 2-го VC на 3-й VC, поворачиваю в портретную и прихожу вернитесь ко 2-му VC с помощью BackButton, статус- и контроллербар находятся вверху, но shouldAutorotateToInterfaceOrientation не был вызван.

Пожалуйста помогите. $h@rky


person Sharky    schedule 07.11.2011    source источник


Ответы (3)


Попробуйте это, это работает для меня:

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self shouldAutorotateToInterfaceOrientation:[[UIApplication sharedApplication] statusBarOrientation] ];
}
person Jimmy Pappachan    schedule 11.11.2011
comment
Да, это тоже работает, но это не отвечает на вопрос, ПОЧЕМУ вид не звонит, когда я возвращаюсь в портретной ориентации. В любом случае я приму ответ, если nodoby скажет мне, почему это происходит на следующей неделе. - person Sharky; 11.11.2011
comment
Как я обещал принятие и голосование, потому что разрешение умнее, чем мой путь xD. $h@rky - person Sharky; 15.11.2011

Сегодня мне пришла в голову мысль, что проблема решена, не зная причины. В моем третьем VC я только что создал указатель на 2nd View и сам вызвал shouldAutorotateToInterfaceOrientation.

Но суть все та же: почему shouldAutorotateToInterfaceOrientation не звонит в описанной ситуации?

С уважением. $h@rky

person Sharky    schedule 09.11.2011

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

ListCurrentViewController *list = [self.storyboard
   instantiateViewControllerWithIdentifier:@"ListCurrentViewController"];
               [self.navigationController presentViewController:list animated:NO completion:Nil];
               [list dismissViewControllerAnimated:NO completion:Nil];
               [self.navigationController pushViewController:list animated:YES];

в функции ListViewController называется:

(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation // iOS 6 autorotation fix { return UIInterfaceOrientationPortrait; }

и вам нужно создать категорию для UINavigationController

(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [self.visibleViewController preferredInterfaceOrientationForPresentation];
}

Я надеюсь, что это решение поможет вам.

person user3361002    schedule 27.02.2014