NSUndoManager отменить вращение UIImage, используя жест вращения - PullRequest
4 голосов
/ 27 января 2012

Как использовать 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 Ответ

4 голосов
/ 27 января 2012

Прежде всего, прочитайте «Использование отмены на 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;
    }
}
...