获取 UIView 上的最后一个触摸事件

Get the last touch event on UIView

Note: This is a question similar to what is asked here, but the answer provided there is not exactly a solution in my case. The question's objective is different too. Reference: touchesBegan - Only needs the last touch action - iPhone

我正在尝试处理 UIView 中的多个触摸。我需要按顺序获得准确的触摸位置。

目前,我正在附加这样的选择器:

[myView addTarget:self action:@selector(touchBegan:withEvent:) forControlEvents: UIControlEventTouchDown];

这是我的经纪人,

- (void)touchBegan:(UIButton *)c withEvent:ev {
    UITouch *touch = [[ev allTouches] anyObject];

这里的问题是[ev allTouches] returns一个NSSet是无序的,所以在多点触摸的情况下我无法得到触摸事件的确切最后位置。

有没有办法在处理多个触摸的情况下获取最后一个位置?

您始终可以创建视图的子类并覆盖 hitTest 以获得准确的接触点

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    debugPrint(point)
    return super.hitTest(point, with: event)
}

这里只是记录接触点。只是为了展示它是如何工作的,我在我的 ViewController 中添加了 touchesBegan 并记录了触摸集

中的第一个触摸点
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    debugPrint(touches.first)
}

这是两者的控制台日志

(175.66667175293, 175.33332824707)

Optional( phase: Began tap count: 1 force: 0.000 window: ; layer = > view: > location in window: {175.66665649414062, 175.33332824707031} previous location in window: {175.66665649414062, 175.33332824707031} location in view: {175.66665649414062, 175.33332824707031} previous location in view: {175.66665649414062, 175.33332824707031})

所以点击测试说,你的触摸点是 (175.66667175293, 175.33332824707) 而 touches.first 说位置在视图中:{175.66665649414062, 175.33332824707031} 基本相同。

可以用hitTest代替touchBegan吗?没有.

这就是为什么我在上面的评论中询问你到底想达到什么目的。如果您正在寻找对触摸的连续监控,那么 touchBegantouchMovetouchEnd 是您应该选择的代表,但如果您正在尝试监控单个触摸并找到它的确切触摸点你总是可以利用 hitTest

希望对您有所帮助