触摸CALayer时触发动作? [英] Trigger an action when a CALayer is touched?

查看:139
本文介绍了触摸CALayer时触发动作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我一直在寻找并且我找不到我要找的东西。

So I have been looking all over and I haven't quite found what I am looking for.

我有一个视图,然后是该视图的子视图。在第二个视图中,我根据我给它的坐标创建CALayers。我希望能够触摸任何这些CALayers并触发一些东西。

I have a view and then a subview of that view. On that second view I create CALayers depending on what coordinates I give it. I want to be able to touch any of those CALayers and trigger something.

我找到了不同的代码片段,看起来他们可以提供帮助,但我还没有能够实现它们。

I have found different pieces of code that look like they can help, but I haven't been able to implement them.

例如:

-(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;
    }       
}

我仍然是这个东西的初学者。我想知道是否有人能告诉我该怎么做。感谢您的帮助。

I am still pretty much a beginner to this stuff. I was wondering if anyone can tell me how to do this. Thanks for any help.

推荐答案

CALayer无法直接对触摸事件作出反应,但程序中的许多其他对象都可以 - 例如托管图层的UIView。

CALayer cannot react on touch events directly, but lots of other objects in your program can - for example the UIView which is hosting the layers.

事件,例如触摸屏幕时由系统生成的事件,通过所谓的响应者链发送。因此,当触摸屏幕时,将向位于触摸位置的UIView发送消息(换句话说 - 调用方法)。对于触摸,有三种可能的消息: touchesBegan:withEvent: touchesMoved:withEvent: touchesEnded:withEvent:

Events, such as an event that is generated by system when screen is touched, are being sent over so called "responder chain". So when the screen is touched, a message is sent (in other words - method is called) to the UIView which lies at the location of touch. For touches there are three possible messages: touchesBegan:withEvent:, touchesMoved:withEvent: and touchesEnded:withEvent:.

如果该视图未实现该方法,系统将尝试将其发送到父视图(superview in iOS语言)。它试图发送它直到它到达顶视图。如果没有任何视图实现该方法,它会尝试传递给当前视图控制器,然后是它的父控制器,然后传递给应用程序对象。

If that view does not implement the method, the system will try to send it to the parent view (superview in iOS language). It's trying to send it until it reaches the top view. If none of the views implement the method, it tries to be delivered to current view-controller, then it's parent controller, then to the application object.

这意味着你可以通过在任何这些对象中实现所提到的方法来对触摸事件做出反应通常托管视图或当前视图控制器是最佳候选者。

That means you can react on touch events by implementing mentioned methods in any of these objects. Usually the hosting view or the current view-controller are the best candidates.

假设您在视图中实现它。接下来的任务是弄清楚你的哪些图层被触摸了,为此你可以使用方便的方法 convertPoint:toLayer:

Let's say you implement it in the view. Next task is to figure out which of your layers have been touched, for this you can use convenient method convertPoint:toLayer:.

例如,它可能在视图控制器中看起来像:

For example here's it might look like in a view controller:

- (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
        }
    }
}

这篇关于触摸CALayer时触发动作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆