【问题标题】:How to suppress the Master-Detail Controller swipe gesture, and recreate its behaviour on iOS 7如何抑制 Master-Detail Controller 滑动手势,并在 iOS 7 上重新创建其行为
【发布时间】:2013-10-14 09:43:55
【问题描述】:

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

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

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

splitViewController.presentsWithGesture = NO;

但是,如果允许手势并且仍然有可用的滑块,那就太好了!

【问题讨论】:

  • 虽然我无法回答您的问题,但我想说谢谢您发布此信息,但您回答了我的问题。我在上下搜索了一种禁用纵向滑动的方法,并且在这篇文章之前从未遇到过presentsWithGesture = false。非常感谢!
  • 在 iOS 12 中将其设置为 splitViewController.presentsWithGesture = false 在个人 vc 中为我工作,感谢您的提问

标签: objective-c ios7 uisplitviewcontroller


【解决方案1】:

经过试验,我想知道如果我尝试创建自己的滑动手势来打开主视图会发生什么。这完美地工作,并且在使用滑块时它不会失败!

因此,在应用委托中,我取消了默认的滑动手势:

splitViewController.presentsWithGesture = NO;

加载详细视图时,我创建了一个滑动手势:

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

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

请注意,您需要为推送到导航控制器堆栈的每个视图创建此手势。就我而言,它始终是相同的视图,因此可以简化事情。在其他情况下,最好创建一个 UIViewController 的子类来创建并处理此手势,然后将其用作任何被推送的控制器的超类...

【讨论】:

  • 我试过你的代码,但打印弹出框时崩溃了:[UIPopoverController _presentPopoverBySlidingIn:fromEdge:ofView:animated:stateOnly:notifyDelegate:]:无法从没有窗口的视图中呈现弹出框。知道为什么会这样吗?谢谢
猜你喜欢
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多