Как установить автоматическую высоту статической ячейки в UITableViewController?
Я использую IB и раскадровку, и я определил UITableViewController
. Там я определил три статические ячейки. Первые два должны иметь заданную высоту, но последняя должна автоматически заполнять оставшееся пространство (привязка к нижней части представления). Как я могу это достичь? Я могу использовать автозапуск для элементов управления внутри, но он сам по себе неактивен для самой ячейки.
Лучшим решением было бы сделать это от IB, но также приветствуются программные решения.
EDIT:
Вот как это выглядит в моей раскадровке (цвета предназначены для визуализации отдельных элементов управления, для каждого элемента управления требуются ограничения):
![Storyboard view controller]()
И после запуска:
Обратите внимание, что текстовый вид заканчивается ниже нижней части экрана.
Я забыл упомянуть, что я нацелен на iOS 7.0 +.
Ответы
Ответ 1
Хорошо попробуйте это
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat{
if indexPath.row == 0 {
return firstRowHeight
}
else if indexPath.row == 1 {
return secondRowHeight
}
else {
return tableView.frame.size.height - firstRowHeight - secondRowHeight
}
}
Единственное, что может быть проблемой, это то, что этот метод будет запущен до того, как представление задает высоту tableView
Ответ 2
Фактически вы можете использовать UITableViewAutomaticDimension
со статическими ячейками. Создайте свои статические ячейки в обычном режиме и вручную настройте свои ячейки как динамические высоты, добавив
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 240 // Something reasonable to help ios render your cells
Теперь переопределите делегат heightForRow
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
Единственное другое предостережение, которое я заметил с помощью этой техники, заключается в том, что вы должны использовать NSAutolayout
для создания ограничения для нижнего контейнера (контейнер UITableViewCell
). Итак, скажем, у вас есть контейнер внутри содержимого cellView, который будет иметь динамическую высоту, так как для правильной визуализации вам нужно создать ограничение нижнего пространства.
Если у вас есть статические ячейки, у которых есть фиксированные высоты, я рекомендую вернуть этот размер, включив строку в tableView:heightForRowAtIndexPath:indexPath
Ответ 3
Обязательно переопределите heightForRowAtIndexPath! В противном случае он не будет отображаться правильно из моего опыта.
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
{
return UITableViewAutomaticDimension
}
Ответ 4
Я рассмотрел это в сообщении в блоге, используя статическое представление таблицы и установив высоты ячеек с помощью автоматического макета. Все ячейки определены в построителе интерфейса.
Вам нужно включить автоматическую высоту ячеек в коде, но это только пара строк.
Я показываю все, включая IB и код.
Посмотрите
http://www.oliverfoggin.com/using-a-static-uitableview-as-a-layout-device/
Ответ 5
Если высота таблицы tableview является динамической, вы можете попробовать эту
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 240
или для просмотра таблицы требуется фиксированная ячейка высоты и какая-то динамическая ячейка высоты, вы можете проверить ответ
Динамическая и статическая высота ячейки таблицы
Надеюсь, что это поможет.
Ответ 6
Не уверен от IB и использование Autolayout
Но используя программно,
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
Используя этот метод, вы можете проверить значение indexpath.row. И используя это возвращение разной высоты.
Ответ 7
Для статической (не управляемой данными) высоты вы можете просто разблокировать ячейку один раз и сохранить высоту:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSNumber *height;
if (!height) {
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"MyCustomCell"];
height = @(cell.bounds.size.height);
}
return [height floatValue];
}