在 UIPageViewController 中滚动多个页面会创建白色闪光

Posted

技术标签:

【中文标题】在 UIPageViewController 中滚动多个页面会创建白色闪光【英文标题】:Scrolling more than one page in a UIPageViewController creates white flash 【发布时间】:2015-08-04 12:02:59 【问题描述】:

所以我创建了一个 UIPageViewController,它的工作方式与我想要的一样,除了一件事。如果我在屏幕上快速滑动手指,页面会向任一侧滚动一个位置,然后弹跳并再次显示下一页的 3/4 厘米。像这样:

零页 || (current)第一页 --> 滚动到第二页 -->浏览第三页

但是,第三页还没有加载,因为这个函数只在当前一个的两侧预加载一个 ViewController,而不是两个,所以在我的例子中,它会预加载页面零和第二,而不是三个,因此创建一个白色的一瞥,直到我打算从第二页滚动到那里。

预加载周边页面的方法:

-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController
 viewControllerBeforeViewController:(UIViewController *)viewController

-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController
  viewControllerAfterViewController:(UIViewController *)viewController

我该如何解决这个问题??

编辑:

我像这样在 UIPageViewController 中声明我的 ViewControllers:

NSMutableArray *_viewControllers;

然后我像这样填充数组:

_viewControllers = [NSMutableArray new];
    for (MyModel *currentObject in _myObjects)

    MyViewController *page = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewControllerID"];
    // setup page with variables
    [_viewControllers addObject:page]; // add the page to the viewControllers array


然后这些是委托方法:

-(UIViewController *)viewControllerAtIndex:(NSUInteger)index

return _viewControllers[index];


-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController
 viewControllerBeforeViewController:(UIViewController *)viewController

NSUInteger currentIndex = [_viewControllers indexOfObject:viewController];
if (currentIndex > 0)  currentIndex--;  else  currentIndex = ([_viewControllers count] - 1); 

return [_viewControllers objectAtIndex:currentIndex];


-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController
  viewControllerAfterViewController:(UIViewController *)viewController

NSUInteger currentIndex = [_viewControllers indexOfObject:viewController];
if (currentIndex < ([_viewControllers count] - 1))  currentIndex++;  else  currentIndex = 0; 

return [_viewControllers objectAtIndex:currentIndex];


-(NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController

return _viewControllers.count;


-(NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController

return 0;

MyModel 只是我为用数据填充 ViewControllers 而构建的一个类

谢谢!

【问题讨论】:

一些实际代码将帮助我们识别问题。 @Tander 请查看更新后的问题 你设置了滚动的过渡风格吗? @tikider 我有,是的 你在哪里使用 -(UIViewController *)viewControllerAtIndex:(NSUInteger)index;代表不需要它 【参考方案1】:

我认为您需要使用自定义缓存实现自己的 pageViewController。但是为了避免用户看到白色的一瞥,您可以在过渡期间禁用用户交互:

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers
    [pageViewController.view setUserInteractionEnabled:NO];


- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
    [pageViewController.view setUserInteractionEnabled:YES];

【讨论】:

【参考方案2】:

我刚刚遇到了类似的问题。如果您使用的是 Interface Builder,请确保选中“Clip Subviews”复选框以查看您提供 id @"MyViewControllerID" 的 UIViewController(或子类)的视图。

或者只是:

_viewControllers = [NSMutableArray new];
    for (MyModel *currentObject in _myObjects)

    MyViewController *page = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewControllerID"];
    // Clip this view's overflowing subviews
    page.view.clipsToBounds = YES;
    // setup page with variables
    [_viewControllers addObject:page]; // add the page to the viewControllers array


【讨论】:

以上是关于在 UIPageViewController 中滚动多个页面会创建白色闪光的主要内容,如果未能解决你的问题,请参考以下文章

UIPageViewController 背景在 Objective C iOS 中从不透明

获取 UIPageViewController 的滚动位置

在故事板中使用 UIPageViewController

如何在 UIPageViewController 和孩子之间正确传递对象

使用 UIPageViewController 在多个视图控制器之间滑动

带有 Peeking 的 UIPageViewController