iOS UIPageViewController获取混淆,并且不显示ViewControllers

fin*_*elp 10 ios uipageviewcontroller swift

我们设置了左右按钮,供用户快速浏览不同的汽车.如果用户快速点击下一页10次或更多次,我们的页面视图控制器将丢失视图控制器.

这是车辆正确显示的车辆页面(模糊以隐藏不相关的信息).见图:

正确显示车辆

如果滚动动画打开(true),则在快速点击右箭头6次或更多次后会丢失车辆页面.见图:

在此输入图像描述

码:

private func show(viewController:UIViewController, going direction: UIPageViewControllerNavigationDirection) {
    let viewControllers = [viewController]
    let isAnimated = true // false always works. However, animation is required.
    setViewControllers(viewControllers, direction: direction, animated: isAnimated, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)

在调试时以及当页面视图控制器停止显示汽车时,我确保正在设置的视图控制器不是零并且列表(汽车)也是非零的.

我尝试了UIPageViewController的解决方案的变体,如何正确跳转到特定页面而不会弄乱数据源指定的顺序?使用完成块的位置.但是,它没有用.

weak var pvcw: UIPageViewController? = self
setViewControllers(viewControllers, direction: direction, animated: true, completion: {(_ finished: Bool) -> Void in
    let pvcs: UIPageViewController? = pvcw
    if pvcs == nil {
        return
    }
    DispatchQueue.main.async(execute: {() -> Void in
        pvcs?.setViewControllers(viewControllers, direction: direction, animated: false) {(_ finished: Bool) -> Void in }
    })
})
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢.

更新

我注意到有时候所包含的View Controller可以偏离中心而不是完全缺失.

查看控制器偏离中心

我更深入地研究了视图控制器完全丢失的情况.单击"调试视图层次结构"并打开" 显示剪切的内容 "时,视图控制器完全丢失时显示以下内容:

启用显示剪辑的内容

剪辑内容

因此,似乎缺少的内容被剪切/超出范围.

仅显示线框显示以下内容:

仅限线框

页面视图控制器有一个

  • _UIPageViewControllerContentView包含一个
  • _UIQueuingScrollView包含一个
  • UIView包含一个
  • VehicleDetailTableViewController(带有汽车图像和细节的UITableViewController).

事情很奇怪,我也看到_UIQueuingScrollView的界限是完全不同的.当一切正常时,边界的x为1125,而X为375.

仅当使用滚动的过渡样式而不是页面卷曲时才会发生这种情况.使用Page Curl时,一切正常.

我们如何防止/解决这个问题?

第二次更新

此代码使问题消失.然而,它留下了更刺耳的经历.也许由于延迟0.4秒,蓝色背景有时显示正常使用.

private func show(viewController:UIViewController, going direction: UIPageViewControllerNavigationDirection) {

    let viewControllers = [viewController]
    setViewControllers(viewControllers, direction: direction, animated: true, completion: { (_) in

        DispatchQueue.main.asyncAfter(deadline: .now() + 0.4, execute: {
            self.setViewControllers(viewControllers, direction: direction, animated: false, completion: nil)
        })
    })
}
Run Code Online (Sandbox Code Playgroud)

这不是一个好的用户体验.有更好的方法吗?

我希望滚动过渡是平滑的,不要简单地显示蓝色背景,并且不要丢失其内容,即View Controller内容.

fin*_*elp 3

虽然真正的答案是让视图控制器尽可能简单(但不能更简单),但这里的代码解决了当用户导航到下一个视图控制器时偶尔会显示背景的副作用的问题。

private func show(viewController:UIViewController, going direction: UIPageViewControllerNavigationDirection) {

    let viewControllers = [viewController]
    setViewControllers(viewControllers, direction: direction, animated: true, completion: { (_) in

        DispatchQueue.main.asyncAfter(deadline: .now() + 0.4, execute: {
            self.setViewControllers(viewControllers, direction: direction, animated: false, completion: nil)
        })
    })
}
Run Code Online (Sandbox Code Playgroud)