- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法为 CALayer 的 initWithLayer:(layer) 选择器找到任何我可以覆盖的等效绑定(bind)方法。
查看 Monotouch 程序集,选择器 initWithLayer 绑定(bind)到默认构造函数,如下所示:
[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? )
这是错误完成的,还是我说不可能覆盖默认构造函数的说法不正确?
Apple 文档指出 initWithLayer 的唯一用途是创建卷影副本,而不是用于初始化层,这让我觉得它可能是一个 Monotouch 错误
Apple 文档
initWithLayer: Override to copy or initialize custom fields of the specified layer.
- (id)initWithLayer:(id)layer Parameters layer The layer from which custom fields should be copied. Return Value A layer instance with any custom instance variables copied from layer.
Discussion This initializer is used to create shadow copies of layers, for example, for the presentationLayer method.
Subclasses can optionally copy their instance variables into the new object.
Subclasses should always invoke the superclass implementation
Note: Invoking this method in any other situation will produce undefined behavior. Do not use this method to initialize a new layer with an existing layer’s content. Availability Available in iOS 2.0 and later. Declared In 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");
}
最佳答案
I cannot find any equivalent binded method for CALayer's initWithLayer:(layer) selector that I can override.
Looking at the Monotouch Assembly, the selector initWithLayer is bound to the default constructor like so:
一些术语:public CALayer (CALayer other)
不是默认构造函数——默认构造函数没有任何参数。
However I need to be able to override the initWithLayer in order to animate my custom property in my CALayer class. (As specified in my previous question Animate a custom property using CoreAnimation in Monotouch?)
这个问题并没有说明为什么需要重写 initWithLayer 构造函数。我确实找到了这个:Why animating custom CALayer properties causes other properties to be nil during animation? ,这似乎是你想要做的。在这种情况下,我认为有一种更简单的方法可以满足您的需求:您只需要覆盖自定义 CALayer 类中的 Clone 方法,并在那里进行适当的初始化。
Was this done by mistake, or am I incorrect in saying that it's not possible to override a default constructor?
从技术上讲,在 C# 中您不会覆盖构造函数。在您的基类中,您提供自己的构造函数,并且所有构造函数都必须调用直接基类中的一个构造函数(在某些情况下,这可能由编译器隐式完成)。
就是说,在 MonoTouch 中,您可以在您的类中提供一个构造函数来执行您想要的所有操作(不过我仍然认为您应该先尝试 Clone 方法):
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.
}
}
关于c# - CALayer initWithLayer : bound to default constructor by mistake? 我可以覆盖默认构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9579532/
我想在我的单元测试中模拟一个遗留对象。这是构造函数: public Class LegacyClass{ public LegacyClass(Object... obj) {
此处说明https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function函数对象实例的构造函数属性“指定创建对
有没有办法从子类中的构造函数分配在父类(super class)中声明的实例变量?我已经习惯使用 BUILD() 作为构造函数,但我想知道这是否是个好主意。 IE: use v6; clas
鉴于以下情况: type AStruct struct { m_Map map[int]bool } 在这种情况下,AStruct的实例在AStruct.m_Map初始化之前不能使用: m_M
我是 Android 新手,我正在尝试学习如何使用 Gson 解析 API 调用。我已经阅读了一些内容,我正在尝试遵循这个示例:http://www.javacodegeeks.com/2011/01
我正在阅读 this文章,我不知道下面这行是做什么的。即使我删除了这一行,我也看不出有什么不同。 this.constructor.prototype.constructor.apply(this,A
这个问题已经有答案了: JsonMappingException: No suitable constructor found for type [simple type, class ]: can
我正在处理我的第一个 Flutter 项目,我正在构建一个登录页面,我创建了一个变量来存储一个 TextFormFieldController,但我收到了上面的错误,因为我删除了构造函数。当我返回这个
假设我们有以下主要和次要构造函数: open class Animal(val name:String){ internal constructor(message:InputStream): t
为什么默认复制构造函数不调用 monster 的基构造函数,但是当我在 troll 中包含一个用户定义的复制构造函数时,它会调用父级(即: 怪物) 构造函数? 我认为它的工作原理如下:创建基础对象,然
这个问题在这里已经有了答案: Is there a difference between foo(void) and foo() in C++ or C? (4 个答案) 关闭 8 年前。 我注意到
我将 T4MVC 与 MVC2 一起使用。 我有以下构建 block : 一个简单的实体接口(interface),它定义了每个 POCO 实体必须有一个 long Id属性(property): p
以下代码返回一个错误: “构造函数调用必须是构造函数中的第一个语句。” 我不明白。我的代码中的构造函数是第一条语句。我究竟做错了什么? public class labelsAndIcons exte
我是 kotlin 的新手,对它包含的所有有用的语法糖和功能感到惊讶。 但是每当我声明一个构造函数时,我都必须独立地将我的所有字段设为私有(private)。 class Result(private
作为主题,相关代码为: #include class ABC { public: ABC() { std::cout<< "default con
在 Haxe 中,我创建了一个名为 的类。我的类 喜欢: class MyClass { var score: String; public function new (score:
不确定为什么会这样,尝试删除所有 new 实例,从 const ect 切换到 let。可以运行站点,但是当我通过 html 表单运行发布请求时,在“const user = new UserSche
我是 Javascript 的新手,我正在尝试深入挖掘并理解继承、构造函数和原型(prototype)链。所以,我创建了一个构造函数, var a = function(){this.integer=
我知道 JavaScript 中的函数有双重生命,第一个是函数(作为创建实例的第一类事物),第二个是普通对象。 但是我很惊讶地看到下面控制台的输出。 function A() { consol
这个问题在这里已经有了答案: Why can't I access a property of an integer with a single dot? (5 个答案) 关闭 5 年前。 为什么
我是一名优秀的程序员,十分优秀!