使用 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)
(因为ViewController
是UIPageViewController
的子类)
如果您在情节提要中设置页面视图控制器,请在属性检查器中修改过渡样式:
【讨论】:
在 Xcode 的最后一个版本中,我在 Playground 中选择了“水平翻转”的过渡样式。但没有任何工作。我也添加了 let pageViewController 但没有任何改变:/UIPageViewController
只有两种过渡样式:Scroll
或 PageCurl
。 FlipHorizontal
是 UIModalTransitionStyle
,当视图控制器以模态方式呈现时使用。如果你想要 FlipHorizontal 或类似的东西,你需要使用 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?