如何跟踪Xcode中的多个触摸

时间:2017-04-16 07:43:48

标签: ios objective-c xcode multi-touch

最近,我制作了一款可以同时拖动多个对象的应用。我曾尝试使用UIPanGestureRecognizer来获取手指触摸的坐标,但我无法知道哪个触摸属于哪个手指。

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

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

1 个答案:

答案 0 :(得分:1)

我在相当长的一段时间内遇到了同样的问题并最终解决了它。以下是我的DrawView.m中的代码,UIViewdrawRect:的子类,可以使用#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

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

只需将代码粘贴到rollapply文件中即可。样本结果如下所示:

enter image description here

希望这会有所帮助:)