使平移手势识别器仅在向下滑动和在桌面视图顶部时响应
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 的答案对我有用。
这对于处理单个动作 Top
或 Bottom
滑动似乎非常重要,其中启用了两个手势并检测到相同的事件。
我可以建议一个简单的逻辑解决方案
检测 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 个点开始的平移。
当用户在 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 的答案对我有用。
这对于处理单个动作 Top
或 Bottom
滑动似乎非常重要,其中启用了两个手势并检测到相同的事件。
我可以建议一个简单的逻辑解决方案
检测 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 个点开始的平移。