Что вам нужно сделать, это определить, когда происходит прокрутка, с помощью метода делегата scrollViewDidScroll(_:)
. Когда вызывается метод делегата, вы можете определить, какие ячейки видны, проверив свойство tableView.indexPathsForVisibleRows
. Обратите внимание, что это свойство возвращает IndexPath для всех ячеек, которые являются полностью видимыми и частично видимыми.
Предполагая, что вас интересуют только полностью видимые ячейки, вы можете проверить рамку для каждой строки, чтобы определить, на самом деле он полностью виден.
Чтобы определить, какие ячейки являются вновь видимыми, необходимо отследить ячейки, которые были видны ранее, и сравнить два набора.
Этот код сообщит вам как только появится ячейка:
var previousVisiblePaths = Set<IndexPath>()
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
guard let visiblePaths = tableView.indexPathsForVisibleRows?.filter ({
let rect = tableView.rectForRow(at: $0)
return tableView.bounds.contains(rect)
}).reduce(into: Set<IndexPath>(), { result, indexPath in
result.insert(indexPath)
}) else { return }
let newVisiblePaths = visiblePaths.subtracting(previousVisiblePaths)
if newVisiblePaths.count > 0 {
print("Just displayed: \(newVisiblePaths)")
}
previousVisiblePaths = visiblePaths
}