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

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

问题描述

所以我一直在寻找,但还没有完全找到我要找的东西.

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

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

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:.

如果该视图没有实现该方法,系统会尝试将其发送到父视图(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天全站免登陆