我有一个UIViewController类在全屏上呈现在它上面我有一个scrollview和一个带有uiview和一个表格的stackview
view.addSubview(scrollView)
scrollView.addSubview(stackView)
stackView.addArrangedSubview(view1)
stackView.addArrangedSubview(tableView)
scrollView有一个TapGestureRecognizer
func settings() {
let gestureRec = UITapGestureRecognizer(target: self, action: #selector(close))
gestureRec.cancelsTouchesInView = false
gestureRec.numberOfTapsRequired = 1
gestureRec.delegate = self
scrollView.addGestureRecognizer(gestureRec)
}
@objc func close() {
dismiss(animated: false)
}
点击任何地方,屏幕都会关闭,即使是tableView,我该怎么修复呢?屏幕需要被关闭,只有当你点击滚动,表格内的StackView应该工作良好
我尝试使用UIGestureRecognizer委托,重写方法,确定点击的位置
从我从你的问题中收集到的,你有一个父视图(滚动视图)和一个子视图(堆栈视图),你只想在用户点击父视图而不是其子视图时执行操作。
您可以尝试的一种解决方案是覆盖gestureRecognizer:shouldReceiveTouch:
并返回true
,如果触摸在所需的位置。下面是一个例子:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch)
-> Bool
{
return touch.view?.isEqual(scrollView) ?? false
}
另一种方法是使用hitTest(_:with:)
来确定包含指定点(在我们的例子中是触摸)的接收器在视图层次结构中的最远后代(包括其本身)。对于您的用例,如果hitTest
返回滚动视图,那么您可以自信地说用户没有点击堆栈视图。下面是一个例子:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch)
-> Bool
{
let hitView = scrollView.hitTest(touch.location(in: scrollView), with: nil)
return hitView?.isEqual(scrollView) ?? false
}
希望这对你有帮助!