gpt4 book ai didi

ios - 从第一页或 0 索引向后滑动时如何弹出 UIPageViewController?

转载 作者:行者123 更新时间:2023-11-29 00:05:34 25 4
gpt4 key购买 nike

我知道滑动默认由 UIPageViewController 管理,并且在此过程中调用了回调方法,如 willTransitionTodidFinishAnimating 等.

当我们从第一页或第零个索引向后滑动时,是否可以关闭 UIPageViewController

我检查了一下,发现没有为此操作调用任何回调方法。

最佳答案

我能够达到预期的效果如下。

1) 将以下属性添加到您的 UIPageViewController 子类:

var scrollView: UIScrollView?
var swipeBackPanGestureRecognizer: UIPanGestureRecognizer?

2) 现在将以下代码添加到 UIPageViewController 子类的 viewDidLoad 方法中:

scrollView = view.subviews.filter{ $0 is UIScrollView }.first as? UIScrollView

if let scrollView = scrollView,
let popGestureRecognizer = self.navigationController?.interactivePopGestureRecognizer,
let targets = popGestureRecognizer.value(forKey: "targets") as? NSMutableArray {
let panGestureRecognizer = UIPanGestureRecognizer()
panGestureRecognizer.setValue(targets, forKey: "targets")
panGestureRecognizer.delegate = self
scrollView.addGestureRecognizer(panGestureRecognizer)
swipeBackPanGestureRecognizer = panGestureRecognizer
}

基本上,您要在scrollView中的构建中添加一个新的UIPanGestureRecognizer,它从内置的interactivePopGestureRecognizer接管目标操作,负责向后滑动(我在这里找到了这个提示:https://stackoverflow.com/a/57487641/10060753)。

3) 最后你需要实现这两个协议(protocol)方法。确保将以下代码添加到 UIPageViewController 子类的最后一个右括号下方,并将“YourPageViewController”替换为适当的子类名称:

extension YourPageViewController: UIGestureRecognizerDelegate {
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
guard let panRecognizer = gestureRecognizer as? UIPanGestureRecognizer,
panRecognizer == swipeBackPanGestureRecognizer else {
return true
}

guard let currentViewController = self.viewControllers?.first,
pageViewController(self, viewControllerBefore: currentViewController) == nil else {
return false
}

guard let gestureView = panRecognizer.view else {
return true
}

let velocity = (panRecognizer.velocity(in: gestureView)).x
return velocity > 0
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if gestureRecognizer == swipeBackPanGestureRecognizer && otherGestureRecognizer == scrollView?.panGestureRecognizer {
return true
} else {
return false
}
}
}

gestureRecognizerShouldBegin(_:) 的实现确保我们的向后滑动手势只有在 a) 在第一页上 (UIPageViewControllerDataSource viewControllerBefore == nil) 和 b) 如果我们从左向右滑动(速度 > 0)。

gestureRecognizer(_: shouldBeRequiredToFailBy:) 的实现确保只有当我们自己的向后滑动手势识别器失败时才会触发内置 UIPageViewController panGestureRecognizer。

关于ios - 从第一页或 0 索引向后滑动时如何弹出 UIPageViewController?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48147754/

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