42 votes

Le changement de taille de cellule animant UICollectionView entraîne un comportement indésirable

J'ai un UICollectionViewController que l'utilisation d'un standard UICollectionViewFlowLayout d'afficher sur une seule colonne verticale de cellules. Je suis d'essayer de créer une expand/collapse animation d'une cellule lorsqu'une cellule est exploité. J'utilise le code suivant pour obtenir ce résultat:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath (NSIndexPath *)indexPath
{
    [self.feedManager setCurrentlySelectedCellIndex:indexPath.item];
    [self.collectionView performBatchUpdates:nil completion:nil];
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    //Return the size of each cell to draw
    CGSize cellSize = (CGSize) { .width = 320, .height = [self.feedManager heightForCellAtIndexPath:indexPath] };
    return cellSize;
}

Le "selectedCellIndex' bien sur ma gestion de l'objet indique le modèle de données de retour d'un développé ou réduit la taille à l'intérieur de heightForCellAtIndexpath:

[self.collectionView performBatchUpdates:nil completion:nil];

Puis l' performBatchUpdates:completiong: méthode anime ce changement de taille bien. Toutefois! Lorsque l'animation se produit, l'expansion de la cellule peut entraîner une partie de la cellule visible au bas de l'écran pour aller hors de l'écran.

Si c'est le cas et j'ai par la suite de l'effondrement de cette cellule, le maintenant hors de l'écran, les cellules composant logiciel enfichable à son ancienne position, sans animation, tandis que toutes les autres cellules visibles animer comme souhaité. Mon intuition vous dit que c'est le bon comportement depuis la cellule est hors de l'écran lors de l'effondrement de l'animation est en cours d'exécution et n'est pas inclus dans l'animation de processus de rendu. Ma question est, comment puis-je éviter cela?

Je préfère que toutes les cellules pour animer l'ensemble, peu importe si elles sont hors de l'écran ou pas. Toutes les pensées?

27voto

Timothy Moose Points 5734

C'est un UICollectionViewFlowLayout bug, mais il existe une solution de contournement. Le problème est que les attributs renvoyés en initialLayoutAttributesForAppearingItemAtIndexPath: ont de mauvaises images. Plus précisément, ils ont les images de la finale, sur la position de l'écran plutôt que la première, au large de la position de l'écran. Vous avez juste besoin de remplacer cette méthode et renvoyer correcte des images. La structure de base de la dérogation devrait ressembler à quelque chose comme ceci:

- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath
{
    UICollectionViewLayoutAttributes *pose = [super initialLayoutAttributesForAppearingItemAtIndexPath:itemIndexPath];
    if (<test for incorrect frame>) {
        CGRect frame = pose.frame;
        frame.origin.y = <calculate correct frame>;
        pose.frame = frame;
    }
    return pose;
}

Vous serez responsable de l'identification des scénarios où les cadres ont besoin d'être ajusté, ce qui peut impliquer en gardant votre propre état interne. Je n'ai pas travaillé par le biais de cette logique, mais j'ai fait un brut de test et a été en mesure d'obtenir une animation fluide.

En généralisant un peu, c'est mon expérience qui n' UICollectionViewFlowLayout est tellement buggé et il ya tellement de nombreux cas de coin pour les combattre si vous avez des éléments en mouvement sur l'écran et hors écran combiné avec toutes les insertions, suppressions, ou se déplace, que j'ai trouvé plus facile de rouler mes propres mises en page. Si vous n'allez pas faire toutes les insertions, suppressions, ou se déplace, puis en substituant UICollectionViewFlowLayout pourrait bien être votre meilleur pari.

Laissez-moi savoir si vous avez besoin de plus d'aide.

MODIFIER

Si vous êtes intéressé dans le fait de regarder une 3 ème partie mise en page, je open source mon custom de la grille de mise en page VCollectionViewGridLayout et ajout d'un exemple de projet de démonstration de lisser l'expansion de la hauteur de la cellule. Essayez d'exécuter l' Développez votre projet. Il est également Trier et Filtrer projet d'animation avec le tri et le filtrage. Les deux projets vous permettent de basculer entre les flux de mise en page et la présentation de la grille de sorte que vous pouvez voir l'amélioration.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X