2013-05-03 62 views
5

我在簡單的應用程序中使用了分割視圖控制器。將所有內容保留爲默認值即可。換句話說,當按下後退按鈕時,主視圖控制器總是以橫向顯示,並將縱向上的詳細視圖控制器覆蓋。使隱藏/取消隱藏主視圖控制器在縱向工作方式與縱向相同

我想要做的就是讓主視圖控制器模仿景觀中的相同功能。換句話說,當設備處於橫向模式時,我希望隱藏主視圖控制器,直到我點擊後退按鈕,然後我希望它覆蓋詳細視圖控制器。

我想做到這一點的最好方法是使用下面的代碼:

- (BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:  (UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation 
{ 
    return self.bHideMaster; 
} 

這個工作,因爲它隱藏在橫向模式下的主視圖控制器。然後我使用下面的代碼使其重新出現:

- (void)hideUnhidePagesController:(id)sender 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.30f]; 

    UISplitViewController* spv = self.splitViewController; 

    // Change hide to unhide or vica versa 
    self.bHideMaster= !self.bHideMaster; 

    // Hide the button if master is visible 
    if(self.bHideMaster) 
    { 
     self.navigationItem.leftBarButtonItem = self.pagesBarButton; 
    } 
    else 
    { 
      self.navigationItem.leftBarButtonItem = nil; 
    } 

    [spv.view setNeedsLayout]; 
    [spv willRotateToInterfaceOrientation:self.interfaceOrientation duration:0]; 
    [[self.splitViewController.viewControllers lastObject] view].frame = self.splitViewController.view.frame; 
    [UIView commitAnimations]; 
} 

這幾乎工作。我有2個問題:

  1. 從過渡隱藏到取消隱藏和取消隱藏到隱藏主視圖控制器不顯示動畫和是多少明顯。我添加了動畫代碼(參見上文),但它僅動畫了詳細視圖控制器而不是主視圖控制器。主人立即出現並消失(留下黑框消失),直到詳細視圖控制器滑過。

  2. 這也顯示了我的第二個問題。我想讓主視圖控制器在橫向模式下出現時將詳細視圖控制器重疊,而使詳細視圖控制器保持原樣。相反,它調整了詳細視圖控制器的大小(與我在開始之前的橫向模式下相同)。我希望主視圖控制器以與縱向模式相同的方式進行交互:主控人員滑過細節控制器的頂部,並在選擇某個項目時滑回。

如果我能解決問題2,那麼我不擔心問題1.這好像應該是在拆分視圖控制器的方法,將在從左側幻燈片母版(重疊詳細視圖控制器)。它以縱向模式執行,所以代碼必須在那裏。我如何在橫向模式下調用相同的代碼?

謝謝!

---------編輯1 ---------

我已經重構hideUnhidePagesController和我越來越近。窗口現在覆蓋縱向和橫向。如果主人在輪換時可見,仍然存在問題。它變得混亂並且顛倒了預期的行爲。我在做這個工作。這裏修改後的代碼:

- (void)hideUnhidePagesController:(id)sender 
{ 
    // Change hide to unhide or vica versa 
    self.bMasterIsHidden= !self.bMasterIsHidden; 

    NSArray *controllers = self.splitViewController.viewControllers; 
    UIViewController *rootViewController = [controllers objectAtIndex:0]; 
    UIView *rootView = rootViewController.view; 
    CGRect rootFrame = rootView.frame; 
    if(self.bMasterIsHidden) 
    { 
     rootFrame.origin.x -= rootFrame.size.width; 
    } 
    else 
    { 
     rootFrame.origin.x += rootFrame.size.width; 
    } 
    [UIView beginAnimations:@"hideUnhideView" context:NULL]; 
    rootView.frame = rootFrame; 
    [UIView commitAnimations]; 
} 

回答

1

我正在把我最終使用的代碼。希望這可以幫助別人。

// *************************************************************************************************** 
// 
// hideUnhideMasterViewControllerButtonPressed 
// 
// *************************************************************************************************** 
- (void)hideUnhideMasterViewControllerButtonPressed:(id)sender { 
    if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
     [self.navigationController popViewControllerAnimated:YES]; 
    } 
    else { 
     if(bMasterIsHidden) 
      [self hideMasterViewController:NO]; 
     else 
      [self hideMasterViewController:YES]; 
    } 
} 

// *************************************************************************************************** 
// 
// hideMasterViewController 
// 
// *************************************************************************************************** 
- (void)hideMasterViewController:(BOOL)bHideMaster { 
    // Change hide to unhide or vica versa 
    self.bMasterIsHidden= !self.bMasterIsHidden; 

    NSArray *controllers = self.splitViewController.viewControllers; 
    UIViewController *rootViewController = [controllers objectAtIndex:0]; 
    UIView *rootView = rootViewController.view; 
    CGRect rootFrame = rootView.frame; 
    if(bHideMaster) { 
     if(self.tapRecognizer) { 
      rootFrame.origin.x -= rootFrame.size.width; 
      [self.view removeGestureRecognizer:self.tapRecognizer]; 
      self.tapRecognizer = nil; 
     } 
    } 
    else { 
     rootFrame.origin.x += rootFrame.size.width; 
     self.tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapRecognized:)]; 
     self.tapRecognizer.numberOfTapsRequired = 1; 
     [self.view addGestureRecognizer:self.tapRecognizer]; 
     self.tapRecognizer.delegate = self; 
    } 
    // Log resulting frame 
    NSString *hiddenString = self.bMasterIsHidden ? @"YES" : @"NO"; 
    NSLog(@"Page=%@ Class=%@ MasterIsHidden=%@ Origin(x,y)=(%f, %f) Size(width,height)=(%f, %f)", self.pageDefinition.pageName, [self class], hiddenString, rootFrame.origin.x, rootFrame.origin.y, rootFrame.size.width, rootFrame.size.height); 

    [UIView beginAnimations:@"hideUnhideView" context:NULL]; 
    rootView.frame = rootFrame; 
    [UIView commitAnimations]; 
} 
6

爲了得到你描述的效果,我不得不將下面的代碼添加到我的DetailViewController中。

- (BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController: 
(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation 
{ 
    return YES; 
} 

然後我的拆分視圖在縱向和橫向模式下的工作方式相同。

+0

是,@Nunrey但它只是隱藏masterViewController.How移動到下一個視圖時控制器取消隱藏? – 2014-08-19 05:55:58

1

也許我來不及回答這個,但是......這裏是解決方案..

你可以在每一個方向的變化讓你masterviewcontroller從方法參考

-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation { 
    myVCForPopOverController = vc; 

    //always hide the controller 
    return YES; 
} 

現在,您可以從任何barbutton項目單擊中顯示此「myVCForPopOverController」。

-(void)onBarButtonClick:(id)sender { 
    if(!self.popOverController.popoverVisible) { 
     self.popOverController = [[UIPopoverController alloc]initWithContentViewController:myVCForPopOverController]; 
     [self.popOverController presentPopoverFromBarButtonItem:showDetailsBarButton permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; 
     self.popOverController.passthroughViews = nil; 
    } 
    else { 
     [self.popOverController dismissPopoverAnimated:YES]; 
    } 
} 

我已經實現了這一點,它的工作原理。

+0

(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:在iOS9中不推薦使用 – zonabi 2015-09-10 20:00:10

13

在IOS 8.0

self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryHidden; 

隱藏主視圖

+1

這項工作的一面不是如果你仍然想要左手滑動手勢來打開菜單(但是想隱藏你可以執行的segue執行的主人, 'self.spliViewController?.presentsWithGesture = true'這會添加手勢但仍隱藏主視圖。 – Rugdr 2016-03-16 18:52:01

相關問題