UIView中的touchesBegan方法没有被调用

9
我知道这个问题可能已经被回答了很多次,但是我不知道为什么touchesBegan:方法在我的UIView中没有被调用。 在将其添加到我的应用程序之前,我创建了一个试验项目进行测试。 我所做的是对UIView进行子类化,在其中实现touchesBegan:,并将其作为另一个视图的子视图添加。 父视图有一个按钮,单击后显示子类化的UIView。 一切正常。 然而,当我在我的现有应用程序中执行相同的操作时,touchesBegan:方法和touchesMoved:方法都未被调用。 有人能解释一下可能导致这些方法无法被调用的原因吗?

1
您的视图启用了用户交互吗? - alinoz
当我启用了用户交互功能后,它仍然无法识别触摸操作。尽管在我的试验项目中,我甚至没有启用用户交互功能,但它仍然能够识别触摸操作。 - Anna Fortuna
3个回答

11

我找到了这个问题的答案。我发现 UIView 的父视图将 userInteraction 设为禁用(这是默认值)。所以当我启用了父视图的 userInteraction 后,触摸事件就被识别了。


8
在我的情况下,background = UIColor.clearColor()touchesBegan 没有被调用的原因。显然,它不会在透明元素上被调用。

我花了两个小时的时间进行调试,直到找到这个答案!谢谢你! - Josip B.

1
我曾经为这个问题苦苦挣扎......最终找到了解决方法。我认为 touchesBegan 重写函数监听的是主视图:即 ViewController 的故事板树中第一个视图!我很想张贴一张我的故事板截图以使内容更加清晰,但我不行! ;)
无论如何,如果你有子视图,它们可能会覆盖主视图......这样触摸就无法“到达”主视图。
为了避免这种情况,您需要在属性检查器中将所有子视图背景属性设置为默认。这样背景将变为透明,触摸就能够到达主视图。
如果您不想将背景设置为透明,则可以采取以下措施:
- 添加您的最后一个视图(带有背景设置)的输出口
- 向其添加一个轻击手势识别器 - 处理轻击以丢弃键盘
ES.
在属性中:
//The last view's outlet
@IBOutlet weak var ContainerView: UIView!

在viewDidLoad()方法中:
let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
self.ContainerView.addGestureRecognizer(tap)

外部:

func handleTap(recognizer: UITapGestureRecognizer){
    self.view.endEditing(true)
}

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