动画CALayer的界限w /重绘

Sam*_*Sam 16 iphone core-animation objective-c calayer bounds

我想知道如何动画CALayer的边界,以便在每个边界变化时,层调用drawInContext:.我在我的CALayer子类上尝试了以下两种方法:

  • 设置needsDisplayOnBoundsChangeYES
  • 返回YES+ (BOOL)needsDisplayForKey:(NSString*)keybounds

都没有工作.CALayer似乎决定使用图层的原始内容,并根据contentsGravity(我认为是性能)来缩放它们.这是他们的解决方法还是我错过了一些明显的东西?

编辑:顺便说一下,我注意到我的自定义CALayer子类没有调用initWithLayer:创建presentationLayer- 怪异.

先谢谢你,山姆

tit*_*coy 7

您可以使用此处概述技术:覆盖CALayer的+needsDisplayForKey:方法,它将在动画的每一步重绘其内容.

  • @titaniumdecoy:我也试过......它适用于自定义属性,但不适用于`bounds`(以及其他`CALayer`属性).调用`actionForKey:`方法调用自定义属性,但不调用`CALayer`属性.你是动画定制属性还是`CALayer`属性? (3认同)
  • 因此,如果`+ needsDisplayForKey:`不能与`bounds`一起使用,那么它是什么呢? (2认同)

Ash*_*row 1

我不确定设置 viewFlags 是否有效。第二种解决方案肯定行不通:

默认实现返回 NO。子类应该 * 为超类定义的属性调用 super。(例如,* 不要尝试为 CALayer 实现的属性返回 YES,* 这样做将产生未定义的结果。)

您需要将视图的内容模式设置为 UIViewContentModeRedraw:

UIViewContentModeRedraw,    //redraw on bounds change (calls -setNeedsDisplay)
Run Code Online (Sandbox Code Playgroud)

查看Apple 关于使用 CALayer 提供内容的文档。他们建议使用 CALayer 的委托属性而不是子类,这可能比您现在尝试的容易得多。