首先,请阅读“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次撤消将其旋转到原始位置。所以我只想为uigesturerecognisersendeded设置撤消管理器。怎么做。 – 2012-02-06 05:29:14
我改变了我的答案。 – 2012-02-06 05:59:37
非常感谢您的帮助。 – 2012-02-06 06:21:31