解散工作不正确UIScrollView和UITableView



我有一个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
}

希望这对你有帮助!

相关内容

  • 没有找到相关文章

最新更新