UiSplitViewController не выполняет автоматическую проверку

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

6 ответов

Решение

UISplitViewController это один из самых темпераментных подклассов контроллера представления, которые мне когда-либо приходилось использовать. Для того, чтобы он работал "идеально", он должен существовать в виде единого корневого представления в окне вашего приложения. Вы можете, однако, обойти это с некоторой хитростью - в моем случае мне нужен был UITabBarController по крайней мере, с двумя различными UISplitViewControllers как контроллеры представления - но тогда вы должны позаботиться о странных случаях, включающих вращение и 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 распознал ориентацию интерфейса. Не могу помочь вам с этим.

Другие вопросы по тегам