我想绑定CAConstraint
的比例,以便CALayer
相对于其上层的宽度可以基于我正在调度的计时器方法中触发的变量来指示(QTMovie
的)进度每一秒。当进度为零时,CALayer
的宽度应为0.0f,当进度完成时(即currentProgress == 1.0f
),currentProgress
的宽度应为上层宽度的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];
我遇到的问题是,当我更新每秒触发的方法中的
CALayer
变量时,0.01f
根本不会更新其宽度。首先测试我的代码,我只是将进度值增加NSTimer
,并记录了数量,并且它肯定在更新。但是,当我基于按钮单击来更新金额时,图层将正确更新。出于良好的考虑,这就是我如何在
MediaPlayer
类中的方法中更新变量:- (void) checkProgress:(NSTimer*)timer {
self.currentProgress += 0.01f;
NSLog(@"checkProgress: %f", currentProgress);
}
然后按一个按钮,我就这样更新它:
self.currentProgress += 0.1f;
为什么不根据我的方法的更改来更新图层的宽度,而是按按钮时更新?有人对我有任何想法可以尝试解决吗?
谢谢!
最佳答案
事实证明,通过单击按钮,我正在修改“兄弟/姐妹”图层(在其超级图层中添加了另一个图层),这似乎已提示该图层进行自身更新。通过不修改另一层,我约束的层就没有更新。因此,限制CAConstraint
的变量似乎不会使CALayer
保持更新。也许是因为CAConstraint
没有用于比例的设置器。并且如果它有一个setter,它将能够告诉该层它需要更新。因此,我已经以不同的方式设置了图层的宽度。