在Monotouch中使用CoreAnimation为自定义属性设置动画效果?

时间:2012-03-03 08:12:14

标签: iphone xamarin.ios core-animation

这与此处发布的问题基本相同:Animating a custom property in a CALayer 一年多以前还没有得到答复。

我正在创建一个自定义图层并在其上绘制一个圆圈。我希望能够为圆的半径(以及之后的其他属性)设置动画。从我所读到的,我已经这样设置:

public class CircleLayer : CALayer
{

    //[Export("radius")]
     //public float Radius { get;set; }
    //EDIT: I've now changed the radius field to what is coded below


        public float Radius;

    [Export("radius")]
    public float getRadius()
    {
        return Radius;
    }

    [Export("setRadius:")]
    public void setRadius(float val)
    {
        Radius = val;
    }

    public float Thickness {get;set;}
    public CGColor Color {get;set;}
    public float GlowAmount {get;set;}

    private SizeF GlowOffset {get;set;}

    [Export ("needsDisplayForKey:")]
    static bool NeedsDisplayForKey (NSString key)
    {
        Console.WriteLine(key.ToString());

        if(key.Equals("radius"))
        {

            return true; 
        }
        else
            return false;

    }



    public CircleLayer ()
    {
        if(GlowAmount == 0.0f)
            GlowAmount = 10f;

        GlowOffset = new SizeF(0f,0f);
        //CALayer.NeedsDisplayForKey("radius");
    }



    public override void DrawInContext (CGContext context)
    {
        base.DrawInContext (context);
        Console.WriteLine("drawing...........");
        PointF centerPoint = new PointF(125,125);//this.Frame.Width/2,this.Frame.Height/2);


        //Outer circle
        context.AddEllipseInRect(new RectangleF(centerPoint.X - Radius,
                                                centerPoint.Y - Radius,
                                                Radius * 2,
                                                Radius * 2));
        //Inner circle
        context.AddEllipseInRect(new RectangleF(centerPoint.X - InnerRadius,
                                                centerPoint.Y - InnerRadius,
                                                InnerRadius * 2,
                                                InnerRadius * 2));

        //Fill in circle
        context.SetFillColor(Color);
        context.SetShadowWithColor(GlowOffset,GlowAmount,GlowColor);
        context.EOFillPath();


    }
}

但它不起作用。当调用NeedsDisplayForKey(并将它们打印到控制台)时,我从未报告半径键。我可以设置标准属性的动画没问题(例如:比例)

编辑:请注意,我现在可以使用SetValueForKey成功修改属性Radius的值。如果我这样做,我需要调用SetNeedsDisplay()来更新屏幕,但是我仍然无法让动画工作。

编辑#2:附加示例:http://dl.dropbox.com/u/8617393/GraphicsTest1.zip

1 个答案:

答案 0 :(得分:2)

不幸的是,MonoTouch无法做到这一点 - 但我们已经为下一个测试版(5.3.3)做了修复,希望很快就会发布。

5.3.3发布后,您可以使用此示例:https://github.com/xamarin/monotouch-samples/tree/monotouch-5.4/CustomPropertyAnimation查看如何操作。