ios - dynamically - El contentView de UITableViewCell obtiene una restricción no deseada de "height== 44"
uitableviewcell height (5)
Estoy creando mi UI completamente en código y uso la Masonería para restringir las subvistas de la vista de contenido de la celda a la altura adecuada. Estoy usando
[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height
en iOS 7 para el alto de fila, mientras que iOS 8 lo maneja automáticamente.
Todo se ve exactamente como debería en la pantalla, pero en la consola recibo una gran cantidad de advertencias para restricciones en conflicto, las cuales parecen ser causadas por una restricción de altura no solicitada e innecesaria en la vista de contenido de la celda (por ejemplo, <NSLayoutConstraint UITableViewCellContentView.height == 44>
).
En iOS 8, estoy configurando rowHeight
la vista de rowHeight
como UITableViewAutomaticDimension
(efectivamente -1
) pero aún así obtengo esta restricción. Solo estoy agregando restricciones entre la vista de contenido y sus propias subvistas, por lo que no hay restricciones entre la vista de contenido y la celda en sí.
¿Alguna idea de dónde viene esta restricción y cómo hacerla desaparecer?
Edición: Ahora, en realidad, encontré una "solución" de tipo: inicialmente establecer el marco de la vista de contenido en algo ridículo, como CGRectMake(0, 0, 99999, 99999)
, antes de agregar subvistas o restricciones, parece hacer que desaparezcan las advertencias. Pero esto no huele exactamente como la forma correcta de hacerlo, así que, ¿puede alguien decir un mejor enfoque?
Con respecto a la "solución" mencionada en la edición en la pregunta (establecer el marco contentView en algo grande temporalmente), aquí hay una prueba de que esta es una buena "solución": 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)
Es hacky pero parece funcionar.
Descubrí que, en algunos casos, establecer una Altura estimada que es muchas veces mayor que la altura de mi celda promedio corrigió la mayoría, si no todas, las advertencias y no tuvo un impacto negativo en la pantalla.
es decir: establecer self.tableView.estimatedRowHeight = 500.0f, mientras que la mayoría de las filas tienen solo una altura de aproximadamente 100.0f solucionó mi problema.
Para seguir con la respuesta de aceptación, después de meses de intentar que el tamaño de celda automático de iOS 8 funcionara, descubrí una importante advertencia. La propiedad ''verifiedRowHeight'' DEBE establecerse. Ya sea a través de tableView directamente o implementando los métodos de delegado. Incluso si no hay manera de determinar una estimación válida, simplemente proporcionar un valor distinto al predeterminado (0.0) ha permitido, de manera demostrable, que el diseño de la celda de iOS 8 funcione en mis pruebas.
Tuve el mismo problema y lo arreglé configurando la máscara de redimensionamiento automático de la celda de esta manera:
override func awakeFromNib() {
super.awakeFromNib()
self.contentView.autoresizingMask = .flexibleHeight
}
También en el controlador establezco la altura estimada y le digo a la vista de tabla que use una dimensión automática (en el método viewDidLoad:
self.tableView.estimatedRowHeight = 120
self.tableView.rowHeight = UITableView.automaticDimension
Estos enlaces ayudaron:
http://useyourloaf.com/blog/2014/08/07/self-sizing-table-view-cells.html
Problema de restricciones de diseño automático en iOS7 en UITableViewCell
¡Espero que esto ayude!
- (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
en NO
no me funciona, pero autoresizingMask = UIViewAutoresizingFlexibleHeight
está bien.
También deberías hacer restricciones como esta:
- (void)updateConstraints {
[self.itemView mas_updateConstraints:^(MASConstraintMaker *make) {
make.leading.trailing.top.equalTo(0);
//make.bottom.equalTo(0);
make.bottom.lessThanOrEqualTo(0);
}];
[super updateConstraints];
}
las restricciones de la parte inferior no solo equalTo
iguales a la parte inferior de equalTo
sino que debe usar lessThanOrEqualTo
Espero que esto sea trabajo para ti!