J'ai un UITableView avec des cellules de différentes hauteurs et j'ai besoin de savoir quand elles sont complètement visibles ou non.
En ce moment, je parcourt chaque cellule de la liste des cellules visibles pour vérifier si elle est complètement visible à chaque fois que la vue défile. 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];
}
}
}
Éditer:
Veuillez noter que * - (NSArray ) visibleCells renvoie des cellules visibles qui sont à la fois complètement visibles et partiellement visibles.
Modifier 2:
Voici le code révisé après avoir combiné les solutions de lnafziger et de 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];
}
ios
uitableview
visible
RohinNZ
la source
la source
Réponses:
Vous pouvez obtenir le rect d'une cellule avec
rectForRowAtIndexPath:
method et le comparer avec les limites rect de tableview en utilisantCGRectContainsRect
function.Notez que cela n'instanciera pas la cellule si elle n'est pas visible, et donc sera plutôt rapide.
Rapide
Obj-C
Bien sûr, cela ne considérera pas que la vue de la table soit coupée par une vue supervisée ou obscurcie par une autre vue.
la source
CGRectContainsRect(tableView.bounds, [tableView rectForRowAtIndexPath:indexPath])
let completelyVisible = tableView.bounds.contains(tableView.rectForRow(at: indexPath))
Je le changerais comme ceci:
la source
Vous pouvez essayer quelque chose comme ceci pour voir combien de pourcentage est visible:
la source
À partir de la documentation:
la source
Si vous souhaitez également prendre en compte contentInset, et que vous ne voulez pas vous fier à un superview (le cadre de vue table dans superview peut être autre chose que 0,0), voici ma solution:
la source
la source
la source
Même si vous avez dit vouloir le vérifier à chaque fois que vous faites défiler, vous pouvez également utiliser
la source
Peut-être pour ce problème, mieux utiliser la fonction suivante de UITableViewDelegate
la source
tells the delegate that the specified cell was removed from the table.
Le code ci-dessous vous permettra de vérifier si une cellule de vue de collection est complètement visible à travers les attributs de mise en page de la vue de collection.
guard let cellRect = collectionView.layoutAttributesForItem(at: indexPath)?.frame else { return } let isCellCompletelyVisible = collectionView.bounds.contains(cellRect)
la source