2010-07-19 36 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解決方案聽起來很棒,但不幸的是我沒有爲我工作。