Ich möchte die Skalierung einer CAConstraint
binden, so dass eine CALayer
's Breite in Bezug auf seine Superlayer Fortschritt (einer QTMovie
) basierend auf einer Variablen, die ich in einer geplanten Timer-Methode, die jede Sekunde feuert aktualisiert werden kann. Die Breite der CALayer
sollte 0.0f sein, wenn der Fortschritt Null ist und 100% der Breite der Superschicht, wenn der Fortschritt abgeschlossen ist (d. H. currentProgress == 1.0f
). Die Art und Weise, dass ich die Schicht mit der Einschränkung, geschaffen habe, ist wie folgt:Wie man die Skala eines CAConstraint bindet?
self.progressLayer = [[[CALayer alloc] init] autorelease];
progressLayer.name = @"progressLayer";
progressLayer.backgroundColor = [Utilities blackColour];
[progressLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinX relativeTo:@"superlayer" attribute:kCAConstraintMinX]];
[progressLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintHeight relativeTo:@"superlayer" attribute:kCAConstraintHeight]];
[progressLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidY relativeTo:@"superlayer" attribute:kCAConstraintMidY]];
CAConstraint* constraint = [CAConstraint constraintWithAttribute:kCAConstraintWidth relativeTo:@"superlayer" attribute:kCAConstraintWidth scale:0.0f offset:0.0f];
[constraint bind:@"scale" toObject:[MediaPlayer sharedMediaPlayer] withKeyPath:@"currentProgress" options:nil];
[progressLayer addConstraint:constraint];
Das Problem, das ich habe, ist, dass, wenn ich die currentProgress
Variable in meiner Methode aktualisieren, die jede Sekunde ausgelöst wird, wird die CALayer
nicht aktualisieren es ist Breite überhaupt. Um mit dem Testen meines Codes zu beginnen, erhöhe ich einfach den Fortschrittswert um 0.01f
und ich protokolliere den Betrag und es wird definitiv aktualisiert. Wenn ich den Betrag jedoch basierend auf einem Klick auf die Schaltfläche aktualisiere, wird der Layer korrekt aktualisiert.
nur für eine gute Maßnahme ist dies, wie ich die Variable bin Aktualisierung in meinem NSTimer
Methode in meiner MediaPlayer
Klasse:
- (void) checkProgress:(NSTimer*)timer {
self.currentProgress += 0.01f;
NSLog(@"checkProgress: %f", currentProgress);
}
Und auf einen Knopf drücken ich es wie so aktualisieren:
self.currentProgress += 0.1f;
Warum wird die Breite des Layers nicht basierend auf den Änderungen in meiner Methode aktualisiert, sondern auf dem Knopfdruck aktualisiert? Hat jemand irgendwelche Ideen, denen ich folgen kann, um das herauszufinden?
Danke!