UITableViewCell contentView получает нежелательное ограничение "height == 44"
Я создаю свой пользовательский интерфейс полностью в коде и используя масонство, чтобы ограничить просмотр содержимого содержимого ячейки до соответствующей высоты. Я использую
[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height
на iOS 7 для высоты строки, в то время как iOS 8 обрабатывает ее автоматически.
Все выглядит так, как должно быть на экране, но в консоли я получаю сообщения с предупреждениями о конфликтующих ограничениях, которые, по-видимому, вызваны неузнанным и ненужным ограничением высоты в представлении содержимого ячейки (например, <NSLayoutConstraint UITableViewCellContentView.height == 44>
).
В iOS 8 я устанавливаю представление таблицы rowHeight
как UITableViewAutomaticDimension
(эффективно -1
), но все же я получаю это ограничение. Я только добавляю ограничения между представлением контента и его собственными подзонами, поэтому никаких ограничений между представлением содержимого и самой ячейкой.
Любая идея, из которой вытекает это ограничение и как его уйти?
Изменить: Теперь я действительно нашел "решение" для сортировки - изначально установка рамки представления контента на что-то смешное, например CGRectMake(0, 0, 99999, 99999)
, перед добавлением подсмотров или ограничений, похоже, делает предупреждения далеко. Но это не совсем пахнет, как правильный способ сделать это, так может ли кто-нибудь сказать о лучшем подходе?
Ответы
Ответ 1
У меня была та же проблема, и я исправил ее, установив маску автоматического изменения размера ячейки следующим образом:
override func awakeFromNib() {
super.awakeFromNib()
self.contentView.autoresizingMask = .flexibleHeight
}
Также в контроллере я устанавливаю предполагаемую высоту и говорю табличному виду использовать автоматическое измерение (в методе viewDidLoad:
self.tableView.estimatedRowHeight = 120
self.tableView.rowHeight = UITableView.automaticDimension
Эти ссылки помогли:
http://useyourloaf.com/blog/2014/08/07/self-sizing-table-view-cells.html
Проблема авторазметки на iOS7 в UITableViewCell
Надеюсь это поможет!
Ответ 2
Чтобы принять решение о принятии ответа - после нескольких месяцев, когда я попытался получить автоматическое определение размеров ячеек iOS 8, я обнаружил важное оговорку. ДОЛЖНА быть установлена свойство 'ratedRowHeight'. Либо через tableView напрямую, либо путем реализации методов делегата. Даже если нет способа определить действительную оценку, просто предоставление значения, отличного от значения по умолчанию (0.0), явно разрешило компоновку ячеек iOS 8 для моего тестирования.
Ответ 3
Относительно "решения", упомянутого в редактировании в вопросе (установка рамки 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 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)
Он взломан, но кажется, что он работает.
Ответ 4
- (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;
}
set translatesAutoresizingMaskIntoConstraints
to 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
Надеюсь, это твоя работа!
Ответ 5
Я выяснил, что в некоторых случаях установка оценочного графика, во много раз превышающего высоту моей средней ячейки, фиксирует большинство, если не все предупреждения, и не оказывает негативного воздействия на дисплей.
т.е.:
Установка self.tableView.estimatedRowHeight = 500.0f, в то время как большинство строк составляют только около 100.0f по высоте, исправлена моя проблема.