1

嗨,我有一个 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;
    }

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

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

替代文字

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

我不明白为什么。

4

4 回答 4

1

苹果说不要将拆分视图控制器放在其他东西中,例如标签栏控制器

于 2010-10-12T19:16:35.670 回答
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;


}
于 2010-07-20T06:20:18.517 回答
0

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

[tabBarController setSelectedViewController:splitVC];

在标签栏控制器上设置视图控制器数组之后。现在像冠军一样工作。

于 2010-08-29T10:02:28.587 回答
0

我知道这是一个老问题,但对于像我这样有导航层次结构的人来说,这是我用来解决这个问题的技巧:

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

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

此外,我发现这仅在设备运行 iOS < 5.0 时才会出现问题。

我在 MGSplitViewController 的视图控制器代码中检查了这个问题(即 self = an 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 下面的解决方案听起来很棒,但不幸的是对我不起作用。

于 2012-06-12T23:50:48.347 回答