使用CABasicAnimation时,CALayer未绘制其内容

Chr*_*ris 5 iphone core-animation objective-c

我有一个自定义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"];
Run Code Online (Sandbox Code Playgroud)

在我的draw方法中,我有一个NSLog语句,在其中我输出my属性的值,我正在动画.

我的问题是,一旦动画启动,就会清除图层子类的所有内容.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
}
Run Code Online (Sandbox Code Playgroud)

ivar _test是一个自定义类,包含一些绘图代码(目前它绘制一个绿色框).现在的问题是动画运行时不会绘制这个绿色框.动画结束后,绿色框再次可见.扩展示例项目:http://dl.dropbox.com/u/5426092/ArbitraryPropertyAnimationNew.zip

Mat*_*ong 1

如果没有看到更多代码,很难说出了什么问题。我有一个示例应用程序,可以同时对自定义属性和图层位置进行动画处理。你可以看一下我的来源,看看有什么不同。