如果快速刷卡,UIPageViewController didFinishAnimating不会被调用

时间:2014-06-17 14:27:43

标签: ios objective-c cocoa-touch uipageviewcontroller

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

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

2 个答案:

答案 0 :(得分:10)

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

中通知UIPageViewController

答案 1 :(得分:2)

我遇到了同样的问题。我尝试使用UIScrollView delegate代替UIPageViewController来解决问题。 这是一个棘手的方法,不建议使用。

1.点击UIScrollView中的UIPageViewController设置委托:

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

2.override 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来获得更好的结果。