2012-01-27 117 views
3

如何使用NSUndoManager旋转UIImageView使用旋转手势?这是我的代码轮换。NSUndoManager使用旋转手势撤消UIImage旋转

- (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; 
} 

回答

3

首先,请阅读“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; 
    } 
} 
+0

但是,如果用户将其旋转100次,则撤销重做功能将无法正常工作。用户将不得不按100次撤消将其旋转到原始位置。所以我只想为uigesturerecognisersendeded设置撤消管理器。怎么做。 – 2012-02-06 05:29:14

+1

我改变了我的答案。 – 2012-02-06 05:59:37

+0

非常感谢您的帮助。 – 2012-02-06 06:21:31