Подтвердить что ты не робот

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

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

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

EDIT:

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

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

Я забыл упомянуть, что я нацелен на iOS 7.0 +.

4b9b3361

Ответ 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];
}