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

时间:2010-07-29 08:34:30

标签: iphone objective-c core-animation

我有一个自定义CALayer子类的应用程序。在这个图层子类中,我覆盖了- (void) drawInContext:(CGContextRef)ctx方法。这很好用,我的所有自定义内容都被绘制出来。

现在我想添加一个自定义属性,当内容发生变化时,该属性会被动画化。我需要在动画运行时重绘。我添加了以下问题的答案中给出的属性: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"];

在我的draw方法中,我有一个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

1 个答案:

答案 0 :(得分:1)

如果没有看到更多代码,很难说出现了什么问题。我有一个示例应用程序,可以同时动画自定义属性和图层的位置。你可以take a look at my source看看有什么不同。