ios - PageViewController - 禁用反弹问题
问题描述
我有一个 PageViewController,目前正在尝试禁用反弹。我已经找到了一些关于这个问题的线索,但是给定的解决方案禁用了反弹到错误的一面。
我有 2 个 ViewController,即homeView
和timelineView
- homeView 最初显示并且索引为 0。当显示此视图时,弹跳在两边都被停用,我无法滑动到下一个控制器。
有人看到这个问题吗?
我的代码:
class RootPageViewController: UIPageViewController, UIPageViewControllerDataSource, UIScrollViewDelegate {
lazy var viewControllerList:[UIViewController] = {
let sb = UIStoryboard(name: "Main", bundle: nil)
let vc1 = sb.instantiateViewController(withIdentifier: "homeView")
let vc2 = sb.instantiateViewController(withIdentifier: "timelineView")
return [vc1, vc2]
}()
var currentPage: Int = 0
let defaults = UserDefaults.standard
override func viewDidLoad() {
super.viewDidLoad()
self.dataSource = self
NotificationCenter.default.addObserver(self, selector: #selector(disableSwipe(_:)), name: Notification.Name(rawValue: "disableSwipe"), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(enableSwipe(_:)), name: Notification.Name(rawValue: "enableSwipe"), object: nil)
for subview in self.view.subviews {
if let scrollView = subview as? UIScrollView {
scrollView.delegate = self
break;
}
}
if let secondViewController = viewControllerList.first as? HomeViewController {
self.setViewControllers([secondViewController], direction: .forward, animated: true, completion: nil)
...
}
}
...
func scrollViewDidScroll(_ scrollView: UIScrollView) {
print(currentPage, viewControllerList.count)
if (currentPage == 0 && scrollView.contentOffset.x < scrollView.bounds.size.width) {
scrollView.contentOffset = CGPoint(x: scrollView.bounds.size.width, y: 0);
} else if (currentPage == viewControllerList.count - 1 && scrollView.contentOffset.x > scrollView.bounds.size.width) {
scrollView.contentOffset = CGPoint(x: scrollView.bounds.size.width, y: 0);
}
}
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
if (currentPage == 0 && scrollView.contentOffset.x <= scrollView.bounds.size.width) {
targetContentOffset.pointee = CGPoint(x: scrollView.bounds.size.width, y: 0);
} else if (currentPage == viewControllerList.count - 1 && scrollView.contentOffset.x >= scrollView.bounds.size.width) {
targetContentOffset.pointee = CGPoint(x: scrollView.bounds.size.width, y: 0);
}
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard let vcIndex = viewControllerList.firstIndex(of: viewController) else { return nil }
let previousIndex = vcIndex - 1
guard previousIndex >= 0 else { return nil }
guard viewControllerList.count > previousIndex else { return nil }
currentPage = previousIndex
return viewControllerList[previousIndex]
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
guard let vcIndex = viewControllerList.firstIndex(of: viewController) else { return nil }
let nextIndex = vcIndex + 1
guard viewControllerList.count != nextIndex else { return nil }
guard viewControllerList.count > nextIndex else { return nil }
currentPage = nextIndex
return viewControllerList[nextIndex]
}
}
解决方案
据我了解,您只是不希望页面控制器UIScrollView
在最后反弹,对吗?在这种情况下,您应该尝试设置scrollView.bounces = false
. (https://developer.apple.com/documentation/uikit/uiscrollview/1619420-bounces)
推荐阅读
- python - AttributeError:“TwoCaptcha”对象没有属性“recaptcha”
- javascript - 我可以在不使用 Babel 的情况下在 ES6 中使用 Webpack 吗?
- reactjs - send Data from react to django rest api
- javascript - 如何使用纯 JavaScript 获取 DIV 元素的 id 和标题
- android - 如何为文本视图(文本大小)的共享元素转换进行自定义转换
- reactjs - 使用控件将视频播放器添加到 GLB 模型
- reactjs - 为什么使用无效数据调用此错误函数 Query.where()。不支持的字段值:firebase 中发生未定义?
- c++ - 我在 Visual Studio 中使用 C++ 的 openFrameworks 库设置项目时遇到问题
- python - 具有不同值但索引相同的熊猫子集
- java - 将此 if 语句与封闭语句合并