Mam UITableView z komórkami o różnych wysokościach i muszę wiedzieć, kiedy są one całkowicie widoczne, czy nie.
W tej chwili przeglądam każdą komórkę na liście widocznych komórek, aby sprawdzić, czy jest ona całkowicie widoczna za każdym razem, gdy widok jest przewijany. Czy to najlepsze podejście?
Oto mój kod:
- (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];
}
}
}
Edytować:
Zwróć uwagę, że * - ( NSArray) visibleCells zwraca widoczne komórki, które są zarówno całkowicie widoczne, jak i częściowo widoczne.
Edycja 2:
Oto poprawiony kod po połączeniu rozwiązań Lnafzigera i Vadima Yelagina :
- (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
źródło
źródło
Odpowiedzi:
Możesz uzyskać
rectForRowAtIndexPath:
prostokąt komórki za pomocą metody i porównać go z prostymi granicami widoku tabeli za pomocąCGRectContainsRect
funkcji function.Zauważ, że nie spowoduje to utworzenia instancji komórki, jeśli nie jest ona widoczna, a zatem będzie raczej szybka.
Szybki
Obj-C
Oczywiście nie będzie to dotyczyło przycinania widoku tabeli przez nadzór lub zasłaniania przez inny widok.
źródło
CGRectContainsRect(tableView.bounds, [tableView rectForRowAtIndexPath:indexPath])
let completelyVisible = tableView.bounds.contains(tableView.rectForRow(at: indexPath))
Zmieniłbym to tak:
źródło
Możesz spróbować czegoś takiego, aby zobaczyć, ile procent jest widoczny:
źródło
Z dokumentów:
źródło
Jeśli chcesz również wziąć pod uwagę contentInset i nie chcesz polegać na superviewie (ramka widoku tabeli w superview może być czymś innym niż 0,0), oto moje rozwiązanie:
źródło
źródło
źródło
Nawet jeśli powiedziałeś, że chcesz go sprawdzać za każdym razem, gdy przewijasz, możesz również użyć
źródło
Może w tym przypadku lepiej wykorzystaj następną funkcję z UITableViewDelegate
źródło
tells the delegate that the specified cell was removed from the table.
Poniższy kod umożliwia sprawdzenie, czy komórka widoku kolekcji jest całkowicie widoczna przez atrybuty układu widoku kolekcji.
guard let cellRect = collectionView.layoutAttributesForItem(at: indexPath)?.frame else { return } let isCellCompletelyVisible = collectionView.bounds.contains(cellRect)
źródło