22

我可能在这里遗漏了一些东西,但是...

我有UIView几个孩子(几个UILabel' 和UIImageView)。当用户单击(点击)父级内的任何位置时,我需要捕捉一个事件-或其任何子级的UIView可见部分)。UIView

这样做的最佳方法是什么?

4

5 回答 5

54

您可以在 Identity Inspector 中更改 UIView 的类......UIControl然后您可以UITouchUpInside为您的视图添加一个事件 - 以捕捉它的点击。

祝你好运!

编辑:这是一步一步的截图:

风景... 原始视图 - UIView 类型

...当然,没有事件。 UIView 没有可以使用的事件

返回并使用 UIControl 更改 UIView 和... 将 UIView 更改为 UIControl

达达!活动! UIControl 允许您使用事件

将方法挂钩到 UITouchUpInside 事件 为 UITouchUpInside 添加事件

这就是它在接口文件中的样子 方法接口

这就是它在实现文件中的样子(当然,你可以用你想要的任何东西替换日志) 方法的实现

于 2012-05-24T07:36:39.390 回答
8

您可以通过为您的父视图设置一个手势识别器并确保您的孩子没有自己的手势识别器来假装这种行为。为此,请向您的父母添加一个手势识别器以UIView监听轻按。parentView您的子视图 ( UILabels/ UIImageView)的包含视图在哪里,并且handleTap是由 实现的方法parentView,请执行以下操作:

UIGestureRecognizer *tapParent = [[UITapGestureRecognizer alloc]initWithTarget:parentView action:@selector(handleTap)];
[parentView addGestureRecognizer:tapParent];
[tapParent release];

由于您的子视图没有自己的手势识别器,它们不会“吃掉”手势,因此只要您在其范围内点击,父视图就会响应。

于 2012-05-23T23:24:33.710 回答
1

您必须提供更多详细信息,因为有多种选择。

如果您想要正常的点击,您可以捕获标准触摸事件之一并查看哪个子视图得到了该事件。像这样的东西:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    if(touch.view != self.mySubViewOfInterest)
    {
        // perform my actions
    }
}

如果您需要复杂的手势识别,那么您可以使用 UIGestureRecognizer 之一并将其分配给子视图或主视图。

无论如何,您必须注意所有子视图(您希望它们捕获事件的子视图)必须启用用户交互,否则您的主视图也会捕获子视图的事件,您最终会在不了解什么的情况下进行调试和调试正在发生。

于 2012-05-23T23:24:18.697 回答
1

斯威夫特 4:

let clickGesture = UITapGestureRecognizer(target: self, action:  #selector(self.onUiViewClick))
uiView.addGestureRecognizer(clickGesture)

 @objc func onUiViewClick(sender : UITapGestureRecognizer) {

    }
于 2019-02-16T00:46:09.103 回答
1

这对我有用

斯威夫特 3

 let gesture = UITapGestureRecognizer(target: self, action: selector(self.customViewClick))
withSender: self)
 customView.addGestureRecognizer(gesture)


 func customViewClick()  {
     print("custom view clicked!")
    }
于 2017-04-13T14:19:01.447 回答