响应一个手势识别器的多个可见视图

Posted

技术标签:

【中文标题】响应一个手势识别器的多个可见视图【英文标题】:Multiple visible views responding to one gesture recognizer 【发布时间】:2014-06-25 00:59:59 【问题描述】:

我有一个视图控制器,它由三个视图(self.panedview、self.view、self.sineview)组成。当检测到向上滑动手势时,最高视图(self.panedview)会向上移动 - 显示另外两个视图(self.view 和 self.sineview)。 self.sineview 是一个 UIView,它不断地运行一个动画,渲染一个移动的正弦波并占据 self.view 的一半。我有一个向下滑动手势识别器,当我在 self.panedview 上向下滑动时它可以工作,但当我在 self.sineview 上向下滑动时它不起作用。如果我在 self.view 上滑动 self.sineview,它似乎可以工作。当我隐藏 self.sineview 并在 self.view 或 self.paned 视图上直接向下滑动时,向下滑动有效。你认为动画正弦波会妨碍手势识别吗?

UISwipeGestureRecognizer * swipeDownRec = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleDownSwipe:)];
[self.panedView addGestureRecognizer:swipeDownRec];
[self.view addGestureRecognizer:swipeDownRec]; 
[self.sineview addGestureRecognizer:swipeDownRec];

我也尝试在这两行代码之间进行更改,但没有区别:

    [self.view insertSubview:self.sineWave belowSubview:self.panedView];
    [self.view insertSubview:self.sineWave aboveSubview:self.view]; 

我也尝试为每个视图添加一个单独的向下滑动手势识别器,但它仍然不起作用。

【问题讨论】:

我建议使用单独的UISwipeGestureRecognizers,这样您就可以根据在一种方法中识别出哪个识别器来明确地执行您需要的操作。 我为每个视图创建了一个单独的UISwipeGestureRecognizers,但它们都有相同的选择器操作方法,但它仍然不起作用。就像我提到的,当我隐藏self.sineview 时,self.panedviewself.view 都完美地响应了一个UISwipeGestureRecognizer。我怀疑动画碍事了 您是否为每个识别器声明了属性?并确定方法中识别的是哪一个? 你指的是哪些属性? 我不知道为什么我没有早点想到这一点,但是我禁用了使正弦波看起来像在移动并且滑动有效的动画。我认为可以安全地假设手势识别器在启用动画时无法识别直接在 self.sineview 上的滑动。 【参考方案1】:

问题是在启用 self.sinewave 动画时无法识别 self.sinewave 的滑动识别器。解决方案很简单:将UIViewAnimationOptionAllowUserInteraction 作为参数添加到options 处理程序的animateWithDuration:delay:options:animations:completion:

【讨论】:

以上是关于响应一个手势识别器的多个可见视图的主要内容,如果未能解决你的问题,请参考以下文章

我对响应不正确子视图的手势识别器有疑问,有啥问题?

子视图不响应父视图的手势识别

自定义页脚视图没有响应我的点击手势识别器标签

如果多个带有手势的视图重叠,如何将 UIGestureRecognizer 放在前面

iOS/ObjC:“后备”轻击手势识别器?

在视图上自定义多个手势