UIPageViewController 滚动(过度滚动)

Posted

技术标签:

【中文标题】UIPageViewController 滚动(过度滚动)【英文标题】:PageViewController scroll bug (over scrolls) 【发布时间】:2016-08-24 02:30:31 【问题描述】:

我按照教程 here 进行了一些更改以适应我的项目(code of my variation here,抱歉我把它放在 GitHub 上,因为复制和粘贴有点长)。有时当我向右滑动以到达最后一个 VC 时,它会自动关闭。其他时候它可以正常工作,如果我滑动到最后一个 VC,它会一直停留在那里,直到我再次向右滑动以关闭它。我在代码中放置了打印语句,以帮助我找到错误所在。这是print statements when it works 和when it doesn't work。查看日志,由于以相同的顺序访问完全相同的代码,我不确定如何修复此错误。当过渡样式为PageCurl 而不是Scroll 时,不会出现此问题。

【问题讨论】:

请不要让我链接到其他页面只是为了查看您的日志。或者你的相关代码。 你能解释一下“一见钟情”是什么意思吗?我什至无法说出问题所在。您还没有尝试描述这种情况的架构。 @stumped 你有解决方案吗?我也有同样的问题。 【参考方案1】:

首先您需要了解 pageViewController 的工作原理。 加载第一页后,当您开始滚动时,它将尝试加载下一页。这只是第一页。之后,一旦您到达一个页面,它将预加载下一页(取决于方向)并准备好。

在您的情况下,当您到达第 5 页时,pageViewController 将尝试 preload 指向您的这部分代码的下一页

guard orderedViewControllersCount != nextIndex else 

        print("last item in coachamrks going to dismiss")
        self.dismissViewControllerAnimated(true, completion: nil)

        return orderedViewControllers.first
    

一旦您到达第 5 页,它就会关闭 viewController。 这不是错误。这是 pageViewController 的默认行为。

我认为您有时会发现它的行为方式与您的错误预期的原因是,当您以足够快的速度滚动页面时,pageViewController 会出于性能原因停止预加载页面。

您可以实现您想要的唯一方法是访问 pageViewController 内部的滚动视图的黑客方式,但它不安全,并且如果 Apple 在未来的更新中更改 pageViewControllers 的架构,可能会破坏您的应用程序。

我建议你在最后一页放一个按钮,用它来关闭pageViewController。

【讨论】:

以上是关于UIPageViewController 滚动(过度滚动)的主要内容,如果未能解决你的问题,请参考以下文章

UIPageViewController 中的 UIScrollView 滚动了多少?

获取 UIPageViewController 的滚动位置

停止 UIPageViewController 的滚动事件

告诉 UIPageViewController 何时滚动(用于图像的视差滚动)

UIPageViewController 滚动(过度滚动)

UICollectionViewController 在 UIPageViewController 中时无法滚动