CALayer initWithLayer:错误地绑定到默认构造函数?我可以覆盖默认构造函数吗?

时间:2012-03-06 07:26:21

标签: c# xamarin.ios core-animation override

我无法为CALayer的initWithLayer找到任何等效的绑定方法:(层)选择器,我可以覆盖。

查看Monotouch程序集,选择器initWithLayer绑定到默认构造函数,如下所示:

[Export ("initWithLayer:")]
    public CALayer (CALayer other)
    {
        if (base.GetType () == typeof(CALayer))
        {
            Messaging.intptr_objc_msgSend_intptr (base.Handle, CALayer.selInitWithLayer, other.Handle);
        }
        else
        {
            Messaging.intptr_objc_msgSendSuper_intptr (base.SuperHandle, CALayer.selInitWithLayer, other.Handle);
            this.Clone (other);
        }
    }

但是我需要能够覆盖initWithLayer,以便在我的CALayer类中为我的自定义属性设置动画。 (正如我之前的问题Animate a custom property using CoreAnimation in Monotouch?中所述)

这是错误地完成的,还是说我不能覆盖默认的构造函数?

Apples文档声明,initWithLayer的唯一用途是创建卷影副本,而不是用于初始化图层,这使得它可能是Monotouch错误

Apple文档

  

initWithLayer:覆盖复制或初始化的自定义字段   指定图层。

     
      
  • (id)initWithLayer:(id)layer参数layer应从中复制自定义字段的图层。返回值包含any的图层实例   从图层复制的自定义实例变量。
  •   
     

讨论此初始值设定项用于创建图层的阴影副本,   例如,对于presentationLayer方法。

     

子类可以选择将其实例变量复制到新变量中   对象

     

子类应始终调用超类实现

     

注意:在任何其他情况下调用此方法都会产生   未定义的行为。不要使用此方法初始化新图层   使用现有图层的内容。可用性在iOS 2.0中可用   然后。在CALayer.h中声明

编辑:

我需要覆盖此方法的原因是CoreAnimation框架调用此方法来创建自己的图层内部副本。我需要能够覆盖它以包含我添加到我的图层的新属性,以便CoreAnimation知道在动画过程中补间我的属性值。我不会自己称呼这个。这就是为什么我不能简单地调用Clone()

我试图在Rolf的代码中添加一个修改,但它仍然没有被调用:

//Needed to do this as sel_registerName is private
[DllImport ("/usr/lib/libobjc.dylib")]
    internal static extern IntPtr sel_registerName (string name);

    static IntPtr selInitWithLayer = sel_registerName("initWithLayer:");

    [Export ("initWithLayer:")]
    public CircleLayer (CALayer other)  //changed SuperHandle to other.SuperHandle as using this.SuperHandle gives me an object reference required error.
        : base (Messaging.intptr_objc_msgSendSuper_intptr (other.SuperHandle, CircleLayer.selInitWithLayer, other.Handle))
    {
        // custom initialization here
        Console.WriteLine("Got to here");
    }

1 个答案:

答案 0 :(得分:4)

  

我无法为CALayer的initWithLayer找到任何等效的绑定方法:(层)选择器,我可以覆盖。

     

查看Monotouch程序集,选择器initWithLayer绑定到默认构造函数,如下所示:

一些术语:public CALayer (CALayer other)不是默认构造函数 - 默认构造函数没有任何参数。

  

但是我需要能够覆盖initWithLayer,以便在我的CALayer类中为我的自定义属性设置动画。 (正如我之前的问题中所述,在Monotouch中使用CoreAnimation为自定义属性设置动画?)

该问题没有说明为什么需要覆盖initWithLayer构造函数。我确实找到了这个:Why animating custom CALayer properties causes other properties to be nil during animation?,这似乎是你想要做的。在这种情况下,我认为有一种更简单的方法可以满足您的需求:您只需要在自定义CALayer类中重写Clone方法,并在那里进行正确的初始化。

  

这是错误地完成的,还是说我不能覆盖默认的构造函数?

从技术上讲,在C#中你不会覆盖构造函数。在您的基类中,您提供自己的构造函数,并且它们都必须在直接基类中调用一个构造函数(在某些情况下,这可能由编译器隐式完成)。

也就是说,在MonoTouch中,你可以在你的班级中提供一个构建器来完成你想做的一切(我仍然相信你应该首先尝试克隆方法):

public MyCALayer : CALayer {
    [Export ("initWithLayer:")]
    public MyCALayer (CALayer other) : base (other)
    {
        // custom initialization here
    }

    public override void Clone ()
    {
        // copy any code that you care about here.
    }
}