2010-07-29 27 views
5

我有一个自定义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

+0

我认为除了动画代码之外,还可以显示绘图代码。动画代码似乎没有任何问题。 – 2010-07-29 14:23:41

+0

这个问题是我的问题的答案,谢谢;) – 2013-03-02 20:35:34

+0

我有同样的问题,我已经修复它。[here](http://stackoverflow.com/questions/42942414/cashapelayer-custom-property-is-nil -when-drawincontext) – 2017-03-24 07:17:19

回答

1

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

+0

感谢您的示例代码。我扩展它,使其行为与我的代码相同(请参阅我的问题)。 – Chris 2010-07-30 06:10:30

+0

现在真正的问题是你想做什么?我已经看过你的代码更改,但我无法找到你想要的事情。如果你只是想动画几个矩形,你完全没有理由自己绘制它。你应该只是添加你的两个矩形作为图层,并像我的示例代码显示的那样将它们的位置动画化。您的自定义属性是完全不必要的那么你想再做什么? – 2010-07-30 21:30:45

相关问题