2011-05-24 7 views
9

Cuando una tabla tiene muchas filas, el usuario puede desplazar hacia arriba o hacia abajo la tabla. Esto crea una animación de desplazamiento que parece tener una longitud determinista dependiendo de la velocidad/duración del gesto de flick. ¿Es posible calcular de manera confiable qué filas de la tabla serán visibles una vez que el desplazamiento se detenga si no hay más interacción del usuario?Calcular en qué fila dejará de desplazarse UITableView?

+0

Buena pregunta, pero por lo que he podido decir ... no, parece que sería una operación compleja de mantener. –

Respuesta

-1

No sé cómo se podría determinar cuántas filas se mostrarán, pero siempre se puede obtener cuántas filas HAN mostrado. (. Una vez que la mesa se detiene w/no más tocar) No estoy seguro si eso ayuda, pero esta es la forma en que lo haría

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 


    // make sure to declare your integer in your .h file and to also synthesize 
    //say this is your int "howManyRowsAreShowing" 
    howManyRowsAreShowing = indexPath.Row; 



    //the rest of the code below is generic table view code for example only 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    // Set up the cell... 
    NSString *cellValue = [listOfItems objectAtIndex:indexPath.row]; 
    cell.text = cellValue; 

    return cell; 
    } 
0

Interesante pregunta ..... UITableViewDelegate se ajusta a UIScrollViewDelegate así: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScrollViewDelegate_Protocol/Reference/UIScrollViewDelegate.html#//apple_ref/occ/intf/UIScrollViewDelegate

Existen algunas retrollamadas de delegado que puede usar para saber cuándo el desplazamiento comienza a desacelerarse y termina desacelerándose.

Probablemente pueda usar – scrollViewDidEndDecelerating: y en ese punto use las alturas de celda y la propiedad de compensación de contenido de tableView (subclases tableView UIScrollView) y luego calcule las celdas que son visibles después de la deceleración.

1

UITableView hereda de UIScrollView y que puede lograr que al utilizar los métodos y UIScrollViewDelegate la propiedad de tabla vista indexPathsForVisibleRows para comprobar qué índice de células caminos son visibles en este momento se detiene el desplazamiento.

Incluso puede guardar la posición inicial desde donde comenzó la desaceleración, para que pueda calcular si la dirección de desplazamiento fue hacia arriba o hacia abajo, lo que le permitirá saber si la celda que detendrá es la primera o la último de los visibles.

int startDeceleratingPosition; 

-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView { 

    startDeceleratingPosition = scrollView.contentOffset.y; 

} 

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ 

    BOOL isPositionUp = startDeceleratingPosition < scrollView.contentOffset.y;  

    NSArray *paths = [_myTableview indexPathsForVisibleRows]; 
    UITableViewCell *cell; 
    if(isPositionUp){ 
     cell = [_myTableview cellForRowAtIndexPath:[paths objectAtIndex:0]]; 
    } else { 
     cell = [_myTableview cellForRowAtIndexPath:[paths lastObject]]; 
    } 

} 

Una nota importante sobre el código anterior es que apunta a la vista de tabla como una variable _myTableview en lugar de limitarte a enviar la variable método delegado scrollView a un UITableView *, aunque eso es sólo los detalles de implementación y no debe afectar la lógica aquí.

+0

Ah, si solo hubiera un método para obtener la velocidad del desplazamiento ... –

+0

Pero hay una manera ... UIScrollView tiene una propiedad decelerationRate, que sería solo un enfoque de bajo nivel para eso, y también con un muchas más oportunidades de obtener un resultado incorrecto. http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScrollView_Class/Reference/UIScrollView.html#//apple_ref/doc/uid/TP40006922-CH3-DontLinkElementID_2 –

+0

La tasa de desaceleración es solo una constante como la gravedad Necesitas saber la velocidad de desplazamiento actual para hacer más cálculos sobre cuándo y dónde se detendrá el desplazamiento, y no veo ninguna forma de obtener la velocidad de desplazamiento a través de la API pública. –

Cuestiones relacionadas