gpt4 book ai didi

ios - 我如何创建一个 UIPageViewController,其中所有屏幕都不同并且有自己的 ViewControllers?

转载 作者:搜寻专家 更新时间:2023-11-01 06:23:31 25 4
gpt4 key购买 nike

我想在屏幕之间使用很酷的滑动动画 - UIPageViewController(是的,你知道介绍屏幕的样式),但是我在 Internet 和 Github 上找到的所有代码对我没用。

我在 Storyboard 界面中发现只有一个 UIViewController 的演示,几乎所有应用程序都展示了如何从数组更改图像源。我阅读了 Apple 引用资料,但我不明白。

我的 Storyboard 上需要一些 ViewControllers(我想以不同的方式设计 UIPageViewController 中的所有屏幕,它们将连接到自己的 ViewControllers 类)将在 UIPageViewController 中显示。

当然,如果您知道更好的方法,请说出来!但我需要的功能是,如果您滑动屏幕,屏幕会随之移动。

有人知道怎么做吗?

最佳答案

UIPageViewController 中没有任何内容要求各种 View Controller 属于同一类。因此,只需实现返回不同类型 View Controller 的 viewControllerBeforeViewControllerviewControllerAfterViewController 即可。如果您想从 Storyboard中引用 subview Controller ,只需为这些场景提供唯一的 Storyboard ID,然后您就可以使用 instantiateViewControllerWithIdentifier。例如,您可能有一系列 Storyboard标识符,并使用它来确定哪种类型的场景在当前场景“之前”和“之后”。

有很多方法可以实现这一点,但您可以这样做:

class ViewController: UIPageViewController, UIPageViewControllerDataSource {

let identifiers = ["A", "B", "C", "D"] // the storyboard ids for the four child view controllers

override func viewDidLoad() {
super.viewDidLoad()

self.dataSource = self

setViewControllers([viewControllerForPage(0)!], direction: .Forward, animated: false, completion: nil)
}

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
var page = (viewController as PageDelegate).pageNumber + 1

return viewControllerForPage(page)
}

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
var page = (viewController as PageDelegate).pageNumber - 1

return viewControllerForPage(page)
}

func viewControllerForPage(page: Int) -> UIViewController? {
if page >= 0 && page < identifiers.count {
let controller = storyboard?.instantiateViewControllerWithIdentifier(identifiers[page]) as? UIViewController
(controller as PageDelegate).pageNumber = page
return controller
}

return nil
}
}

显然,如果你想在这里更优雅,你可以维护一个以前实例化的 View Controller 的缓存,但确保你响应内存压力并在必要时清除该缓存。但希望这能说明一个事实,即页面 View Controller 没有任何内容规定子级是特定的 Controller 类。

顺便说一下,上面假设每个 subview Controller 都遵循一个协议(protocol)来跟踪页码。

/// Page delegate protocol
///
/// This is a protocol implemented by all of the child view controllers. I'm using it
/// just to keep track of the page number. In practical usage, you might also pass a
/// reference to a model object, too.

@objc protocol PageDelegate {
var pageNumber: Int { get set }
}

如果你想走完全不同的方向,另一种方法是使用标准 Storyboard,你有一个接一个呈现 View Controller 的 segues,然后为每个 View Controller 实现滑动手势识别器,从右边滑动执行继续过渡到下一个场景(例如执行 performSegueWithIdentifierIBAction),另一个滑动手势识别器(从左到右)将关闭 View Controller 。

最后,如果您希望这些手势识别器是交互式的(例如跟随用户的手指),您可以使用自定义转换,并结合交互式转换。有关详细信息,请参阅 WWDC 2013 视频 Custom Transitions Using View Controllers或 WWDC 2014 视频 View Controller Advancements in iOS 8 (在视频的大约 20 分钟内,描述了如何使用演示 Controller 在 iOS 8 中增强自定义转换)和 A Look Inside Presentation Controllers .

关于ios - 我如何创建一个 UIPageViewController,其中所有屏幕都不同并且有自己的 ViewControllers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28915933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com