J'ai un UITableViewfonctionnement sous iOS 8 et j'utilise des hauteurs de cellule automatiques à partir de contraintes dans un storyboard.
Une de mes cellules contient une seule UITextViewet j'en ai besoin pour se contracter et se développer en fonction de la saisie de l'utilisateur - appuyez sur pour réduire / développer le texte.
Je fais cela en ajoutant une contrainte d'exécution à la vue texte et en modifiant la constante de la contrainte en réponse aux événements utilisateur:
-(void)collapse:(BOOL)collapse; {
_collapsed = collapse;
if(collapse)
[_collapsedtextHeightConstraint setConstant: kCollapsedHeight]; // 70.0
else
[_collapsedtextHeightConstraint setConstant: [self idealCellHeightToShowFullText]];
[self setNeedsUpdateConstraints];
}
Chaque fois que je fais cela, je l'enveloppe dans les tableViewmises à jour et appelle [tableView setNeedsUpdateConstraints]:
[tableView beginUpdates];
[_briefCell collapse:!_showFullBriefText];
[tableView setNeedsUpdateConstraints];
// I have also tried
// [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
// with exactly the same results.
[tableView endUpdates];
Lorsque je fais cela, ma cellule se développe (et s'anime en le faisant) mais j'obtiens un avertissement de contraintes:
2014-07-31 13:29:51.792 OneFlatEarth[5505:730175] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7f94dced2b60 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'(388)]>",
"<NSLayoutConstraint:0x7f94dced2260 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...']-(15)-| (Names: '|':UITableViewCellContentView:0x7f94de5773a0 )>",
"<NSLayoutConstraint:0x7f94dced2350 V:|-(6)-[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'] (Names: '|':UITableViewCellContentView:0x7f94de5773a0 )>",
"<NSLayoutConstraint:0x7f94dced6480 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f94de5773a0(91)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7f94dced2b60 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'(388)]>
388 est ma hauteur calculée, les autres contraintes sur la UITextViewmienne sont de Xcode / IB.
Le dernier me dérange - je suppose que UIView-Encapsulated-Layout-Height c'est la hauteur calculée de la cellule lors de son premier rendu - (j'ai défini ma UITextViewhauteur sur> = 70,0) mais il ne semble pas juste que cette contrainte dérivée annule ensuite une utilisateur mis à jour cnstraint.
Pire encore, bien que le code de mise en page dise qu'il essaie de briser ma contrainte de hauteur, il ne le fait pas - il continue à recalculer la hauteur de la cellule et tout dessine comme je le voudrais.
Alors, quelle est NSLayoutConstraint UIView-Encapsulated-Layout-Height(je suppose que c'est la hauteur calculée pour le dimensionnement automatique des cellules) et comment devrais-je le forcer à recalculer proprement?
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;. Je pense que la définition initiale du masque de redimensionnement automatique empêche la dernière contrainte d'être ajoutée. J'ai trouvé cette solution ici: github.com/wordpress-mobile/WordPress-iOS/commit/…
<rect key="frame" x="0.0" y="0.0" width="600" height="110"/>dans sa définition, ce qui me fait croire qu'il s'agit d'un bogue IB . Au moins, le mien l'était de toute façon.