CALayer initWithLayer:错误绑定到默认构造函数?我可以重写默认构造函数吗

本文关键字:默认 构造函数 重写 我可以 initWithLayer 错误 绑定 CALayer | 更新日期: 2023-09-27 18:27:03

对于CALayer的initWithLayer:(layer)选择器,我找不到任何可以重写的等效绑定方法。

查看Monotouch Assembly,选择器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类中为我的自定义属性设置动画。(正如我之前的问题中所述,在Monotouch中使用CoreAnimation制作自定义属性动画?)

这是错误的吗,还是我说不可能覆盖默认构造函数的说法不正确?

Apples文档指出,initWithLayer的唯一用途是创建卷影副本,而不是初始化一个层,这让我觉得它可能是一个单触式错误

苹果文档

initWithLayer:重写以复制或初始化指定的层。

  • (id)initWithLayer:(id)layer参数层应该从中复制自定义字段的层。返回值具有任意从图层复制的自定义实例变量

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

子类可以选择性地将它们的实例变量复制到新的对象

子类应始终调用超类实现

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

编辑:

我需要重写此方法的原因是CoreAnimation框架调用此方法来创建自己的层的内部副本。我需要能够覆盖它,以包括我添加到层中的新属性,这样CoreAnimation就知道在动画过程中我的属性值之间的关系。我自己不会这么说的。这就是为什么我不能简单地调用克隆()

我试着给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");
    }

CALayer initWithLayer:错误绑定到默认构造函数?我可以重写默认构造函数吗

对于CALayer的initWithLayer:(layer)选择器,我找不到任何可以重写的等效绑定方法。

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

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

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

这个问题并没有说明为什么需要重写initWithLayer构造函数。不过,我确实发现了这一点:为什么为自定义CALayer属性设置动画会导致其他属性在动画过程中为零?,这似乎就是你想要做的。在这种情况下,我认为有一种更简单的方法可以满足你的需求:你只需要覆盖自定义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.
    }
}