UIPageViewController 缓存

Posted

技术标签:

【中文标题】UIPageViewController 缓存【英文标题】:UIPageViewController caching 【发布时间】:2014-06-04 10:01:14 【问题描述】:

我有一个带有动态变化数据源的 UIPageViewController -

viewControllerAfterViewController

viewControllerBeforeViewController

如果数据还没有准备好,则返回 nil,如果数据准备好,则返回视图控制器。如果我尝试在某些时候快速向左翻页多次 viewControllerAfterViewController 将不再被调用。

可能是什么问题?我想 UIPageViewController 认为它知道一切并且什么都没有改变,所以它不调用那个方法,对吗?如何“重置”此缓存?

我使用 curl 过渡样式,这似乎只发生在横向模式下。

【问题讨论】:

【参考方案1】:

我最终使用了自己的滑动手势。

    首先从 UIPageViewController 中移除现有的滑动手势

    for (UIGestureRecognizer * recognizer in _pageViewController.gestureRecognizers) 
        recognizer.enabled = NO;
    
    

    然后将你自己的滑动手势识别器添加到 UIPageViewController

    UISwipeGestureRecognizer * rightRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleRightSwipe:)];
    [rightRecognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
    [_pageViewController.view addGestureRecognizer:rightRecognizer];
    
    UISwipeGestureRecognizer * leftRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleLeftSwipe:)];
    [leftRecognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
    [_pageViewController.view addGestureRecognizer:leftRecognizer];
    
    - (void) handleRightSwipe: (id) sender 
    // your swipe handler here 
    // note that you need  to call didFinishAnimating manually now
    
    // manually calculate next/prev view controller, also you should consider orientation too
     UIViewController * nextController = [_modelController pageViewController:_pageViewController viewControllerAfterViewController:existingController];
    
    
    __weak typeof(self) weakSelf = self;
    __weak UIPageViewController * wController = _pageViewController;
    [_pageViewController setViewControllers:@[nextController] direction:
        UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL completed)
            [weakSelf pageViewController:wController didFinishAnimating:YES previousViewControllers:@[existingController] transitionCompleted:YES];
        ];
      
     
    

此外,您可以尝试不删除现有的滑动手势,如果现有识别器触发,它看起来不会调用您的自定义滑动手势,这样您在拖动页面角时也有很好的动画(如果您删除所有识别器)。

【讨论】:

以上是关于UIPageViewController 缓存的主要内容,如果未能解决你的问题,请参考以下文章

添加专用 UI​​ViewController(例如 Monotouch 中的 UIPageViewController)的正确方法是啥?

UIPageViewController 缓存和交换具有相似内容的页面的视图层次结构

使用 UIPageViewController 使 UI 滚动视图滚动

Swift pagecontroller 故事板 UI 对象与 UIPageviewcontroller 连接

UIPageViewController -presentationCount 不触发

如何更改 UIPageViewController 中的按钮名称