如何在Xcode中跟踪多个触摸

问题描述:

最近我做了一个可以同时拖动多个对象的应用程序。我曾尝试使用UIPanGestureRecognizer来获取手指触摸的坐标,但我无法知道哪个触摸属于哪个手指。如何在Xcode中跟踪多个触摸

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

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

我在相同的问题上奋斗了很长时间,终于解决了它。以下是我的DrawView.m中的代码,它是UIView的一个子类,它能够使用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::时将每个ID与屏幕上的触摸进行比较。

只需将代码粘贴到您的.m文件中即可使用。抽样结果如下所示:

enter image description here

希望这有助于:)