Найти высоту пустого пространства в UITableView

#iphone #uitableview

#iPhone #uitableview

Вопрос:

В моем UITableView мне нужно разместить UIView в нижнем колонтитуле таблицы и за пределами экрана. Например, функция «Нажать, чтобы обновить» (например, приложение Twitter) находится в начале таблицы и за пределами экрана, мне нужно то же самое, но внизу.

Если у меня достаточно строк с общей высотой, превышающей высоту экрана, у меня нет никаких проблем, но если у меня нет ни одной строки, я не могу расположить muy view.

Итак, мне нужно добавить пустую ячейку (пользовательскую ячейку) в мою таблицу, чтобы заполнить пустое пространство между последней ячейкой и нижней частью экрана, как я могу это сделать? Как я могу узнать высоту пустого пространства?

Большое вам спасибо за вашу помощь.

Ответ №1:

Почему бы вместо пустой ячейки не использовать тот же вид нижнего колонтитула таблицы и просто сделать его достаточно большим, чтобы вместить это пустое пространство. Это кажется намного проще.

Теперь единственное решение, которое я могу придумать прямо сейчас, — это вручную рассчитать высоту вашего содержимого. Для этого, я думаю, вы можете использовать хитрость и просто вызвать

 
CGRect lastRowFrame = [tableView rectForRowAtIndexPath: last_row_index_path];
  

Как говорится в документации, это даст вам кадр для последней строки, и с его помощью вы можете вычислить разницу между frame.size.height и последним кадром строки. Что-то вроде этого:

 
CGFloat emptySpaceHeight = tableView.frame.size.height - (lastRowFrame.origin.y   lastRowFrame.size.height);
  

Это будет пустое пространство, которое вам нужно добавить в представление нижнего колонтитула.

О, и еще один последний трюк для получения этого эффекта: убедитесь, что вы используете tableView.contentInset для установки нижней вставки минус «Нажать, чтобы обновить» высоту сообщения. Это приведет к тому, что tableview подпрыгнет и останется с сообщением вне экрана.

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

Комментарии:

1. Это сбой для меня .. вроде как это происходит в бесконечном цикле. Я выполняю вычисление пустого пространства внутри моего метода viewForFooterInSection и метода heightForFooterInSection. Я думаю, проблема в том, что я пытаюсь найти последний indexPath раздела до его инициализации.

Ответ №2:

Быстрая версия

         lastRowFrame = tableView.rectForRow(at: indexPath)
        let emptySpaceHeight = tableView.frame.size.height - (lastRowFrame.origin.y   lastRowFrame.size.height)
  

Ответ №3:

Вы можете попробовать добавить это в функцию heightforrowat, это позволяет нижней ячейке иметь размер недостающего пространства между последней ячейкой и нижней частью экрана.

     if indexPath == (lastIndexPath) {
        var currentCellsHeight: CGFloat = 0
        let minimumFooterCellHeight = 50 // Whatever you want the minimum to be

        for visibleCell in tableView.visibleCells {
            currentCellsHeight  = visibleCell.frame.height
        }

        if let footerCell = tableView.cellForRow(at: indexPath) {
            currentCellsHeight -= footerCell.frame.height
        }
        if self.view.frame.height - currentCellsHeight < minimumFooterCellHeight {
            return minimumFooterCellHeight
        } else {
            return self.view.frame.height - currentCellsHeight
        }
    }