Прежде всего, прочитайте «Использование отмены на iPhone» . Убедитесь, что вы установили свойство undoManager
где-то в цепочке респондента (возможно, в вашем контроллере представления).
Мы хотим отменить действие только после завершения жеста. Но когда мы нажимаем действие отмены, нам нужно знать преобразование представления, когда начался жест. Создайте переменную экземпляра для хранения этого исходного преобразования:
@implementation YourViewController {
CGAffineTransform _originalImageViewTransform;
}
Далее нам нужен метод, который запускает действие отмены и устанавливает преобразование представления:
- (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;
}
Ваш метод handleRotate:
должен определить состояние жеста и предпринять соответствующее действие.
- (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;
}
}