This chapter presented the information clearly, but I disliked how the implementations of the various gestures ignored changes made by other gestures. i.e. a "zoom" followed by a rotation would no longer be "zoomed", a rotation followed by a zoom wouldn't be rotated. The following changes allow you to make the changes cumulative.
Code:
@synthesize imageView;
CGAffineTransform currentState;
BOOL senderState = YES;
-(IBAction)handlePinchGesture:(UIGestureRecognizer *)sender
{
if (senderState) {
currentState = sender.view.transform;
senderState = NO;
}
CGFloat factor = [(UIPinchGestureRecognizer *)sender scale];
sender.view.transform = CGAffineTransformScale(currentState, factor, factor);
if(sender.state == UIGestureRecognizerStateEnded)
{
senderState = YES;
}
}
-(IBAction)handleRotationGesture:(UIGestureRecognizer *)sender
{
if (senderState) {
currentState = sender.view.transform;
senderState = NO;
}
CGFloat rotation = [(UIRotationGestureRecognizer *)sender rotation];
sender.view.transform = CGAffineTransformRotate(currentState, rotation);
if (sender.state == UIGestureRecognizerStateEnded) {
senderState = YES;
}
}
-(IBAction)handlePanGesture:(UIGestureRecognizer *)sender
{
if (senderState) {
currentState = sender.view.transform;
senderState = NO;
}
CGPoint translation = [(UIPanGestureRecognizer *)sender translationInView:imageView];
sender.view.transform = CGAffineTransformTranslate(currentState, translation.x, translation.y);
if (sender.state == UIGestureRecognizerStateEnded) {
senderState = YES;
}
}
The variables
CGPoint netTranslation;
CGFloat lastScaleFactor=1;
CGFloat netRotation;
are no longer needed since you get the information about the current state from the view.