我正在研究Cocoa Touch应用程序,并尝试通过确定触摸视图图层的哪个子图层来处理触摸。我的控制器代码看起来像这样:
CALayer *hitLayer = [self.view.layer hitTest:point];
这不起作用。如果我点击子层的底部,而不是顶部,它会起作用。经过一个小时的拉毛和谷歌搜索后,我终于发现,如果使用表示层进行命中测试而不是图层本身,它会起作用:
CALayer *hitLayer = [self.view.layer.presentationLayer hitTest:point];
所以,我已经解决了我的问题,但我的问题是:为什么?
我已阅读核心动画指南,我了解演示树和渲染树可能与对象模型树不同。但我不明白为什么表示树(显然)会有不同的命中测试行为。表示树和对象模型不会有相同的框架,边界等吗?
答案 0 :(得分:4)
根据CALayer documentation,模型和表示树之间似乎存在关于呈现给用户的内容(取决于正在进行的动画)的差异。对于命中测试,presentationLayer
方法中有一个参考:
例如,发送一个hitTest: 消息到presentationLayer会 查询的表示值 层树。
因此我怀疑只有表示层具有正确的几何信息才能执行命中测试。
答案 1 :(得分:3)
//Identify the touch point in the view. Using UITapRecognizer
CGPoint loc = [recognizer locationInView:recognizer.view];
//convert the point to superview co-ordinates and then identify the layer using hit test.
CALayer *layer = [self.layer hitTest:[self convertPoint:loc toView:self.superview]];
这会给我一个被触摸的图层,至少目前是这样。如果您认为这是一种错误的方法,请告诉我们,我应该使用presentation-layer。