UIQueuingScrollView didScrollWithAnimation中的断言失败:force:

我有一个UIPageViewController设置分页我的ImageViewController

ImageViewController里面包含一个带有UIImageViewUIScrollView 。 没有其他的。

我正在testing在我的数据源为UIPageViewController (即三页)的3“项目”。

这一切工作正常,我可以滚动和缩放,然后页面约30秒,然后突然我得到这个警告…

 *** Assertion failure in -[_UIQueuingScrollView _didScrollWithAnimation:force:], /SourceCache/UIKit/UIKit-2372/_UIQueuingScrollView.m:778 

我不知道在哪里开始debugging,因为它不指向我的任何代码,也没有任何我的代码在堆栈或任何东西。

有人可以给我一个指针,从哪里开始debugging。

编辑

我做了更多的testing。 它似乎发生,如果scrollView正在减速(即轻弹后),然后我试图将PageViewController过渡到另一个ViewController作为scrollview仍在移动。

该应用程序通过转换到下一页崩溃了大约20%的方式。

编辑2

该错误似乎停止_cache_getImp行(不知道如果这是一个大写我小写的L)。

编辑3

这会好起来的 我刚刚下载了Apple的PhotoScroller示例应用程序,看看他们是否以不同的方式解决了问题。 那么,不,他们没有。 示例应用程序崩溃的方式完全一样,我的! 您必须同时缩放和滚动并转换页面,以使其更容易崩溃,但也会发生在自己身上,这可能需要更长的时间才能发生。

想出了一个解决scheme! 在我的情况下,我有UIPageViewController UIPageViewControllerTransitionStyleScroll以及下一个button,允许用户通过点击前进通过我的viewpager。 当用户按下下一个button并在松开手指(仍然在button的框架内)之前稍微拖动时,我正在发生这种崩溃。 在这种情况下,button内的拖动会干扰UIPageViewController的平移手势识别器,这就是导致崩溃的原因。

虽然用户不太可能进入这种状态,但我想出了一个相对简单的解决scheme,防止我的应用程序崩溃,如果它发生。 我有一个布尔值,表示用户是否处于有效状态,以便移动到下一个屏幕,并在触摸时将其设置为YES,如果用户拖动button内的任何位置,则将其设置为NO。 然后,在touchUp(nextPressed)上检查布尔值,然后UIPageViewController编程方式移动我的UIPageViewController

 - (IBAction)touchDown:(id)sender { self.shouldAdvanceToNextScreen = YES; } - (IBAction)touchDragInside:(id)sender { self.shouldAdvanceToNextScreen = NO; } - (IBAction)nextPressed:(id)sender { if (self.shouldAdvanceToNextScreen) { UIViewController *initialViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"TutorialScreen2"]; NSArray *viewControllers = [NSArray arrayWithObject:initialViewController]; [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; } } 

缺点是即使用户仍然在button框内松开手指,也不会发生任何事情。 不过,我更喜欢这个崩溃,不pipe怎么看,这是一个非常罕见的边缘情况。 我希望用户只需再次点击 – 这次不需要点击和拖动,并成功地向前移动。

我欢迎任何想法,进一步采取这一步,并防止触摸拖动和UIPageViewController之间的冲突。

你有没有尝试禁用UIScrollView弹跳? 这对我有用,解决了我上面提到的我的其他问题。

我一整天都在为此而战。 我的结论:

如果你有一个滚动视图作为显示ViewController,你是滚动的委托:你有麻烦。 即使使用水平滚动configurationPageViewController,垂直滚动视图也会触发事件。 – >这不会造成麻烦,如果:你回滚到您的视图的顶部之前(不知道如何解决这个问题)。

有这样的好StackOverflow线程。

基本上解决scheme是:

1 [yourView setViewControllers:yourControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

2使用UIPageViewControllerTransitionStylePageCurl作为过渡样式。

这固定了我的大部分问题。

如果有人有滚动的代表问题的解决scheme,将是最好的

我有一个类似的问题。 我的设置是一个UIPageViewController ,我用UIImageView里面加载视图控制器。 当UIPageViewController滚动时进行交互时,我得到了相同的崩溃日志。

我通过创build一个UILongPressGestureRecognizer来修复它,并添加到UIPageViewController的滚动视图中。

  1. 创build了我自己的UIPageViewController的子类(解决scheme是特定于我的情况,但可以很容易地作为一个通用的解决scheme)

  2. findUIPageViewController的内部UIScrollView

     - (UIScrollView *)findScrollView { UIScrollView *scrollView; for (id subview in self.view.subviews) { if ([subview isKindOfClass:UIScrollView.class]) { scrollView = subview; break; } } return scrollView; } 
  3. 将长按手势识别器添加到内部滚动视图,并将其动作指向方法或nil

     /** * On tap-hold the page view controller crashes as soon as it pages to a new view controller. * Setting a long press gesture to ignore the hold. */ - (void)listenForLongPressGestureOnScrollView:(UIScrollView *)scrollView { UILongPressGestureRecognizer *longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:nil]; [longPressGestureRecognizer setMinimumPressDuration:0.5]; [scrollView addGestureRecognizer:longPressGestureRecognizer]; } 

它确实看起来像在iOS 8和9的错误(和下面的“答案”试图解决这个问题)

随意在bugreport.apple.com上提交一张票请务必指定如何使PhotoScroller崩溃

包括你所看到的所有iOS版本

迄今为止我已经看到:

声明失败 – [XXX.TrackingPageViewController queuingScrollView:didEndManualScroll:toRevealView:direction:animated:didFinish:didComplete:],/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.60.12/UIPageViewController.m :2028

– [_ UIQueuingScrollView _didScrollWithAnimation:force:],/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.60.12/_UIQueuingScrollView.m:785(lldb)中的断言失败

我会保持更新的列表(尽pipedownvoting,无论大规模)。 敬请关注。

它看起来不像我们的错误。

UPD 2016 09 27(在Xcode 8上):

声明失败 – [XXX.TrackingPageViewController queuingScrollView:didEndManualScroll:toRevealView:direction:animated:didFinish:didComplete:],/ SourceCache /UIKit/UIKit-3347.44.2.2/UIPageViewController.m:1875

真棒