1

CAConstraintの尺度をバインドして、スーパーレイヤーに対するCALayerの幅が、毎秒発生するスケジュールされたタイマーメソッドで更新中の変数に基づいて進行状況(QTMovie)を示すようにしたいとします。 CALayerの幅は、進行がゼロの場合は0.0f、進行が完了した場合はスーパーレイヤの幅の100%(つまりcurrentProgress == 1.0f)になります。次のように私は制約を持つ層を作成した方法は次のとおりです。CAConstraintのスケールをバインドする方法は?

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]; 

私が持っている問題は、私は毎秒発射され、私の方法でcurrentProgress変数を更新する際、CALayerが更新されないということですそれはまったくの幅です。私のコードをテストすることから始めるには、進捗の値を0.01fだけインクリメントしています。私はその量を記録しており、確実に更新しています。ただし、ボタンのクリックに基づいて量を更新すると、レイヤーが正しく更新されます。

ちょうど良い対策のために、これは私が私のMediaPlayerクラス内で私のNSTimer方法で変数を更新しています方法です:

- (void) checkProgress:(NSTimer*)timer { 
    self.currentProgress += 0.01f; 
    NSLog(@"checkProgress: %f", currentProgress); 
} 

そして、私はそうのようにそれを更新ボタンを押して上:

self.currentProgress += 0.1f; 

私のメソッドの変更に基づいてレイヤの幅が更新されないのはなぜですか?誰も私にこれを試してみるために従うべきアイディアがありますか?

ありがとうございます!

答えて

1

私のボタンをクリックすると、自分自身の更新を行うように促すように思われる "兄弟/姉妹"層(それがスーパー層に追加された別の層)を修正していたことが判明しました。他のレイヤーを変更しないことで、私が拘束していたレイヤーは更新されませんでした。したがって、CAConstraintの変数を制約すると、CALayerは更新されないようです。これは、CAConstraintにスケールの設定がないためです。また、セッターがあれば、更新する必要があることをレイヤーに伝えることができます。だから私は自分のレイヤーの幅を別の方法で設定しました。

関連する問題