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:(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.
}
}