2013-10-11 4 views
1

Im пытается включить распознавание жестов мультитач для моего приложения. Я пытался поддерживать структуру данных, которая поддерживала бы следы касания (все точки в времени жизни касания от начала до конца) для нескольких пальцев.Структура данных iOS для сохранения следов с несколькими касаниями?

Похоже, что методы UIResponder дают только множество касаний, которые активны, движутся или заканчиваются в определенный момент времени без каких-либо связей между касаниями, которые были перемещены, и касаниями, которые начали движение. Есть ли способ установить эти отношения, или я что-то упустил?

Любые идеи о том, как я могу структурировать данные, также будут полезны, или идеи о том, как я могу получить чрезвычайно быстрый ответ с несколькими касаниями для следов жестов в моем приложении, будут полезны!

ПРИМЕЧАНИЕ: Я помню, как однажды увидел блог, который имел аккуратный способ поддерживать указатели на касания, начинающиеся с нескольких пальцев, и идентификация их с помощью целых чисел для каждого пальца и использование этого для быстрого ответа на мультитач (неспособный найти его сейчас!)

ответ

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]; 
} 

Это работало очень хорошо для меня, им удалось отследить до 11 пальцев в iPad!

Смежные вопросы