我正在尝试为我的应用程序启用多点触控手势识别。我一直在尝试维护一个数据结构,这个数据结构可以保持多个手指的触摸痕迹(从开始到触发的触摸生命周期中的所有点)。
似乎UIResponder方法仅提供活动,移动或在特定时间点结束的触摸组,而移动的触摸和开始移动的触摸之间没有关系。有没有办法建立这种关系,或者我错过了什么?
关于我如何能够进行数据结构的任何想法也会有所帮助,或者关于如何在我的应用程序上为手势痕迹获得极快的多点触摸响应的想法将会有所帮助!
注意:我记得曾经看过一个博客,它有一个简洁的方法来保持多个手指开始触摸的指针,并使用每个手指的整数来识别它们并使用它来获得快速的多点触摸响应(不能现在就在网上找到!)
答案 0 :(得分:0)
经过一番挖掘后,我找到了一个很好的解决方案,并得到了这个人的很多帮助(http://www.codedojo.com/?p=1030)。
最后,它是关于了解iOS如何处理其触摸事件。我最初不清楚的是,当触摸开始时,创建UITouch对象,然后只要该手指向下(即使您在屏幕上移动它),iOS使用相同的UITouch对象但更新了属性对象基于您的行动。
这是我实现的基础,并且使用来自codedojo的想法我实现了一个简单的touchManager,它维护一个UITouch对象数组,并在手指被添加到屏幕上时更新该数组。
因此,在任何时候,您都拥有一个数据结构,可以维护所有UITouch对象,您可以使用这些对象获取多个触摸的手指痕迹。最重要的是,您可以在代码中的任何位置使用此数据结构,以便轻松地执行必要的操作。
@interface TouchStateManager : NSObject{
NSMutableArray *touches;
}
@property(nonatomic , assign , readwrite)NSMutableArray *touches;
-(int)addTouch:(UITouch *)_touch;
-(int)getActiveTouchCount;
-(int)getFingerIdForTouch:(UITouch *)_touch;
@implementation GETouchStateManager
@synthesize touches;
-(int)getFingerIdForTouch:(UITouch *)_touch{
if(self.touches == NULL){
self.touches = [[NSMutableArray alloc] initWithCapacity:MAX_TOUCHES];
}
if([self.touches containsObject:_touch]){
return [self.touches indexOfObject:_touch];
}
else
return -1;
}
-(int)addTouch:(UITouch *)_touch{
if([self.touches count] == 0){
[self.touches addObject:_touch];
return [self getActiveTouchCount];
}
else{
if(![self.touches containsObject:_touch]){
[self.touches addObject:_touch];
return [self getActiveTouchCount];
}
}
return -1;
}
-(int)getActiveTouchCount{
DLog(@"Count : %d" , [touches count]);
return [touches count];
}
这对我很有效,我能够在iPad上跟踪多达11个手指!