我有一个自定义CALayer子类的应用程序。在这个图层子类中,我覆盖了- (void) drawInContext:(CGContextRef)ctx
方法。这工作正常,我所有的自定义内容绘制。使用CABasicAnimation时,CALayer没有绘制它的内容
现在我想添加一个自定义属性,当它的内容发生变化时它会变成动画。我需要在动画运行时重新绘制。我加了属性就像在回答给予以下问题:Animating a custom property of CALayer subclass
而且我还添加了一个CABasicAnimation实例,该属性设置为我的层:
CABasicAnimation* theAnimation=[CABasicAnimation animationWithKeyPath:@"moveContentToLeft"];
theAnimation.duration=1.0;
theAnimation.fromValue=[NSNumber numberWithFloat:0.0];
theAnimation.toValue=[NSNumber numberWithFloat:10.0];
[area addAnimation:theAnimation forKey:@"moveContentToLeft"];
在我的画法我有一个的NSLog声明我输出我的属性值我动画。
我的问题是,只要动画开始,图层子类的所有内容都被清除。 NSLog输出我的属性的值被插入(所以drawInContext方法)被调用。但不知何故,它画的东西在动画过程中是不可见的。在动画结束时,原始内容再次可见。
目前,在绘制图层时还没有使用动画属性,所以我期望正常的内容会再次绘制,并获得带有插值的NSLog的输出。
我的图层是另一个图层的子元素(在UIView中)。我试图在绘图方法的最后重绘超级图层(调用_parent setNeedsDisplay [parent是父视图的ivar])。这没有帮助。而且我也有这样的感觉,这不是一个好主意。
我希望有人能帮助我解决这个问题。
更新
感谢马特龙项目的例子,我可以看到我的问题在于绘图方法中。我扩展了他的项目,所以它显示了同样的问题。我认为这是简单的显示比原来的代码;)
- (void)drawInContext:(CGContextRef)ctx
{
NSLog(@"Getting called: Bob: %i", [self bob]);
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(50 + [self bob], 50, 100, 100));
CGContextAddPath(ctx, path);
CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);
CGContextSetLineWidth(ctx, 1.0);
CGContextStrokePath(ctx);
CGPathRelease(path);
[_test testInContext:ctx]; // here is the problem
}
伊娃_test
是包含一些绘图代码(目前它绘制一个绿色方框)的自定义类。现在的问题是,这个绿色框将不会在动画运行时绘制。一旦动画结束,绿框再次可见。扩展示例项目:http://dl.dropbox.com/u/5426092/ArbitraryPropertyAnimationNew.zip
我认为除了动画代码之外,还可以显示绘图代码。动画代码似乎没有任何问题。 – 2010-07-29 14:23:41
这个问题是我的问题的答案,谢谢;) – 2013-03-02 20:35:34
我有同样的问题,我已经修复它。[here](http://stackoverflow.com/questions/42942414/cashapelayer-custom-property-is-nil -when-drawincontext) – 2017-03-24 07:17:19