Как я могу координировать поведение двух UIGestureRecognizer? - PullRequest
0 голосов
/ 07 февраля 2011

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

Я смотрел на документы UIGestureRecognizerDelegate, но не вижу способа заставить его делать то, что я хочу.

Спасибо
Дуг

1 Ответ

0 голосов
/ 01 февраля 2012

Первое, что нужно попробовать - убедиться, что распознаватели работают «одновременно».В вашем делегате вы хотите определить следующее:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{        
    return (gestureRecognizer.view == otherGestureRecognizer.view);
}

По моему опыту, этого достаточно, чтобы получить достаточно плавный опыт.Однако, если это не так, то я бы обновил ваше преобразование только из одного из распознавателей, сохранив состояние из другого в свойстве.Допустим, вы объявили свойство CGFloat с именем cachedScale, которое вы установили на 1.0 в инициализаторе.Затем в обработчиках пинча и панорамирования вы будете делать следующее:

- (IBAction)handlePinch:(UIPinchGestureRecognizer *)recognizer
{    
    self.cachedScale *= recognizer.scale;
}

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer
{
    CGAffineTransform transform = CGAffineTransformMakeScale(self.cachedScale, self.cachedScale);
    self.cachedScale = 1.0;

    CGPoint translation = [recognizer translationInView:recognizer.view.superview];
    CGAffineTransformTranslate(transform, translation.x, translation.y);

    // do something with your transform
}

Если вы просто пытаетесь перетащить вид вокруг, вам может повезти, изменив центр вида вместо применения переводак его преобразованию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...