UIView带有子视图的TouchUpInside事件

24

我可能有所遗漏,但是...

我有一个带有几个子项的 UIView(一些UILabelUIImageView)。我需要在用户单击(轻敲)父 UIView(可见部分或其任何子项)时捕获事件。

最好的方法是什么?

5个回答

56
您可以在“Identity Inspector”中更改UIView的类...将其更改为UIControl,然后您就可以为视图添加一个UITouchUpInside事件-以捕获对其的轻敲。
祝好运!
编辑:以下是带有截图的逐步说明:
视图... Original view - of type UIView ...当然,没有事件。 UIView has no events you can use 返回并将UIView更改为UIControl,然后... Change UIView to UIControl Ta-daa!事件! UIControl allows you to use events 将方法钩到UITouchUpInside事件上 Add event for UITouchUpInside 这是界面文件中应该看起来的样子 The interface of the method 这是实现文件中应该呈现的样子(当然,你可以用任何你想要的东西替换日志记录) 方法的实现

2
@WebOrCode:我已经编辑了我的答案并添加了截图,希望能有所帮助。 - DarkByte

8
您可以通过为父视图添加手势识别器,并确保子视图没有自己的手势识别器来模拟此行为。为此,请向父UIView添加一个手势识别器以监听轻敲事件。如果parentView是包含子视图(UILabels/UIImageView)的视图,并且handleTap是由parentView实现的方法,则可以执行以下操作:
UIGestureRecognizer *tapParent = [[UITapGestureRecognizer alloc]initWithTarget:parentView action:@selector(handleTap)];
[parentView addGestureRecognizer:tapParent];
[tapParent release];

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

3

这对我有效

Swift 3

(注:此处为编程语言名称)
 let gesture = UITapGestureRecognizer(target: self, action: selector(self.customViewClick))
withSender: self)
 customView.addGestureRecognizer(gesture)


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

1

你需要提供更多细节,因为有多个选项可供选择。

如果你想要普通的点击事件,你可以捕获其中一个标准的触摸事件,并查看哪个子视图接收到了该事件。类似于这样:

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

如果您需要进行复杂的手势识别,可以使用UIGestureRecognizer之一,并将其分配给子视图或主视图。
无论如何,您必须注意,所有子视图(您希望它们捕获事件的那些)都必须启用用户交互,否则您的主视图也会捕获子视图的事件,这样您就会不断地进行调试,而不理解发生了什么。

1

Swift 4:

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

 @objc func onUiViewClick(sender : UITapGestureRecognizer) {

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接