[ios] Annullare un'animazione UIView?


Answers

Uso:

#import <QuartzCore/QuartzCore.h>

.......

[myView.layer removeAllAnimations];
Question

È possibile cancellare un'animazione UIView mentre è in corso? O dovrei scendere al livello di CA?

cioè ho fatto qualcosa di simile (magari impostando anche un'azione di fine animazione):

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties

// set view properties

[UIView commitAnimations];

Ma prima che l'animazione sia completata e ottengo l'evento di animazione terminato, voglio cancellarlo (taglia corto). È possibile? Googling trova alcune persone che fanno la stessa domanda senza risposte - e una o due persone speculano che non può essere fatto.







Anche se annulli l'animazione nei modi sopra l'animazione, didStopSelector ancora in esecuzione. Quindi, se nella tua applicazione ci sono stati logici guidati da animazioni, avrai dei problemi. Per questo motivo, con le modalità sopra descritte, utilizzo la variabile di contesto delle animazioni di UIView . Se si passa lo stato corrente del programma dal parametro contesto all'animazione, quando l'animazione si interrompe, la funzione didStopSelector può decidere se fare qualcosa o semplicemente tornare in base allo stato corrente e il valore dello stato passato come contesto.




Per mettere in pausa un'animazione senza ripristinare lo stato originale o finale:

CFTimeInterval paused_time = [myView.layer convertTime:CACurrentMediaTime() fromLayer:nil];
myView.layer.speed = 0.0;
myView.layer.timeOffset = paused_time;



Su iOS 4 e UIViewAnimationOptionBeginFromCurrentState , utilizza l'opzione UIViewAnimationOptionBeginFromCurrentState nella seconda animazione per tagliare la prima animazione breve.

Ad esempio, si supponga di avere una vista con un indicatore di attività. Desiderate attenuare l'indicatore di attività mentre inizia un'attività potenzialmente dispendiosa in termini di tempo e svanirla quando l'attività è terminata. Nel codice qui sotto, la vista con l'indicatore di attività su di esso si chiama activityView .

- (void)showActivityIndicator {
    activityView.alpha = 0.0;
    activityView.hidden = NO;
    [UIView animateWithDuration:0.5
                 animations:^(void) {
                     activityView.alpha = 1.0;
                 }];

- (void)hideActivityIndicator {
    [UIView animateWithDuration:0.5
                 delay:0 options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^(void) {
                     activityView.alpha = 0.0;
                 }
                 completion:^(BOOL completed) {
                     if (completed) {
                         activityView.hidden = YES;
                     }
                 }];
}



Se si sta animando un vincolo cambiando la costante anziché una proprietà della vista, nessuno degli altri metodi funziona su iOS 8.

Esempio di animazione:

self.constraint.constant = 0;
[self.view updateConstraintsIfNeeded];
[self.view layoutIfNeeded];
[UIView animateWithDuration:1.0f
                      delay:0.0f
                    options:UIViewAnimationOptionCurveLinear
                 animations:^{
                     self.constraint.constant = 1.0f;
                     [self.view layoutIfNeeded];
                 } completion:^(BOOL finished) {

                 }];

Soluzione:

È necessario rimuovere le animazioni dai livelli di qualsiasi vista influenzata dalla modifica del vincolo e dai relativi sottolivelli.

[self.constraintView.layer removeAllAnimations];
for (CALayer *l in self.constraintView.layer.sublayers)
{
    [l removeAllAnimations];
}



[UIView setAnimationsEnabled:NO];
// your code here
[UIView setAnimationsEnabled:YES];



Links