Как установить автоматическую высоту статической ячейки в UITableViewController?

Я использую IB и раскадровку, и я определил UITableViewController. Там я определил три static клетки. Первые два должны иметь заданную высоту, но последний должен автоматически заполнять оставшееся пространство (якорь в нижней части представления). Как я могу достичь этого? Я могу использовать autolayout для элементов управления внутри ячейка, но она выделена серым цветом для самой ячейки.

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

EDIT:

вот как это выглядит в моей раскадровки (цвета для визуализации отдельных элементов, каждый элемент управления имеет необходимые ограничения): Storyboard view controller

и после запуска: Simulator view Обратите внимание, что текстовое представление заканчивается внизу экрана.

Я забыл упомянуть, что я нацелен на 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() когда вы хотите обновите поля.