禁用 UIPageViewController 弹跳 - Swift

6

我正在制作一个具有UIViewController之间滚动功能的示例应用程序,但是我的目标是禁用滚动结束时的反弹效果以及返回到第一个UIViewController时的反弹效果。

这是我的代码:

class PageViewController: UIPageViewController,UIPageViewControllerDataSource, UIPageViewControllerDelegate{

    var index = 0
    var identifiers: NSArray = ["FirstNavigationController", "SecondNavigationController"]
    override func viewDidLoad() {

        self.dataSource = self
        self.delegate = self

        let startingViewController = self.viewControllerAtIndex(self.index)

        let viewControllers: NSArray = [startingViewController]
        self.setViewControllers(viewControllers as [AnyObject], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
    }

    func viewControllerAtIndex(index: Int) -> UINavigationController! {

        let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
        //first view controller = firstViewControllers navigation controller
        if index == 0 {

            return storyBoard.instantiateViewControllerWithIdentifier("FirstNavigationController") as! UINavigationController

        }

        //second view controller = secondViewController's navigation controller
        if index == 1 {

            return storyBoard.instantiateViewControllerWithIdentifier("SecondNavigationController") as! UINavigationController
        }

        return nil
    }
    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {

        let identifier = viewController.restorationIdentifier
        let index = self.identifiers.indexOfObject(identifier!)

        //if the index is the end of the array, return nil since we dont want a view controller after the last one
        if index == identifiers.count - 1 {

            return nil
        }

        //increment the index to get the viewController after the current index
        self.index = self.index + 1
        return self.viewControllerAtIndex(self.index)

    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {

        let identifier = viewController.restorationIdentifier
        let index = self.identifiers.indexOfObject(identifier!)

        //if the index is 0, return nil since we dont want a view controller before the first one
        if index == 0 {

            return nil
        }

        //decrement the index to get the viewController before the current one
        self.index = self.index - 1
        return self.viewControllerAtIndex(self.index)

    }

}

请看这里:

请看:

图片描述

1个回答

7

我不确定你是否能够这样做。UIPageController并不是非常可定制的。

个人而言,当我想在UIViewController之间滚动时,我更喜欢使用一个简单的UIViewController作为容器,并在其中添加一个UIScrollView。然后我通过代码将所有的控制器添加到UIScrollView的contentSize中。您需要将所有的控制器添加到容器的子级中。

iOS 9更新

func setupDetailViewControllers() {
    var previousController: UIViewController?
    for controller in self.controllers {
        addChildViewController(controller)
        addControllerInContentView(controller, previousController: previousController)
        controller.didMoveToParentViewController(self)
        previousController = controller
    }
}

func addControllerInContentView(controller: UIViewController, previousController: UIViewController?) {
    contentView.addSubview(controller.view)
    controller.view.translatesAutoresizingMaskIntoConstraints = false

    // top
    controller.view.topAnchor.constraintEqualToAnchor(contentView.topAnchor).active = true

    // bottom
    controller.view.bottomAnchor.constraintEqualToAnchor(contentView.bottomAnchor).active = true

    // trailing
    trailingContentViewConstraint?.active = false
    trailingContentViewConstraint = controller.view.trailingAnchor.constraintEqualToAnchor(contentView.trailingAnchor)
    trailingContentViewConstraint?.active = true

    // leading
    let leadingAnchor = previousController?.view.trailingAnchor ?? contentView.leadingAnchor
    controller.view.leadingAnchor.constraintEqualToAnchor(leadingAnchor).active = true

    // width
    controller.view.widthAnchor.constraintEqualToAnchor(scrollView.widthAnchor).active = true
}

之前的回答

就像这样:

scrollView是一个IBOutlet,具有到ContainerViewController每个边缘的约束。

class ContainerViewController: UIViewController {

@IBOutlet var scrollView: UIScrollView!

override func viewDidLoad() {
    super.viewDidLoad()
    scrollView.bounces = false
    scrollView.pagingEnabled = true
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}

override func viewDidLayoutSubviews() {
    initScrollView()
}

func initScrollView(){
    let viewController1 = storyboard?.instantiateViewControllerWithIdentifier("ViewController1") as! ViewController1

    viewController1.willMoveToParentViewController(self)
    viewController1.view.frame = scrollView.bounds

    let viewController2 = storyboard?.instantiateViewControllerWithIdentifier("ViewController2") as! ViewController2

    viewController2.willMoveToParentViewController(self)
    viewController2.view.frame.size = scrollView.frame.size
    viewController2.view.frame.origin = CGPoint(x: view.frame.width, y: 0)

    scrollView.contentSize = CGSize(width: 2 * scrollView.frame.width, height: scrollView.frame.height)

    scrollView.addSubview(viewController2.view)
    self.addChildViewController(viewController2)
    viewController2.didMoveToParentViewController(self)

    scrollView.addSubview(viewController1.view)
    self.addChildViewController(viewController1)
    viewController1.didMoveToParentViewController(self)
}}

有没有其他可能的解决方案,而不是使用 UIScrollView 替代 UIPageViewController?或者如何实现仅允许水平滚动? - AaoIi
你的scrollView不应该垂直滚动,因为你的contentSize的高度等于scrollView的高度。 - GaétanZ
在您的方式中,我该如何检查我现在是否在viewController2中? - AaoIi
我没有我的电脑,但你可以像在containerViewController中那样使用index。你可以将containerViewController设置为scrollView的代理,并在内容移动时每次更改索引。或者你可以在viewDidAppear中使用parentViewController属性从你的UINavigationViewController中更改它。 - GaétanZ
所以如果我需要添加一个视图控制器,如何使它工作(公式)?我应该使用 width:3 * ...来做吗? - AaoIi
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接