使平移手势识别器仅在向下滑动并在 tableview 顶部时响应

Posted

技术标签:

【中文标题】使平移手势识别器仅在向下滑动并在 tableview 顶部时响应【英文标题】:make pan gesture recognizer only respond when swiping down AND at the top of a tableview 【发布时间】:2017-12-20 14:52:05 【问题描述】:

当用户在 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

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

【问题讨论】:

为什么要投反对票?如果我错过了什么,希望得到解释。 【参考方案1】:

最简单的方法是在您的 tableView 顶部添加另一个清晰的视图,并向该视图添加一个平移手势识别器。它可能很短(我尝试了 20 分,效果很好)。仅当 contentOffset.y

【讨论】:

谢谢,这确实是一个简单的解决方案。【参考方案2】:

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

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

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

【讨论】:

所以你建议使用tableView自己的手势处理程序?【参考方案3】:

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

考虑到你的tableview是一个scrollview,当用户在你的table上滚动时,这个函数就会运行,你可以通过调用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

【讨论】:

感谢您的回答,我尝试过这种方式,但不幸的是结果有些错误。

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

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

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

SWRevealViewController 平移手势识别器问题

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

如何确定 UIPanGesture 的方向(向上或向下)?

平移手势识别器的三层混淆