Ich habe eine UITableView mit Zellen unterschiedlicher Höhe und muss wissen, ob sie vollständig sichtbar sind oder nicht.
Im Moment durchlaufe ich jede Zelle in der Liste der sichtbaren Zellen, um zu überprüfen, ob sie jedes Mal, wenn die Ansicht gescrollt wird, vollständig sichtbar ist. Ist das der beste Ansatz?
Hier ist mein 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];
}
}
}
Bearbeiten:
Bitte beachten Sie, dass * - (NSArray ) visibleCells sichtbare Zellen zurückgibt, die sowohl vollständig als auch teilweise sichtbar sind.
Bearbeiten 2:
Dies ist der überarbeitete Code, nachdem Lösungen von lnafziger und Vadim Yelagin kombiniert wurden :
- (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
quelle
quelle
Antworten:
Sie können das Rechteck einer Zelle mit
rectForRowAtIndexPath:
method abrufen und es mit dem Rechteck von tableview vergleichenCGRectContainsRect
Funktion Funktion .Beachten Sie, dass dies die Zelle nicht instanziiert, wenn sie nicht sichtbar ist, und daher ziemlich schnell ist.
Schnell
Obj-C
Dies berücksichtigt natürlich nicht, dass die Tabellenansicht von einer Übersicht abgeschnitten oder von einer anderen Ansicht verdeckt wird.
quelle
CGRectContainsRect(tableView.bounds, [tableView rectForRowAtIndexPath:indexPath])
let completelyVisible = tableView.bounds.contains(tableView.rectForRow(at: indexPath))
Ich würde es so ändern:
quelle
Sie können so etwas versuchen, um zu sehen, wie viel Prozent sichtbar sind:
quelle
Aus den Dokumenten:
quelle
Wenn Sie auch das contentInset berücksichtigen und sich nicht auf eine Übersicht verlassen möchten (der Tabellenansichtsrahmen in der Übersicht könnte etwas anderes als 0,0 sein), ist hier meine Lösung:
quelle
quelle
quelle
Auch wenn Sie gesagt haben, dass Sie es jedes Mal überprüfen möchten, wenn Sie gescrollt haben, können Sie es auch verwenden
quelle
Vielleicht wird für dieses Problem die nächste Funktion von UITableViewDelegate besser verwendet
quelle
tells the delegate that the specified cell was removed from the table.
Mit dem folgenden Code können Sie überprüfen, ob eine Sammlungsansichtszelle über die Layoutattribute der Sammlungsansicht vollständig sichtbar ist.
guard let cellRect = collectionView.layoutAttributesForItem(at: indexPath)?.frame else { return } let isCellCompletelyVisible = collectionView.bounds.contains(cellRect)
quelle