使平移手势识别器仅在向下滑动和在桌面视图顶部时响应

make pan gesture recognizer only respond when swiping down AND at the top of a tableview

当用户在 tableView 顶部向下滑动时,我试图关闭当前 viewcontroller。由于tableview占据了整个屏幕,我的手势和tableView的手势冲突了。

我想过让我的 UIPanGestureRecognizer 仅在用户没有滚动表格视图 (tableView.contentOffset.y == 0.0) 并且滑动方向向下时才响应。但是,我没有成功实现这个。

这是我的代码:

var tableGesture: UIPanGestureRecognizer?
var oPosition: CGPoint?
var currentPosition: CGPoint?
@IBOutlet weak var table: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    table.delegate = self
    table.dataSource = self

    tableGesture = UIPanGestureRecognizer(target: self, action: #selector(tableGesture(_:)))
    table.addGestureRecognizer(tableGesture!)
}

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    let translation = tableGesture?.translation(in: table)
    return translation!.y > 0 && table.contentOffset.y == 0.0
}

我看过类似的问题,但 none 的答案对我有用。

这对于处理单个动作 TopBottom 滑动似乎非常重要,其中启用了两个手势并检测到相同的事件。

我可以建议一个简单的逻辑解决方案
检测 table 视图的滚动位置,如果 table 行索引为零或 table 滚动的内容偏移量为零:识别向下滑动事件和 close/dismiss 您的视图控制器。

这是类似的解决方案,您可以使用: -

如果我明白你想要什么,这就是你需要的。

考虑到您的 table 视图是一个滚动视图,只要用户在您的 table 上滚动,此函数就会 运行 并且您可以通过调用 [=15 获取滚动的坐标=].

var lastContentOffset: CGFloat = 0

func scrollViewDidScroll(_ scrollView: UIScrollView) {

    print("the user scrolled down",table.contentOffset.y)


    if (self.lastContentOffset > tableView.contentOffset.y) {
        //scrolling up

    }
    else if (self.lastContentOffset < tableView.contentOffset.y) {
        // scrolling down

        // dismiss your view here.

    }


    if table.contentOffset.y < 5 {

        // the following code will be called when the user scrolls back up

        // show the view again if thats what you need


    }


    self.lastContentOffset = scrollView.contentOffset.y
}

执行此操作的最简单方法是在 tableView 顶部添加另一个清晰视图,并向该视图添加平移手势识别器。它可以很短(我尝试了 20 个点,效果很好)。仅当 contentOffset.y <= 0 时,您可以重写 scrollViewDidScroll 并将 isHidden 设置为 true。仅当您位于 tableView 的顶部时,不可见视图现在将检测从 tableview 的前 20 个点开始的平移。