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