在使用CABasicAnimation时,CALayer不会绘制其内容
我有一个自定义CALayer子类的应用程序。 在这个图层子类中,我覆盖了- (void) drawInContext:(CGContextRef)ctx
方法。 这工作正常,我所有的自定义内容绘制。
现在我想添加一个自定义属性,当它的内容发生变化时它会变成动画。 我需要在动画运行时重新绘制。 我添加了以下问题的答案中给出的属性:为CALayer子类的自定义属性设置动画
我还为这个属性添加了一个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])。 这没有帮助。 而且我也有这样的感觉,这不是一个好主意。
我希望有人能帮助我解决这个问题。
更新
感谢Matt Long的示例项目,我可以看到我的问题在于绘图方法。 我扩展了他的项目,所以它显示了同样的问题。 我认为比原来的代码更简单;)
- (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
}
ivar _test
是一个包含一些绘图代码的自定义类(目前它绘制一个绿色框)。 现在的问题是,这个绿色框将不会在动画运行时绘制。 一旦动画结束,绿框再次可见。 扩展示例项目:http://dl.dropbox.com/u/5426092/ArbitraryPropertyAnimationNew.zip
如果没有看到更多的代码,很难说出了什么问题。 我有一个示例应用程序,它可以同时为一个自定义属性和一个图层的位置设置动画。 你可以看看我的来源,看看有什么不同。
链接地址: http://www.djcxy.com/p/74191.html上一篇: CALayer is not drawing its content while CABasicAnimation is used