gpt4 book ai didi

ios - 在 pageViewController 内的 tableView 上滑动以删除

转载 作者:IT王子 更新时间:2023-10-29 05:43:10 27 4
gpt4 key购买 nike

我在 pageViewController 中有一个 tableView,当在单元格上滑动以显示删除单元格的选项时,只有在某些情况下才能识别手势,假设您快速且激进地滑动。

我想这是因为不确定滑动手势是针对 pageView 还是 tableView。有没有一种方法可以专门确定滑动手势发生的位置,以便顺利显示删除按钮?

最佳答案

理论:

UIPageViewControllerUITableView都是使用UIScrollView实现的,其中UIPageViewController嵌入了UIScrollViewUITableViewUIScrollView

的子类

UITableView 还使用了几个 UIPanGestureRecognizer 来引入所有魔法。其中之一是 UISwipeActionPanGestureRecognizer,它处理滑动以删除操作。

这个问题是因为 UIPageViewControllerUIPanGestureRecognizer 在与 UITableViewUISwipeActionPanGestureRecognizer 的冲突中获胜。

因此,如果 UITableViewUISwipeActionPanGestureRecognizer 正在运行,我们必须了解如何告诉 UIPageViewController 忽略手势。

幸运的是,UIGestureRecognizer 已经提供了一些东西。

UIGestureRecognizerrequire(toFail otherGestureRecognizer: UIGestureRecognizer) 在两个手势识别器之间创建了一个关系,该关系将阻止手势的操作被调用,直到另一个手势识别器失败。

所以我们所要做的就是在UITableView时让UIPageViewControllers嵌入UIScrollviewpanGestureRecognizer失败UISwipeActionPanGestureRecognizer 被触发。

有两种方法可以实现这一点。

解决方案 1:向 TableView 添加新的手势识别器并模仿 UISwipeActionPanGestureRecognizer。并使 UIPageViewController panGesture 需要使这个新的 gestureRecognizer 失败

解决方案 2(有点脏):对 UITableViewUISwipeActionPanGestureRecognizer 进行字符串比较并生成 UIPageViewController panGesture 需要使这个新的 gestureRecognizer 失败

代码:

解决方案 1获取 UIPageViewController 嵌入 UIScrollView

的实用工具
extension UIPageViewController {

var scrollView: UIScrollView? {
return view.subviews.first { $0 is UIScrollView } as? UIScrollView
}

}

将以下代码添加到包含 UITableViewUIViewController 并从 viewDidLoad() 调用它

func handleSwipeDelete() {
if let pageController = parent?.parent as? UIPageViewController {
let gestureRecognizer = UIPanGestureRecognizer(target: self, action: nil)
gestureRecognizer.delaysTouchesBegan = true
gestureRecognizer.cancelsTouchesInView = false
gestureRecognizer.delegate = self
tableView.addGestureRecognizer(gestureRecognizer)

pageController.scrollView?.canCancelContentTouches = false
pageController.scrollView?.panGestureRecognizer.require(toFail: gestureRecognizer)
}
}

最后委托(delegate)方法

func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
guard let panGesture = gestureRecognizer as? UIPanGestureRecognizer else {
return false
}

let translation = panGesture.translation(in: tableView)
// In my case I have only trailing actions, so I used below condition.
return translation.x < 0
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return otherGestureRecognizer.view == tableView
}

方案二(有点脏)获取 UIPageViewController 嵌入 UIScrollView

的实用工具
extension UIPageViewController {

var scrollView: UIScrollView? {
return view.subviews.first { $0 is UIScrollView } as? UIScrollView
}

}

将以下代码添加到包含 UITableViewUIViewController 并从 viewDidLoad() 调用它

func handleSwipeDelete() {
guard let pageController = parent as? UIPageViewController else {
return
}

pageController.scrollView?.canCancelContentTouches = false
tableView.gestureRecognizers?.forEach { recognizer in
let name = String(describing: type(of: recognizer))
guard name == "_UISwipeActionPanGestureRecognizer" else {
return
}
pageController.scrollView?
.panGestureRecognizer
.require(toFail: recognizer)
}
}

关于ios - 在 pageViewController 内的 tableView 上滑动以删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36686048/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com