注意:这是一个与此处询问的问题类似的问题,但是
  如果我的情况下没有确切的解决方案,请回答。问题的
  目标也不同。参考:
  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]返回一个无序的NSSet,因此在多次触摸的情况下,我无法获得触摸事件的确切最后位置。

在处理了多次触摸的情况下,有什么方法可以使我到达最后一个位置?

最佳答案

您始终可以创建View的子类并覆盖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)
  
  可选的(
  阶段:开始点击计数:1力:0.000窗口:;层=>视图:
  >窗口中的位置:
  {175.66665649414062,175.33332824707031}在窗口中的先前位置:
  {175.66665649414062,175.33332824707031}在视图中的位置:
  {175.66665649414062,175.33332824707031}视图中的先前位置:
  {175.66665649414062,175.33332824707031})


因此,命中测试说,您的接触点是(175.66667175293,175.33332824707),而touches.first说的是可视位置:{175.66665649414062,175.33332824707031}
基本上是一样的

可以使用hitTest代替touchBegan吗?没有。

这就是为什么我在上面的评论中问您到底要达到什么目的。如果您要连续监控触摸,而不是touchBegantouchMovetouchEnd是您应该选择的代表,但是如果您要监控单个触摸并找到其确切的触摸点,则可以随时使用的hitTest

希望能帮助到你

09-17 04:30