Tenho um UITableView com células de alturas diferentes e preciso saber quando elas estão totalmente visíveis ou não.
No momento, estou percorrendo cada célula na lista de células visíveis para verificar se ela está completamente visível toda vez que a exibição é rolada. Esta é a melhor abordagem?
Este é o meu código:
- (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];
}
}
}
Editar:
Observe que * - (NSArray ) visibleCells retorna células visíveis que são completamente visíveis e parcialmente visíveis.
Editar 2:
Este é o código revisado após combinar as soluções de ambos lnafziger e 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
fonte
fonte
Respostas:
Você pode obter o reto de uma célula com o
rectForRowAtIndexPath:
método e compará-lo com o ret de limites de tableview usando aCGRectContainsRect
função.Observe que isso não irá instanciar a célula se ela não estiver visível e, portanto, será bastante rápido.
Rápido
Obj-C
É claro que isso não considerará a visualização da tabela sendo cortada por uma supervisão ou obscurecida por outra visualização.
fonte
CGRectContainsRect(tableView.bounds, [tableView rectForRowAtIndexPath:indexPath])
let completelyVisible = tableView.bounds.contains(tableView.rectForRow(at: indexPath))
Eu mudaria assim:
fonte
Você pode tentar algo assim para ver quanta porcentagem está visível:
fonte
Dos documentos:
fonte
Se você também quiser levar o contentInset em conta e não quiser depender de uma supervisão (o quadro de visão da tabela em superview pode ser diferente de 0,0), aqui está minha solução:
fonte
fonte
fonte
Mesmo se você disser que deseja verificá-lo sempre que rolar, você também pode usar
fonte
Talvez para este problema seja melhor usada a próxima função de UITableViewDelegate
fonte
tells the delegate that the specified cell was removed from the table.
O código a seguir permitirá que você verifique se uma célula de visualização de coleção está completamente visível através dos atributos de layout da visualização de coleção.
guard let cellRect = collectionView.layoutAttributesForItem(at: indexPath)?.frame else { return } let isCellCompletelyVisible = collectionView.bounds.contains(cellRect)
fonte