使用 UIPageViewController 将 PageCurl 转换为滚动

Posted

技术标签:

【中文标题】使用 UIPageViewController 将 PageCurl 转换为滚动【英文标题】:Transition PageCurl to Scroll with UIPageViewController 【发布时间】:2015-01-18 21:11:50 【问题描述】:

我想在视图之间更改我的动画。 目前我有 PageCurl 但我想要一个像 Snapchat 这样的滚动动画。

我不能使用var transitionStyle: UIPageViewControllerTransitionStyle get

我的视图控制器:

import UIKit

class ViewController: UIPageViewController, UIPageViewControllerDataSource

    let pageViewController = UIPageViewController(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: nil)
    var messagesViewController : MessagesViewController!
    var searchViewController : SearchViewController!
    var friendsViewController : FriendsViewController!

    override func viewDidLoad() 
        super.viewDidLoad()

        // set UIPageViewControllerDataSource
        self.dataSource = self

        // Reference all of the view controllers on the storyboard
        self.messagesViewController = self.storyboard?.instantiateViewControllerWithIdentifier("messagesViewController") as? MessagesViewController
        self.messagesViewController.title = "Messages"

        self.searchViewController = self.storyboard?.instantiateViewControllerWithIdentifier("searchViewController") as? SearchViewController
        self.searchViewController.title = "Search"

        self.friendsViewController = self.storyboard?.instantiateViewControllerWithIdentifier("friendsViewController") as? FriendsViewController
        self.friendsViewController.title = "Friends"

        // Set starting view controllers
        var startingViewControllers : NSArray = [self.searchViewController]
        self.setViewControllers(startingViewControllers, direction: .Forward, animated: false, completion: nil)
    


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

        switch viewController.title! 
        case "Messages":
            return nil
        case "Search":
            return messagesViewController
        case "Friends":
            return searchViewController
        default:
            return nil
        
    

    // pink green blue

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

        switch viewController.title! 
        case "Messages":
            return searchViewController
        case "Search":
            return friendsViewController
        case "Friends":
            return nil
        default:
            return nil

        
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


【问题讨论】:

【参考方案1】:

来自Apple Docs:

"该属性的值是在页面视图控制器初始化时设置的,不能更改。"

您必须在初始化时指定过渡样式。如果你在代码中这样做,你将需要类似的东西:

let pageViewController = ViewController(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: nil)

(因为ViewControllerUIPageViewController 的子类)

如果您在情节提要中设置页面视图控制器,请在属性检查器中修改过渡样式:

【讨论】:

在 Xcode 的最后一个版本中,我在 Playground 中选择了“水平翻转”的过渡样式。但没有任何工作。我也添加了 let pageViewController 但没有任何改变:/ UIPageViewController 只有两种过渡样式:ScrollPageCurlFlipHorizontalUIModalTransitionStyle,当视图控制器以模态方式呈现时使用。如果你想要 FlipHorizo​​ntal 或类似的东西,你需要使用 UIPageViewController 以外的东西。 不,我想要与 snapchat 相同的过渡,请问我该怎么做。 如何创建上面的ViewController?通过故事板/segue 还是代码? 我已经在操场上创建了我的视图控制器,在问题的代码粘贴中具有相同的名称。【参考方案2】:

如果您需要使用故事板并且仍然需要在代码中设置过渡样式,您可以在继承 UIPageViewController 的类中使用此技巧。诀窍是,在带有编码器的 init 中,您调用 super.init(),它采用像这样的转换样式

class ViewController: UIPageViewController 

    required init?(coder: NSCoder) 
        super.init(transitionStyle: Configs.transitionStyle, navigationOrientation: .horizontal, options: nil)
    

【讨论】:

这对我有用,但它让我不调用 init(coder:) 初始化程序......我不确定我们是否应该这样做......

以上是关于使用 UIPageViewController 将 PageCurl 转换为滚动的主要内容,如果未能解决你的问题,请参考以下文章

将 UINavigationController 添加到 UIPageViewController

以编程方式将 UIPageViewController 过渡样式设置为滚动

无法将自动布局约束添加到 UIPageViewController

如何使用自动布局(约束)将子视图添加到 UIPageViewController?

UIPageviewController 使用 Storyboard 崩溃

ios 5 UIPageViewController 将过渡样式更改为滚动