我想绑定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}}
为什么不根据我方法的更改更新图层的宽度,而是按下按钮上的更新?有没有人对我有什么想法可以试着想出来?
谢谢!
答案 0 :(得分:1)
事实证明,点击我的按钮,我正在修改一个“兄弟/姐妹”图层(另一层添加到它的超级图层),这似乎促使该图层对其自身进行了更新。通过不修改其他图层,我正在约束的图层没有更新。因此,似乎约束CAConstraint
的变量不会使CALayer
更新。也许这是因为CAConstraint
没有规模的设定者。如果它有一个setter,它就能告诉该层它需要更新。所以我已经开始以不同的方式设置我的图层的宽度。