La meilleure façon de vérifier si UITableViewCell est complètement visible

J'ai un UITableView avec les cellules de différentes hauteurs et j'ai besoin de savoir quand ils sont complètement visible ou non.

En ce moment je suis en parcourant chaque cellule de la liste de cellules visibles pour vérifier si il est complètement visible à chaque fois que l'affichage défile à l'écran . Est-ce la meilleure approche?

Voici mon code:

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView {

    CGPoint offset = aScrollView.contentOffset;
    CGRect bounds = aScrollView.bounds;    
    NSArray* cells = myTableView.visibleCells;

    for (MyCustomUITableViewCell* cell in cells) {

        if (cell.frame.origin.y > offset.y &&
            cell.frame.origin.y + cell.frame.size.height < offset.y + bounds.size.height) {

            [cell notifyCompletelyVisible];
        }
        else {

            [cell notifyNotCompletelyVisible];
        }
    }
}

Edit:

Veuillez noter que *- (NSArray )visibleCells retourne cellules visibles qui sont à la fois complètement visible et en partie visible.

Edit 2:

C'est le code révisé après la combinaison de solutions à partir de deux lnafziger et Vadim Yelagin:

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView {
    NSArray* cells = myTableView.visibleCells;
    NSArray* indexPaths = myTableView.indexPathsForVisibleRows;

    NSUInteger cellCount = [cells count];

    if (cellCount == 0) return;

    //Check the visibility of the first cell
    [self checkVisibilityOfCell:[cells objectAtIndex:0] forIndexPath:[indexPaths objectAtIndex:0]];

    if (cellCount == 1) return;

    //Check the visibility of the last cell
    [self checkVisibilityOfCell:[cells lastObject] forIndexPath:[indexPaths lastObject]];

    if (cellCount == 2) return;

    //All of the rest of the cells are visible: Loop through the 2nd through n-1 cells
    for (NSUInteger i = 1; i < cellCount - 1; i++)
        [[cells objectAtIndex:i] notifyCellVisibleWithIsCompletelyVisible:YES];
}

- (void)checkVisibilityOfCell:(MultiQuestionTableViewCell *)cell forIndexPath:(NSIndexPath *)indexPath {
    CGRect cellRect = [myTableView rectForRowAtIndexPath:indexPath];
    cellRect = [myTableView convertRect:cellRect toView:myTableView.superview];
    BOOL completelyVisible = CGRectContainsRect(myTableView.frame, cellRect);

    [cell notifyCellVisibleWithIsCompletelyVisible:completelyVisible];
}
  • Tout comme une note de côté, vous devez vous rendre à l'ensemble de vos questions précédentes et accepter les réponses de ceux qui vous ont aidés.
  • Merci de me le dire! J'avais déjà donné un +1, mais avait oublié de l'ensemble accepté la fonction réponse.
  • Votre code est correct pour moi, et même si c'est compliqué, il fonctionne. Ne pas réparer ce qui n'est pas cassé, hein?
InformationsquelleAutor RohinNZ | 2012-03-22