#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
}
}