REPRO存储库:https://github.com/kaolin/38492498/tree/master
我有@property int percentScanned
。
我设置了needsDisplayForKey:
+ (BOOL)needsDisplayForKey:(NSString *)key {
if ([@"percentScanned" isEqualToString:key]) {
return YES;
}
return [super needsDisplayForKey:key];
}
我的显示方法:
- (void)display {
_percentTextLayer.string = [NSString stringWithFormat:@"%02d%%",[[self presentationLayer] percentScanned]];
}
我的动画:
[CATransaction begin];
self.percentScanned = 99;
_percentTextLayer.string=@"99%";
[CATransaction setCompletionBlock:^{
_percentTextLayer.string=@"99%";
self.percentScanned = 99;
}];
{
CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"percentScanned"];
[a setFromValue:@0];
[a setToValue:@99];
[a setDuration:4.];
[self addAnimation:a forKey:@"percentage"];
}
[CATransaction commit];
这一切都很好,除了在动画结束时,我的模型层字符串返回到" 00%"。正如你所看到的,我已经抛出了像厨房水槽那样强迫它停留在" 99%" (在animation.removedOnCompletion = NO;
和animation.fillMode = kCAFillModeForwards;
之外的" hack" - 实际上,添加这些并没有帮助!)。
我做在同一层上有大约3/30秒后的另一个动画,淡化不透明度....但推出或删除它,似乎没有有所作为。
我知道如何为标准动画值执行此操作,但我错过了一些关于如何使用像这样的辅助/评估值执行此操作的内容....
编辑添加:
在此过程中的某个地方,添加animation.removedOnCompletion = NO;
和animation.fillMode = kCAFillModeForwards;
确实已经开始了#34;正在工作"但我还是希望不会泄露动画....
如果我为percentScanned添加了一个setter,那么最后不会调用0,但最后会调用display 0。很难跟踪被调用的setPercentScanned和被调用的显示之间的链接...
我可以将我的display
修改如下:
- (void)display {
if ([[self presentationLayer] percentScanned] != 0) {
_percentTextLayer.string = [NSString stringWithFormat:@"%02d%%",[[self presentationLayer] percentScanned]];
}
}
然后它适用于我的特定用例,但这仍然不太理想......
在显示方法中放置一个断点是相当无益的(当然它只是在display_if_needed中发生)。 :/
答案 0 :(得分:0)
基本上,将结束值直接设置到图层上,并仅为fromValue
设置动画。因此,图层的值在动画结束时已经正确。
答案 1 :(得分:0)
percentScanned需要设置为@dynamic变量,以便Core Animation按https://stackoverflow.com/a/2396461/856925
为您实现访问者