UINavigationController在iOS7中的交互式弹出手势异常工作

16
在iOS7中,我们有一个新的“从左向右滑动”的手势,这是一个非常有用的功能,但我现在遇到一个问题。
我使用这段代码自定义UINavigationBar中的返回按钮: self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:view]; 但这会禁用“从左向右滑动”的手势,所以我使用以下代码来保持手势启用: self.navigationController.interactivePopGestureRecognizer.delegate = self 然后,我发现手势工作异常,如果当前的ViewController有一个tableView,在tableView滚动时,手势无法被触发。现在手势不能很容易地被触发,是否有一些方法来解决它?

你尝试过在你的UIGestureRecognizerDelegate上实现´- gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:´吗?然后你可以检查其中一个手势是否是swipetopop手势并返回YES。 - Peter Segerblom
@PeterSegerblom 它奏效了!我还实现了 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer, return YES; 以禁用 otherGestureRecognizer,这样当前的 ViewController 就不会收到 UIPanGestureRecognizer 用于滚动 UITableView。现在看起来很好,非常感谢! - Wei
Swift 3 解决方案:https://dev59.com/z1sW5IYBdhLWcg3wdnFh#43433530 - iwasrobbed
3个回答

29

这段代码对我来说可以正常工作。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return [gestureRecognizer isKindOfClass:UIScreenEdgePanGestureRecognizer.class];
}

5
在类控制器中添加 "UIGestureRecognizerDelegate" 类,
在 viewDidAppear 中添加:
override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    
    self.navigationController?.interactivePopGestureRecognizer.delegate =  self
}

=)


不需要在 ViewDidAppear 方法中。 - William Hu

5

interactivePopGestureRecognizer.delegate设置为self仅是第一步。第二步是实现:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return !(otherGestureRecognizer is UIPanGestureRecognizer)
}

在进行交互式弹出操作时,需要对平移手势识别器进行测试,以阻止滚动视图或表格视图的垂直滚动。


1
当UITableView正在滚动时,此代码不会触发UIScreenEdgePanGestureRecognizer。我实现了- (BOOL)shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer方法,并返回YES。 - Wei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接