我无法为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");
}
答案 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.
}
}