我可能在这里遗漏了一些东西,但是......
我有一个UIView
有几个孩子(几个UILabel
和UIImageView
)。当用户点击(点按)父UIView
中的任何位置(UIView
或其任何子节点的可见部分)时,我需要捕获一个事件。
这样做的最佳方式是什么?
答案 0 :(得分:49)
您可以在身份检查器中更改UIView的类...使其成为UIControl
然后您可以为您的视图添加UITouchUpInside
的事件 - 以捕获其上的点击。
编辑:这是屏幕截图的一步一步:
观点......
...当然,没有事件。
返回并使用UIControl更改UIView并...
的Ta-DAA!活动!
将方法挂钩到UITouchUpInside事件
这就是它在接口文件中的样子
这是它在实现文件中的样子(当然,你可以用你想要的任何东西替换日志)
答案 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) {
}