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;
    }
}
Другие вопросы по тегам