Saya memiliki UITableView dengan sel-sel dengan ketinggian yang berbeda dan saya perlu tahu kapan mereka benar - benar terlihat atau tidak.
Saat ini saya mengulang setiap sel dalam daftar sel yang terlihat untuk memeriksa apakah benar-benar terlihat setiap kali tampilan digulir. Apakah ini pendekatan terbaik?
Ini kode saya:
- (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:
Harap dicatat bahwa * - (NSArray ) visibleCells mengembalikan sel yang terlihat yang keduanya benar-benar terlihat dan sebagian terlihat.
Edit 2:
Ini adalah kode yang direvisi setelah menggabungkan solusi dari lnafziger dan 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
sumber
sumber
Jawaban:
Anda bisa mendapatkan persegi sel dengan
rectForRowAtIndexPath:
metode dan membandingkannya dengan persegi batas tableview menggunakanCGRectContainsRect
fungsi.Perhatikan bahwa ini tidak akan membuat instance sel jika tidak terlihat, dan karenanya akan menjadi lebih cepat.
Cepat
Obj-C
Tentu saja ini tidak akan menganggap tampilan tabel terpotong oleh tampilan super atau dikaburkan oleh tampilan lain.
sumber
CGRectContainsRect(tableView.bounds, [tableView rectForRowAtIndexPath:indexPath])
let completelyVisible = tableView.bounds.contains(tableView.rectForRow(at: indexPath))
Saya akan mengubahnya seperti ini:
sumber
Anda dapat mencoba sesuatu seperti ini untuk melihat berapa banyak persentase yang terlihat:
sumber
Dari dokumen:
sumber
Jika Anda juga ingin mempertimbangkan contentInset, dan tidak ingin mengandalkan superview (bingkai tampilan tabel di superview bisa jadi lebih dari 0,0), inilah solusi saya:
sumber
sumber
sumber
Bahkan jika Anda mengatakan ingin memeriksanya setiap kali Anda menggulir, Anda juga dapat menggunakan
sumber
Mungkin untuk masalah ini lebih baik digunakan fungsi selanjutnya dari UITableViewDelegate
sumber
tells the delegate that the specified cell was removed from the table.
Kode di bawah ini akan memungkinkan Anda memeriksa apakah sel tampilan koleksi benar-benar terlihat melalui atribut tata letak tampilan koleksi.
guard let cellRect = collectionView.layoutAttributesForItem(at: indexPath)?.frame else { return } let isCellCompletelyVisible = collectionView.bounds.contains(cellRect)
sumber