每次pinch:
被调用时,您只需根据捏识别器的比例计算变换即可。每次pinchRotate:
被调用时,您只需根据旋转识别器的旋转来计算变换。您永远不会将缩放和旋转合并为一个变换。
这是一个方法。给自己一个新的实例变量,_activeRecognizers
:
NSMutableSet *_activeRecognizers;
初始化它在viewDidLoad
:
_activeRecognizers = [NSMutableSet set];
使用一种方法作为操作both识别器:
- (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
情况要复杂得多。