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