我有一个UIPagesViewController
,有2页。这里显示一页:
可以通过手势或单击工具栏中的按钮来切换页面。
使用方法
正确切换按钮-(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];
}
}
然而手势切换只能在大部分时间正常工作,但有时候生成的场景看起来像下列图像之一:
如果场景看起来像上面的左图,则可见的半按钮不起作用。但页面仍然可以通过手势切换,一切都可以正常工作
问题发生在模拟器和设备上
我不知道什么是错的,也不知道如何避免这个问题。任何提示都非常受欢迎。
更新
我现在意识到以下情况:如果页面视图处于3个故障场景中左侧显示的状态,我向右拖动几个像素然后放开,所有3个图像上可见的垂直条右侧消失,图像显示正确,并移回正确的位置。如果我然后向左拖动它然后松开,再次显示该垂直条。所以这显然是一个UIPageViewController错误。
答案 0 :(得分:1)
以下是适合我的解决方案:
实际上我有两个不同的问题。
1)您可以在上图中看到的垂直条纹。
UIPageViewController
显示的我的视图控制器具有覆盖整个视图的UIImageView
子视图,用于背景图像(上面的虚线背景)。我在开发过程中使用了大小为2480x3507的图像,文件名为#34; Fond1.jpg"。当我改为使用文件名" Fond1@2x.png"分配尺寸为640x1092的图像时,条纹消失了。
2)上面显示的黑色图像。
这显然发生在我非常快速地进行页面切换时,即第一次切换动画在第二次切换动画启动时尚未完成。我发现here一个解决方案显然也适用于我(从那以后我没有遇到过这样的问题)。
实际上我认为这两个问题都是由iOS中的错误引起的:当可以使用jpg图像时,应该正确处理它们。并且UIPageViewController
应该能够处理自己尝试非常快速页面切换的情况。
答案 1 :(得分:0)
UIPageViewController
很糟糕,特别是如果您通过手势切换切换页面与代码切换
您可能想要尝试的是强制UIPageViewController
在按代码(而不是手势)切换页面时重新加载其缓存。所以,例如:
-(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似乎有一些视图控制器堆栈的底层缓存。当我们不是通过手势而是通过代码切换页面时,此缓存似乎不同步。如果它是一个bug,我不会感到惊讶,只有UIPageViewController
充满了那些。
因此,当设置viewControllers有帮助时,强制UIPageViewController
重新加载其缓存。实现这一目标的最佳方法是重置dataSource,如上例所示。
我希望这会有所帮助。
而且你不太依赖UIPageViewController
:)