Первое, что нужно попробовать - убедиться, что распознаватели работают «одновременно».В вашем делегате вы хотите определить следующее:
- (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
}
Если вы просто пытаетесь перетащить вид вокруг, вам может повезти, изменив центр вида вместо применения переводак его преобразованию.