ฉันมี UITableView ที่มีเซลล์ที่มีความสูงต่างกันและฉันจำเป็นต้องรู้ว่าเมื่อใดที่มองเห็นได้อย่างสมบูรณ์หรือไม่
ในขณะนี้ฉันกำลังวนรอบแต่ละเซลล์ในรายการเซลล์ที่มองเห็นได้เพื่อตรวจสอบว่ามองเห็นได้อย่างสมบูรณ์ทุกครั้งที่เลื่อนมุมมองหรือไม่ นี่เป็นแนวทางที่ดีที่สุดหรือไม่?
นี่คือรหัสของฉัน:
- (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];
}
}
}
แก้ไข:
โปรดทราบว่า * - (NSArray ) visibleCellsจะส่งคืนเซลล์ที่มองเห็นได้ซึ่งทั้งมองเห็นได้อย่างสมบูรณ์และมองเห็นได้บางส่วน
แก้ไข 2:
นี่คือรหัสที่แก้ไขหลังจากรวมโซลูชันจากทั้งlnafzigerและ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];
}