UIQueuingScrollView中的断言失败didScrollWithAnimation:force:

时间:2012-10-16 14:02:04

标签: iphone ios uipageviewcontroller

我已设置UIPageViewController分页ImageViewController

ImageViewController包含UIScrollView,里面有UIImageView。没别了。

我正在测试UIPageViewController的数据源中的3个“项目”(即三页)。

一切正常,我可以滚动和缩放,然后翻页大约30秒,然后突然我收到这个警告......

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

我不知道从哪里开始调试它,因为它没有指向我的任何代码,并且堆栈中没有任何代码或任何东西。

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

修改

我做了一些测试。如果scrollView正在减速(即在轻弹之后)似乎会发生,然后我尝试将PageViewController转换到另一个ViewController,因为scrollview仍在移动。

应用程序在转换到下一页的过程中崩溃了大约20%。

编辑2

错误似乎停在_cache_getImp行上(不确定这是大写字母i还是小写字母L)。

编辑3

这变得更好。我刚刚下载了Apple的PhotoScroller示例应用程序,看看他们是否以不同的方式解决了问题。嗯,不,他们没有。示例应用程序以与我的方式完全相同的方式崩溃!你必须同时缩放,滚动和转换页面,以使其更容易崩溃,但它也可能发生在它自己也可能需要更长的时间。

5 个答案:

答案 0 :(得分:5)

想出一个解决方案!在我的情况下,我有UIPageViewController UIPageViewControllerTransitionStyleScroll以及下一个按钮,允许用户通过点击进入我的viewpager。当用户按下下一个按钮并在释放他们的手指之前稍微拖动(仍然在按钮的框架内)时,我正在收到此崩溃。在这种情况下,按钮内的拖动似乎会干扰UIPageViewController的平移手势识别器,这就是导致崩溃的原因。

虽然用户不太可能进入这种状态,但我提出了一个相对简单的解决方案,可以防止我的应用程序崩溃。我有一个布尔值表示用户是否处于有效状态以移动到下一个屏幕并在触摸时将其设置为YES,如果用户拖动我的按钮内的任何位置则为NO。然后,在touchUp(nextPressed)上,我以编程方式移动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];
  }
}

缺点是即使用户仍然将手指放在按钮框内,也不会发生任何事情。但是,我更倾向于崩溃,并认为这是一个非常罕见的边缘情况。我希望用户可以再次点击 - 这次没有点击和放大拖 - 并成功前进。

我欢迎任何有关进一步采取措施并防止触摸拖动与UIPageViewController完全冲突的想法。

答案 1 :(得分:1)

您是否尝试过禁用UIScrollView中的弹跳?这对我有用,并解决了我在上面的评论中提到的其他问题。

答案 2 :(得分:1)

我整天都在和这个人打架。 我的结论:

如果您有一个滚动视图作为显示ViewController并且您是滚动的委托:您遇到了麻烦。即使配置了水平滚动的PageViewController,视图上的垂直滚动也会触发事件。 - >如果出现以下情况,这不会造成麻烦:您之前回滚到视图的顶部(不确定如何解决此问题)。

有很好的StackOverflow线程,如this one

基本上解决方案是:

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

2使用UIPageViewControllerTransitionStylePageCurl作为过渡样式。

这解决了我的大多数问题。

如果某人有滚动授权问题的解决方案,那将是最好的

答案 3 :(得分:0)

我有类似的问题。我的设置是UIPageViewController,我正在加载内部有UIImageView的视图控制器。在UIPageViewController滚动时进行交互时,我得到了相同的崩溃日志。

我修改了UILongPressGestureRecognizer并添加到UIPageViewController的滚动视图。

  1. 创建了我自己的UIPageViewController子类(解决方案特定于我的案例,但可以很容易地用作通用解决方案)

  2. 找到UIPageViewController

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

    /**
     *  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];
    }
    

答案 4 :(得分:-2)

它肯定看起来像iOS 8和9中的错误。 (以及"答案"下面尝试解决这个问题)

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

包括您已经看到它崩溃的所有iOS版本

到目前为止,我已经看到了:

  

断言失败 - [XXX.TrackingPageViewController queuingScrollView:didEndManualScroll:toRevealView:direction:animated:didFinish:didComplete:],/ BuildRoot / Library / Cache / com.xapple.xbs / Source / UIKit / UIKit-3512.60.12 / UIPageViewController.m:2028

     

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

我会更新列表(尽管是低调的,无论多么大规模)。 请继续关注。

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

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

真棒