2011-10-12 21 views
6

Estoy tratando de desplazar una UITableView mediante programación tocando un botón. Debería tener el mismo efecto al hacerlo a mano o incluso un poco más en el tiempo de desplazamiento.Desplazar programáticamente un UITableView con aceleración y desaceleración

Primero traté de usar scrollToRowAtIndexPath: atScrollPosition: animated: Sin embargo, es demasiado rápido y está corregido en el tiempo. Además, no tiene aceleración y desaceleración.

¿Alguna idea de cómo desplazar una UITableView mediante programación ya que se ha desplazado manualmente? Estaba pensando en enviarle algunos toques personalizados . ¿Crees que podría funcionar?

¡Cualquier idea y ayuda son muy apreciadas! ¡Gracias!

Respuesta

9

UITableview es una subclase de UIScrollview. Al igual que en UIScrollview, puede establecer mediante programación la posición de desplazamiento de UITableview configurando la propiedad contentOffset.

Cambia el valor de esta propiedad dentro de un bloque de animación para que tenga más control en el tiempo. Necesitarás calcular la posición del punto Y. Supongamos que desea desplazarse a la fila 50, puede ser 50 * rowHeight (suponiendo que tenga una altura uniforme).

Por ejemplo:

CGFloat calculatedPosY = 50 * rowHeight // do you own calculation of where you'd like it. 
[UIView animateWithDuration:0.2 
    animations:^{theTableview.contentOffset = CGPointMake(0.0, calculatedPosY);} 
    completion:^(BOOL finished){ }]; 

Hay otro método que podría utilizar que proporciona más opciones, así

echar un vistazo a este método:

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion 
+1

¡Gracias! Sin embargo, ya lo he intentado. El problema es que las celdas de la vista de tabla no se están cargando. –

+0

Suena como un problema con otra cosa. Tal vez después de que la animación sea con w/contentOffset, puede preguntar a la tabla por sus filas visibles a través del método: "indexPathsForVisibleRows". Y luego llame a reloadRowsAtIndexPaths: withRowAnimation: con esas rutas de índice visibles. Pero creo que podría haber un problema de mayor nivel en la mano. –

2

Bueno, estos son sólo un par de "fuera de mi cabeza responde", pero podría intentar usar este método (en UIScrollView, del cual UITableView es una subclase):

-(void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated 

Una vez que -(CGRect) rectForRowAtIndexPath: le da las coordenadas de la celda, puede animar a la ubicación de la celda. Pero en lugar de llamarlo una vez, llámalo un par de veces con una compensación menor, luego con una compensación cada vez mayor y luego otra más pequeña. Sin embargo, me preocupa que sea difícil hacerlo parecer suave.

Aún así, si eso no funciona, quizás cambiar el valor contentOffset dentro de un bloque UIView animateWithDuration:delay:options:animations:completion funcionaría. Tal vez si usa UIViewAnimationOptionCurveEaseInOut, puede obtener el efecto que desea simplemente llamándolo una vez. De lo contrario, ejecute varias animaciones en cada parte del camino y cubra distancias cada vez mayores antes de reducir la velocidad.

+0

Gracias! Intenté eso. Sin embargo, el contenido de tableView no se está cargando de esta manera.Realmente no puedo creer que sea tan difícil hacer eso. –

6

Configure su botón en la subvista de celda y use este código para desplazarse por la tabla programáticamente en el evento táctil del botón. Y si no está configurando el botón como una subvista de la celda de la tabla, modifique este código según sea necesario.

CGPoint point = [button.superview convertPoint:button.frame.origin toView:self.tableView]; 
    CGPoint contentOffset = self.tableView.contentOffset; 
    contentOffset.y += (point.y - contentOffset.y - self.navigationController.navigationBar.frame.size.height); // Adjust this value as you need 
    [self.tableView setContentOffset:contentOffset animated:YES]; 
Cuestiones relacionadas