如何检测以编程方式触摸了哪个子视图

Posted

技术标签:

【中文标题】如何检测以编程方式触摸了哪个子视图【英文标题】:how to detect which subview is touched programmatically 【发布时间】:2012-05-07 08:27:10 【问题描述】:

我在网上搜索了很多,但没有找到任何具体的东西。我想这不是一个很大的问题,但我无法弄清楚。

我正在处理 UIImageView“A”,然后我添加了一些其他 UIImageViews 作为该“A ImageView”的子视图。为所有子视图启用了 UserInteraction。现在在 TouchBegan 方法中,我得到“A ImageView”的子视图数组并将其与 Touch.view 进行比较。但是 touch.view 总是等于父视图,即“A ImageView”,并且永远不会返回触摸的子视图。

所以请指导我如何检测触摸了哪个子视图,然后我将通过更新其中心将该子视图移动到新位置。

提前感谢大家,期待您的回复。

问候,

【问题讨论】:

【参考方案1】:

恐怕将imageview用作按钮是错误的,但如果您坚持这样做,请尝试以下:

你可以通过继承一个 imageview 来重写 hitTest 方法

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

    UIView *hittedView = [super hitTest: point withEvent: event];
    NSLog (@"self=<%p>, hitted=<%p>", self, hittedView);
    return hittedView;

添加日志以查看默认的 hitTest 是否返回正确的子视图。

如果没有,恐怕你得自己写hitTest代码了:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 

    for (UIView *view in self.subviews) 
        if (CGRectContainsPoint(view.frame, point)) 
           return view;
        
    
    return self

本文档对您有用: http://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/Introduction/Introduction.html

【讨论】:

【参考方案2】:

是否启用了子视图的交互,如果是,您是否尝试为您动态添加的每个主要视图和子视图提供单独的标签,并通过查看它们的标签来验证触摸...

【讨论】:

感谢 yunas 的回复 是的 userInteraction 已启用,但我没有尝试过这个标签逻辑,让我试试,我会尽快更新结果。 我从 2 开始标记子视图,触摸视图的标记值始终为 0。这甚至不是任何图像视图的有效标记,甚至对于父 UIImageView 也不是。所以这意味着它总是检测 self.view 作为触摸视图。 hmmmm 我认为你做错了什么。我创建了一个演示项目,您可以从这里cl.ly/GRnl 下载它,在控制台上您会看到 self.view 的标签为 1000,imageview 的标签为 500。

以上是关于如何检测以编程方式触摸了哪个子视图的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式禁用android中的触摸输入

单击手势不适用于以编程方式添加的子视图

在可可触摸中以编程方式将视图位置设置为右上角

检测 UIButton 触摸子视图

如何以编程方式找出打开了哪种位置模式?

目标c:从视图/图像/按钮外部开始触摸时检测触摸开始/向下