ios - 使隐藏/取消隐藏主视图 Controller 在横向上的工作与纵向相同

标签 ios uisplitviewcontroller ipad

我在一个简单的应用程序中使用 Split View Controller 。将所有内容保留为默认值就可以了。换句话说,当按下后退按钮时,主视图 Controller 始终以横向显示并以纵向覆盖细节 View Controller 。

我想做的是让主视图 Controller 模拟横向和纵向相同的功能。换句话说,当设备处于横屏状态时,我希望主视图 Controller 隐藏起来,直到我按下后退按钮,然后我希望它覆盖详细 View Controller 。

我认为最好的方法是使用以下代码:

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

这是因为它在横向模式下隐藏了主视图 Controller 。然后我使用以下代码使其重新出现:

 - (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];
 }

这几乎奏效了。我有两个问题:

  1. 主视图 Controller 从隐藏到取消隐藏和取消隐藏到隐藏的转换不是动画的,而且非常明显。我添加了动画代码(见上文),但它只为细节 View Controller 而不是主视图 Controller 设置动画。 master 会立即出现和消失(在消失时留下一个黑框),直到详细 View Controller 滑过。

  2. 这也说明了我的第二个问题。我希望主视图 Controller 在以横向模式出现时与详细 View Controller 重叠,而使详细 View Controller 保持原样。相反,它会调整详细 View Controller 的大小(就像我开始之前在横向模式下所做的一样)。我希望主视图 Controller 以与纵向模式相同的方式进行交互:主视图 Controller 滑入细节 Controller 的顶部,并在选择项目时滑出。

如果我能解决问题 2,那么我就不必担心问题 1。 Split View Controller 中似乎应该有一种方法可以从左侧滑入母版(与详细 View Controller 重叠) ).它以纵向模式执行,因此代码必须存在。我如何在横向模式下调用相同的代码?

谢谢!

--------编辑 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];
 }

最佳答案

在 iOS 8.0 中

self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryHidden;

隐藏主视图

关于ios - 使隐藏/取消隐藏主视图 Controller 在横向上的工作与纵向相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16352980/

相关文章:

ios - UIBarButtons 太靠近 UIPopoverController 内的 UINavigationBar 的边缘

iOS Swift 4 - 如何将数据传递给 splitviewcontrollers master

iphone - 在运行时设置 UIInterfaceOrientation

iphone - 等待 NSURLConnection 完成

objective-c - CATransaction 之后在 ios6 上重复调用 layoutSubviews

ios - 如何将采样率 16000 的 wav 转换为 mp3?

ios - SplitView 的 displayModeButtonItem 在 iPad (iOS8) 上不显示标题

iphone - UISplitView - 为masterView中的每一行加载不同的detailView

iphone - 苹果企业开发人员向客户分发临时文件吗?

ios - ios 7.0.X 的 popover 大小问题,加载 popover 时没有得到