Erstens: Lesen Sie "Rückgängig machen auf dem iPhone" . Vergewissern Sie sich, dass Sie die undoManager
Eigenschaft irgendwo in Ihrer Responder-Kette (wahrscheinlich in Ihrem View-Controller).
Wir wollen nur dann eine Rückgängig-Aktion auslösen, wenn die Geste endet. Aber wenn wir die Rückgängig-Aktion auslösen, müssen wir die Transformation der Ansicht kennen, als die Geste begann. Erstellen Sie eine Instanzvariable, die diese ursprüngliche Transformation enthält:
@implementation YourViewController {
CGAffineTransform _originalImageViewTransform;
}
Als nächstes brauchen wir eine Methode, die eine Rückgängig-Aktion auslöst und die Transformation der Ansicht festlegt:
- (void)setTransform:(CGAffineTransform)newTransform ofView:(UIView *)view
undoTransform:(CGAffineTransform)undoTransform
{
// If I'm called because the gesture ended, this pushes an undo action.
// If I'm called because the user requested an undo, this pushes a redo action.
[[self.undoManager prepareWithInvocationTarget:self]
setTransform:undoTransform ofView:view undoTransform:newTransform];
// Now actually set the transform.
view.transform = newTransform;
}
Ihr handleRotate:
Methode muss den Zustand der Geste erkennen und die entsprechenden Maßnahmen ergreifen.
- (void)handleRotate:(UIRotationGestureRecognizer *)recognizer {
UIView *view = recognizer.view;
UIGestureRecognizerState state = recognizer.state;
if (state == UIGestureRecognizerStateCancelled) {
view.transform = _originalImageViewTransform;
return;
}
if (state == UIGestureRecognizerStateBegan) {
_originalImageViewTransform = view.transform;
}
CGAffineTransform transform = view.transform;
transform = CGAffineTransformRotate(transform, recognizer.rotation);
recognizer.rotation = 0; // This line means we don't need prevRotation
if (state == UIGestureRecognizerStateEnded) {
[[ The gesture ended, so push an undo action before setting the transform.
[self setTransform:transform ofView:view undoTransform:_originalImageViewTransform];
} else {
// The gesture changed but didn't end, so don't push an undo action.
view.transform = transform;
}
}