2010-07-19 31 views
1

嗨,我有一个splitViewControllerUISplitViewController奇怪的行为

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

我不明白为什么。

+1

我尝试删除UINavigationController和所有在纵向和横向工作正常,所以这个问题似乎与UINavigationController – 2010-07-20 08:24:33

回答

1

苹果说,不要把拆分视图控制器内别的东西,就像一个标签栏控制器

+0

它在哪里说的? – ZaBlanc 2011-05-07 03:04:22

+0

@ZaBlanc:请参阅分割视图控制器的视图控制器编程指南部分:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/iPadControllers/iPadControllers.html#//apple_ref/doc/uid/TP40007457 -CH6-SW2“分割视图控制器必须始终是您创建的任何界面的根源......” – user102008 2011-06-20 21:20:13

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; 


} 
+0

Tnx有关,但这不适用于我。 – 2010-07-20 08:24:49

0

当试图标签栏,分割视图和导航控制器的组合时,我有这个完全相同的问题。我注意到对齐间隙仅在应用程序首次启动时出现,并且第一个选项卡是自动选择的,因为它是选项卡栏控制器视图控制器数组中的第一个选项卡。在切换选项卡然后返回到分离视图中导航控制器未对齐的那个选项卡后,没有对齐问题。因此,复制此行为,并摆脱了错位的画面时,首先呈现我说:

[tabBarController setSelectedViewController:splitVC]; 

设置标签栏控制器的视图控制器阵列之后。像现在的冠军一样工作。

0

我知道这是一个老问题,但在这里我只是用来解决这个问题的人谁拥有黑客导航层次结构像我这样的:

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

没有我想能摆脱只发生一次,在启动时,如果该设备的方向,除了UIInterfaceOrientationPortrait任何20px的差距。 20px的差距是由UINavigationBar对于上面的分割视图的UINavigationController具有非零的origin.y值引起的;最有可能的是,你会发现它是20.

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

我您在我的MGSplitViewController的视图控制器代码这个问题(即自我=一个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解决方案听起来很棒,但不幸的是我没有为我工作。