1

我想綁定一個CAConstraint的比例,這樣一個CALayer的寬度相對於它的超級層可以指示進度(QTMovie)基於一個變量,我正在更新一個計劃中的定時器方法,每秒觸發一次。當進度爲零時,CALayer的寬度應該爲0.0f,當進度完成時(即currentProgress == 1.0f),超級層的寬度爲100%。我已經與約束創建的層的方法如下:如何綁定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沒有規模的二傳手。如果它有一個setter,它將能夠告訴圖層它需要更新。所以我已經開始以不同的方式設置圖層的寬度。