UiSplitViewController не выполняет автоматическую проверку
Я недавно столкнулся с проблемой. Мое приложение для iPad каким-то образом препятствует автоматическому вращению iPad. Мое приложение загружает UISplitView с обоими контроллерами представления, возвращающими YES для shouldAutorotateToInterfaceOrientation:. Я настроил свой info.plist для включения ключа "Поддерживаемые ориентации интерфейса" со всеми четырьмя ориентациями. Однако, когда я запускаю приложение, вращение устройства не вращает splitView (даже если я получаю UIDeviceOrientationDidChangeNotification). Кроме того, когда я выхожу из приложения в другой ориентации, которая была запущена на главном экране iPad, он не автоматически поворачивается к правильному представлению, пока я не поверну его снова, пока приложение не запущено.... Любые идеи будут высоко оценены...,
6 ответов
UISplitViewController
это один из самых темпераментных подклассов контроллера представления, которые мне когда-либо приходилось использовать. Для того, чтобы он работал "идеально", он должен существовать в виде единого корневого представления в окне вашего приложения. Вы можете, однако, обойти это с некоторой хитростью - в моем случае мне нужен был UITabBarController
по крайней мере, с двумя различными UISplitViewController
s как контроллеры представления - но тогда вы должны позаботиться о странных случаях, включающих вращение и UISplitViewControllerDelegate
обратные вызовы не стреляют.
Здесь надеемся, что Apple делает UISplitViewController
более совместим с другими UIKit
компоненты в будущем...
Я столкнулся с этой же проблемой с двумя подчиненными UINavigationControllers. В моем случае вращение начало работать после того, как я переопределил shouldAutorotateToInterfaceOrientation: в левом контроллере всегда возвращать "YES".
Я нашел, что это работает нормально - при условии, что ОБА дети из UISplitViewController
реализовать shouldAutorotateToInterfaceOrientation
:
Т.е. если у вас есть что-то вроде:
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
тогда оба MasterViewController
а также DetailViewController
следует реализовать:
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return YES;
}
как убедиться, что вращение работает.
Ваш UISplitViewController установлен в качестве корневого контроллера представления? Если нет, то это может быть причиной вашей проблемы. У меня была похожая проблема - строка состояния будет вращаться, но мои детализация и основные виды останутся на месте. Я переставил представления так, чтобы UISplitViewController был корневым, а затем мое "главное меню" было представлено как модальный контроллер представления поверх разделенного представления, и это позволило устранить проблему вращения.
Согласно руководству по программированию iPad, "представление контроллера разделенного вида всегда должно быть установлено как корневое представление окна вашего приложения".
Надеюсь это поможет.
У меня была такая же проблема прямо сейчас. Причина была в том, что я случайно добавил другое окно в дополнение к представлению UISplitViewController. Удаление лишнего вида заставило его работать.
Вы сказали, что ваша первая проблема заключается в том, что UISplitView не позволяет вам автоматически выполнять рутирование. Вместо этого попробуйте использовать подкласс Splitview, который включает в себя авторутинг:
@implementation SplitViewControllerRotating
- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
NSLog(@"SplitViewControllerRotating shouldAutorotate");
return YES;
}
@end
Твоя вторая проблема звучит странно. Вы сказали, что после выхода из приложения вам нужно повернуть, чтобы ваш iPad распознал ориентацию интерфейса. Не могу помочь вам с этим.