【问题标题】:NSUndoManager to undo UIImage rotation using rotation gestureNSUndoManager 使用旋转手势撤消 UIImage 旋转
【发布时间】:2012-02-20 04:39:42
【问题描述】:

如何使用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;
}

【问题讨论】:

    标签: objective-c ios cocoa-touch uiimageview uigesturerecognizer


    【解决方案1】:

    首先,阅读“Using Undo on 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;
        }
    }
    

    【讨论】:

    • 但是如果用户将它旋转 100 次,那么撤销重做功能将无法正常工作。用户必须按撤消 100 次才能将其旋转到原始位置。所以我只想为uigesturerecogniserstateended设置撤消管理器。如何做到这一点。
    • 非常感谢您的帮助。
    • 我喜欢它,虽然我有很多属性需要撤消。 RE:“创建一个实例变量来保存原始变换” 我可以看到这仅适用于旋转手势,但是如果你实现平移、旋转、捏合、边框颜色、阴影、属性 A 怎么办? ..Property Z。似乎在更改开始时为每个设置的 iVar 可能会失控?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多