Как установить автоматическую высоту статической ячейки в UITableViewController?
Я использую IB и раскадровку, и я определил UITableViewController
. Там я определил три static клетки. Первые два должны иметь заданную высоту, но последний должен автоматически заполнять оставшееся пространство (якорь в нижней части представления). Как я могу достичь этого? Я могу использовать autolayout для элементов управления внутри ячейка, но она выделена серым цветом для самой ячейки.
лучшим решением было бы сделать это из IB, но программные решения также приветствованный.
EDIT:
вот как это выглядит в моей раскадровки (цвета для визуализации отдельных элементов, каждый элемент управления имеет необходимые ограничения):
и после запуска: Обратите внимание, что текстовое представление заканчивается внизу экрана.
Я забыл упомянуть, что я нацелен на iOS 7.0+.
8 ответов
Ok попробуйте это
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
вы можете использовать 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
'контейнер ы). Предположим, у вас есть контейнер внутри contentView ячейки, который будет иметь динамическую высоту, для это для правильной визуализации вам нужно создать ограничение Нижнего пространства.
если у вас есть некоторые статические ячейки, которые имеют фиксированные высоты, я рекомендую вернуть этот размер, включив строку в tableView:heightForRowAtIndexPath:indexPath
обязательно переопределите heightForRowAtIndexPath! В противном случае он не будет отображаться правильно из моего опыта
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
{
return UITableViewAutomaticDimension
}
Я покрыл это в блоге, используя статический вид таблицы и устанавливая высоты ячеек с помощью автоматического макета. Все ячейки определены в interface builder.
вы должны включить автоматическую высоту ячейки в коде, но это всего лишь пара строк.
Я показываю все, включая IB и код.
посмотреть
http://www.oliverfoggin.com/using-a-static-uitableview-as-a-layout-device/
если вся высота ячейки tableview динамическая, вы можете попробовать это
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 240
или tableview нужна некоторая фиксированная ячейка высоты & некоторая динамическая ячейка высоты вы можете проверить ответ динамическая и статическая высота ячейки tableview
надеюсь, что это помогает.
Не уверен из IB и с помощью Autolayout
но с использованием программно,
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
используя этот метод, u может проверить indexpath.ряд. И с помощью этого возвращают разную высоту.
для статической (не управляемой данными) высоты вы можете просто удалить ячейку один раз и сохранить высоту:
- (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];
}
ответ Райана Романчука отличный. У меня есть совет, который может помочь новичку вроде меня.
поскольку это случай статической ячейки, вы можете быть склонны использовать IBOutlet
для каждого динамического поля. Установка значений в say UILabel
за пределами tableView
цикл нагрузки не будет рассматривать новые высоты.
чтобы динамическая высота работала, вы можете назначить значения в переопределенном cellForRowAtIndexPath
делегировать, чтобы autolayout мог подобрать новую высоту. Звоните tableView.reloadData()
когда вы хотите обновите поля.