33

我已经UIPageViewController设置了寻呼我的ImageViewController.

ImageViewController包含UIScrollView一个内部UIImageView。没有其他的。

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

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

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

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

有人可以给我一个关于从哪里开始调试的指针。

编辑

我做了更多的测试。如果滚动视图正在减速(即在轻弹之后),那么似乎会发生这种情况,然后我尝试将 PageViewController 转换到另一个 ViewController,因为滚动视图仍在移动。

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

编辑 2

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

编辑 3

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

4

5 回答 5

5

Came up with a solution! In my case I have a UIPageViewController with UIPageViewControllerTransitionStyleScroll as well as next buttons that allow the user to advance through my viewpager by tapping. I am getting this crash when the user presses a next button and drags around slightly before releasing their finger (still within the frame of the button). It appears that the dragging within the button is interfering with UIPageViewController's pan gesture recognizer in this case, and that's what causes the crash.

While it's pretty unlikely that the user will get in this state, I've come up with a relatively simple solution the prevents my app from crashing if it does happen. I have a boolean that represents if the user is in a valid state to move to the next screen and set it to YES on touch down, then to NO if the user drags anywhere inside my button. Then, on touchUp (nextPressed) I check the boolean before moving my UIPageViewController programatically.

- (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];
  }
}

The downside is that nothing will happen even though the user still released their finger within the button frame. However, I prefer this over a crash and see this as a pretty rare edge case regardless. I'd expect the user would just tap again - this time without a tap & drag - and move forward successfully.

I'd welcome any ideas on taking this a step further and preventing the clash between the touch drag and the UIPageViewController altogether.

于 2013-12-14T10:56:06.007 回答
1

我整天都在和这个作斗争。我的结论:

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

有像这样的好 StackOverflow 线程。

基本上解决方案是:

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

2 使用 UIPageViewControllerTransitionStylePageCurl 作为过渡样式。

这解决了我的大部分问题。

如果有人对滚动的委托问题有解决方案,将是最受欢迎的

于 2014-01-15T14:42:19.320 回答
1

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

于 2012-12-03T14:15:18.237 回答
0

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

我通过创建UILongPressGestureRecognizer并添加到UIPageViewController的滚动视图来修复它。

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

  2. 找到内部 UIScrollView 的UIPageViewController

    - (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];
    }
    
于 2014-05-13T16:52:17.437 回答
-1

它肯定看起来像 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)

我会保持更新列表(尽管投票反对,但数量很大)。敬请关注。

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

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

惊人的

于 2016-09-13T14:33:50.093 回答