获取 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
吗?没有.
这就是为什么我在上面的评论中询问你到底想达到什么目的。如果您正在寻找对触摸的连续监控,那么 touchBegan
、touchMove
、touchEnd
是您应该选择的代表,但如果您正在尝试监控单个触摸并找到它的确切触摸点你总是可以利用 hitTest
希望对您有所帮助
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
吗?没有.
这就是为什么我在上面的评论中询问你到底想达到什么目的。如果您正在寻找对触摸的连续监控,那么 touchBegan
、touchMove
、touchEnd
是您应该选择的代表,但如果您正在尝试监控单个触摸并找到它的确切触摸点你总是可以利用 hitTest
希望对您有所帮助