UISplitViewController странное поведение - PullRequest
1 голос
/ 19 июля 2010

Привет, у меня есть splitViewController

mapViewController = [[MapViewController alloc] initWithManagedObjectContext:managedObjectContext startingRegion:startingRegion];

    distanceViewController = [[DistanceTableViewController alloc] initWithManagedObjectContext:managedObjectContext];
    distanceViewController.mapViewController = mapViewController;
    setupViewController = [[SetupTableViewController alloc] initWithStyle:UITableViewStyleGrouped map:mapViewController.map];   
    setupViewController.positionSwitch.on = savePosition;

    SearchTableViewController *searchViewController = [[SearchTableViewController alloc]  initWithStyle:UITableViewStylePlain managedObjectContext:managedObjectContext];   
    searchViewController.mapViewController = mapViewController;

    tabBarController = [[UITabBarController alloc] init];

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        UINavigationController *mapNavigationController = [[[UINavigationController alloc] initWithRootViewController:mapViewController] autorelease];
        UINavigationController *searchNavigationController = [[[UINavigationController alloc] initWithRootViewController:searchViewController] autorelease];
        UINavigationController *distanceNavigationController = [[[UINavigationController alloc] initWithRootViewController:distanceViewController] autorelease];
        UINavigationController *setupNavigationController = [[[UINavigationController alloc] initWithRootViewController:setupViewController] autorelease];

        UISplitViewController* splitVC = [[UISplitViewController alloc] init];
        splitVC.viewControllers = [NSArray arrayWithObjects:searchNavigationController, mapNavigationController, nil];
        splitVC.title = @"iMetano";
        splitVC.tabBarItem = [[[UITabBarItem alloc] initWithTitle:@"Mappa" image:[UIImage imageNamed:@"mapIcon2.png"] tag:0] autorelease];

        NSArray *viewControllersArray = [NSArray arrayWithObjects: splitVC,setupNavigationController,nil];
        [splitVC release];

        tabBarController.viewControllers = viewControllersArray;
    }

Когда я запускаю свое приложение в портретном режиме, все работает нормально.

Когда я запускаю свое приложение в альбомной ориентации, это результат

альтернативный текст http://img828.imageshack.us/img828/4100/errorw.png

  1. Я вижу только вид первого viewController SearchTableViewController с некоторым пикселем между UINavigationController и строкой состояния
  2. Когда я поворачиваюсь в портретной ориентации и после возвращения в альбомной ориентации, я вижу оба вида viewController, но у второго есть некоторый пиксель между statusBar и UINavigationControllor

Я не могу понять, почему.

Ответы [ 4 ]

1 голос
/ 12 октября 2010

яблоко говорит, что не следует помещать контроллер разделенного вида внутри чего-то другого, например, контроллера панели вкладок

0 голосов
/ 13 июня 2012

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

UITabBarController
    Tab0->UINavigationController->MGSplitViewController _or_ UISplitViewController
    Tab1->UINavigationController->SomeOtherViewController
    Tab2->Etc...

Ничто из того, что я пытался, не могло избавиться от этогоРазрыв в 20px, который появляется только один раз при загрузке, если ориентация устройства - что-либо кроме UIInterfaceOrientationPortrait.Разрыв в 20 пикселей вызван UINavigationBar для вышеприведенного UINavigationController разделенного представления, имеющего ненулевое значение origin.y;скорее всего, вы найдете его 20.

Кроме того, я обнаружил, что это проблема, только если устройство работает под управлением iOS <5.0. </p>

Я проверяю эту проблему впросмотреть код контроллера моего MGSplitViewController (то есть self = MGSplitViewController):

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    if(self.doIOS4OneTimeRotationHack == YES)
    {
        self.doIOS4OneTimeRotationHack = NO;
        for(UINavigationController *navController in [self viewControllers])
        {
            if(navController.navigationBar.frame.origin.y != 0.0f)
            {
                [UIView animateWithDuration:0.01
                                      delay:0.0
                                    options:UIViewAnimationOptionCurveEaseOut
                                 animations:
                 ^(void)
                 {
                     navController.navigationBar.frame = CGRectMake(navController.navigationBar.frame.origin.x,0.0f, navController.navigationBar.frame.size.width,navController.navigationBar.frame.size.height);
                 }
                                 completion:
                 ^(BOOL finished)
                 {
                     //NSLog(@"Shifted navbar 0x%x up!",navController.navigationBar);
                 }];
            }
        }
    }
}

Если анимация завершается всего за 0,01 секунды, это происходит так быстро, что вы даже не заметите ее как всплеск загрузкиэкран исчезнет, ​​и ваш MGSplitViewController вид появится на своем месте.Возможно, поиграйте с этим и сделайте это мгновенно;Мне нужно было заставить его работать и перейти к следующему заданию, так что я не стал дурачиться с этим до конца.

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

0 голосов
/ 29 августа 2010

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

[tabBarController setSelectedViewController:splitVC];

сразу после установки массива контроллера представления на контроллере панели вкладок. Теперь работает как чемпион.

0 голосов
/ 20 июля 2010

После просмотра моего кода и IB раз за разом.Это лучшее, что я мог придумать.Не уверен, что это лучший, но он работает для меня.Я загружаю стандартный детальный вид контроллера.Если я загружаю контроллер непосредственно в viewDidLoad, то проблема возникает.Если я загружаю его из селектора, проблема исчезает.Надеюсь, это поможет.У меня есть этот код в RootViewController.

    - (void)viewDidLoad {
        [super viewDidLoad];
        [self performSelector:@selector(loadController) withObject:nil afterDelay:0];
    }

    -(void)loadController{
    UIViewController <SubstitutableDetailViewController> *detailViewController = nil;
    WebViewController *newDetailViewController = [[WebViewController alloc] initWithNibName:@"WebViewController" bundle:nil];
    [newDetailViewController setTitle:@"Home"];
    NewNavController <SubstitutableDetailViewController>*navController = [[NewNavController alloc] initWithRootViewController:newDetailViewController];

    detailViewController = navController;

    NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil];
    splitViewController.viewControllers = viewControllers;


}
...