【问题标题】:CALayer hitTest with sublayers带有子层的 CALayer hitTest
【发布时间】:2013-02-18 15:49:13
【问题描述】:

我有一个由根层和 2 个 CALayer 子类组成的结构。这 2 层也包含一层。

这里有一个方案:

ROOT LAYER 
    |
    |------- LAYER A
    |           |---------BG
    |
    |
    |--------LAYER B
                |---------BG

如果我在ROOT LAYER 上调用hitTest 方法,它会将最内层返回到层次结构中。因此,如果用户点击LAYER A,我会得到LAYER ABG

//In this example hitResult will contains the BG of LAYER A or the BG of LAYER B
CALayer *hitResult = [rootLayer hitTest:point)]; 

如何停止响应者链并从发送到ROOT LAYER 的 HitTest 中直接获取 LAYER ALAYER B

【问题讨论】:

  • 如果图层是您自己的子类,那么您可以覆盖hitTest: 并做您自己的事情。
  • @DavidRönnqvist 我无法理解。如何停止子类的传播?
  • 从背景层返回NO
  • 您能填写一个答案以便我接受吗?

标签: objective-c core-animation calayer hittest


【解决方案1】:

如果这些层是您自己的 CALayer 子类,那么您可以覆盖 hitTest:containsPoint: 以在那里执行您自己的逻辑。

在您的背景层中覆盖 containsPoint: 并返回 NO 将阻止它们从它们的超层 hitTest: 实现中返回。

或者,您可以覆盖 A 层和 B 层中的 hitTest:,如果它们包含该点,则返回 self

【讨论】:

    【解决方案2】:

    仅作记录,请注意,如果您设置零 z 比例,图层将不再通过命中测试。

    // BG layer won't receive clicks
    bgLayer.transform = CATransform3DMakeScale(1, 1, 0)
    

    这可能是一种无需子类化就可以使图层处于非活动状态的方法,但我猜 Apple 可以随时更改此行为,因此我不会推荐它。

    对于那些可能想知道为什么子图层不再获得点击的人,我还是放弃了这个答案。只要确保在任何缩放中都通过 sz 中的 1。

    我在这个棘手的问题上浪费了几个小时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多