Подтвердить что ты не робот

Ошибка утверждения в UIQueuingScrollView didScrollWithAnimation: force:

У меня есть UIPageViewController настройка подкачки my ImageViewController.

ImageViewController содержит UIScrollView с UIImageView внутри. Больше ничего.

Я тестирую в данный момент с 3 "элементами" в моем источнике данных для UIPageViewController (т.е. трех страниц).

Все работает отлично, и я могу прокручивать и масштабировать, а затем страницу в течение примерно 30 секунд, а затем вдруг получаю это предупреждение...

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

Я не знаю, с чего начать отлаживать его, хотя он не указывает на какой-либо из моего кода, и в моем стеке нет ни одного кода.

Может кто-нибудь дать мне указатель относительно того, где начать отлаживать это.

ИЗМЕНИТЬ

Я провел немного больше тестирования. Похоже, что если scrollView замедляется (т.е. После щелчка), а затем я пытаюсь перейти с помощью PageViewController на другой ViewController, поскольку перемещение прокрутки все еще перемещается.

Приложение сбрасывает около 20% пути через переход на следующую страницу.

РЕДАКТИРОВАТЬ 2

Ошибка, похоже, останавливается на строке _cache_getImp (не уверен, что это капитал я или строчный регистр L).

РЕДАКТИРОВАТЬ 3

Это становится лучше. Я просто скачал приложение Apple PhotoScroller, чтобы посмотреть, не обошли ли они проблему. Ну, нет, они этого не сделали. Пример приложения падает точно так же, как и мой! Вы должны одновременно масштабировать и прокручивать страницы и переходить на страницы, чтобы сделать их более вероятными, но это может произойти и на самом деле. Это может занять больше времени.

4b9b3361

Ответ 1

Придумал решение! В моем случае у меня есть UIPageViewController с UIPageViewControllerTransitionStyleScroll, а также следующие кнопки, которые позволяют пользователю продвигаться через мой просмотрщик, нажав. Я получаю этот сбой, когда пользователь нажимает следующую кнопку и немного перемещается, прежде чем отпускать палец (все еще в пределах рамки кнопки). Похоже, что перетаскивание внутри кнопки в этом случае мешает UIPageViewController распознаванию жеста каретки, а также тому, что вызывает сбой.

В то время как маловероятно, что пользователь получит это состояние, я придумал относительно простое решение, предотвращающее сбой моего приложения, если это произойдет. У меня есть логическое значение, которое представляет, если пользователь находится в правильном состоянии, чтобы перейти к следующему экрану и установить его в YES при касании вниз, а затем в НЕТ, если пользователь перетаскивает где-нибудь внутри моей кнопки. Затем, на 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 вообще.

Ответ 2

Вы пытались отключить подпрыгивание в UIScrollView? Это сработало для меня и решило мою другую проблему, о которой я уже упоминал в своем комментарии выше.

Ответ 3

Я борюсь с этим весь день. Мои выводы:

Если у вас есть scrollview как показывающий ViewController, и вы делегируете свитки: у вас проблемы. Даже с помощью PageViewController, настроенного с горизонтальной прокруткой, вертикальная прокрутка на вашем представлении вызовет событие. → это не вызывает проблем, если: вы сначала прокручиваете назад в начало своего просмотра (не знаете, как это исправить).

Есть хорошие потоки StackOverflow, такие как этот.

В основном решение:

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

2 Используйте UIPageViewControllerTransitionStylePageCurl как стиль перехода.

Это фиксировало большинство моих проблем.

Если у кого-то есть решение проблем с делегацией с прокруткой, будет наиболее хорошо

Ответ 4

У меня была аналогичная проблема. Моя настройка была UIPageViewController, и я загружал контроллеры просмотра с UIImageView внутри. При взаимодействии во время прокрутки UIPageViewController я получил тот же журнал сбоев.

Я исправил его, создав UILongPressGestureRecognizer и добавив в прокрутку UIPageViewController.

  • Создал собственный подкласс UIPageViewController (решение специфично для моего случая, но может легко использоваться в качестве общего решения)

  • Найдите внутренний UIScrollView UIPageViewController

    - (UIScrollView *)findScrollView
    {
        UIScrollView *scrollView;
        for (id subview in self.view.subviews)
        {
            if ([subview isKindOfClass:UIScrollView.class])
            {
                scrollView = subview;
                break;
            }
        }
    
        return scrollView;
    }
    
  • Добавьте длинный распознаватель жестов к внутреннему экрану прокрутки и укажите его действие на метод или 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];
    }
    

Ответ 5

Это наверняка выглядит как ошибка в iOS 8 и 9. (и "ответы" ниже пытаются обойти это)

Не забудьте отправить билет на bugreport.apple.com Обязательно укажите, как сбой PhotoScroller

Включите все версии iOS, с которыми вы столкнулись.

На сегодняшний день я видел:

Ошибка утверждения в - [XXX.TrackingPageViewController queueingScrollView: didEndManualScroll: toRevealView: направление: анимированное: 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: направление: анимированное: didFinish: didComplete:],/SourceCache/UIKit/UIKit-3347.44.2.2/UIPageViewController.m:1875

устрашающий