UIPageViewController在快速滑动时无法调用didFinishAnimating函数

19
我有一个UIPageViewController,它的功能符合预期。我可以向左或向右滚动,当我每次滚动时都会调用委托方法didFinishAnimating。但是,如果我滚动得太快,最终会停留在一个页面上,在该页面上didFinishAnimating不会被调用,而对于所有之前的页面,它都被调用了。有人知道这可能是为什么吗?
我认为无论如何(例如,即使中途中止翻页),didFinishAnimating都应该在每个页面转换时被调用。

6
我已经调查了一段时间,似乎这是UIPageViewController实现中的一个bug。我正在考虑摆脱UIPageViewController并使用自定义UIScrollView实现来解决这个问题。 - Matt R
1
很高兴知道有其他人能够重现这种行为。 - mattnedrich
你好,你有找到任何解决方法吗? - Arslan Asim
2个回答

14

这个问题在2017年仍然存在。我尝试了许多替代方法,但现在我已经放弃了希望,认为最好的方式是使用协议来将UIPageViewController与内容ViewController绑定,这样我们就可以在viewDidAppear()中通知UIPageViewController


我曾经遇到过同样的问题,我在同一段代码块中初始化并分配了dataSourcedelegate,但我注意到delegate方法没有被调用。然后我在初始化时分配了dataSource,在后台进程之后分配了delegate,这样就可以调用delegate方法了。我猜这是一个奇怪的错误,可能是他们(苹果公司)在2017年破坏了它。 - Pratik Jamariya

2
我遇到了同样的问题。我尝试使用UIScrollView代理而不是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 来获得更好的结果。

1
这个实现没有考虑到人们点击页面控件点来切换页面的情况。因此,您可能仍然需要在 willTransitionToViewControllersdidFinishAnimating 上实现 UIPageViewControllerDelegate - chakming

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接