NSUndoManager 使用旋转手势撤消 UIImage 旋转

Pre*_*van 5 cocoa-touch objective-c uiimageview uigesturerecognizer ios

如何使用旋转手势NSUndoManager来旋转UIImageView?这是我的旋转代码。

- (void)handleRotate:(UIRotationGestureRecognizer *)recognizer 
{
    if (recognizer.state == UIGestureRecognizerStateBegan) {
        prevRotation = 0.0;
    } 

    float thisRotate = recognizer.rotation - prevRotation;
    prevRotation = recognizer.rotation;
    recognizer.view.transform = CGAffineTransformRotate(recognizer.view.transform, thisRotate);

    CGPoint lastpoint = point;
}
Run Code Online (Sandbox Code Playgroud)

rob*_*off 5

首先,阅读\xe2\x80\x9c在 iPhone 上使用撤消\xe2\x80\x9d。确保您已设置undoManager在响应程序链中的某个位置(可能在视图控制器中)设置了该属性。

\n\n

我们只想在手势结束时推送撤消操作。但是当我们推动撤消操作时,我们需要知道手势开始时视图的变换。创建一个实例变量来保存原始变换:

\n\n
@implementation YourViewController {\n    CGAffineTransform _originalImageViewTransform;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

接下来,我们需要一个方法来推送撤消操作并设置视图的变换:

\n\n
- (void)setTransform:(CGAffineTransform)newTransform ofView:(UIView *)view\n    undoTransform:(CGAffineTransform)undoTransform\n{\n    // If I\'m called because the gesture ended, this pushes an undo action.\n    // If I\'m called because the user requested an undo, this pushes a redo action.\n    [[self.undoManager prepareWithInvocationTarget:self]\n        setTransform:undoTransform ofView:view undoTransform:newTransform];\n\n    // Now actually set the transform.\n    view.transform = newTransform;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

你的handleRotate:方法需要检测手势的状态并采取适当的操作。

\n\n
- (void)handleRotate:(UIRotationGestureRecognizer *)recognizer {\n    UIView *view = recognizer.view;\n    UIGestureRecognizerState state = recognizer.state;\n\n    if (state == UIGestureRecognizerStateCancelled) {\n        view.transform = _originalImageViewTransform;\n        return;\n    }\n\n    if (state == UIGestureRecognizerStateBegan) {\n        _originalImageViewTransform = view.transform;\n    }\n\n    CGAffineTransform transform = view.transform;\n    transform = CGAffineTransformRotate(transform, recognizer.rotation);\n    recognizer.rotation = 0; // This line means we don\'t need prevRotation\n\n    if (state == UIGestureRecognizerStateEnded) {\n        [[ The gesture ended, so push an undo action before setting the transform.\n        [self setTransform:transform ofView:view undoTransform:_originalImageViewTransform];\n    } else {\n        // The gesture changed but didn\'t end, so don\'t push an undo action.\n        view.transform = transform;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n