在更改自定义属性时对 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 是否支持(由我(所需的行为?我做错了什么?

在更改自定义属性时对 CALayer 进行动画处理

代码中缺少构造函数:

[Export ("initWithLayer:")]
public MyCircle (CALayer other)
    : base (other)
{
}

我不确定它是否会解决您的问题,但值得一试:)