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

时间:2014-10-23 12:32:49

标签: ios

我有一个UIPagesViewController,有2页。这里显示一页:
enter image description here
可以通过手势或单击工具栏中的按钮来切换页面。

使用方法

正确切换按钮
-(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];
    }
}

然而手势切换只能在大部分时间正常工作,但有时候生成的场景看起来像下列图像之一:
enter image description here enter image description here enter image description here
如果场景看起来像上面的左图,则可见的半按钮不起作用。但页面仍然可以通过手势切换,一切都可以正常工作 问题发生在模拟器和设备上 我不知道什么是错的,也不知道如何避免这个问题。任何提示都非常受欢迎。

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

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

2 个答案:

答案 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:)