[ios] Abbrechen einer UIView-Animation?



Answers

Benutzen:

#import <QuartzCore/QuartzCore.h>

.......

[myView.layer removeAllAnimations];
Question

Ist es möglich, eine UIView Animation während der UIView abzubrechen? Oder müsste ich auf die CA-Ebene wechseln?

dh ich habe so etwas getan (vielleicht auch eine Endanimationsaktion):

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

// set view properties

[UIView commitAnimations];

Aber bevor die Animation beendet ist und ich das Ereignis beendet habe, möchte ich es abbrechen (kurz geschnitten). Ist das möglich? Beim Durchstöbern finden ein paar Leute die gleiche Frage ohne Antworten - und ein oder zwei Leute spekulieren, dass das nicht möglich ist.




Auch wenn Sie die Animation auf die oben didStopSelector Arten abbrechen, wird die Animation didStopSelector . Wenn Sie logische Zustände in Ihrer Anwendung haben, die durch Animationen gesteuert werden, haben Sie Probleme. Aus diesem Grund benutze ich mit den oben beschriebenen Möglichkeiten die Kontextvariable von UIView Animationen. Wenn Sie den aktuellen Zustand Ihres Programms durch den Kontextparameter an die Animation übergeben, kann Ihre didStopSelector Funktion bei Beendigung der Animation entscheiden, ob sie etwas tun oder nur basierend auf dem aktuellen Status und dem als Kontext übergebenen didStopSelector zurückkehren soll.




Verwenden Sie unter iOS 4 und höher die Option UIViewAnimationOptionBeginFromCurrentState für die zweite Animation, um die erste Animation kurz zu machen.

Angenommen, Sie haben eine Sicht mit einem Aktivitätsindikator. Sie möchten den Aktivitätsindikator einblenden, während eine potenziell zeitaufwendige Aktivität beginnt, und sie nach Beendigung der Aktivität ausblenden. Im folgenden Code wird die Ansicht mit dem Aktivitätsindikator 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;
                     }
                 }];
}



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



Um eine Animation anzuhalten, ohne den Status auf Original oder Final zurückzusetzen:

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






Wenn Sie eine Einschränkung animieren, indem Sie die Konstante anstelle einer Ansichtseigenschaft ändern, funktioniert keine der anderen Methoden unter iOS 8.

Beispielanimation:

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) {

                 }];

Lösung:

Sie müssen die Animationen aus den Layern aller Ansichten entfernen, die von der Constraint-Änderung und ihren Sublayern betroffen sind.

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



Links