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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使平移手势识别器仅在向下滑动时在桌面视图的顶部进行响应相关的知识,希望对你有一定的参考价值。

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

我想让我的UIPanGestureRecognizer只响应用户没有滚动tableview(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
}

我查看了类似的问题,但没有一个答案对我有用。

答案

最简单的方法是在tableView顶部添加另一个清晰视图,并为此视图添加平移手势识别器。它可以很短(我尝试了20分,并且工作正常)。只有当contentOffset.y <= 0时,您才可以覆盖scrollViewDidScroll并将isHidden设置为true。不可见视图现在将检测只有当您位于tableView顶部时才从tableview的前20个点开始的平移。

另一答案

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

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

以下是类似的解决方案,您可以使用: - Scrolling Delegate in TableView

另一答案

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

考虑到你的tableview是一个scrollview,只要用户在你的桌子上滚动你就可以运行这个函数,你可以通过调用table.contentOffset.y来获得滚动的坐标。

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
}

以上是关于使平移手势识别器仅在向下滑动时在桌面视图的顶部进行响应的主要内容,如果未能解决你的问题,请参考以下文章

使用平移手势识别器关闭视图控制器

是否可以禁用滑动手势并仅使平移手势在滚动视图中工作?

仅在长按识别器触发后执行平移手势识别器

在视图控制器之间平移(不滑动)

防止自定义 UITableViewCells 中的多个平移手势

平移手势使视图在拖动时从手指跳开