iOS:使用手势进行页面切换时,UIPagesViewController有时无法正确显示

我有一个2页的UIPagesViewController 。 一页显示在这里:
在这里输入图像说明
可以通过手势或单击工具栏中的button切换页面。

button切换始终正确使用该方法

 -(void)switchViewControllers { if (self.pageIndex == 1) { self.pageIndex = 0; [self setViewControllers:@[self.gameControllers[0]] direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:nil]; } else { self.pageIndex = 1; [self setViewControllers:@[self.gameControllers[1]] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; } } 

但是, 通过手势切换只能在大部分时间内正确地进行,但有时产生的场景看起来像以下图像之一:
在这里输入图像说明在这里输入图像说明在这里输入图像说明
如果场景看起来像上面的左侧图像,则半button可见不起作用。 但是页面仍然可以通过手势进行切换,一切都可以再次运行。
问题发生在模拟器和设备上。
我不知道什么是错的,也不知道如何避免这个问题。 任何暗示都非常受欢迎。

编辑(由于Bartek的答案):
即使从未以编程方式切换页面,也会出现此问题。

更新:
我现在意识到如下情况:如果页面视图处于3个错误场景中左侧所示的状态,并且向右拖动几个像素,那么在所有3个图像上可以看到的垂直条消失,图像显示正确,并移回到正确的位置。 如果我稍微拖动一下,然后松开,再次显示垂直条。 所以这显然是一个UIPageViewController错误。

这是为我工作的解决scheme:

其实我有两个不同的问题。

1)你可以在上面的图像中看到垂直条纹。
我的UIPageViewController提供的视图控制器有一个UIImageView子视图覆盖整个视图,用于背景图像(上面的虚线背景)。 我在开发过程中使用了文件名为“Fond1.jpg”的大小为2480×3507的图像。 当我反而分配一个大小为640×1092的图像文件名为“Fond1@2x.png”,条纹消失了。

2)上面显示的黑色图像。
当我进行页面切换的速度非常快时,这显然发生了,也就是如此快,以至于第二个切换animation在第二个切换animation启动时还没有完成。 我在这里find了一个解决scheme,显然也适用于我(从那以后我没有这样的问题)。

其实我觉得这两个问题都是由iOS中的错误引起的:当可以使用jpg图片时,应该正确处理它们。 而UIPageViewController应该能够自己处理一个很快的页面切换的情况。

UIPageViewControllerUIPageViewController地狱,特别是如果你混合切换页面的手势与代码切换。
你可能想要尝试的是强制UIPageViewController重新加载其caching切换页面的代码(而不是手势)。 所以,例如:

 -(void)switchViewControllers { // Resetting dataSource will cause UIPageViewControllerDataSource to rebuild its view controller stack cache id<UIPageViewControllerDataSource> dataSource = self.dataSource; self.dataSource = nil; self.dataSource = dataSource; if (self.pageIndex == 1) { self.pageIndex = 0; [self setViewControllers:@[self.gameControllers[0]] direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:nil]; } else { self.pageIndex = 1; [self setViewControllers:@[self.gameControllers[1]] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; } } 

这看起来很可怕,但诀窍。
详细来说,UIPageViewController似乎有一些视图控制器堆栈的底层caching。 当我们不是通过手势而是通过代码切换页面时,这个caching看起来不同步。 如果它是一个错误,我不会感到惊讶,单UIPageViewController充满了这些。

所以,当viewControllers设置帮助时,强制UIPageViewController重新加载它的caching。 实现这一点的最好方法是重置dataSource,如上例所示。

我希望这有帮助。

而且你不要依赖UIPageViewController太多:)