2016-07-20 10 views
10

REPRO Repository hier: https://github.com/kaolin/38492498/tree/mastersekundäre Eigenschaft Update klebt nicht nach Animation


Ich habe einen @property int percentScanned.

Ich habe gesetzt needsDisplayForKey:

+ (BOOL)needsDisplayForKey:(NSString *)key { 
    if ([@"percentScanned" isEqualToString:key]) { 
     return YES; 
    } 
    return [super needsDisplayForKey:key]; 
} 

Meine Display-Methode:

- (void)display { 
    _percentTextLayer.string = [NSString stringWithFormat:@"%02d%%",[[self presentationLayer] percentScanned]]; 
} 

Meine Animation:

[CATransaction begin]; 
    self.percentScanned = 99; 
    [email protected]"99%"; 
    [CATransaction setCompletionBlock:^{ 
     [email protected]"99%"; 
     self.percentScanned = 99; 
    }]; 
    { 
     CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"percentScanned"]; 
     [a setFromValue:@0]; 
     [a setToValue:@99]; 
     [a setDuration:4.]; 
     [self addAnimation:a forKey:@"percentage"]; 
    } 
    [CATransaction commit]; 

Das alles funktioniert gut, außer bei der Ende des Th In der Animation geht meine Modell-Layer-Zeichenfolge zurück auf "00%". Wie Sie sehen können, habe ich geworfen, was sich wie die Küche bei 99% (außerhalb des "Hacks" von animation.removedOnCompletion = NO; und animation.fillMode = kCAFillModeForwards;-und tatsächlich, Hinzufügen dieser diejenigen nicht hilft!)

I tun haben Sie eine andere Animation auf der gleichen Schicht etwa 3/30 einer Sekunde später, die Opazität verblassen .... Aber drängen, oder löschen, scheint keinen Unterschied zu machen.

Ich weiß, wie dies für Standard-animierten Werten zu tun, aber ich bin etwas fehlt, wie dies wie dies mit einem sekundären/ausgewertet Wert zu tun ....


Edited hinzufügen:

Irgendwo auf dem Weg, das hinzufügen animation.removedOnCompletion = NO; und animation.fillMode = kCAFillModeForwards; haben tatsächlich beginnen „arbeiten“, aber ich mag nicht Animationen lecken ....

Wenn ich einen Setter für percentScanned hinzufügen, ist es nicht mit 0 bei genannt das Ende, aber die Anzeige wird mit 0 aufgerufen Am Ende. Es ist ziemlich schwer die Verbindung zwischen setPercentScanned zu verfolgen aufgerufen wird und die Anzeige aufgerufen wird ...

Ich kann meine display hacken zu lesen wie folgt:

- (void)display { 
    if ([[self presentationLayer] percentScanned] != 0) { 
     _percentTextLayer.string = [NSString stringWithFormat:@"%02d%%",[[self presentationLayer] percentScanned]]; 
    } 
} 

Dann ist es für meinen speziellen Anwendungsfall funktioniert , aber das ist immer noch weniger als ideal ....

Und einen Haltepunkt in der Anzeige-Methode setzen ist ziemlich nicht hilfreich (natürlich passiert es gerade innerhalb Display_if_needed). :/

Antwort

0

Im Grunde legen Sie den Endwert direkt auf die Ebene und animieren Sie nur die . Der Wert der Ebene ist also am Ende der Animation bereits korrekt.

+0

Ich glaube, das ist, was ich oben getan. Das gleiche Muster funktioniert für alle meine Eigenschaften außer diesem, das speziell ist, weil es keine standardmäßig animierte Eigenschaft ist .... –

+1

Aber die Animation wird ausgeführt, fügen Sie einen bedingten Haltepunkt für den Wert hinzu, der festgelegt wird, und überprüfen Sie, wenn es auf Null festgelegt ist – Wain

+0

Entschuldigung, wenn ich beim Durchlaufen fehlschlage; Baby kam nur ein paar Wochen zu früh. –