Je crée mon interface entièrement en code et utilise la maçonnerie pour contraindre les vues secondaires de la vue de contenu de la cellule à la hauteur appropriée. j'utilise
[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height
sur iOS 7 pour la hauteur de la ligne, tandis qu'iOS 8 la gère automatiquement.
Tout semble exactement comme il se doit à l'écran, mais la console contient des tonnes d'avertissements concernant des contraintes conflictuelles, qui semblent tous être provoqués par une contrainte de hauteur non demandée et inutile sur la vue du contenu de la cellule (par exemple, <NSLayoutConstraint UITableViewCellContentView.height == 44>
).
Sur iOS 8, je règle rowHeight
de la vue de table sur UITableViewAutomaticDimension
(effectivement -1
), mais j'obtiens tout de même cette contrainte. J'ajoute seulement des contraintes entre la vue de contenu et ses propres sous-vues, donc aucune contrainte entre la vue de contenu et la cellule elle-même.
Une idée d'où vient cette contrainte et comment la faire disparaître?
Edit: Maintenant, j'ai en fait trouvé une "solution" - définir d'abord le cadre de la vue contenu à quelque chose de ridicule, comme CGRectMake(0, 0, 99999, 99999)
, avant d'ajouter des sous-vues ou des contraintes, semble faire disparaître les avertissements. Mais cela ne sent pas vraiment la bonne façon de le faire, alors quelqu'un peut-il parler d'une meilleure approche?
J'ai eu le même problème et je l'ai corrigé en réglant le masque de redimensionnement automatique de la cellule comme ceci:
override func awakeFromNib() {
super.awakeFromNib()
self.contentView.autoresizingMask = .flexibleHeight
}
De plus, dans le contrôleur, je définis la hauteur estimée et indique à la vue table d'utiliser une dimension automatique (dans la méthode viewDidLoad:
self.tableView.estimatedRowHeight = 120
self.tableView.rowHeight = UITableView.automaticDimension
Ces liens ont aidé:
http://useyourloaf.com/blog/2014/08/07/self-sizing-table-view-cells.html
Problème de mise en page automatique sur iOS7 dans UITableViewCell
J'espère que cela t'aides!
Après avoir passé des mois à essayer de faire fonctionner le dimensionnement automatique des cellules d'iOS 8, j'ai découvert une mise en garde importante. La propriété 'ratedRowHeight' DOIT être définie. Soit directement via tableView, soit en implémentant les méthodes de délégation. Même s'il n'existe aucun moyen de déterminer une estimation valide, le simple fait de fournir une valeur autre que la valeur par défaut (0,0) a clairement permis à la disposition des cellules d'iOS 8 de fonctionner dans mes tests.
En ce qui concerne la "solution" mentionnée dans l'édition de la question (définir temporairement le cadre contentView), voici la preuve qu'il s'agit d'une bonne "solution": 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)
C'est hacky mais cela semble fonctionner.
J'ai découvert que, dans certains cas, la définition d'une hauteur estimée qui était plusieurs fois supérieure à la hauteur de ma cellule moyenne était corrigée dans la plupart des avertissements, voire tous, et n'avait aucun impact négatif sur l'affichage.
i.ee .: Setting self.tableView.estimatedRowHeight = 500.0f alors que la plupart des lignes ne font qu'environ 100.0f en hauteur ont résolu mon problème.
- (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;
}
régler translatesAutoresizingMaskIntoConstraints
sur NO
n'est pas un travail pour moi, mais autoresizingMask = UIViewAutoresizingFlexibleHeight
est bien.
vous devriez aussi faire des contraintes comme ceci:
- (void)updateConstraints {
[self.itemView mas_updateConstraints:^(MASConstraintMaker *make) {
make.leading.trailing.top.equalTo(0);
//make.bottom.equalTo(0);
make.bottom.lessThanOrEqualTo(0);
}];
[super updateConstraints];
}
les contraintes de fond et pas seulement equalTo
le fond de contentView, vous devez utiliser lessThanOrEqualTo
j'espère que c'est un travail pour vous!