[Ios] UICollectionView se bloque lors du défilement whist en rotation (les attributs de disposition pour l'item supplémentaire au chemin d'index ont changé sans invalider ..)


Answers

Question

Des idées pour résoudre le fait que mon UICollectionView plante en faisant défiler le whist?

J'utilise l'approche suivante pour le défilement et la rotation séparément, et chacun semble fonctionner correctement. Je viens juste de noter que lorsque je fais les deux choses en même temps, je peux avoir ce crash. Cela semble donc être lié au fait que lorsque je fais pivoter l'appareil et que les nouveaux attributs de disposition sont calculés dans prepareLayout, le défilement continu déclenche "invalidateLayoutWithContext (invalidContext)" (voir ci-dessous).

Des idées? Y a-t-il un moyen de mettre en attente (ou de les ignorer) les réponses de défilement pendant la rotation?

Rotation Approach Dans viewWillLayoutSubviews dans le contrôleur de vue, j'invalide l'ensemble de la mise en page

self.cal.collectionViewLayout.invalidateLayout()

Scrolling Approach Pour me permettre d'avoir une vue décorative "collante" (en-tête), je n'invalide pas toute la mise en page, car elle tue les performances, mais fait ce qui suit. Dans la classe de mise en forme, je substitue shouldInvalidateLayoutForBoundsChange

    override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
        let invalidContext : UICollectionViewLayoutInvalidationContext = self.invalidationContextForBoundsChange(newBounds)

        // Keep Header Sticky
invalidContext.invalidateDecorationElementsOfKind(GCCalendarLayoutKind_Decorative1, atIndexPaths: [headerDecorativeIndexPath])

        // Apply Invalidation
        self.invalidateLayoutWithContext(invalidContext)        

        // Return normal super return (just in case of future IOS upgrades)
        return super.shouldInvalidateLayoutForBoundsChange(newBounds)
    }

Notez ici que j'invalide la vue décorative (en-tête), alors que l'erreur avec le crash est que mes mises en page supplémentaires sont différentes.

Erreur

2015-10-30 07: 14: 30.181 test3_collectionview [17086: 3102132] * Échec de l'assertion dans - [UICollectionViewData validateLayoutInRect:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.29.5/ Test_collectionview [17086: 3102132] * Fin de l'application en raison d'une exception non interceptée 'NSInternalInconsistencyException', raison: 'attributs de disposition pour l'élément supplémentaire au chemin d'index ({longueur = 2, chemin = 0 - 0}) changé du chemin d'index: ({longueur = 2, chemin = 0 - 0}); type d'élément: (Décoratif1); cadre = (0 1085,5; 320 16); zIndex = 1; pour indexer le chemin: ({longueur = 2, chemin = 0 - 0}); type d'élément: (Décoratif1); cadre = (0 853,5; 320 16); zIndex = 1; sans invalider la mise en page '*** Première pile d'appels: