J'ai un UITableView
fonctionnement sous iOS 8 et j'utilise des hauteurs de cellule automatiques à partir de contraintes dans un storyboard.
Une de mes cellules contient une seule UITextView
et 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 tableView
mises à 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 UITextView
mienne 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 UITextView
hauteur 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.