首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >确定哪个子视图被触摸

确定哪个子视图被触摸
EN

Stack Overflow用户
提问于 2012-02-20 06:51:52
回答 1查看 371关注 0票数 1

我正在用iPhone尝试动画的东西,我有一个小的应用程序,它有从屏幕顶部到底部的圆圈。我在动画中添加了UIViewAnimationOptionAllowUserInteraction选项,并在子视图和主视图上都设置了userInteractionEnabled = YES。每次我的NSTimer触发时,我都会以编程的方式生成子视图,这就形成了一个圆圈。

我遇到的问题是,即使我在我的主视图和子视图上实现了- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event,事件也只会在主视图上触发,无论我多么努力或多少次打破掉下来的圆圈。

我怎么才能让这个事件在我的圈子里触发呢?为什么触摸不会在顶部的视图上触发?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-20 08:35:09

问题是,当您使用核心动画(使用UIView动画方法时隐式发生)执行“补间”动画时,新值将立即应用于已知的model layer tree

动画被提交给Core Animation,下一次发生主运行循环时,Core animation会执行必要的渲染,使其看起来就像发生了动画一样。但实际上,视图的模型值(例如,它的frametransform属性)会立即更改。

尝试点击屏幕底部按钮落地的位置(假设按钮在屏幕上完成)。如果这样做,它应该会像您预期的那样响应交互事件。

您可以通过不断触发计时器并在每一步应用小的更改来手动更改圆圈的框架。然而,这可能并不理想。

另一种选择是使用视图的层的presentationLayer方法。这一层代表了我们在屏幕上看到的任何时间点的层的状态。不经意间,我想象您的主视图的触摸处理方法可以遍历每个子视图,并检查接触点是否与子视图层的表示层的框架相交。如果是这样,那就意味着有人“触摸”了你的子视图。

代码语言:javascript
运行
复制
for (UIView *subview in self.subviews)
{
    CALayer *presentationLayer = (CALayer *)[subview.layer presentationLayer];

    if (CGRectContainsPoint(presentationLayer.frame, touchPoint)
    {
        // Found the subview the user touched
    }
}

我应该注意到,presentationLayer返回id,因为表示层可能是CALayer或它的任何子类。例如,如果您使用的是CAShapeLayer,那么-presentationLayer将返回一个CAShapeLayer。尽管如此,只要将其转换为CALayer就可以了,因为对于此任务而言,您所关心的就是检查它的frame属性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9354082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档