在CALayer上设置遮罩会破坏hitTest

时间:2013-09-06 00:57:58

标签: calayer mask hittest

我有一个CALayer的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。为什么面具会杀死测试?它看起来是正确的。

2 个答案:

答案 0 :(得分:1)

事实证明,命中测试要求该点位于CALayer的范围内,但未记录的是它也必须位于mask的范围内。所以我改变了我的代码,它起作用了:

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

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

我花了几个小时来弄明白这一点,所以我想分享一下。

答案 1 :(得分:0)

我使用了可接受的答案,但是仍然存在一些问题,因为如果您的图层不是0,0,则应该使用边界来防止蒙版不显示。这是快速的解决方法:

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

maskLayer.frame = theLayer.bounds
theLayer.mask = maskLayer