Каждый раз, когда вызывается pinch:
, вы просто вычисляете преобразование на основе шкалы распознавателя пинча. Каждый раз, когда вызывается pinchRotate:
, вы просто вычисляете преобразование на основе вращения распознавателя вращения. Вы никогда не объединяете масштаб и вращение в одно преобразование.
Вот подход. Дайте себе одну новую переменную экземпляра, _activeRecognizers
:
NSMutableSet *_activeRecognizers;
Инициализируйте его в viewDidLoad
:
_activeRecognizers = [NSMutableSet set];
Используйте один метод в качестве действия для обоих распознавателей:
- (IBAction)handleGesture:(UIGestureRecognizer *)recognizer
{
SMImage *selectedImage = [DataCenter sharedDataCenter].selectedImage;
switch (recognizer.state) {
case UIGestureRecognizerStateBegan:
if (_activeRecognizers.count == 0)
selectedImage.referenceTransform = selectedImage.transform;
[_activeRecognizers addObject:recognizer];
break;
case UIGestureRecognizerStateEnded:
selectedImage.referenceTransform = [self applyRecognizer:recognizer toTransform:selectedImage.referenceTransform];
[_activeRecognizers removeObject:recognizer];
break;
case UIGestureRecognizerStateChanged: {
CGAffineTransform transform = selectedImage.referenceTransform;
for (UIGestureRecognizer *recognizer in _activeRecognizers)
transform = [self applyRecognizer:recognizer toTransform:transform];
selectedImage.transform = transform;
break;
}
default:
break;
}
}
Вам понадобится этот вспомогательный метод:
- (CGAffineTransform)applyRecognizer:(UIGestureRecognizer *)recognizer toTransform:(CGAffineTransform)transform
{
if ([recognizer respondsToSelector:@selector(rotation)])
return CGAffineTransformRotate(transform, [(UIRotationGestureRecognizer *)recognizer rotation]);
else if ([recognizer respondsToSelector:@selector(scale)]) {
CGFloat scale = [(UIPinchGestureRecognizer *)recognizer scale];
return CGAffineTransformScale(transform, scale, scale);
}
else
return transform;
}
Это работает, если вы просто разрешаете вращение и масштабирование. (Я даже проверил это!)
Если вы хотите добавить панорамирование, используйте отдельный метод действия и просто настройте selectedImage.center
. Попытка панорамирования с вращением и масштабированием с использованием selectedImage.transform
намного сложнее.