【问题标题】:Problem returning a custom CALayer subclass from hitTest从 hitTest 返回自定义 CALayer 子类的问题
【发布时间】:2011-05-11 13:57:50
【问题描述】:

我正在尝试通过命中测试来识别自定义 CALayer 子类。 除了一个例外,这很好用:

我的自定义 CALayers 代表文本窗口,所有数据(内容、背景颜色、位置……)都取自 NSManagedObjects(来自 CoreData)。我的 CALayer 子类将其相关的 managedObject 类保存在一个实例变量中。 问题是:我无法访问这个 ivar:

当我这样检查时:

CustomCALayer *customLayer =[self.layer.presentationLayer hitTest:mouseDownPosition];   

...customLayer 包含CALayer 具有的所有属性(例如backgroundColorname),但不是我的managedObject ivar。 我怀疑这是因为 hitTest 返回 CALayer 而不是我的子类。

但是我该如何解决呢?

(我还尝试对我的层的“hitTestLayer”子层进行命中测试,然后通过hitTestLayer.superlayer 获取该层。但是,superlayer 也返回CALayer...)

【问题讨论】:

    标签: cocoa subclass calayer


    【解决方案1】:

    您是否重写了自定义 CALayer 的 - hitTest 方法以返回 CustomCALayer 而不是 CALayer?

    【讨论】:

    • 嘿,谢谢你的线索!但我仍然无法弄清楚如何做到这一点。尝试是不是很愚蠢: - (CustomCALayer *)hitTest:(CGPoint)thePoint { return (CustomCALayer *) [super hitTest:thePoint]; } ?
    • 我在考虑它并且可以工作,但首先,您是否将该 ivar 设为属性?如果没有,您无论如何都无法检索它。
    • 另外,你如何测试你返回的对象是什么类?对于测试,您可能会考虑记录 isKindOfClass... 这将帮助您了解发生了什么?
    • 是的,ivar 是一个属性,我现在通过 isKindOfClass 测试了对象的类。我想,我可能误解了这个问题,当我认为 hitTest 会返回错误的类时(该死,对不起!):类是正确的,但 ivar 仍然不存在。但这里有一些有趣的事情:正如我在问题中所描述的,我将 hitTest 发送到“self.layer.presentationLayer”。当我将其更改为“self.layer”时,突然间我的 ivar 存在了!我认为这解决了我的问题(因为我不想为我的图层设置动画)但我仍然不明白。无论如何,非常感谢您的宝贵时间!
    • 我想返回的层不包含 ivar,因为它没有返回正确的层!您应该将 hitTest 发送到根层。对不起,我错过了! :( 但听起来你让它工作了。但是,如果你确实想将 hitTest 发送到子层,你必须先用 objectAtIndex 调用它。子层不是层的成员,所以你不要用它调用它点语法。它属于称为 sublayers 的 NSArray 成员。所以你会做 CACustomLayer *customLayer = [self.layer.sublayers objectAtIndex:i] hitTest:thePoint]。不管怎样,很高兴你能成功!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多