我有UIViewController,并且有很多子视图。每个子视图可以是Uibutton,其他视图控制器,UIView。如何检测用户何时在任何地方首次点击屏幕。我已经使用过TouchesBegan事件,但在Subviews上却无法使用。非常感谢!
答案 0 :(得分:0)
可以说您的MainViewController具有三个子视图,分别为UIButton
,UIView
和SubViewController。
轻击/单击这些子视图后,可以通过以下方式对其进行检测。
UIButton :添加touchBegan事件,并在MainViewController中添加IBAction
并将其捕获到MainViewController中。
UIView :如下面的代码所示,添加TapGesture
以捕获MainViewController中的触摸事件。
SubViewController :添加类似于UIView的TapGesture,并在SubViewController中捕获触摸事件。使用Delegate pattern
并通知MainViewController有关SubViewController触摸事件。
通过这种方式,您可以在MainViewController中检测子视图的所有touch事件。希望能帮助到你。如果没有,请告诉我。
点击手势代码
通过viewDidLoad
方法将“点击手势”添加到视图中。
var gestureTap = UITapGestureRecognizer(target: self, action: #selector(self.handleGestureTap(sender:)))
view.addGestureRecognizer(gestureTap)
处理程序方法:
@objc
func handleGestureTap(sender: UITapGestureRecognizer? = nil) {
print("View Tapped")
}
答案 1 :(得分:0)
您好,您确定要为该类创建引用出口吗?
您可以在以下问题中检查ventuz的答案: UIView touch event in controller
答案 2 :(得分:0)
将手势重新添加到UIVIewController的视图中
// Add this in the ViewDidLoad method
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.didTapView(sender:)))
self.view.addGestureRecognizer(tapGesture)
@objc
func didTapView(sender: UITapGestureRecognizer) {
print("View Tapped")
}
您将必须继承要使用的UI元素的类,并重写下面的方法,以将touch事件传递给视图层次结构中的下面的视图。像这样
class CustomView: UIView {
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
print("Passing all touches to the next view (if any), in the view stack.")
return false
}
}
现在在您的情节提要中使用此类,然后它将touch事件传递给ViewController的视图,因此将调用didTapView
方法。因为您只想要第一次触摸事件,所以可以保留一个标志来检查它是否是第一次触摸。请注意,如果不需要,请不要使用UIButton。