如何绑定CAConstraint的规模?

时间:2010-11-19 07:12:07

标签: cocoa core-animation cocoa-bindings calayer key-value-observing

我想绑定CAConstraint的比例,以便相对于它的超级层CALayer的宽度可以根据我的变量指示进度(QTMovie)我正在以每秒触发的计划定时器方法进行更新。当进度为零时,CALayer的宽度应为0.0f,当进度完成时,currentProgress == 1.0f的宽度应为超级层的宽度的100%(即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根本不会更新它的宽度。首先测试我的代码,我只是将进度值递增NSTimer,我正在记录数量,它肯定会更新。但是,当我根据按钮单击更新金额时,图层会正确更新。

为了更好地衡量这是我在MediaPlayer课程中使用- (void) checkProgress:(NSTimer*)timer { self.currentProgress += 0.01f; NSLog(@"checkProgress: %f", currentProgress); } 方法更新变量的方式:

self.currentProgress += 0.1f;

按下按钮,我会像这样更新:

{{1}}

为什么不根据我方法的更改更新图层的宽度,而是按下按钮上的更新?有没有人对我有什么想法可以试着想出来?

谢谢!

1 个答案:

答案 0 :(得分:1)

事实证明,点击我的按钮,我正在修改一个“兄弟/姐妹”图层(另一层添加到它的超级图层),这似乎促使该图层对其自身进行了更新。通过不修改其他图层,我正在约束的图层没有更新。因此,似乎约束CAConstraint的变量不会使CALayer更新。也许这是因为CAConstraint没有规模的设定者。如果它有一个setter,它就能告诉该层它需要更新。所以我已经开始以不同的方式设置我的图层的宽度。