Нет… indexPathsForVisibleRows это не решение

Представьте, что вам дали задание выяснить, какие ячейки табличного представления в данный момент полностью видны на экране. Итак, вы запускаете Xcode, получаете доступ к UITableView indexPathsForVisibleRows и ожидаете, что это выполнит свою работу.

Очень скоро вы заметите, что что-то не так. Результат, который вы получаете, немного отличается. Ячейки, частично видимые на экране, также включаются в результат, а это не то, что вам нужно. Как вы должны это сделать?

Решение на самом деле довольно простое: все, что вам нужно сделать, это мыслить нестандартно. Позвольте мне показать вам, как это сделать.

Получение путей индекса для UITableView

Чтобы найти индексные пути для всех полностью видимых ячеек, мы должны сначала иметь способ определить, является ли ячейка полностью видимой, на основе ее индексного пути.

Итак, как еще можно сказать, что «ячейка полностью видна»?

Ячейка, в которой представление содержимого полностью пересекается с представлением таблицы, считается полностью видимой ячейкой.

Имея это в виду, мы переводим приведенное выше утверждение в код следующим образом:

let cellFrame = tableView.rectForRow(at: indexPath)
let isCellFullyVisible = tableView.bounds.contains(cellFrame)

Как только мы сможем определить, является ли ячейка полностью видимой, на основе ее индексного пути, получение индексных путей для всех полностью видимых станет довольно простым.

Вот и все для просмотра таблицы! Далее, просмотр коллекции!

Получение путей индекса для UICollectionView

С точки зрения представления коллекции общий подход в основном такой же. Однако представление коллекции работает немного иначе, чем представление таблицы, мы не можем напрямую получить рамку ячеек представления коллекции. Мы должны получить доступ к фрейму ячейки через его атрибут layout следующим образом:

Часть фильтрации в основном такая же, как и табличное представление, только обязательно используйте indexPathsForVisibleItems вместо indexPathsForVisibleRows.

Делая шаг вперед

Как хорошие разработчики, мы всегда должны стремиться писать чистый и пригодный для повторного использования код. Итак, давайте сделаем код, который я только что показал вам, расширением функциональности представления таблицы и представления коллекции. Вот как это выглядит:

После этого получение путей индекса для всех полностью видимых ячеек стало таким же простым, как:

Довольно чисто, не так ли?

Want to Connect?
You can also follow me on Twitter so you won’t miss out any of my upcoming iOS development-related articles.

Спасибо за прочтение. 👨🏻‍💻