如果快速滑动,则不会调用 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
【讨论】:
我遇到了同样的问题,我在同一个代码块中初始化和分配dataSource
和delegate
,我注意到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
以获得更好的结果。
【讨论】:
这个实现没有满足人们点击页面控制点来切换页面的情况。所以你可能仍然需要在willTransitionToViewControllers
和didFinishAnimating
上实现UIPageViewControllerDelegate
以上是关于如果快速滑动,则不会调用 UIPageViewController didFinishAnimating的主要内容,如果未能解决你的问题,请参考以下文章
仅在 uiPageViewController 中禁用临时向前滑动
Android ListView的数据如果有112个,右侧会出现一个可以拉动的快速默认滑动条,111个不会出现的