获取 UIView 上的最后一个触摸事件
Posted
技术标签:
【中文标题】获取 UIView 上的最后一个触摸事件【英文标题】:Get the last touch event on UIView 【发布时间】:2018-08-01 06:56:42 【问题描述】:注意:这是一个与此处提出的问题类似的问题,但 答案是在我的情况下没有完全解决方案。问题是 目标也不一样。参考: 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
,所以在多次触摸的情况下我无法获得触摸事件的确切最后位置。
有没有办法在处理多次触摸的情况下获得最后一个位置?
【问题讨论】:
您到底想达到什么目的?您是否需要像绘图应用程序那样持续监控触摸?或者它只是一个触摸,你想知道确切的触摸点? @SandeepBhandari 我不需要持续监控触摸位置,但我需要使用最后一次触摸的CGPoint
s 检测所有触摸,并且必须支持多次触摸。
试试我在下面发布的答案
【参考方案1】:
您始终可以创建 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
吗?没有。
这就是为什么我在上面的 cmets 中询问您到底想要实现什么。如果您正在寻找对触摸的持续监控,而不是 touchBegan
、touchMove
、touchEnd
是您应该选择的代表,但如果您尝试监控单个触摸并找到其确切的触摸点,您可以随时使用hitTest
希望对你有帮助
【讨论】:
感谢您的帖子。但是,当有多个触摸时,touches.first
可能包含任何一个随机触摸事件,因为该集合没有排序。
@bijoy-thangaraj :我刚刚使用 touch 开始向您展示它是如何与 hitTest 同步的。想法是使用 hitTest 。所以尝试使用 hitTest
@Bijoy Thangaraj :很高兴我能帮上忙。快乐编码以上是关于获取 UIView 上的最后一个触摸事件的主要内容,如果未能解决你的问题,请参考以下文章
将触摸事件从覆盖 UIView 转发到 UIWebView / 如何从代码将触摸事件发送到 uiwebview