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). :/
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 .... –
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
Entschuldigung, wenn ich beim Durchlaufen fehlschlage; Baby kam nur ein paar Wochen zu früh. –