Вращение UIInterfaceOrientation в подвиде не работает

В моем приложении я использую UITabbarController, который идеально поворачивается ко всем UIInterfaceOrientations во всех контроллерах представления. Но когда я впоследствии добавляю UIView в UIWindow, он не будет добавляться в текущий UIInterfaceOrientation, а всегда будет добавляться в UInterfaceOrientationPortrait (который по умолчанию используется для приложения). Он также не будет поворачиваться в новую ориентацию. Я добавляю ViewController, используя:

LoginViewController *loginViewController = [[LoginViewController alloc] init];
[self.window addSubview:[loginViewController view]];

у меня есть

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    NSLog(@"%@", @"YES IT WILL!");
}

в LoginViewController.m, но там никогда ничего не будет зарегистрировано. Любая идея, почему подвид не будет вращаться?

Боковое смахивание

РЕДАКТИРОВАТЬ: Нашел решение: по-видимому, UIWindow должен иметь только одно подвид, а не больше, иначе все испортится, поэтому я вызываю:

LoginViewController *loginViewController = [[LoginViewController alloc] init];
[tabBarController presentModalViewController:loginViewController animated:YES];

вместо этого, который будет автоматически поворачивать представление loginviewcontrollers.


person SideSwipe    schedule 02.08.2011    source источник
comment
+1 Ваш ответ - это то, что мне было нужно все это время ± мои взгляды СТОЛЬКО капризничали, это было невероятно. Я пытался опубликовать делегаты уведомлений об ориентации пользовательского интерфейса, проходящие через ориентацию пользовательского интерфейса, это было сумасшествием. Настоящий контроллер модального представления - это именно то, что мне было нужно. Ваше здоровье.   -  person Pavan    schedule 04.09.2012


Ответы (2)


У меня есть представление внутри другого представления, когда происходит вращение, вызывается только родитель willRotateToInterfaceOrientation, поэтому я добавил [self.subViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; к родительскому методу willRotateToInterfaceOrientation.

person Derek Li    schedule 02.08.2011
comment
Это кажется немного более грязным решением, плюс в моем примере есть два подвида uiwindow, и только один из них ведет себя правильно :), тем не менее. - person SideSwipe; 02.08.2011

Поскольку вы добавляете новое подпредставление в окно, вы также должны вращать окно.

person alloc_iNit    schedule 02.08.2011
comment
как я должен это сделать? представление uitabbarcontrollers добавляется в uiwindow с точно таким же стилем: '[self.window addSubview:tabBarController.view];' и автоповорот с ним работает безупречно, не делая ничего особенного для поворота окна - person SideSwipe; 02.08.2011
comment
Во-первых, инициализируйте свое представление с именем пера, LoginViewController *loginViewController = [[LoginViewController alloc] initWithNibName:@nameOfXIB bundle:nil]; [self.window addSubview: [представление loginViewController]]; И проверьте, правильно ли работает вращение или нет - person alloc_iNit; 02.08.2011
comment
Почему я должен инициализировать его с помощью NIB? Во всяком случае, нашел sosolution сам. Смотри редактируй. - person SideSwipe; 02.08.2011
comment
Просто чтобы ответить на ваш вопрос, почему нужно initWithNibName... Есть два взаимоисключающих способа указать эти представления: вручную или с помощью файла пера. Если вы указываете представления вручную, вы должны реализовать метод loadView и использовать его для назначения корневого объекта представления свойству представления. Если вы задаете представления с помощью файла пера, вы не должны переопределять loadView, но должны вместо этого создать файл пера в Интерфейсном Разработчике и затем инициализировать свой объект контроллера представления с помощью initWithNibName:bundle: метод. - person alloc_iNit; 02.08.2011
comment
Мне не нравится InterfaceBuilder, я предпочитаю создавать интерфейс по коду... и, кстати, вам не нужно переопределять loadview, вы можете... большинство настроек происходит в viewdidload, где вы добавляете подпредставления... но это все не имеет отношения к моему первоначальному вопросу :) - person SideSwipe; 02.08.2011