objective-c - 如何抑制 Master-Detail Controller 滑动手势,并在 iOS 7 上重新创建其行为

标签 objective-c ios7 uisplitviewcontroller

默认情况下,UISplitViewController 提供滑动手势以纵向模式打开主视图。

不幸的是,即使在详细信息页面上操作 slider 时,这个手势也会打开主 Controller !我在这里发现了另一个问题,它被标记为针对 iOS 5.1 报告的错误,但问题在 iOS7 上仍然存在...

现在有没有办法在这种情况下抑制这个手势?我意识到我可以通过这样做完全删除它:

splitViewController.presentsWithGesture = NO;

但是,允许手势并且仍然有可用的 slider 会很好!

最佳答案

在试验之后,我想知道如果我尝试创建自己的滑动手势来打开主视图会发生什么。这非常有效,并且在使用 slider 时不会失败!

所以,在应用程序委托(delegate)中,我抑制了默认的滑动手势:

splitViewController.presentsWithGesture = NO;

加载详细 View 后,我创建了一个滑动手势:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UISwipeGestureRecognizer *swipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleRightSwipe:)];
    swipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
    [self.view addGestureRecognizer:swipeGestureRecognizer];

    [self configureView];
}

在 splitViewController:willHideViewController:withBarButtonItem:forPopoverController: 中,我存储了我自己打开主视图所需的引用:

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
    // Add the bar item to the navigation bar

    barButtonItem.title = NSLocalizedString(@"Master", @"Master");
    [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];

    // Store references to the button and popover controller so that we can manually open the view using a custome swipe gesture

    self.masterPopoverButton = barButtonItem;
    self.masterPopoverController = popoverController;
}

最后,我处理滑动:

- (void)handleRightSwipe:(UISwipeGestureRecognizer *)recognizer {

    // Find the root controller in the stack (this is the one that's also the split view's delegate, and thus has access
    // to the pop over controller.

    MyDetailViewController *rootController = (MyDetailViewController *)[self.navigationController.viewControllers objectAtIndex:0];

    if (!rootController.masterPopoverController.popoverVisible) {

        [rootController.masterPopoverController presentPopoverFromBarButtonItem:rootController.masterPopoverButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }
}

这在主视图 Controller 中滑动。我担心这会将 Controller 显示为传统的弹出窗口(带有箭头等),但它实际上做了正确的事情(至少它在 iOS 7 下是这样——我没有测试过早期版本)。

请注意,您需要为插入导航 Controller 堆栈的每个 View 创建此手势。就我而言,它始终是相同的 View ,因此可以简化事情。在其他情况下,创建一个 UIViewController 的子类来创建这个手势并处理它可能是个好主意,然后将它用作任何被推送的 Controller 的父类(super class)......

关于objective-c - 如何抑制 Master-Detail Controller 滑动手势,并在 iOS 7 上重新创建其行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19357447/

相关文章:

ios - 是否可以将状态栏文本(前景)颜色更改为任意颜色(即不是黑色或白色)?

ios - 如何在 iPad 的 UISplitViewController 中隐藏 MasterViewController

objective-c - Objective-C 中的类是对象吗?

ios - 为什么调用 MFMailComposeViewController 会释放调用它的 View ?

iOS - "' Foundation/Foundation.h' 文件未找到“Swift 项目内的自定义框架内出错”

ios - JSON 文本未以数组或对象开头,并且未设置允许片段的选项

ios - 使用 Touch ID 将指纹存储在数据库中

ios - 如何在 Swift 中以编程方式更改 Split View Controller 中的详细 View

ios - 更改 Nav 的 rootViewController 会导致 UISplitViewController 在紧凑纵向方向上显示详细信息

ios - 将 EC_KEY OpenSSL 中的公钥和私钥导出到 SecKeyRef