带孩子的UIView上的TouchUpInside

时间:2012-05-23 22:36:51

标签: iphone uiview-hierarchy touch-up-inside

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

我有一个UIView有几个孩子(几个UILabelUIImageView)。当用户点击(点按)父UIView中的任何位置(UIView或其任何子节点的可见部分)时,我需要捕获一个事件。

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

5 个答案:

答案 0 :(得分:49)

您可以在身份检查器中更改UIView的类...使其成为UIControl然后您可以为您的视图添加UITouchUpInside的事件 - 以捕获其上的点击。

祝你好运!

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

观点...... Original view - of type UIView

...当然,没有事件。 UIView has no events you can use

返回并使用UIControl更改UIView并... Change UIView to UIControl

的Ta-DAA!活动! UIControl allows you to use events

将方法挂钩到UITouchUpInside事件 Add event for UITouchUpInside

这就是它在接口文件中的样子 The interface of the method

这是它在实现文件中的样子(当然,你可以用你想要的任何东西替换日志) The implementation of the method

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:1)

你必须提供更多细节,因为有多种选择。

如果您想要正常点击,您可以捕捉标准触摸事件之一并查看该事件的子视图。像这样:

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

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

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

答案 3 :(得分:1)

这对我有用

Swift 3

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


 func customViewClick()  {
     print("custom view clicked!")
    }

答案 4 :(得分:0)

快捷键4:

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

 @objc func onUiViewClick(sender : UITapGestureRecognizer) {

    }