Определите, видна ли ячейка tableview
есть ли способ узнать, является ли ячейка tableview в настоящее время видимой?
У меня есть tableview, первая ячейка которого(0) является uisearchbar.
Если поиск не активен, то скрыть ячейку 0 с помощью смещения.
Если таблица содержит только несколько строк, то видна строка 0.
Как определить, видна ли строка 0 или является верхней строкой?
7 ответов:
UITableViewимеет метод экземпляра с именемindexPathsForVisibleRows, что вернетNSArrayнаNSIndexPathпредметы для каждой строки в таблице, которые в настоящее время видны. Вы можете проверить этот метод с любой частотой, которую вам нужно, и проверить правильность строки. Например, еслиtableViewявляется ссылкой на вашу таблицу, следующий метод скажет вам, является ли строка 0 на экране:-(BOOL)isRowZeroVisible { NSArray *indexes = [tableView indexPathsForVisibleRows]; for (NSIndexPath *index in indexes) { if (index.row == 0) { return YES; } } return NO; }потому что
UITableViewметод возвращаетNSIndexPath, вы можете легко расширить этот для поиска разделов или комбинаций строк/разделов.это более полезно для Вас, чем
visibleCellsметод, который возвращает массив объектов таблица клетки. Объекты ячеек таблицы перерабатываются, поэтому в больших таблицах они в конечном итоге не будут иметь простой корреляции с вашим источником данных.
для проверки TableView ячейка видна или нет используйте этот код строки
if(![tableView.indexPathsForVisibleRows containsObject:newIndexPath]) { // your code }здесь newIndexPath-это IndexPath проверяющей ячейки.....
Swift 3.0
if !(tableView.indexPathsForVisibleRows?.contains(newIndexPath)) { // Your code here }
Я использую это в Swift 3.0
extension UITableView { /// Check if cell at the specific section and row is visible /// - Parameters: /// - section: an Int reprenseting a UITableView section /// - row: and Int representing a UITableView row /// - Returns: True if cell at section and row is visible, False otherwise func isCellVisible(section:Int, row: Int) -> Bool { guard let indexes = self.indexPathsForVisibleRows else { return false } return indexes.contains {.section == section && .row == row } } }
другое решение (которое также может быть использовано для проверки, если строка полностью видна) было бы проверить, если кадр для
rowнаходится внутри видимой прямой кишкиtableview.в следующем коде
ipпредставляетNSIndexPath:CGRect cellFrame = [tableView rectForRowAtIndexPath:ip]; if (cellFrame.origin.y<tableView.contentOffset.y) { // the row is above visible rect [tableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionTop animated:NO]; } else if(cellFrame.origin.y+cellFrame.size.height>tableView.contentOffset.y+tableView.frame.size.height-tableView.contentInset.top-tableView.contentInset.bottom){ // the row is below visible rect [tableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionBottom animated:NO]; }и с помощью
cellForRowAtIndexPath:должен работать, так как он возвращаетnilобъект, если строка не видна:if([tableView cellForRowAtIndexPath:ip]==nil){ // row is not visible }
Swift Версия:
if let indices = tableView.indexPathsForVisibleRows { for index in indices { if index.row == 0 { return true } } } return false
IOS 4:
NSArray *cellsVisible = [tableView indexPathsForVisibleRows]; NSUInteger idx = NSNotFound; idx = [cellsVisible indexOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { return ([(NSIndexPath *)obj compare:indexPath] == NSOrderedSame); }]; if (idx == NSNotFound) {
обратите внимание, что "несколько видимый" - это "видимый". Кроме того, в viewWillAppear, вы можете получить ложные срабатывания от
indexPathsForVisibleRowsкак макет выполняется, и если вы смотрите на последнюю строку, даже вызовlayoutIfNeeded()не поможет вам на столы. Вы хотите, чтобы проверить вещи в / послеviewDidAppear.этот код swift 3.1 отключит прокрутку, если последняя строка полностью видна. Вызовите его в / после viewDidAppear.
let numRows = tableView.numberOfRows(inSection: 0) // this can't be in viewWillAppear because the table's frame isn't set to proper height even after layoutIfNeeded() let lastRowRect = tableView.rectForRow(at: IndexPath.init(row: numRows-1, section: 0)) if lastRowRect.origin.y + lastRowRect.size.height > tableView.frame.size.height { tableView.isScrollEnabled = true } else { tableView.isScrollEnabled = false }
Comments