Assertion failure in UIQueuingScrollView didScrollWithAnimation: force:

j'ai un UIPageViewController qui demande mon ImageViewController .

le ImageViewController contient un UIScrollView avec un UIImageView à l'intérieur. Rien d'autre.

je teste actuellement avec 3" items "dans ma source de données pour le UIPageViewController (i.e. trois pages).

tout fonctionne très bien et je peux faire défiler et zoomer et puis page pendant environ 30 secondes et puis soudainement je reçois cet avertissement...

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

Je n'ai aucune idée d'où commencer à le déboguer, car il ne pointe pas sur mon code et il n'y a aucun de mes codes dans la pile ou quoi que ce soit.

quelqu'un peut-il me donner un conseil pour commencer à déboguer ceci?

MODIFIER

j'ai fait un peu plus de tests. Cela semble se produire si le scrollView décélère (c'est-à-dire après un clic) et ensuite j'essaie de faire la transition vers le Controller PageView. vers un autre ViewController alors que le scrollview est toujours en mouvement.

l'application plante environ 20% du chemin à travers la transition à la page suivante.

EDIT 2

L'erreur semble s'arrêter sur la ligne _cache_getImp (pas sûr si c'est un i majuscule ou minuscule L).

MODIFIER 3

C'est de mieux en mieux. Je viens de télécharger Apple PhotoScroller sample app pour voir s'ils ont contourné le problème d'une manière différente. Eh bien, non, ils ne l'ont pas fait. L'application sample se plante exactement de la même manière que la mienne! Vous devez zoomer et faire défiler et les pages de transition en même temps pour le rendre plus susceptible de se planter, mais il se produit sur lui-même trop il pourrait juste prendre plus de temps à se produire.

31
demandé sur Mehul Mistri 2012-10-16 18:02:03

5 réponses

a trouvé une solution! Dans mon cas, j'ai un UIPageViewController avec UIPageViewControllerTransitionStyleScroll ainsi que les boutons suivants qui permettent à l'utilisateur d'avancer à travers mon viewpager en tapant. J'obtiens ce crash quand l'utilisateur appuie sur un bouton Suivant et traîne légèrement autour avant de relâcher son doigt (toujours dans le cadre du bouton). Il semble que le glisser dans le bouton interfère avec UIPageViewController pan reconnaissance gestuelle dans ce cas, et c'est ce qui cause le crash.

alors qu'il est assez peu probable que l'utilisateur va obtenir dans cet état, j'ai trouvé une solution relativement simple le empêche mon application de se planter si elle se produit. J'ai un booléen qui représente si l'utilisateur est dans un état valide pour passer à l'écran suivant et le mettre à OUI au toucher vers le bas, puis à non si l'utilisateur traîne n'importe où à l'intérieur de mon bouton. Puis, sur le touchUp (nextPressed) je vérifie le booléen avant de déplacer mon UIPageViewController programmatically.

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

l'inconvénient est que rien ne se passera même si l'Utilisateur a encore libéré leur doigt dans le cadre de bouton. Cependant, je préfère ceci à un crash et je vois cela comme un cas de bord assez rare malgré tout. Je m'attendais à ce que l'utilisateur taperait à nouveau - cette fois sans un claquement & drag - et aller de l'avant avec succès.

j'apprécierais toutes les idées pour aller un peu plus loin et prévenir l'affrontement entre le touch drag et le UIPageViewController tout à fait.

5
répondu Kyle Clegg 2013-12-14 11:06:39

avez-vous essayé de désactiver le rebond dans la vue Uiscroll? Cela a fonctionné pour moi et a résolu mon autre problème trop évoqué dans mon commentaire ci-dessus.

1
répondu Remover 2012-12-03 14:15:18

je me suis battu avec ça toute la journée. Mes Conclusions:

si vous avez un scrollview comme contrôleur de visualisation et que vous êtes délégué des scrolls: vous êtes en difficulté. Même avec le Controller PageViewController configuré avec le défilement Horizontal, un défilement vertical sur votre vue déclenchera un événement. -> cela ne cause pas de problème si: vous faites défiler vers le haut de votre vue avant (pas sûr comment corriger cela).

Il ya de bonnes Les fils de débordement de piles comme celui-ci .

fondamentalement la solution est:

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

2 Utilisez UIPageViewControllerTransitionStylepagecurl comme Style de transition.

cela a résolu la plupart de mes problèmes.

Si quelqu'un a une solution pour la délégation des problèmes avec le scrolling, sera plus wellcome

1
répondu wolffan 2017-05-23 12:34:44

j'ai eu un problème similaire. Ma configuration était un UIPageViewController et je chargeais des contrôleurs de vue avec un UIImageView à l'intérieur. En interagissant pendant que le UIPageViewController défilait, j'ai eu le même journal de bord.

Je l'ai corrigé en créant un UILongPressGestureRecognizer et en ajoutant à la vue de défilement de UIPageViewController .

  1. a créé ma propre sous-classe de UIPageViewController (la Solution est spécifique à mon cas mais peut facilement être utilisée comme une solution générique)

  2. trouver la vue intérieure de L'UIScrollView du UIPageViewController

    - (UIScrollView *)findScrollView
    {
        UIScrollView *scrollView;
        for (id subview in self.view.subviews)
        {
            if ([subview isKindOfClass:UIScrollView.class])
            {
                scrollView = subview;
                break;
            }
        }
    
        return scrollView;
    }
    
  3. ajouter le reconnaisseur de geste long tap à la vue intérieure de défilement et de point son action à une méthode ou zéro

    /**
     *  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];
    }
    
0
répondu Martin Stolz 2014-05-13 16:52:17

il ressemble sûrement à un bug dans iOS 8 et 9. (et les "réponses" en bas de tenter de contourner cela)

n'hésitez pas à déposer une contravention sur bugreport.apple.com N'oubliez pas de préciser comment planter le PhotoScroller

Comprennent toutes les versions d'iOS que vous l'avez vu crash sur

À ce jour, je l'ai vu:

échec d'Assertion dans -[XXX.TrackingPageViewController queuingScrollView: didEndManualScroll:toRevealView:direction:animated:didFinish: didComplete:], /BuildRoot/Library/Caches/com.Apple.xbs/Sources/UIKit/UIKit-3512.60.12 / UIPageViewController.m: 2028

Assertion failure in - [_UIQueuingScrollView _didScrollWithAnimation: force:], /BuildRoot/Library/Caches/com.Apple.xbs / Sources/UIKit/UIKit-3512.60.12 / _UIQueuingScrollView.m: 785 (lldb)

je vais garder la liste à jour (malgré la la baisse des votes, aussi massive soit-elle). Restez à l'écoute.

Il ne ressemble pas à notre bug.

UPD 2016 09 27 (on Xcode 8 now):

Assertion failure in - [XXX.TrackingPageViewController queuingScrollView: didEndManualScroll:toRevealView:direction:animated:didFinish: didComplete:], /SourceCache/UIKit/UIKit-3347.44.2.2/UIPageViewController.m: 1875

génial

-2
répondu Anton Tropashko 2016-09-28 12:08:46