Calcule em qual linha o UITableView parará de rolar?

10

Quando uma tabela possui muitas linhas, o usuário pode deslocar a tabela para cima / baixo. Isso cria uma animação de rolagem que parece ter um comprimento determinístico dependendo da velocidade / duração do gesto de movimento. É possível calcular com segurança quais linhas na tabela ficarão visíveis quando a rolagem parar, se não houver mais interação do usuário?

    
por Grzegorz Adam Hankiewicz 24.05.2011 в 22:53
fonte

4 respostas

5

No iOS 5.0 e posterior, há uma nova API para o UIScrollViewDelegate chamado scrollViewWillEndDragging: withVelocity: targetContentOffset: . Com esse novo método, a posição de parada da rolagem pode ser calculada e até modificada, conforme explicado na sessão de vídeo 100: novidades em Cocoa Touch , por volta do nono minuto.

    
por Grzegorz Adam Hankiewicz 14.01.2012 / 21:33
fonte
1

UITableView herda de UIScrollView e você pode fazer isso usando os métodos UIScrollViewDelegate e table view indexPathsForVisibleRows para verificar quais caminhos do índice de células estão visíveis no momento em que a rolagem é interrompida.

Você pode até salvar a posição inicial de onde a desaceleração começou, para que você possa calcular se a direção de rolagem estava para cima ou para baixo, o que permitirá que você saiba se a célula que irá parar é a primeira ou a última dos visíveis.

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]];
    }

}

Uma observação importante sobre o código acima é que ele aponta para a exibição de tabela como uma variável _myTableview em vez de apenas transmitir a variável de método delegada scrollView para um UITableView * , embora isso seja apenas detalhes de implementação e não afeta a lógica aqui.

    
por Felipe Sabino 25.05.2011 / 00:35
fonte
0

Pergunta interessante ..... UITableViewDelegate também está de acordo com UIScrollViewDelegate : link

Existem alguns callbacks delegados que você pode usar para saber quando a rolagem começa a desacelerar e termina a desacelerar.

Você provavelmente poderia usar – scrollViewDidEndDecelerating: e nesse ponto usar as alturas de célula e a propriedade de deslocamento de conteúdo do tableView (tableView subclasses UIScrollView ) e depois calcular as células visíveis após a desaceleração.

    
por Sid 25.05.2011 / 00:15
fonte
-1

Eu não sei como você pode determinar quantas linhas serão mostradas, mas você sempre pode ver quantas linhas foram mostradas. (uma vez que a mesa pára sem tocar mais) Não tenho certeza se isso ajuda, mas é assim que você faria

    - (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;
    }
    
por Louie 24.05.2011 / 23:48
fonte