1

我有一个CALayerwith hitTesting 可以正常工作。代码是这样的:

- (void)setup
{
    _maskLayer = [CAShapeLayer layer];
    _maskLayer.fillColor = [UIColor whiteColor].CGColor;
    _maskLayer.path = somePath;

    _theLayer.frame = CGRectMake(0, 0, size.width, size.height);
    // Taps work fine if we do not apply the mask
    // _theLayer.mask = _maskLayer;
}

- (IBAction)tapOnView:(UITapGestureRecognizer *)sender
{
    CGPoint point = [sender locationInView:theView];
    CALayer *subLayer = [_theLayer.presentationLayer hitTest:point].modelLayer;

    if (subLayer != _theLayer && subLayer != nil) {
        // Do something with the sublayer which the user touched
    }
}

问题是,如果我取消注释行mask,我的命中测试总是返回nil。为什么面罩会杀命中测试?它在视觉上看起来是正确的。

4

2 回答 2

2

事实证明,命中测试要求点位于 的范围内CALayer,但没有记录的是它也必须位于mask. 所以我像这样更改了我的代码并且它起作用了:

    _theLayer.frame = CGRectMake(0, 0, size.width, size.height);

    // Apply a mask
    _maskLayer.frame = _theLayer.frame;
    _theLayer.mask = _maskLayer;

我花了几个小时才弄清楚这一点,所以我想分享一下。

于 2013-09-06T00:57:57.800 回答
0

我使用了接受的答案,但仍然有一些问题,因为您应该使用边界来防止您的蒙版不显示您的图层是否不是 0,0 另外,这是快速解决方案:

theLayer.frame = CGRecti(x: 0, y, 0: width: size.width, height:size.height) 

maskLayer.frame = theLayer.bounds
theLayer.mask = maskLayer
于 2018-07-04T05:21:07.217 回答