2014-09-29 5 views
15

Я создаю свой интерфейс полностью в коде и используя масонство, чтобы ограничить подзаголовки представления содержимого ячейки на соответствующую высоту. Я используюСодержимое ContentView UITableViewCell получает нежелательное ограничение «height == 44»

[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height 

на iOS 7 для высоты строки, в то время как iOS 8 обрабатывает его автоматически.

Все выглядит точно так, как должно быть на экране, но в консоли я получаю сообщения с предупреждениями о конфликтующих ограничениях, которые, по-видимому, вызваны непрозрачным и ненужным ограничением высоты в представлении содержимого ячейки (например, <NSLayoutConstraint UITableViewCellContentView.height == 44>).

На iOS 8 Я устанавливаю вид стола rowHeight как UITableViewAutomaticDimension (фактически -1), но все же я получаю это ограничение. Я только добавляю ограничения между представлением контента и его собственными подзонами, поэтому никаких ограничений между представлением контента и самой ячейкой.

Любая идея, из-за которой возникает это ограничение, и как заставить его уйти?

Edit: Теперь я действительно нашел «решение» сортов - первоначальной настройку кадра представления содержимого на что-то нелепое, как CGRectMake(0, 0, 99999, 99999), перед добавлением подвидов или ограничений, кажется, делает предупреждение уйти. Но это не совсем пахнет, как правильный способ сделать это, так может ли кто-нибудь рассказать о лучшем подходе?

ответ

16

Я была такая же проблема и установил ее установки автоматического изменения размера маски клетки, как это:

override func awakeFromNib() { 
    super.awakeFromNib() 
    self.contentView.autoresizingMask = UIViewAutoresizing.FlexibleHeight 
} 

Кроме того, в контроллере я установил расчетную высоту и сказать вид таблицы для использования автоматического измерения (в метод viewDidLoad:

self.tableView.estimatedRowHeight = 120 
    self.tableView.rowHeight = UITableViewAutomaticDimension 

Эти ссылки помогли:

http://useyourloaf.com/blog/2014/08/07/self-sizing-table-view-cells.html

Auto layout constraints issue on iOS7 in UITableViewCell

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

+0

У меня есть этот вопрос, и попробовал этот ответ, но я все еще получаю ошибку :(Я использую Snapkit кстати "". –

+0

Per https: //github.com/Alex311/TableCellWithAutoLayout/commit/bde387b27e33605eeac3465475d2f2ff9775f163#commitcomment-4633188 Это не оптимальное решение. Посмотрите, пожалуйста, на мое решение. –

+1

Только установив оценочную высоту строки, я решил проблему. self.tableView.estimatedRowHeight = 120 Спасибо Maricel – crazywood

5

Чтобы ответить на вопрос о принятии ответа - после нескольких месяцев попытки получить автоматическую калибровку ячеек iOS 8 для работы я обнаружил важное оговорку. ДОЛЖНА быть установлена ​​свойство 'ratedRowHeight'. Либо через tableView напрямую, либо путем реализации методов делегата. Даже если не существует способа определить действительную оценку, просто предоставление значения, отличного от значения по умолчанию (0.0), явно разрешило раскладку ячеек iOS 8 для моего тестирования.

+1

Похоже, что оценочное значение RowHeight должно быть установлено при использовании iOS 9. – CodeReaper

4

Что касается до «решений», указанных в редактировании в вопросе (установка кадра contentView к чему-то большому временно), вот доказательство, что это хорошо «решение»: https://github.com/smileyborg/TableViewCellWithAutoLayoutiOS8/blob/master/TableViewCellWithAutoLayout/TableViewController/TableViewCell.swift

 // Note: if the constraints you add below require a larger cell size than the current size (which is likely to be the default size {320, 44}), you'll get an exception. 
     // As a fix, you can temporarily increase the size of the cell's contentView so that this does not occur using code similar to the line below. 
     //  See here for further discussion: https://github.com/Alex311/TableCellWithAutoLayout/commit/bde387b27e33605eeac3465475d2f2ff9775f163#commitcomment-4633188 
     // contentView.bounds = CGRect(x: 0.0, y: 0.0, width: 99999.0, height: 99999.0) 

Это Hacky, но он работает.

0
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 

    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { 

     //self.contentView.translatesAutoresizingMaskIntoConstraints = NO; 
     self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight; 
     self.itemView = [CustomItemView new]; 
     [self.contentView addSubview:self.itemView]; 

    } 

    return self; 
} 

установить translatesAutoresizingMaskIntoConstraints в NO не работает для меня , но autoresizingMask = UIViewAutoresizingFlexibleHeight хорошо.

вы должны также делает ограничения, как это:

- (void)updateConstraints { 

    [self.itemView mas_updateConstraints:^(MASConstraintMaker *make) { 

     make.leading.trailing.top.equalTo(0); 
     //make.bottom.equalTo(0); 
     make.bottom.lessThanOrEqualTo(0); 

    }]; 

    [super updateConstraints]; 
} 

нижние ограничения не только equalTo дно contentView, вы должны использовать lessThanOrEqualTo

надеюсь, что это работа для вас!

0

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

т.е .: Установка self.tableView.estimatedRowHeight = 500.0f в то время как большинство строк только 100.0f в высоту фиксированной мой вопрос.

+0

Это, однако, приводит к тому, что полоса прокрутки «прыгает» в больших таблицах, так как расчетное значение RowHeight сильно отличается от реального размера. – Daniel

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