我试图在用户向下滑动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
}
我已经查看了类似的问题,但没有一个答案对我有用。
答案 0 :(得分:0)
这对于处理单个操作Top
或Bottom
滑动非常关键,其中启用了两个手势并检测到相同的事件。
我可以建议一个简单的逻辑解决方案
检测tableview的滚动位置,如果表行索引为零或表滚动的内容偏移为零:识别向下滑动事件并关闭/关闭视图控制器。
以下是类似的解决方案,您可以使用: - Scrolling Delegate in TableView
答案 1 :(得分:0)
如果我明白你想要什么,这就是你需要的。
考虑到你的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
}
答案 2 :(得分:0)
最简单的方法是在tableView上添加另一个清晰视图,并在此视图中添加平移手势识别器。它可以很短(我尝试了20分,并且工作正常)。只有当contentOffset.y&lt; = 0时,您才可以覆盖scrollViewDidScroll并将isHidden设置为true。不可见视图现在将检测只有当您位于tableView顶部时才从tableview的前20个点开始的平底锅。