2015-03-31 1 views
20

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

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

EDIT:

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

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

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

ответ

5

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

+0

Это лучший вариант, как сейчас. Однако мне нужно вычесть 63 пикселя больше для третьей строки, может быть, это для панели навигации? – bpiec

+0

Итак, 63 (ну, на самом деле 64) - это высота навигационной панели + высота строки состояния. Какой-то странный для меня, что высота 'tableView' содержит их ... – bpiec

+0

Обычно вы не должны вычитать навигацию. высота бара. Используйте функцию отладки просмотра, чтобы увидеть, какова фактическая высота таблицы. –

0

Не уверен, что от IB и используя Autolayout

Но использование программно,

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

Используя этот метод, и можно проверить на indexpath.row. И используя это возвращение разной высоты.

+0

Конечно, я знаю этот метод, но вопрос в том, что я должен вернуть для третьей строки ... – bpiec

0

Для статической (не управляемые данных) высоты, вы можете просто из очереди в клетке один раз и сохранить высоту:

- (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]; 
} 
+0

Я не понимаю, как это могло бы мне помочь ... – bpiec

3

я покрывал это в блоге с помощью статического вида таблицы и установки ячейки высоты с использованием автоматической компоновки. Все ячейки определены в построителе интерфейса.

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

Я показываю все, включая IB и код.

Посмотрите

http://www.oliverfoggin.com/using-a-static-uitableview-as-a-layout-device/

+0

Так выглядит, когда я устанавливаю ограничения и возвращаю 'UITableViewAutomaticDimension' для height: [link] (http://i.imgur.com/4Xj3lIn.png?1) (обратитесь к обновленному вопросу для справки). Я также забыл упомянуть, что я нацелен на iOS 7.0+. – bpiec

51

Вы можете использовать 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

+8

Использование Autolayout не является оговоркой, это особенность! – SwiftArchitect

+0

Отлично работает для меня. Я также реализовал 'tableView.reloadData()' так, чтобы моя высота ячейки была пересчитана, когда я изменяю содержимое в этой статической ячейке. – Andrej

+0

@SwiftArchitect очень правдивый, я предполагаю, что я просто имел в виду «не забыть» ваше нижнее ограничение –

7

Обязательно переопределить heightForRowAtIndexPath! В противном случае он не будет отображаться правильно из моего опыта

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
{ 
    return UITableViewAutomaticDimension 
} 
1

Если вся высота TableView клетки является динамической, то вы можете попробовать этот

tableView.rowHeight = UITableViewAutomaticDimension 
tableView.estimatedRowHeight = 240 

или TableView нуждается в некоторой фиксированной ячейке высоты & некоторый динамический рост сот вы можете проверить ответ Dynamic & static tableview cell height

Надеюсь, что это поможет.

Смежные вопросы