about gesture:
当点击屏幕时会记录点击的位置为point,可以重写hitTest来获取
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
let view = super.hitTest(point, with: event)
print("看这里 \(view), point=\(point), event=\(event)")
return view
}
系统将会从视图层最上层开始询问哪个视图可以接收这个gesture,
系统会从视图层次结构的最顶层开始调用 hitTest(:with:) 方法。这个方法的目的是确定哪个视图应该处理触摸事件,它会逐级向下查询,直到找到最合适的视图来处理触摸事件。
如果在视图层次中某个视图上添加了手势识别器,系统会调用该视图的gestureRecognizer(:shouldReceive:)来应答,如果为false则会询问下一个view,如果为ture则停止询问,调用相关gesture的action
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapViewHandle)];
[view addGestureRecognizer:tap];
tap.delegate = self//决定了当这个view接收到这个gesture是调用谁的 func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {方法
系统通过调用 hitTest(:with:) 方法来确定哪个视图应该接收手势,然后根据每个视图的 gestureRecognizer(:shouldReceive:) 方法来决定手势是否应该被该视图处理
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if let touchedView = touch.view {
print("gustureView看这里:Touched view: \(String(describing: touch.view)),type: \(type(of: touch.view))")
}
return false
}
你可以获取到具体点击的是哪个view
所有gestureRecognizer,shouldReceive方法里面的touch.view都是由用户实际点击的view决定的,并不会因为某个view是否添加gesture或者shouldReceive方法返回了false所改变。
返回true:手势识别器将处理这个触摸事件。手势识别器将继续跟踪触摸并尝试识别手势。
返回false:手势识别器将忽略这个触摸事件。触摸事件将传递给其他视图或手势识别器处理。