所以我一直在寻找,我还没找到我要找的东西。
我有一个视图,然后是该视图的子视图。在第二个视图中,我根据我给它的坐标创建CALayers。我希望能够触摸任何一个CALayers并触发一些东西。
我发现了不同的代码片段看起来很有帮助,但我无法实现它们。
例如:
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { if ([touches count] == 1) { for (UITouch *touch in touches) {
CGPoint point = [touch locationInView:[touch view]]; point = [[touch view] convertPoint:point toView:nil];
CALayer *layer = [(CALayer *)self.view.layer.presentationLayer hitTest:point];
layer = layer.modelLayer; layer.opacity = 0.5;
} } }
还有这个......
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
// If the touch was in the placardView, bounce it back to the center
if ([touch view] == placardView) {
// Disable user interaction so subsequent touches don't interfere with animation
self.userInteractionEnabled = NO;
[self animatePlacardViewToCenter];
return;
}
}
我仍然是这个东西的初学者。我想知道是否有人能告诉我如何做到这一点。谢谢你的帮助。
答案 0 :(得分:13)
CALayer无法直接对触摸事件作出反应,但程序中的许多其他对象都可以 - 例如托管图层的UIView。
事件,例如触摸屏幕时由系统生成的事件,通过所谓的“响应者链”发送。因此,当触摸屏幕时,将向位于触摸位置的UIView发送消息(换句话说 - 调用方法)。对于触摸,有三种可能的消息:touchesBegan:withEvent:
,touchesMoved:withEvent:
和touchesEnded:withEvent:
。
如果该视图未实现该方法,系统将尝试将其发送到父视图(iOS语言的superview)。它试图发送它直到它到达顶视图。如果没有任何视图实现该方法,它会尝试传递给当前视图控制器,然后是它的父控制器,然后传递给应用程序对象。
这意味着您可以通过在任何这些对象中实现所提到的方法来对触摸事件做出反应。通常托管视图或当前视图控制器是最佳候选者。
假设您在视图中实现它。接下来的任务是找出触摸了哪些图层,为此您可以使用方便的方法convertPoint:toLayer:
。
例如,在视图控制器中可能看起来像这样:
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
CGPoint p = [(UITouch*)[touches anyObject] locationInView:self.worldView];
for (CALayer *layer in self.worldView.layer.sublayers) {
if ([layer containsPoint:[self.worldView.layer convertPoint:p toLayer:layer]]) {
// do something
}
}
}