在 UIPageViewController 中预加载下一页

2024-02-13

我已经看过很多很多地方,但还没有找到一些好的示例代码来展示如何在 UIPageViewController 中预加载“下一个”页面。关于 SO 有一些答案,详细介绍了一些理论上的方法(请参阅这个问题 https://stackoverflow.com/questions/11659604/preloading-pages-of-uipageviewcontroller)但尚未有人发布工作示例。

在我的应用程序的工作流程中,我每个屏幕显示 1 个页面,并且我希望预加载“下一个”屏幕,因为实际上,滑动到下一页可能会非常慢,有时需要滑动 2 次(如果滑动太快) )以便渲染和显示下一页。这提供了糟糕的用户体验。我并不真正关心预加载“上一个”或任何其他屏幕,因为典型的工作流程是用户在移动到下一个屏幕(右侧)之前在屏幕上停留一段时间。我正在使用幻灯片动画(不是卷曲)。我以编程方式创建所有视图,根本不使用 IB。

我尝试将一些 UIViewController 存储在 NSMutableArray 中并从那里加载控制器,但要正常工作很棘手,而且似乎没有加快任何速度。必须有一个好的方法来做到这一点。

任何帮助是极大的赞赏。


我已经通过某种方式解决了我的问题。对于每个ContentView, 我有一个UIImageView在一个UIScrollView用于缩放。我的问题是,启动应用程序时,如果用户在滑动之前进行缩放,则在放大时进入下一页效果不太好。我使用以下代码(Swift 1.2)来解决这个问题。正如我所说,这有点像黑客。

var layoutsubs = false

override func viewDidLoad() {
    super.viewDidLoad()
    //Other code for implementing pageViewController omitted

    //add pageViewController to main view
    self.addChildViewController(pageViewController)
    self.view.addSubview(pageViewController.view)
    pageViewController.didMoveToParentViewController(self)

    //Load to the viewController after the starting VC, then go back to the starting VC
    var viewControllers = [afterVC]
    pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Forward, animated: true, completion: nil)
    viewControllers = [startingVC]
    pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Reverse, animated: true, completion: nil)
}

override func viewWillLayoutSubviews() {
    //Load the viewController before the starting VC then go back to the starting VC
    //viewWillLayoutSubviews() is called multiple times, so do this only once
    if !layoutsubs {
        let startingVC = self.viewControllerAtIndex(imageIndex) as ContentViewController
        let beforeVC = pageViewController(pageViewController, viewControllerBeforeViewController: startingVC) as! ContentViewController

        var viewControllers = [beforeVC]
        pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Reverse, animated: true, completion: nil)
        viewControllers = [startingVC]
        pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Forward, animated: true, completion: nil)
        layoutsubs = true
    }
}

本质上,我在启动视图控制器之前和之后加载视图控制器。我通过将每个设置为 VC 来查看来做到这一点setViewControllers(_:direction:animated:completion:) (see ref https://developer.apple.com/library/prerelease/ios//documentation/UIKit/Reference/UIPageViewControllerClassReferenceClassRef/index.html#//apple_ref/occ/instm/UIPageViewController/setViewControllers:direction:animated:completion:),然后返回到起始视图控制器。为什么这在两个不同的函数中?好吧,如果将所有内容合二为一,则只会加载起始 VC 旁边的两个视图控制器之一。这对于某些情况可能是理想的,但我需要加载所有三个 VC(之前、开始和之后)。

我不确定如果该方法的效果如何UIPageViewController已经加载了。例如,如果您需要在几次滑动后从正在查看的页面加载页面 2。如果你把它放进去,它可能会跳过willTransitionToViewControllers().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 UIPageViewController 中预加载下一页 的相关文章

随机推荐

  • 如何以编程方式获取计算机的本地网络 IP 地址?

    我需要使用 C 和 NET 3 5 从我的程序中获取计算机的实际本地网络 IP 地址 例如 192 168 0 220 在这种情况下我不能只使用 127 0 0 1 我怎样才能做到这一点 如果您正在寻找命令行实用程序 ipconfig 可以
  • Python 在屏幕上绘图

    我正在编写一个需要选择屏幕区域的应用程序 我需要将光标更改为十字形 然后在用户选择上绘制一个矩形 我搜索的第一件事是如何操作光标 然后我遇到了 wxPython 使用wxPython 我可以轻松地在带有面板的框架上执行此操作 问题是我需要窗
  • 如何在 Python 日志消息中将“levelname”重命名为“level”?

    我有一个 Python 日志记录配置 如下所示 LOGGING CONFIG version 1 formatters human class logging Formatter format asctime s levelname s m
  • 我应该阻止密码自动完成吗?

    有很多在这里回复 https stackoverflow com questions 2530 how do you disable browser autocomplete on web form field input tag on h
  • 更新应用程序而不安装新的APK

    我正在尝试查看是否可以远程更新用户手机上的应用程序无需下载 apk文件 这是我的 老板 的信息收集请求 他认为这在 iOS 上是可能的 所以他希望我在 Android 上检查一下 本质上 我试图让我的应用程序偶尔从我们的网络服务器中提取版本
  • BigQuery 可以用作主要查询引擎吗?

    我想知道是否可以深入了解使用 BigQuery 作为我们正在开发的分析工具的主要查询引擎的可行性 我们的公共 API 实际上需要使用 PHP SDK 可能超过 1 亿行 执行至少数百个并发 SELECT 查询 但从当前文档来看 BigQue
  • 使用 NodeJS+Express、aws-sdk 将文件直接流式传输到 s3

    我想使用 NodeJS 通过浏览器直接上传一些大文件到 s3 目前还不清楚如何准备该文件上传到 s3 可能有更好的模块 如 Knox 来处理这种情况 但我不确定 有什么想法吗 文件对象 file webkitRelativePath las
  • 如何使用带 IN 子句的 PDO 准备语句? [复制]

    这个问题在这里已经有答案了 我以这种格式将一些数据存储在 MySQL 内的字段中 1 5 9 4我将这个字段命名为related 现在我想在一个内部使用这个字段IN 子句 with PDO 我将该字段内容存储在 related多变的 这是我
  • 为应用整个页面的正文提供背景颜色。为什么?

    body background color red div Hello World div So the background color red 适用于整个页面高度 但当我检查页面时 正文的高度仅达到div含有你好世界 有人请解释一下为什
  • 根据设备大小缩放多行 UIButton 上的字体

    当前设置 我有一个多行的 UIButton它被添加到它的超级视图 一个普通的UIView 按钮的宽度是其父视图的 90 因此 当其父视图的大小发生变化时 标签的宽度也会相应变化 因为Autolayout限制 接下来 在 viewDidLoa
  • Firebase 处理与数据库的断开连接

    我不确定它是否已断开连接或数据库错误事件 首先 当开始在 Firebase 上加载数据时 我会显示一个对话框 然后我想在两种情况下关闭该对话框 有互联网 加载数据成功 我在 onDataChange 中关闭对话框 应用程序启动时没有互联网连
  • 使用 getters() 还是在 POJO 中使用直接字段访问?

    给定一个简单的 POJO 它真的会产生影响吗 或者使用以下任一方法是否可能产生副作用 total getPriorAmount getCurrentAmount OR total this priorAmount this currentA
  • 从 Eclipse 运行干净的 Android 构建?

    有没有办法从 Eclipse 运行构建 每次都会清除应用程序的数据 我想这样做是为了检查我的应用程序的首次运行体验 如果您使用的是 eclipse 请转到应用程序的运行配置 单击目标选项卡 然后选中擦除用户数据字段 我相信这会在每次运行 e
  • 在 JavaFX 中的所有表格单元格上设置工具提示

    我的应用程序包含一个TableView 根据每行中特定单元格的值 通过设置自定义单元格工厂来更改行样式setCellFactory对于本专栏 这很好用 现在我想添加一个工具提示 使用它没什么大不了的setTooltip 然而 此工具提示应设
  • 删除与正则表达式匹配的文件

    在 Windows 上从与 Perl 中的某些正则表达式匹配的目录中删除所有文件的最短和最好的方法 我的例子 全部删除 txt目录中的文件 但保留tmp txt 视窗 chdir dir or die unlink grep ne tmp
  • Pandas 将所有对象列转换为类别

    我想要一个优雅的函数来将 pandas 数据框中的所有对象列转换为类别 df x df x astype category 执行类型转换df select dtypes include object 将子选择所有类别列 但是 这会导致其他列
  • 具有函数得分的 ElasticSearch 查询运行速度慢了 10 倍以上

    这是我的没有功能分数的查询 from 200 size 25 query bool filter bool must nested query terms cotypes id 199
  • 在 Delphi 的 Label 中显示简单标记

    我当前正在 TLabel 中显示一些文本 我现在想通过在文本中显示某些单词来强调它们bold也许italic 在 Delphi 中推荐的方法是什么 是否有类似 TLabel 的组件可以显示简单的 HTML 或标记 我正在想象这样的代码 la
  • 如何在 MSBuild 中排除(禁用)PackageReference 的(传递)依赖性?

    我正在使用一个包Xamanimation其中有一个依赖项Xamarin Forms 4 1 0 写在其nuspec file
  • 在 UIPageViewController 中预加载下一页

    我已经看过很多很多地方 但还没有找到一些好的示例代码来展示如何在 UIPageViewController 中预加载 下一个 页面 关于 SO 有一些答案 详细介绍了一些理论上的方法 请参阅这个问题 https stackoverflow