Mam UITableView
działający pod iOS 8 i używam automatycznych wysokości komórek od ograniczeń w serii ujęć.
Jedna z moich komórek zawiera jedną UITextView
i muszę ją skurczyć i rozwinąć na podstawie danych wprowadzonych przez użytkownika - dotknij, aby zmniejszyć / rozwinąć tekst.
Robię to, dodając ograniczenie czasu wykonywania do widoku tekstu i zmieniając stałą ograniczenia w odpowiedzi na zdarzenia użytkownika:
-(void)collapse:(BOOL)collapse; {
_collapsed = collapse;
if(collapse)
[_collapsedtextHeightConstraint setConstant: kCollapsedHeight]; // 70.0
else
[_collapsedtextHeightConstraint setConstant: [self idealCellHeightToShowFullText]];
[self setNeedsUpdateConstraints];
}
Ilekroć to robię, pakuję go w tableView
aktualizacje i dzwonię [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];
Kiedy to robię, moja komórka rozszerza się (i animuje podczas tej operacji), ale pojawia się ostrzeżenie o ograniczeniach:
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 to moja obliczona wysokość, pozostałe ograniczenia UITextView
są moje od Xcode / IB.
Ostatnia przeszkadza mi - zgaduję, że UIView-Encapsulated-Layout-Height
jest to obliczona wysokość komórki, gdy jest ona renderowana po raz pierwszy - (ustawiłem moją UITextView
wysokość na> = 70,0), jednak nie wydaje się słuszne, aby to pochodne ograniczenie nadpisało zaktualizowano cnstraint użytkownika.
Co gorsza, chociaż kod układu mówi, że próbuje przełamać moje ograniczenie wysokości, nie robi tego - kontynuuje ponowne obliczanie wysokości komórki i wszystko rysuje tak, jak bym chciał.
Czym więc jest NSLayoutConstraint
UIView-Encapsulated-Layout-Height
(domyślam się, że jest to obliczona wysokość dla automatycznego określania rozmiaru komórki) i jak powinienem zmusić ją do ponownego przeliczenia?
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
. Myślę, że początkowo ustawienie maski automatycznego zatrzymywania powstrzymuje dodawanie ostatniego ograniczenia. Znalazłem to rozwiązanie tutaj: github.com/wordpress-mobile/WordPress-iOS/commit/…
<rect key="frame" x="0.0" y="0.0" width="600" height="110"/>
w definicji, co prowadzi mnie do przekonania, że to błąd IB . Przynajmniej moja była zresztą.