4 Stimmen

NSUndoManager zum Rückgängigmachen von UIImage-Drehungen mit Hilfe von Drehgesten

Wie zu verwenden NSUndoManager zum Drehen einer UIImageView Rotationsgesten verwenden? Dies ist mein Code für die Rotation.

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

4voto

rob mayoff Punkte 356759

Erstens: Lesen Sie "Rückgängig machen auf dem iPhone" . Vergewissern Sie sich, dass Sie die undoManager Eigenschaft irgendwo in Ihrer Responder-Kette (wahrscheinlich in Ihrem View-Controller).

Wir wollen nur dann eine Rückgängig-Aktion auslösen, wenn die Geste endet. Aber wenn wir die Rückgängig-Aktion auslösen, müssen wir die Transformation der Ansicht kennen, als die Geste begann. Erstellen Sie eine Instanzvariable, die diese ursprüngliche Transformation enthält:

@implementation YourViewController {
    CGAffineTransform _originalImageViewTransform;
}

Als nächstes brauchen wir eine Methode, die eine Rückgängig-Aktion auslöst und die Transformation der Ansicht festlegt:

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

Ihr handleRotate: Methode muss den Zustand der Geste erkennen und die entsprechenden Maßnahmen ergreifen.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X