2013-07-31 2 views
0

У меня есть вид с четырьмя жесты жесты. Первое имеет как максимальное, так и минимальное количество прикосновений, равное 1, от второго до 2 и т. Д. Это делает так, что каждый будет распознавать только одно касание, пока на экране будет скользить до четырех пальцев.Использование распознавателей жестов, которые динамически прилипают к одному касанию среди многих

Это работает денди. То, что не работает, - это обнаружение, когда отдельные касания заканчиваются. Все, что я должен был сделать, когда жест заканчивается, происходит только тогда, когда все жесты полностью прекратились.

Пример метод делегата:

- (void) handlePan:(UIPanGestureRecognizer*)recognizer { 

    //Setting what happens when a gesture is recognized as beginning 
    if (recognizer.state == UIGestureRecognizerStateBegan) { 

    //...whatever happens, bunnies follow your finger or whatever 

    } else 

    //Setting what happens when a gesture ends 
    if ((recognizer.state == UIGestureRecognizerStateEnded) | 
     (recognizer.state == UIGestureRecognizerStateCancelled) | 
     (recognizer.state == UIGestureRecognizerStateFailed)) { 

     NSLog(@"end"); 

    } 
} 

Что должно происходить в том, что я вижу «конец» в консоли, когда поднимается любой палец. Вместо этого я ничего не вижу, пока все пальцы не подняты, и в этот момент я вижу «конец» четыре раза (или столько же раз, сколько и пальцы, которые были на экране).

Есть ли способ, которым я могу сделать эту работу так, как я предполагаю?

Редактировать После ворча я вижу, что я не могу правильно анализировать свою проблему. Вся причина, по которой я хочу обнаружить, когда касание жестов заканчивается, заключается в том, что я хочу, чтобы жесты могли стать активными, когда на экране больше одного касания, но я хочу, чтобы каждый жест отслеживал только одно касание. Я устанавливал «активный» флаг на жесты, которые отслеживали касания, а затем отключил этот флаг после того, как касания закончились, и это не сработало, потому что обнаружение сенсорного конца было сложно реализовать хорошо.

Но если есть другой способ достичь того же, это настоящая вещь, которую я ищу: среди многих перекрывающихся прикосновений каждый распознаватель жестов отслеживает один и только один.

+0

Я думаю, что [это сообщение] (http://stackoverflow.com/a/12434281/352891) поможет – user352891

+0

@ user352891 спасибо за подсказку; на самом деле это касается другой вещи. Он различается в зависимости от того, где на экране находится жест, и вообще не обнаруживает состояния. –

ответ

0

Это то, что в конечном итоге сработало.

Короче говоря, я сделал флаг, который щелкнул всякий раз, когда распознавателю жестов было назначено прикосновение, гарантируя, что никакие другие распознаватели не приняли это касание. Я также тестировал каждый распознаватель, чтобы убедиться, что он принял только прикосновение, когда оно не было уже после касания. Поэтому я сделал каждое касание только один раз, и каждый распознаватель принимает только одно касание. Работал как шарм.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
      //set this to no every time a new touch happens, meaning it isn't taken yet. 
      touchTaken = NO; 
     } 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 

     //If the touch is taken or the gesture's already following a touch, say no. 
     if (touchTaken | ([gestureRecognizer numberOfTouches] > 0)) { 
      return NO; 
     } 
     else { 
      touchTaken = YES; 
      return YES; 
     } 
    } 
0

Возможно, вы захотите сделать что-то вроде: он ловит изменение пальцев на экране для данного жеста; вам может потребоваться добавить еще некоторую логику, связанную с тем жестом, с которым вы работаете:

switch(recognizer.numberOfTouches) { 
    case 1: { 
     NSLog(@"1 "); 
     break; 
    } 
    case 2: { 
     NSLog(@"2"); 
     break; 
    } 
    case 3: { 
      NSLog(@"3"); 
      break; 
    } 
    case 4: { 
      NSLog(@"4"); 
      break; 
    } 
    default: { 
      NSLog(@"0"); 
    } 
} 
Смежные вопросы