3

Comment utiliser NSUndoManager pour faire pivoter un UIImageView en utilisant un mouvement de rotation? C'est mon code pour la rotation.NSUndoManager pour annuler la rotation UIImage en utilisant le mouvement de 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; 
} 

Répondre

3

Tout d'abord, lisez “Using Undo on iPhone”. Assurez-vous que vous avez défini la propriété undoManager quelque part dans votre chaîne de répondeur (probablement dans votre contrôleur de vue).

Nous voulons seulement pousser une action d'annulation quand le geste se termine. Mais quand nous poussons l'action d'annulation, nous devons connaître la transformation de la vue quand le geste a commencé. Créer une variable d'instance pour maintenir cette transformation d'origine:

@implementation YourViewController { 
    CGAffineTransform _originalImageViewTransform; 
} 

Ensuite, nous avons besoin d'une méthode qui pousse une action undo et définit transform de la vue:

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

Votre méthode handleRotate: doit détecter l'état de le geste et prendre les mesures appropriées.

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

Mais si l'utilisateur le fait 100 fois, la fonction d'annulation ne sera pas correctement utilisée. L'utilisateur devra appuyer 100 fois sur Annuler pour le faire pivoter à sa position d'origine. Donc je veux mettre le gestionnaire d'annulation seulement pour uigesturerecogniserstateended. Comment faire ça. –

+1

J'ai changé ma réponse. –

+0

Merci beaucoup pour votre aide. –