У меня есть 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, так и от Вадима Елагина :
- (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
источник
источник
Ответы:
Вы можете получить прямоугольник ячейки с помощью
rectForRowAtIndexPath:
метода и сравнить его с прямоугольником границ таблицы с помощьюCGRectContainsRect
функции.Обратите внимание, что это не создаст экземпляр ячейки, если она не видна, и, следовательно, будет довольно быстро.
Swift
Obj-C
Конечно, при этом не будет рассматриваться представление таблицы, обрезанное супервизором или скрытое другим представлением.
источник
CGRectContainsRect(tableView.bounds, [tableView rectForRowAtIndexPath:indexPath])
let completelyVisible = tableView.bounds.contains(tableView.rectForRow(at: indexPath))
Я бы изменил это так:
источник
Вы можете попробовать что-то вроде этого, чтобы увидеть, сколько процентов видно:
источник
Из документов:
источник
Если вы также хотите принять во внимание contentInset и не хотите полагаться на супервизор (рамка представления таблицы в супервизоре может быть чем-то другим, кроме 0,0), вот мое решение:
источник
источник
источник
Даже если вы сказали, что хотите проверять его каждый раз при прокрутке, вы также можете использовать
источник
Возможно, для этой проблемы лучше использовать следующую функцию из UITableViewDelegate
источник
tells the delegate that the specified cell was removed from the table.
Приведенный ниже код позволит вам проверить, полностью ли видна ячейка представления коллекции через атрибуты макета представления коллекции.
guard let cellRect = collectionView.layoutAttributesForItem(at: indexPath)?.frame else { return } let isCellCompletelyVisible = collectionView.bounds.contains(cellRect)
источник