NSUndoManager отменить вращение UIImage, используя жест вращения
Как пользоваться 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;
}
1 ответ
Решение
Прежде всего, прочитайте "Использование отмены на 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;
}
}