如何在Xcode中跟踪多个触摸(How to track multiple touches in Xcode)

编程入门 行业动态 更新时间:2024-10-19 06:28:03
如何在Xcode中跟踪多个触摸(How to track multiple touches in Xcode)

最近我正在创建一个可以同时拖动多个对象的应用程序。 我曾尝试使用UIPanGestureRecognizer来获取手指触摸的坐标,但我不知道哪个触摸属于哪个手指。

我需要支持四个手指同时平移而不会使用Objective-C相互干扰。

我已经搜索了一段时间的洗液,但他们显示的答案对我不起作用。 任何帮助,将不胜感激。

Recently I'm making an app that can drag multiple objects at the same time. I had tried to use UIPanGestureRecognizer to get the coordinates of finger touches, but I couldn't know which touch belongs to which finger.

I need to support four fingers panning simultaneously without interfering with each other using Objective-C.

I had searched for the soulution for a while, but the answers they show didn't work for me. Any help would be appreciated.

最满意答案

我在相当长的一段时间内遇到了同样的问题并最终解决了它。 以下是我的DrawView.m的代码,它是UIView的子类,能够使用drawRect:支持绘图drawRect: 。

#import "DrawView.h" #define MAX_TOUCHES 4 @interface DrawView() { bool touchInRect[MAX_TOUCHES]; CGRect rects[MAX_TOUCHES]; UITouch *savedTouches[MAX_TOUCHES]; } @end @implementation DrawView -(id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { // Initialization code self.multipleTouchEnabled = YES; for (int i=0; i<MAX_TOUCHES; i++) { rects[i] = CGRectMake(200, 200, 50 ,50); savedTouches[i] = NULL; touchInRect[i] = false; } } return self; } - (void)drawRect:(CGRect)rect { // Drawing code [[UIColor blueColor] set]; CGContextRef context = UIGraphicsGetCurrentContext(); for (int i=0; i<MAX_TOUCHES; i++) { CGContextFillRect(context, rects[i]); CGContextStrokePath(context); } } #pragma mark - Handle Touches - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSArray *allTouches = [touches allObjects]; for (int i=0; i<[allTouches count]; i++) { UITouch *touch = allTouches[i]; CGPoint newPoint = [touch locationInView:self]; for (int j=0; j<MAX_TOUCHES; j++) { if (CGRectContainsPoint(rects[j], newPoint) && !touchInRect[j]) { touchInRect[j] = true; savedTouches[j] = touch; break; } } } } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { NSArray *allTouches = [touches allObjects]; for (int i=0; i<[allTouches count]; i++) { UITouch *touch = allTouches[i]; CGPoint newPoint = [touch locationInView:self]; for (int j=0; j<MAX_TOUCHES; j++) { if (touch == savedTouches[j]) { rects[j] = [self rectWithSize:rects[j].size andCenter:newPoint]; [self setNeedsDisplay]; break; } } } } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { NSArray *allTouches = [touches allObjects]; for (int i=0; i<[allTouches count]; i++) { UITouch *touch = allTouches[i]; for (int j=0; j<MAX_TOUCHES; j++) { if (touch == savedTouches[j]) { touchInRect[j] = false; savedTouches[j] = NULL; break; } } } } - (CGRect)rectWithSize:(CGSize)size andCenter:(CGPoint)point { return CGRectMake(point.x - size.width/2, point.y - size.height/2, size.width, size.height); } @end

我将MAX_TOUCHES设置为4,因此屏幕上会有四个对象。 这个的基本概念是在调用touchesBegan::时将每个UITouch ID存储在savedTouches数组中,然后在touchesMoved:: called时将每个ID与屏幕上的触摸进行比较。

只需将代码粘贴到.m文件中即可。 示例结果如下所示:

在此处输入图像描述

希望这可以帮助 :)

I've struggled with the same problem for quite a long time and finally solved it. The following is the code in my DrawView.m, which is a subclass of UIView that is able to support drawings using drawRect:.

#import "DrawView.h" #define MAX_TOUCHES 4 @interface DrawView() { bool touchInRect[MAX_TOUCHES]; CGRect rects[MAX_TOUCHES]; UITouch *savedTouches[MAX_TOUCHES]; } @end @implementation DrawView -(id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { // Initialization code self.multipleTouchEnabled = YES; for (int i=0; i<MAX_TOUCHES; i++) { rects[i] = CGRectMake(200, 200, 50 ,50); savedTouches[i] = NULL; touchInRect[i] = false; } } return self; } - (void)drawRect:(CGRect)rect { // Drawing code [[UIColor blueColor] set]; CGContextRef context = UIGraphicsGetCurrentContext(); for (int i=0; i<MAX_TOUCHES; i++) { CGContextFillRect(context, rects[i]); CGContextStrokePath(context); } } #pragma mark - Handle Touches - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSArray *allTouches = [touches allObjects]; for (int i=0; i<[allTouches count]; i++) { UITouch *touch = allTouches[i]; CGPoint newPoint = [touch locationInView:self]; for (int j=0; j<MAX_TOUCHES; j++) { if (CGRectContainsPoint(rects[j], newPoint) && !touchInRect[j]) { touchInRect[j] = true; savedTouches[j] = touch; break; } } } } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { NSArray *allTouches = [touches allObjects]; for (int i=0; i<[allTouches count]; i++) { UITouch *touch = allTouches[i]; CGPoint newPoint = [touch locationInView:self]; for (int j=0; j<MAX_TOUCHES; j++) { if (touch == savedTouches[j]) { rects[j] = [self rectWithSize:rects[j].size andCenter:newPoint]; [self setNeedsDisplay]; break; } } } } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { NSArray *allTouches = [touches allObjects]; for (int i=0; i<[allTouches count]; i++) { UITouch *touch = allTouches[i]; for (int j=0; j<MAX_TOUCHES; j++) { if (touch == savedTouches[j]) { touchInRect[j] = false; savedTouches[j] = NULL; break; } } } } - (CGRect)rectWithSize:(CGSize)size andCenter:(CGPoint)point { return CGRectMake(point.x - size.width/2, point.y - size.height/2, size.width, size.height); } @end

I set the MAX_TOUCHES as 4, so there will be four objects on the screen. The basic concept of this is to store each UITouch ID in the savedTouches array when touchesBegan:: is called, and later compare each ID with the touches on screen when touchesMoved:: called.

Just paste the code into your .m file and it'll work. The sample result is shown here:

enter image description here

Hope this helps :)

更多推荐

本文发布于:2023-04-27 23:33:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1329710.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:多个   如何在   Xcode   touches   track

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!