Comment connaître la largeur d'un UITableViewCell lors de l'utilisation de la layout automatique?

J'ai un UITableViewCell où je mets dans ses labels contentView et d'autres choses en utilisant la layout automatique. J'ai ajouté des contraintes, l'une d'entre elles étant que contentView a les mêmes limites que UITableViewCell .

(Sur le storyboard , pour plus de commodité, j'ai choisi iphone 4-inch comme la taille des simulated mesortingcs .)

Après avoir ajouté les contraintes, j'appelle layoutIfNeeded car j'ai besoin d'get la taille de mes cellules. Les contraintes sont en effet présentées comme je peux voir que mon contentView est maintenant la même taille de UITableViewCell . Le problème est que la taille de l' UITableViewCell n'a pas encore été adaptée à la taille de l'écran (je suppose que c'est fait automatiquement plus tard car mes cellules vont bien). Donc, je suis toujours sur la taille d'un iPhone 4 pouces alors que je suis sur un iphone 4,7 pouces.

Existe-t-il un moyen de triggersr la taille finale de mes cellules comme il existe un moyen de forcer la disposition en utilisant layoutIfNeed ?

Lorsque vous chargez la cellule depuis le storyboard ou la plume, elle a la taille spécifiée dans la plume et non la taille finale. Dans cellForRowAtIndexPath, ajoutez vos vues et contraintes à contentView, puis ajustez la largeur en faisant cell.width = tableView.width. Enfin, appelez layoutIfNeeded comme vous le faisiez auparavant.

Cela provoquera une layout complète avec la largeur correcte de la cellule.

Edit: Cela fonctionne parce que même si vous chargez la nib avec la layout automatique activée (translatesAutoresizingMasksIntoConstraints = NO), la première vue de chaque file nib a toujours désactivé la layout automatique (translateAutoresizingMasksIntoConstraints = YES).

Cela signifie que lors du rendu de la vue (en faisant layoutIfNedded), autolayout considérera la propriété frame et masks pour déterminer la taille correcte.

Vous n'avez pas besoin d'appeler layoutIfNeeded après avoir ajouté des contraintes.

Vous pouvez sous- classr votre cellule et surcharger – (void) la méthode layoutSubviews pour get des changements de frame ou vous pouvez append un observateur à la cellule si vous ne voulez pas la sous- classr .

 [cell addObserver:yourObserver forKeyPath:@"self.frame" options:NSKeyValueObservingOptionNew context:NULL]; 

puis, dans la class de l'observateur

 - (void)observeValueForKeyPath:(NSSsortingng *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if(object==cell && [keyPath isEqualToSsortingng:@"self.frame"]) { //your code... } } 

Si cela ne fonctionne pas, essayez de replace cell par cell.contentView.

Éditer: Si vous voulez créer une sous-vue en utilisant des contraintes qui correspondent à la hauteur de la cellule et a une largeur de 100 et avec est aligné à la cellule.

 UIView *createdSubview = [[UIView alloc] init]; createdSubview.translatesAutoresizingMaskIntoConstraints = NO; [cell.contentView addSubview:createdSubview]; //Left align [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[createdSubview]" options:0 mesortingcs:nil views:NSDictionaryOfVariableBindings(createdSubview)]]; // Fit the parent view height [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[createdSubview]-0-|" options:0 mesortingcs:nil views:NSDictionaryOfVariableBindings(createdSubview)]]; // Width constraint [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[createdSubview(==100)]" options:0 mesortingcs:nil views:NSDictionaryOfVariableBindings(createdSubview)]];