如果快速滑动,则不会调用 UIPageViewController didFinishAnimating

Posted

技术标签:

【中文标题】如果快速滑动,则不会调用 UIPageViewController didFinishAnimating【英文标题】:UIPageViewController didFinishAnimating not called if swiped quickly 【发布时间】:2014-06-17 14:27:43 【问题描述】:

我有一个按预期工作的 UIPageViewController。我可以左右滚动,当我滚动每个方向时会调用委托方法didFinishAnimating。但是,如果我滚动得太快,我最终会进入一个没有调用 didFinishAnimating 的页面,尽管它会为所有以前的页面调用。有谁知道为什么会发生这种情况?

我认为didFinishAnimating 会在每次页面转换时被调用,不管(例如,即使轮到中止)。

【问题讨论】:

我已经研究这个问题一段时间了,它看起来很可能是 UIPageViewController 实现中的一个错误。我正在讨论摆脱 UIPageViewController 并使用自定义 UIScrollView 实现来解决这个错误。 很高兴知道其他人能够重现此行为。 嗨,您有解决办法吗? 【参考方案1】:

这个错误在 2017 年仍然存在.. 我尝试了许多替代方法.. 现在我放弃了 Apple 修复这个问题的希望,我认为最好的方法是使用协议将 UIPageViewController 与内容 @ 绑定987654322@,所以我们可以在viewDidAppear()中通知UIPageViewController

【讨论】:

我遇到了同样的问题,我在同一个代码块中初始化和分配dataSourcedelegate,我注意到delegate 方法没有被调用。然后我在初始化时分配了dataSource,在后台进程调用delegate 方法之后分配了delegate。这是一个奇怪的错误,我猜他们(Apple)在 2017 年打破了它。【参考方案2】:

我也有同样的问题。我尝试使用UIScrollView delegate 而不是UIPageViewController 来解决问题。 这是一个棘手的方法,不推荐使用。

1.获取UIPageViewController中的UIScrollView设置委托:

for (UIView *view in self.view.subviews) 
    if ([view isKindOfClass:[UIScrollView class]]) 
        UIScrollView *scroll = (UIScrollView *) view;
        scroll.delegate = self;
    

2.覆盖scrollViewWillBeginDragging:(UIScrollView *)scrollView

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
    [[NSNotificationCenter defaultCenter] postNotificationName:PageSwitchingBegan
                                                    object:nil];

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
    [[NSNotificationCenter defaultCenter] postNotificationName:PageSwitchingEnded
                                                    object:nil];

您也可以尝试覆盖- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 而不是scrollViewDidEndDragging 以获得更好的结果。

【讨论】:

这个实现没有满足人们点击页面控制点来切换页面的情况。所以你可能仍然需要在willTransitionToViewControllersdidFinishAnimating上实现UIPageViewControllerDelegate

以上是关于如果快速滑动,则不会调用 UIPageViewController didFinishAnimating的主要内容,如果未能解决你的问题,请参考以下文章

仅在 uiPageViewController 中禁用临时向前滑动

Android ListView的数据如果有112个,右侧会出现一个可以拉动的快速默认滑动条,111个不会出现的

Swift:处理自定义幻灯片菜单中的快速滑动

使用 uiswipegesturerecognizer 快速更新 uitableviewcell 的框架

如何使用点击事件使其不会传播到视图

如果谓词使用 IN,则不会调用 NSFetchedResultsControllerDelegate 方法?