Ich habe eine UITableView
Ausführung unter iOS 8 und verwende automatische Zellenhöhen aufgrund von Einschränkungen in einem Storyboard.
Eine meiner Zellen enthält eine einzelne UITextView
und ich muss sie basierend auf Benutzereingaben zusammenziehen und erweitern. Tippen Sie auf, um den Text zu verkleinern / erweitern.
Dazu füge ich der Textansicht eine Laufzeitbeschränkung hinzu und ändere die Konstante der Einschränkung als Reaktion auf Benutzerereignisse:
-(void)collapse:(BOOL)collapse; {
_collapsed = collapse;
if(collapse)
[_collapsedtextHeightConstraint setConstant: kCollapsedHeight]; // 70.0
else
[_collapsedtextHeightConstraint setConstant: [self idealCellHeightToShowFullText]];
[self setNeedsUpdateConstraints];
}
Wann immer ich dies tue, verpacke ich es in tableView
Updates und rufe an [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];
Wenn ich das mache, wird meine Zelle zwar erweitert (und dabei animiert), aber ich erhalte eine Warnung zu Einschränkungen:
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 ist meine berechnete Höhe, die anderen Einschränkungen für die UITextView
sind meine von Xcode / IB.
Das letzte stört mich - ich vermute, das UIView-Encapsulated-Layout-Height
ist die berechnete Höhe der Zelle, wenn sie zum ersten Mal gerendert wird - (ich setze meine UITextView
Höhe auf> = 70,0), aber es scheint nicht richtig, dass diese abgeleitete Einschränkung dann eine überschreibt Benutzer cnstraint aktualisiert.
Schlimmer noch, obwohl der Layoutcode besagt, dass versucht wird, meine Höhenbeschränkung zu brechen, ist dies nicht der Fall. Anschließend wird die Zellenhöhe neu berechnet und alles wird so gezeichnet, wie ich es möchte.
Also, was ist NSLayoutConstraint
UIView-Encapsulated-Layout-Height
(ich vermute, es ist die berechnete Höhe für die automatische Zellengröße) und wie sollte ich vorgehen, um es zu zwingen, sauber neu zu berechnen?
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
. Ich denke, dass das anfängliche Einstellen der Autoresize-Maske das Hinzufügen der letzten Einschränkung verhindert. Ich habe diese Lösung hier gefunden: github.com/wordpress-mobile/WordPress-iOS/commit/…
<rect key="frame" x="0.0" y="0.0" width="600" height="110"/>
in ihrer Definition fehlte , was mich zu der Annahme führte, dass dies ein IB-Fehler ist . Zumindest meins war es sowieso.