动画自定义CALayer属性
我试图根据现有的图层属性位置来定义抽象图层属性角度。 基本上它描述了从一个圆的中心的层的方向。 我喜欢以下内容:
@interface MenuItemLayer : CALayer
@property CGFloat angle;
@end
@implementation MenuItemLayer
+ (BOOL)needsDisplayForKey: (NSString*)key {
if ([key isEqualToString: @"angle"]) return YES;
return [super needsDisplayForKey: key];
}
- (void)drawInContext: (CGContextRef)context {
[self renderInContext: context];
}
- (CGFloat)angle {
CGPoint center = self.superlayer.center;
CGPoint pos = self.position;
return atan2f(pos.x - center.x, center.y - pos.y);
}
- (void)setAngle: (CGFloat)angle {
CGPoint center = self.superlayer.center;
CGFloat radius = 100;
[CATransaction begin];
[CATransaction setDisableActions: YES];
self.position = CGPointMake(center.x + radius * sinf(angle),
center.y - radius * cosf(angle));
[CATransaction commit];
}
@end
当我用setAngle:手动设置值时,它工作正常,但问题是,当我尝试使用CABasicAnimation为其设置动画时,由MenuItemLayer维持的视图根本不移动并保持原始位置,而我可以请参阅setValue:和drawInContext:通常随动画的进度一起调用,因此表示层的position属性得到更新。
任何人都有一些线索? 谢谢!
----
刚刚注意到文档中的以下评论:
renderInContext:
This method renders directly from the layer tree, ignoring any animations added to the render tree. Renders in the coordinate space of the layer.
这是否意味着即使在drawInContext:方法的接收者是表示层的情况下,renderInContext:仍将始终使用模型图层来呈现图像? 这可能是问题的原因吗? 如果是这样,我应该总是手动将图层转换到表示层所代表的正确位置?
你打算怎么做?
- (void)drawInContext: (CGContextRef)context {
[self renderInContext: context];
}
当你评论它时会发生什么? 我发现-renderInContext最常用于渲染到上下文中,以便将它保存为图像,所以这对我来说看起来很奇怪。 一个基本的动画应该能够动画你的属性没有问题,但覆盖-drawInContext似乎只有在你打算用CG做一些自定义绘图时才有意义。
链接地址: http://www.djcxy.com/p/12869.html