uicollectionviewcontroller iphone ios objective-c uicollectionview uicollectionviewcell

iphone - uicollectionviewcontroller - Animaciones UICollectionView(insertar/eliminar elementos)



uicollectionviewcell swift (2)

Descarga el diseño del círculo . Es un ejemplo de diseño personalizado que usando

initialLayoutAttributesForAppearingItemAtIndexPath: finalLayoutAttributesForDisappearingItemAtIndexPath:

Ese será un buen material de trabajo para ti.

Me gustaría personalizar los estilos de animación cuando se inserta y / o elimina un UICollectionViewCell.

La razón por la que necesito esto es que, de manera predeterminada, veo que insertar una celda tiene un fundido suave en la animación, sin embargo, eliminar una celda tiene una combinación de animación mover hacia la izquierda + desaparecer. Estaría muy feliz con esto si no fuera por un problema.

Después de eliminar una celda, todavía se reutiliza cuando agrego otras nuevas, y cuando se reutiliza, no se agrega con el fundido predeterminado en efecto, sino que es una combinación de movimiento hacia la izquierda + atenuación.

No estoy seguro de por qué estoy teniendo esta inconsistencia en las animaciones. Si se trata de un error / problema / estupidez conocidos (de mi parte :)), hágamelo saber cómo solucionarlo.

De lo contrario, avíseme cómo configurar animaciones personalizadas cuando se elimina la celda (o indíqueme un tutorial).

Gracias

ACTUALIZAR

Se corrigió el extraño comportamiento de la animación subclasificando UICollectionViewFlowLayout y agregando esta línea de código

- (UICollectionViewLayoutAttributes *) initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath { return nil; }

¡Eso es! :)


Si usa su propia subclase de UICollectionViewLayout , puede implementar los métodos:

  • initialLayoutAttributesForAppearingItemAtIndexPath: para inserciones

  • finalLayoutAttributesForDisappearingItemAtIndexPath: para eliminaciones

De acuerdo con la documentación, los atributos que devuelve se utilizan como puntos de partida para la animación, y el punto final son los atributos normales devueltos por su diseño (o lo contrario para su eliminación). Los atributos de diseño incluyen posición, alfa, transformación ... Por supuesto, es más trabajo escribir su propia clase de diseño que usar el diseño de flujo proporcionado por Apple.

Edición: para responder a su pregunta en los comentarios, aquí hay una implementación súper básica de un diseño para filas de elementos que son todos del mismo tamaño.

Una celda tiene un frame y, de manera predeterminada, un alpha de 1.0 (como lo define layoutAttributesForItemAtIndexPath: . Cuando se elimina, sus propiedades se finalLayoutAttributesForDisappearingItemAtIndexPath: desde su estado actual antes de la eliminación a las propiedades establecidas por finalLayoutAttributesForDisappearingItemAtIndexPath: que corresponden al mismo frame y un alpha de 0.0. Así que no se moverá pero se desvanecerá. Sin embargo, las celdas a la derecha se indexPath a la izquierda (porque su indexPath ha cambiado y, por lo tanto, su frame como lo establece layoutAttributesForItemAtIndexPath: .

- (CGSize)collectionViewContentSize { NSInteger numberOfItems = [self.collectionView numberOfItemsInSection:0]; return CGSizeMake(numberOfItems * ITEM_WIDTH, ITEM_HEIGHT); } - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath { NSUInteger index = [indexPath indexAtPosition:0]; UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; attributes.frame = CGRectMake(index * ITEM_WIDTH, 0, ITEM_WIDTH, ITEM_HEIGHT); return attributes; } - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { NSMutableArray *attributes = [NSMutableArray new]; NSUInteger firstIndex = floorf(CGRectGetMinX(rect) / ITEM_WIDTH); NSUInteger lastIndex = ceilf(CGRectGetMaxX(rect) / ITEM_WIDTH); for (NSUInteger index = firstIndex; index <= lastIndex; index++) { NSIndexPath *indexPath = [[NSIndexPath alloc] initWithIndexes:(NSUInteger [2]){ 0, index } length:2]; [attributes addObject:[self layoutAttributesForItemAtIndexPath:indexPath]]; } return attributes; } - (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForItemAtIndexPath:indexPath]; attributes.alpha = 0.0; return attributes; }