首页 > 解决方案 > PageViewController - 禁用反弹问题

问题描述

我有一个 PageViewController,目前正在尝试禁用反弹。我已经找到了一些关于这个问题的线索,但是给定的解决方案禁用了反弹到错误的一面。

我有 2 个 ViewController,即homeViewtimelineView- 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]
    }
}

标签: iosswift

解决方案


据我了解,您只是不希望页面控制器UIScrollView在最后反弹,对吗?在这种情况下,您应该尝试设置scrollView.bounces = false. (https://developer.apple.com/documentation/uikit/uiscrollview/1619420-bounces


推荐阅读