2013-05-03 63 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