Ho una UITableView
corsa sotto iOS 8 e sto usando le altezze delle celle automatiche dai vincoli in uno storyboard.
Una delle mie celle ne contiene una singola UITextView
e ne ho bisogno per contrarmi ed espandersi in base all'input dell'utente: tocca per ridurre / espandere il testo.
Lo sto facendo aggiungendo un vincolo di runtime alla vista di testo e modificando la costante sul vincolo in risposta agli eventi dell'utente:
-(void)collapse:(BOOL)collapse; {
_collapsed = collapse;
if(collapse)
[_collapsedtextHeightConstraint setConstant: kCollapsedHeight]; // 70.0
else
[_collapsedtextHeightConstraint setConstant: [self idealCellHeightToShowFullText]];
[self setNeedsUpdateConstraints];
}
Ogni volta che lo faccio, lo avvolgo negli tableView
aggiornamenti e chiamo [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];
Quando lo faccio, la mia cella si espande (e si anima mentre lo fa) ma ricevo un avviso sui vincoli:
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 è la mia altezza calcolata, gli altri vincoli UITextView
sono i miei da Xcode / IB.
L'ultimo mi dà fastidio - suppongo che UIView-Encapsulated-Layout-Height
sia l'altezza calcolata della cella quando viene renderizzata per la prima volta ((ho impostato la mia UITextView
altezza su> = 70,0), tuttavia non sembra giusto che questo vincolo derivato abbia la precedenza su un cnstraint utente aggiornato.
Peggio ancora, anche se il codice del layout dice che sta cercando di rompere il mio vincolo di altezza, non lo fa - continua a ricalcolare l'altezza della cella e tutto disegna come vorrei.
Quindi, cos'è NSLayoutConstraint
UIView-Encapsulated-Layout-Height
(suppongo sia l'altezza calcolata per il dimensionamento automatico delle celle) e come devo fare per costringerlo a ricalcolare in modo pulito?
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
. Penso che l'impostazione iniziale della maschera di ridimensionamento automatico impedisca di aggiungere l'ultimo vincolo. Ho trovato questa soluzione qui: github.com/wordpress-mobile/WordPress-iOS/commit/…
<rect key="frame" x="0.0" y="0.0" width="600" height="110"/>
nella sua definizione, portandomi a credere che si tratti di un bug IB . Almeno il mio lo era comunque.