【问题标题】:How to detect which CALayer was clicked on?如何检测点击了哪个CALayer?
【发布时间】:2023-08-15 00:09:02
【问题描述】:

我在检测点击了哪个 CALayer 时遇到了问题,因为这些 CALayer 有一个恒定的 CABasicAnimation 来移动 x 和 y 位置。

我目前的代码如下:

-(void)mouseUp:(NSEvent *)theEvent
{
    CGPoint pointInView = NSPointToCGPoint([self convertPoint:[theEvent locationInWindow]fromView:nil]);
    CALayer* clickedOn = [(CALayer*) self.layer hitTest:[self.layer convertPoint:pointInView toLayer:self.layer.superlayer]];
    int selectedContact = -1;
    for (int i = 0; i < [contactLayers count]; i++) {
        CALayer* presentationLayer = [contactLayers[i] presentationLayer];
        if (presentationLayer == clickedOn) {
            selectedContact = i;
            break;
        }
    }

    if(selectedContact == -1)
        return; //no contact selected;

    CALayer* selectedContactLayer = contactLayers[selectedContact];
    [selectedContactLayer removeFromSuperlayer];
}

contactLayers 是一个 NSMutableArray,包含用户可以点击的所有可能的 CALayers。

每次运行时,“i”似乎总是最终保持 -1。我正在使用presentationLayer,因为 CALayers 应用了 CABasicAnimation。我也试过modelLayer,但这只有在你点击每一层的初始位置时才有效。

所以只是回顾一下:我有一个 NSMutableArray 的 CALayers,它们都应用了 CABasicAnimation,这个数组称为contactLayers。当用户单击图层时,我需要通过将索引设置为数组中的适当值来知道他们单击了哪个图层。提前致谢!

【问题讨论】:

  • 不是肯定的,但我认为你应该通过点击测试self.layer.presentationLayer 来计算 clickedOn,而不是 self.layer
  • @danh 就是这样!我还必须将 superLayer 更改为 PresentationLayer。把它作为一个答案,我很乐意将其标记为正确:) 谢谢!

标签: objective-c cocoa calayer cabasicanimation


【解决方案1】:

通过命中测试“self.layer.presentationLayer”而不是“self.layer”来计算“clickedOn”

【讨论】: