这与此处发布的问题基本相同: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()来更新屏幕,但是我仍然无法让动画工作。
答案 0 :(得分:2)
不幸的是,MonoTouch无法做到这一点 - 但我们已经为下一个测试版(5.3.3)做了修复,希望很快就会发布。
5.3.3发布后,您可以使用此示例:https://github.com/xamarin/monotouch-samples/tree/monotouch-5.4/CustomPropertyAnimation查看如何操作。