1

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!

Antwort

1

Es stellt sich heraus, dass ich mit meinem Knopfdruck eine "Bruder/Schwester" Schicht änderte (eine andere Schicht, die zu ihrem Superlayer hinzugefügt wurde), die die Schicht veranlasst hat, ein Update von sich selbst zu machen. Indem ich die andere Ebene nicht ändere, wurde meine Ebene, die ich eingeschränkt hatte, nicht aktualisiert. So scheint es, dass die Beschränkung einer Variablen von CAConstraint die CALayer nicht aktualisiert wird. Vielleicht liegt das daran, dass CAConstraint keinen Setter für die Waage hat. Und wenn es einen Setter hätte, könnte es der Schicht mitteilen, dass sie aktualisiert werden muss. Also habe ich die Breite meiner Ebene anders gewählt.