2015-02-04 14 views
10

Sto scrivendo un'app per fotocamera e ho problemi a mostrare il riquadro di messa a fuoco quando l'utente tocca lo schermo.Come annullare l'animazione precedente quando viene attivato uno nuovo?

mio codice è (in rapido):

self.focusView.center = sender.locationInView(self.cameraWrapper) 
self.focusView.transform = CGAffineTransformMakeScale(2, 2) 
self.focusView.hidden = false 

UIView.animateWithDuration(0.5, animations: { [unowned self]() -> Void in 
    self.focusView.transform = CGAffineTransformIdentity 
}, completion: { (finished) -> Void in 
    UIView.animateWithDuration(0.5, delay: 1.0, options: nil, animations: {() -> Void in 
     self.focusView.alpha = 0.0 
    }, completion: { (finished) -> Void in 
      self.focusView.hidden = true 
      self.focusView.alpha = 1.0 
    }) 
}) 

Tuttavia, se l'uso toccare lo schermo consecutivamente quando l'animazione precedente non finisce, la vecchia e la nuova animazione mescolare e la vista attenzione sarà comportarsi in modo strano ad esempio scomparirà molto velocemente.

Qualcuno potrebbe dirmi come annullare l'animazione precedente, in particolare il blocco di completamento precedente?

+0

tenta di utilizzare una variabile BOOL membro e farlo sì nell'animazione basata sul sì e non provare ad animarlo – Tendulkar

+0

Prova UIView.setAnimationBeginsFromCurrentState (true); prima di avviare l'animazione – Jageen

+0

possibile duplicato di [Come annullare l'animazione basata su blocco UIView?] (http://stackoverflow.com/questions/9569943/how-to-cancel-uiview-block-based-animation) –

risposta

25

È possibile metodo utente removeAllAnimations per fermare l'animazione
Sostituire il codice con sotto

self.focusView.center = sender.locationInView(self.cameraWrapper) 
self.focusView.transform = CGAffineTransformMakeScale(2, 2) 
self.focusView.hidden = false 
self.focusView.layer.removeAllAnimations() // <<==== Solution 
UIView.animateWithDuration(0.5, animations: { [unowned self]() -> Void in 
    self.focusView.transform = CGAffineTransformIdentity 
}, completion: { (finished) -> Void in 

    UIView.animateWithDuration(0.5, delay: 1.0, options: nil, animations: {() -> Void in 
     self.focusView.alpha = 0.0 
    }, completion: { (finished) -> Void in 
      self.focusView.hidden = true 
      self.focusView.alpha = 1.0 
    }) 
}) 


Riferimento: link
enter image description here

+0

Ho provato il tuo metodo e sembra rimuovere l'animazione corrente ma la nuova animazione non viene eseguita correttamente. Il mio pulsante chiama un'animazione. Quando tocco il pulsante, l'animazione inizia. Quando lo tocco di nuovo, voglio che l'animazione si fermi e ricomincia dall'inizio. Ma, usando il tuo metodo di rimozione, si ferma e quindi esegue un'animazione molto breve e incasinata. Qualche idea sul perché? –

+0

@DaveG ti prego di condividere il tuo codice? – Jageen

+0

L'ho postato poche ore fa: http://stackoverflow.com/questions/32449016/consecutive-animation-calls-not-working/32449640#32449640 –

0

Nel mio caso, ho solo bisogno di impostare il valore , ho animato in modo concreto.

Ad es.

if ([indexPath isEqual:self.currentPlayerOrderIndexPath]) 
    { 
     [UIView animateWithDuration:0.5 
           delay:0.0 
          options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveEaseInOut 
         animations:^{ 
          cell.avatarImageV.transform = CGAffineTransformMakeScale(1.15,1.15); 
         } 
         completion:NULL]; 
    } 
    else 
    { 
     cell.avatarImageV.transform = CGAffineTransformMakeScale(1.0, 1.0); 
0

Nel mio caso, ho aggiungere l'indicatore di messa a fuoco utilizzando addSubview().

self.view.addSubview(square) 

square è l'UIView I definito nella funzione. Quindi, quando l'utente tocca lo schermo per mettere a fuoco, questa funzione aggiungerà un quadrato nella sottoview. E per cancellare questa animazione quando avviene il prossimo tocco, semplicemente uso la funzione removeFromSuperview(), quando questa funzione la chiama rimuove la vista dalla sua superview che è il quadrato di messa a fuoco qui.

filterView.subviews.forEach({ $0.removeFromSuperview() }) 

È diverso dal metodo precedente per rimuovere l'animazione, ma rimuovere direttamente la visualizzazione secondaria.

Problemi correlati