Tenho uma UITableView
execução no iOS 8 e estou usando alturas de células automáticas de restrições em um storyboard.
Uma das minhas células contém uma única UITextView
e eu preciso que ela se contraia e expanda com base na entrada do usuário - toque para diminuir / expandir o texto.
Estou fazendo isso adicionando uma restrição de tempo de execução à exibição de texto e alterando a constante na restrição em resposta a eventos do usuário:
-(void)collapse:(BOOL)collapse; {
_collapsed = collapse;
if(collapse)
[_collapsedtextHeightConstraint setConstant: kCollapsedHeight]; // 70.0
else
[_collapsedtextHeightConstraint setConstant: [self idealCellHeightToShowFullText]];
[self setNeedsUpdateConstraints];
}
Sempre que faço isso, envolvo-o em tableView
atualizações e chamo [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 faço isso, meu celular se expande (e anima enquanto o faz), mas recebo um aviso de restrições:
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 é minha altura calculada, as outras restrições UITextView
são as de Xcode / IB.
O último está me incomodando - acho que essa UIView-Encapsulated-Layout-Height
é a altura calculada da célula quando ela é renderizada pela primeira vez - (defino minha UITextView
altura como> = 70.0), mas não parece certo que essa restrição derivada substitua uma usuário atualizado cnstraint.
Pior, embora o código de layout diga que está tentando quebrar minha restrição de altura, isso não acontece - ele recalcula a altura da célula e tudo é desenhado como eu gostaria.
Então, o que é NSLayoutConstraint
UIView-Encapsulated-Layout-Height
(suponho que seja a altura calculada para o dimensionamento automático de células) e como devo forçá-lo a recalcular corretamente?
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
. Eu acho que a configuração inicial da máscara de redimensionamento automático impede que a última restrição seja adicionada. Eu encontrei esta solução aqui: github.com/wordpress-mobile/WordPress-iOS/commit/…
<rect key="frame" x="0.0" y="0.0" width="600" height="110"/>
em sua definição, levando-me a acreditar que este é um bug do IB . Pelo menos o meu era assim mesmo.