在更改自定义属性时对 CALayer 进行动画处理
本文关键字:动画 处理 CALayer 自定义属性 | 更新日期: 2023-09-27 18:19:36
我正在尝试在更改自定义属性时触发 CALayer 的动画。当我更改圆的半径时,我希望图层自动触发它的动画。在 Objective-C 中,通过将 @dynamic
属性设置为属性并重写 actionForKey:
方法(进而设置动画(可以实现(如本例所示(。
public class MyCircle : CALayer
{
[Export ("radius")]
public float Radius { get; set; }
public MyCircle ()
{
Radius = 200;
SetNeedsDisplay ();
}
[Export ("initWithLayer:")]
public MyCircle (CALayer other) : base (other)
{ }
public override void Clone (CALayer other)
{
base.Clone (other);
MyCircle o = other as MyCircle;
Radius = o.Radius;
}
public CABasicAnimation MakeAnimationForKey (String key)
{
CABasicAnimation animation = CABasicAnimation.FromKeyPath (key);
animation.From = PresentationLayer.ValueForKey (new NSString (key));
animation.Duration = 1;
return animation;
}
[Export ("actionForKey:")]
public override NSObject ActionForKey (string key)
{
switch (key.ToString ())
{
case "radius":
return MakeAnimationForKey (key);
default:
return base.ActionForKey (key);
}
}
[Export ("needsDisplayForKey:")]
static bool NeedsDisplayForKey (NSString key)
{
switch (key.ToString ())
{
case "radius":
return true;
default:
return CALayer.NeedsDisplayForKey (key);
}
}
public override void DrawInContext (CGContext ctx)
{
// draw circle based in radius
}
}
但是,在我的 C#/Monotouch 代码中,当值更改时,"radius"永远不会发送到 ActionForKey。在上一个问题(在 Monotouch 中使用 CoreAnimation 对自定义属性进行动画处理?(中,答案和提供的示例代码基于手动调用的自定义属性动画(我不想要(。
Monotouch 是否支持(由我(所需的行为?我做错了什么?
代码中缺少构造函数:
[Export ("initWithLayer:")]
public MyCircle (CALayer other)
: base (other)
{
}
我不确定它是否会解决您的问题,但值得一试:)