UISplitViewController奇怪的行为

时间:2010-07-19 17:29:58

标签: iphone uikit uiviewcontroller uisplitviewcontroller

您好我有一个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;
    }

当我以纵向启动我的应用程序时,一切正常。

当我在横向启动我的应用程序时,这是结果

alt text http://img828.imageshack.us/img828/4100/errorw.png

  1. 我只看到第一个viewController SearchTableViewController的视图,在UINavigationController和状态栏之间有一些像素
  2. 当我以纵向旋转并且在横向返回后,我看到两个viewController的视图,但第二个在statusBar和UINavigationControllor之间有一些像素
  3. 我无法理解为什么。

4 个答案:

答案 0 :(得分:1)

苹果说不要将分割视图控制器放在其他内容中,比如标签栏控制器

答案 1 :(得分:0)

一次又一次地查看我的代码和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;


}

答案 2 :(得分:0)

尝试组合标签栏,拆分视图和导航控制器时,我遇到了同样的问题。我注意到,只有当应用程序首次启动并且第一个选项卡被自动选中时才会出现对齐间隙,因为它是选项卡栏控制器的视图控制器数组中的第一个选项卡。在切换视图中切换选项卡然后返回到未对齐导航控制器的选项卡后,没有出现对齐问题。因此,为了复制这种行为并在首次渲染屏幕时摆脱不对齐,我添加了:

[tabBarController setSelectedViewController:splitVC];
在标签栏控制器上设置视图控制器阵列后立即

。现在就像一个冠军。

答案 3 :(得分:0)

我知道这是一个古老的问题,但这是我刚刚用来解决这个问题的黑客攻击任何拥有像我一样的导航层次结构的人:

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

如果设备方向是除了UIInterfaceOrientationPortrait以外的任何东西,我尝试的任何东西都无法摆脱在启动时仅发生一次的20px间隙。 20px间隙是由UINavigationBar引起的,因为上面的拆分视图的UINavigationController具有非零的origin.y值;最有可能的是,你会发现它是20岁。

此外,我发现如果设备运行iOS&lt;这只是一个问题。 5.0。

我在我的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视图出现在它的位置时你甚至都不会注意到它。也许可以随意使用并瞬间完成;我不得不让它工作并继续我的下一个任务,所以我不会因此而愚弄它。

我不喜欢诉诸这样的黑客,但这是我能解决这个问题的唯一方法。下面ScottS的解决方案听起来很棒,但不幸的是对我不起作用。