2010-04-29 3 views
6

У меня недавно возникла проблема. Мое приложение iPad каким-то образом предотвращает автоматическое вращение iPad. Мое приложение загружает UISplitView с обоими контроллерами представления, возвращающими YES для shouldAutorotateToInterfaceOrientation :. Я установил свой info.plist, чтобы включить ключ «Поддерживаемые интерфейсы» со всеми четырьмя ориентациями. Однако, когда я запускаю приложение, вращение устройства не приводит к повороту splitView (хотя я получаю UIDeviceOrientationDidChangeNotification). Кроме того, когда я выхожу из своего приложения в другой ориентации, которую он начал на главном экране iPad, он не авторотируется до правильного представления, пока я не поверну его снова без моего приложения. Любые идеи будут высоко оценены ...UiSplitViewController не автородет

ответ

8

UISplitViewController - один из самых классных подкласс классов контроля, который мне когда-либо приходилось использовать. Для того, чтобы он работал «отлично», он должен быть единственным корневым представлением в окне вашего приложения. Тем не менее, вы можете обойти это с некоторыми обманами - в моем случае мне нужен был UITabBarController, по крайней мере, с двумя отдельными UISplitViewController s в качестве контроллеров представлений - но тогда вам нужно позаботиться о странных случаях, связанных с поворотом, и UISplitViewControllerDelegate обратные вызовы не срабатывают ,

Здесь надеются, что Apple, делает UISplitViewController более совместимым с другими компонентами UIKit в будущем ...

+1

Вы можете обойти это с обманом, о котором вы говорите ... Какая обманка? Вы дразните! – radven

+0

То, к чему оно сводилось, просто направило соответствующие методы поворота вручную. Ведение журнала кучей вещей, чтобы узнать, какие методы были, и мы не вызываемся. Затем я просто получил компенсацию в моем подклассе контроллера корневого представления, убедившись, что контроллеры дочерних представлений получили правильные методы, выпущенные, изменили размеры их представлений и т. Д. – LucasTizma

+0

У меня такая же проблема прямо сейчас, когда у меня есть SplitViewController, которые являются вкладками под TabBarController, действовать беспорядочно, поэтому он рад узнать, что это не только я! Благодарим за этот комфорт хотя бы! – Gowiem

0

Вы сказали, что ваша первая проблема заключается в том, что UISplitView предотвращает авторотирование. Попробуйте использовать подкласс SplitView вместо этого enbales autorotating:

@implementation SplitViewControllerRotating 
- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ 
    NSLog(@"SplitViewControllerRotating shouldAutorotate"); 
    return YES; 
} 
@end 

Вашей вторая проблема звучит странно. Вы сказали, что после выхода из приложения вы должны повернуть, чтобы ваш iPad распознал ориентацию интерфейса. Не могу помочь вам в этом.

+2

Я дал ему выстрел ... Это не сработало ... Разве цель UISplitView не авторотировать в любом случае? – Michael

+0

Кто-нибудь знает решение на iOS 9? Ответы, приведенные выше, устарели. – vaberer

0

У меня была такая же проблема прямо сейчас. Причина заключалась в том, что я случайно добавил еще один вид в окно в дополнение к представлению UISplitViewController. Удаление дополнительного представления заставило его работать.

1

Установлен ли ваш UISplitViewController в качестве контроллера корневого представления? Если нет, это может быть причиной вашей проблемы. У меня была аналогичная проблема - строка состояния вращалась, но мои детали и основные взгляды оставались бы на месте. Я перестроил представления так, что UISplitViewController был корнем, а затем мое «главное меню» было представлено как контроллер модального представления поверх раскосного представления, и это заставило проблему вращения уйти.

В соответствии с iPad Programming Guide «Вид контроллера разделенного вида всегда должен быть установлен как корневой вид окна вашего приложения».

Надеюсь, это поможет.

4

Я столкнулся с этой же проблемой, с двумя подчиненными UINavigationControllers. В моем случае поворот начал работать, как только я перевернул shouldAutorotateToInterfaceOrientation: на левом контроллере всегда возвращался «ДА».

+2

Как masterView, так и detailView должны поддерживать YES для любой ориентации, к которой вы пытаетесь повернуть. Если ни один из них не вернет ДА, он не будет вращаться. Я пропустил эту тонкую деталь, мой masterView только поддерживал портрет. Надеюсь, это помогает кому-то другому. – sasquatch

1

Я нашел, что это отлично работает - при условии, ОБА детей из UISplitViewController осуществлению shouldAutorotateToInterfaceOrientation:

I.е, если у вас есть что-то вроде:

 MasterViewController *masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController_iPad" bundle:nil]; 
     UINavigationController *masterNavigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController]; 

     DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController_iPad" bundle:nil]; 
     UINavigationController *detailNavigationController = [[UINavigationController alloc] initWithRootViewController:detailViewController]; 

     self.splitViewController.viewControllers = @[masterNavigationController, detailNavigationController]; 

     self.window.rootViewController = self.splitViewController; 

, чтобы определить rootViewController из ваших NSApplication тогда как MasterViewControllerDetailViewController и должны осуществлять:

(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { 
    return YES; 
} 

, чтобы обеспечить вращение работы.

Смежные вопросы