在 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 和孩子之间正确传递对象