objective-c cocoa-touch uitableview nsfetchedresultscontroller

objective c - ¿Puedes hacer animaciones personalizadas para Insertar celdas UITableView?



objective-c cocoa-touch (4)

La answer de materik no funcionó para mí con iOS 7.1 SDK, tengo [self cellForRowAtIndexPath:indexPath]; después de llamar [self cellForRowAtIndexPath:indexPath];

Aquí está mi código en la subclase de UITableView :

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation { [super insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; [self endUpdates]; // Populates UITableView with data [self beginUpdates]; for (NSIndexPath *indexPath in indexPaths) { __block UITableViewCell *cell = [super cellForRowAtIndexPath:indexPath]; if (cell) { // If indexPath isn''t visible we''ll get nil here // Custom animation CGRect frame = cell.frame; frame.origin.x = cell.frame.size.width; cell.frame = frame; frame.origin.x = 0; void (^animationsBlock)() = ^{ cell.frame = frame; }; if ([[UIView class] respondsToSelector: @selector(animateWithDuration:delay:usingSpringWithDamping: initialSpringVelocity:options:animations:completion:)]) { [UIView animateWithDuration:0.3 delay:0 usingSpringWithDamping:0.5 initialSpringVelocity:0 options:0 animations:animationsBlock completion:NULL]; } else { [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:animationsBlock completion:NULL]; } } } }

Tengo un UITableView que está siendo llenado por NSFetchedResultsController.

En la carga inicial de la tabla, me gustaría que las Células estén animadas, pero me gustaría hacer un poco más de animación personalizada que

[tableView insertRowsAtIndexPaths:withRowAnimation:];

Permite. Específicamente, me gustaría reducir la velocidad de las animaciones y hacer que vuelen desde un lado de una manera específica. No he podido lograr esto con las constantes UITableViewRowAnimation. ¿Hay alguna manera de usar Core Animation para hacer exactamente lo que quiero o necesito para seguir con las animaciones de UIKit en esta instancia específica?

¡Gracias por cualquier ayuda!

Joel


Utilizar esta:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{ [cell setFrame:CGRectMake(320, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height)]; [UIView animateWithDuration:2 animations:^{ [cell setFrame:CGRectMake(100, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height)]; }]; }


Versión de Swift 3.0 de la respuesta de Mattias Eriksson

func animate() { for cell in tblView.visibleCells { cell.frame = CGRect(x:320, y:cell.frame.origin.y, width:cell.frame.size.width, height:cell.frame.size.height) UIView.animate(withDuration: 1.0) { cell.frame = CGRect(x:0, y:cell.frame.origin.y, width:cell.frame.size.width, height:cell.frame.size.height) } } }


NUEVA SOLUCIÓN (12/12/2017)

Agregar una versión de Swift 4.0 del método animado. Debería implementarse de la misma manera que la solución a continuación:

func animate() { for cell in self.tableView.visibleCells { cell.frame = CGRect(x: self.tableView.frame.size.width, y: cell.frame.origin.y, width: cell.frame.size.width, height: cell.frame.size.height) UIView.animate(withDuration: 1.0) { cell.frame = CGRect(x: 0, y: cell.frame.origin.y, width: cell.frame.size.width, height: cell.frame.size.height) } } }

NUEVA SOLUCIÓN (2015-09-05)

Agregar una versión Swift 2.0 del método animado. Debería implementarse de la misma manera que la solución a continuación:

func animate() { for cell in self.tableView.visibleCells { cell.frame = CGRectMake(320, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height) UIView.animateWithDuration(1.0) { cell.frame = CGRectMake(0, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height) } } }

NUEVA SOLUCIÓN (2014-09-28)

Rehice la solución un poco para facilitar la implementación y hacer que funcione con iOS8. Todo lo que necesita hacer es agregar este método animate en su TableViewController y llamarlo siempre que quiera animarlo (por ejemplo, en su método de recarga, pero podría llamarlo en cualquier momento):

- (void)animate { [[self.tableView visibleCells] enumerateObjectsUsingBlock:^(UITableViewCell *cell, NSUInteger idx, BOOL *stop) { [cell setFrame:CGRectMake(320, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height)]; [UIView animateWithDuration:1 animations:^{ [cell setFrame:CGRectMake(0, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height)]; }]; }]; }

Nuevamente, cambie la animación como lo desee. Este código particular animará las celdas desde la derecha a una velocidad lenta.

SOLUCIÓN ANTIGUA (06-06-2013)

Puede hacerlo implementando su propia UITableView y reemplazando el método insertRowsAtIndexPaths. Aquí hay un ejemplo de cómo podría verse cómo las celdas se empujarán desde la derecha, muy lentamente (animación de 1 segundo):

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation { for (NSIndexPath *indexPath in indexPaths) { UITableViewCell *cell = [self cellForRowAtIndexPath:indexPath]; [cell setFrame:CGRectMake(320, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height)]; [UIView beginAnimations:NULL context:nil]; [UIView setAnimationDuration:1]; [cell setFrame:CGRectMake(0, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height)]; [UIView commitAnimations]; } }

Puedes jugar con las animaciones tú mismo. La vista de tabla no llamará automáticamente a este método, por lo que debe anular el método reloadData en su delegado de vista de tabla y llamar a este método usted mismo.

COMENTARIO

El método reloadData debería verse más o menos así:

- (void)reloadData { [super reloadData]; NSMutableArray *indexPaths = [[NSMutableArray alloc] init]; for (int i = 0; i < [_data count]; i++) [indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]]; [self insertRowsAtIndexPaths:indexPaths withRowAnimation:0]; }