【问题标题】:UISplitViewController strange behaviorUISplitViewController 奇怪的行为
【发布时间】:2010-07-19 17:29:58
【问题描述】:

嗨,我有一个 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 之间有一些像素

我不明白为什么。

【问题讨论】:

  • 我尝试删除 UINavigationController 并且在纵向和横向上都可以正常工作,所以问题似乎与 UINavigationController 有关

标签: iphone uikit uiviewcontroller uisplitviewcontroller


【解决方案1】:

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

【讨论】:

【解决方案2】:

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


}

【讨论】:

    【解决方案3】:

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

    [tabBarController setSelectedViewController:splitVC];
    

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

    【讨论】:

      【解决方案4】:

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

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

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

      另外,我发现这只有在设备运行 iOS

      我在 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 下面的解决方案听起来很棒,但不幸的是对我不起作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-27
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-08
        • 2015-07-20
        相关资源
        最近更新 更多