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?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez obtenir le rect d'une cellule avec
rectForRowAtIndexPath:
de la méthode et de la comparer avec tableview de limites rect à l'aide deCGRectContainsRect
fonction.Noter que ce ne sera pas instancier la cellule si elle n'est pas visible, et donc sera assez rapide.
Swift
Obj-C
Bien sûr, cela n'a égard à la vue de la table d'être accroché par un superview ou caché par un autre point de vue.
CGRectContainsRect(tableView.bounds, [tableView rectForRowAtIndexPath:indexPath])
let completelyVisible = tableView.bounds.contains(tableView.rectForRow(at: indexPath))
Je voudrais le modifier comme ceci:
Vous pouvez essayer quelque chose comme cela pour voir combien de pourcentage est visible:
De la documentation:
Si vous aussi vous voulez prendre le contentInset en compte, et ne veux pas compter sur un superview (la vue de la table cadre superview pourrait être quelque chose d'autre qu'0,0), voici ma solution:
Le code ci-dessous va vous permettre de vérifier si la vue d'une collection de cellules est complètement visible à travers les attributs de mise en page de l'affichage de la collection.
guard let cellRect = collectionView.layoutAttributesForItem(at: indexPath)?.frame else { return }
let isCellCompletelyVisible = collectionView.bounds.contains(cellRect)
Même si vous avez dit que vous voulez le vérifier à chaque fois que vous défiler, vous pouvez également utiliser
Peut-être pour cette question qu'il vaut mieux utilisé à côté de la fonction de UITableViewDelegate
tells the delegate that the specified cell was removed from the table.