19

Sto configurando il seguente metodo UIView animateWithDuration:, con l'intenzione di impostare il mio BOOL animationOn altrove nel programma per annullare quella ripetizione a ciclo infinito. Avevo l'impressione che il blocco completion venisse chiamato ogni volta che termina un ciclo dell'animazione, ma questo non sembra essere il caso.Arresta un'animazione UIView a ripetizione automatica/ripetizione infinita con un BOOL/blocco di completamento

Il blocco completion è mai stato chiamato in un'animazione ricorrente? E se no, c'è un altro modo in cui posso fermare questa animazione al di fuori di questo metodo?

- (void) animateFirst: (UIButton *) button 
{ 
    button.transform = CGAffineTransformMakeScale(1.1, 1.1); 
    [UIView animateWithDuration: 0.4 
          delay: 0.0 
         options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat 
        animations: ^{ 
         button.transform = CGAffineTransformIdentity; 
        } completion: ^(BOOL finished){ 
         if (!animationOn) { 
          [UIView setAnimationRepeatCount: 0]; 
         } 
    }]; 
} 

risposta

45

Il blocco di completamento viene chiamato solo quando l'animazione viene interrotta. Ad esempio viene chiamato quando l'app passa in background e torna di nuovo in primo piano (tramite multitasking). In tal caso l'animazione viene interrotta. Dovresti riavviare l'animazione quando ciò accade.

Per fermare l'animazione è possibile rimuoverlo dallo strato della vista:

[button.layer removeAllAnimations]; 
+0

Questo non ha funzionato, ho paura. L'animazione continua anche dopo l'applicazione della modifica della trasformazione. (Ho impostato '.transform' su' CGAffineTransformMakeScale (1.0, 1.0) '). – Luke

+0

Ho trovato qualcos'altro che potrebbe funzionare. Ho aggiornato la mia risposta. Puoi provarlo? –

+0

Oh, l'hai capito da solo :) Grazie per aver accettato la mia risposta in ogni caso –

2

Ho risolto il problema chiamando [button.layer removeAllAnimations].

+0

Mi sono stancato ma non funziona per me. Da dove nel tuo codice chiami questo metodo? – Supertecnoboff

8

Vecchio ma un'altra opzione.

È anche possibile impostare un'altra animazione che non sta ripetendo lo stesso parere, in questo modo è anche possibile catturare nello stato attuale e restituirlo a come è quello di utilizzare l'opzione UIViewAnimationOptionBeginFromCurrentState. Viene anche chiamato il blocco di completamento.

-(void)someEventSoStop 
{ 
    button.transform = CGAffineTransformMakeScale(1.0, 1.0); 
    [UIView animateWithDuration: 0.4 
          delay: 0.0 
         options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState 
        animations: ^{ 
         button.transform = CGAffineTransformIdentity; 
        } completion: ^(BOOL finished){ 

        }]; 
} 
+0

Questo è un approccio migliore rispetto all'altra soluzione, poiché riporta l'animazione all'identità. – Nikolozi

1

Come per la documentazione di riferimento di classe View: Se è stato utilizzato uno qualsiasi dei metodi di classe come animateWithDuration:delay:options:animations:completion: se la durata è impostata su valore negativo o 0, le modifiche vengono fatte senza eseguire l'animazione. Così ho fatto qualcosa di simile per interrompere l'animazione infinita:

[UIView animateWithDuration:0.0 animations:^{ 
     button.layer.affineTransform = CGAffineTransformIdentity; 
    }]; 

Penso che questo è meglio di rimozione di tutte le animazioni dal livello come nella risposta suggerita. Si noti che questo è applicabile a tutti gli altri metodi di animazione classe nella classe UIView.

+0

Questo non ha funzionato per me. Ho dovuto chiamare removeAllAnimations. –

Problemi correlati