UIPanGestureRecognizer 没有在其 SuperView 区域之外的 UIImageView 被触发?

Posted

技术标签:

【中文标题】UIPanGestureRecognizer 没有在其 SuperView 区域之外的 UIImageView 被触发?【英文标题】:UIPanGestureRecognizer not being fired for UIImageView outside its SuperView area? 【发布时间】:2014-12-26 21:30:08 【问题描述】:

我在 iPad 应用上有以下 UI:

下面是对发生的事情的解释:

    蓝色区域是附加到(显示的)ViewController 的 View。 黄色区域是一个 UIImageView,用户可以在其中拖动项目(我称之为活动区域)。黄色是蓝色区域的子视图。 红色项目是一个附加了 UIPanGestureRecognizer 的 UIImageView。它是黄色区域的子视图。 可以拖动红色项目,只要从活动(黄色)区域内开始拖动即可。

在上图所示的情况下,我希望能够从其表面上的任何点拖动红色项目。 (不仅来自与(黄色)区域相交的区域)

有什么想法吗?

谢谢!

【问题讨论】:

【参考方案1】:

当视图超出其父视图的范围时,它们不会响应触摸。您可以通过使红色视图成为蓝色视图而不是黄色视图的子视图来解决此问题。

【讨论】:

【参考方案2】:

rdelmar 有最干净的方法来做到这一点。

但是如果你想保留你的视图架构,你可以为你的黄色视图创建一个 YellowClass,它是 UIImageView 的子类。并在您的 YellowClass 中实现以下代码:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
   
    if (!self.clipsToBounds && !self.hidden && self.alpha > 0) 
        for (UIView *subview in self.subviews.reverseObjectEnumerator) 
            CGPoint subPoint = [subview convertPoint:point fromView:self];
            UIView *result = [subview hitTest:subPoint withEvent:event];
            if (result != nil) 
                return result;
            
        
    

    return nil;

YellowView 之外的 YellowView 子视图将响应触摸。

从this post阅读。

【讨论】:

以上是关于UIPanGestureRecognizer 没有在其 SuperView 区域之外的 UIImageView 被触发?的主要内容,如果未能解决你的问题,请参考以下文章

UIPanGestureRecognizer 没有在其 SuperView 区域之外的 UIImageView 被触发?

未调用 iOS 13 UIPanGestureRecognizer 选择器

UIPanGestureRecognizer 的翻译(in:) 函数的视角参数是啥?

UIPanGestureRecognizer 在 iOS 13 中不起作用

UIPanGestureRecognizer 的准确起始位置?

游乐场中的 UIPanGestureRecognizer