Tengo un UITableView con celdas de diferentes alturas y necesito saber cuándo son completamente visibles o no.
En este momento, estoy recorriendo cada celda en la lista de celdas visibles para verificar si es completamente visible cada vez que se desplaza la vista. ¿Es este el mejor enfoque?
Aquí está mi 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:
Tenga en cuenta que * - (NSArray ) visibleCells devuelve celdas visibles que son tanto completamente visibles como parcialmente visibles.
Edición 2:
Este es el código revisado después de combinar soluciones de lnafziger y 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
fuente
fuente
Respuestas:
Puede obtener el rect de una celda con el
rectForRowAtIndexPath:
método y compararlo con los límites de tableview rect usando laCGRectContainsRect
función.Tenga en cuenta que esto no creará una instancia de la celda si no es visible y, por lo tanto, será bastante rápido.
Rápido
Obj-C
Por supuesto, esto no considerará que la vista de tabla esté recortada por una supervista u oscurecida por otra vista.
fuente
CGRectContainsRect(tableView.bounds, [tableView rectForRowAtIndexPath:indexPath])
let completelyVisible = tableView.bounds.contains(tableView.rectForRow(at: indexPath))
Lo cambiaría así:
fuente
Puede probar algo como esto para ver cuánto porcentaje es visible:
fuente
De los documentos:
fuente
Si también desea tener en cuenta el contentInset y no desea depender de una supervista (el marco de la vista de tabla en la supervista podría ser algo más que 0,0), aquí está mi solución:
fuente
fuente
fuente
Incluso si dijo que desea comprobarlo cada vez que se desplaza, también puede utilizar
fuente
Tal vez para este problema use mejor la siguiente función de UITableViewDelegate
fuente
tells the delegate that the specified cell was removed from the table.
El siguiente código le permitirá verificar si una celda de vista de colección es completamente visible a través de los atributos de diseño de la vista de colección.
guard let cellRect = collectionView.layoutAttributesForItem(at: indexPath)?.frame else { return } let isCellCompletelyVisible = collectionView.bounds.contains(cellRect)
fuente