По сути, это тот же вопрос, что и здесь: Анимация пользовательского свойства в 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 (и выводит их на консоль). Я не могу анимировать стандартные свойства без проблем (например: масштаб)
Редактировать: обратите внимание, что теперь я могу успешно изменить значение свойства Radius с помощью SetValueForKey. Если я делаю это, мне нужно вызвать SetNeedsDisplay () для обновления экрана, однако я все равно не могу заставить анимацию работать вообще.
Редактировать # 2: Образец прилагается: http://dl.dropbox.com/u/8617393/GraphicsTest1.zip