如何给一个UIImageView添加手势识别器?

5
在这个项目中,有一个名为myView的UIView和一个名为myImage的UIImageView,myView的背面是myImage,视图层次结构如下: UIWindow |-- UIImageView (myImage) |-- UIView (myView) [全屏]
然后在ViewController中为myImage添加了一个手势识别器。
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
        tapGesture.numberOfTapsRequired = 1;
        [myImage addGestureRecognizer:tapGesture];

但手势不会影响到我的图片,因为我的图片已经设置了setUserInteractionEnabled:YES。只有当我的图片放在我的视图前面时才会产生影响,我该如何解决这个问题?


如果它在视图后面,它将无法接收触摸。 - ohr
2个回答

10

你的UIView显然在触及到UIImageView之前就截取了触摸事件。

你可以把UIImageView放在UIView的前面,或者禁用UIView的用户交互功能,这样它就不会截取触摸事件。

如果你需要更精细的控制触摸事件,你可以选择:

  • 如果必须为了设计需求将UIView放在UIImageView的前面(例如如果它遮挡了UIImageView的一部分),但是不要让它捕获事件(userInteractionEnabled = NO),并使用一个不同的UIView来捕获UIImageView之外的事件。
  • 保持UIViewUIImageView的前面,并保持其能够捕获事件(userInteractionEnabled = YES),但是通过对你的UIView进行子类化、重写pointInside:withEvent:hitTest:withEvent:方法来过滤通过它的事件。

如需更多信息,你应该阅读相关的苹果编程指南:《事件处理相关的苹果编程指南》


但是myImage必须留在myView的后面,有没有办法在触摸开始时进行检测,并确定哪个视图将受到影响? - pqteru
是的。如我在答案中所述,在UIView上关闭用户交互(userInteractionEnabled = NO)。如果UIView仍然需要捕获除UIImageView位置之外的任何地方的触摸事件,则有多种可能性:(1)使您的UIView位于UIImageView上方,但具有userInteractionEnabled = NO,并在UIImageView下面放置另一个UIView来捕获未被UIImageView捕获的所有触摸事件,或(2)将UIView放在UIImageView上面,对其进行子类化并重写hitTest:withEvent:pointInside:withEvent: UIView方法。 - AliSoftware

1

我的代码:

UILongPressGestureRecognizer *press = [[UILongPressGestureRecognizer alloc] 
initWithTarget:self action:@selector(hasLongPressed)];
[press setMinimumPressDuration:0.1f]; //1ms
press.delegate = (id)self;
[self.DGEMLogo addGestureRecognizer:press];

需要两个属性才能执行:

1.) 将手势识别器添加到您的UIImageView(self.DGEMLogo) [self.DGEMLogo addGestureRecognizer:press];

2.) 将您的UIImage属性Interaction enabled设置为TRUE

就是这样。


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