У меня есть UITableView
, работающий под iOS 8, и я использую автоматическую высоту ячеек из ограничений в раскадровке.
Одна из моих ячеек содержит один UITextView
, и мне нужно, чтобы он сокращался и расширялся на основе пользовательского ввода - нажмите, чтобы уменьшить/развернуть текст.
Я делаю это, добавляя ограничение времени выполнения в текстовое представление и изменяя константу в ограничении в ответ на пользовательские события:
-(void)collapse:(BOOL)collapse; {
_collapsed = collapse;
if(collapse)
[_collapsedtextHeightConstraint setConstant: kCollapsedHeight]; // 70.0
else
[_collapsedtextHeightConstraint setConstant: [self idealCellHeightToShowFullText]];
[self setNeedsUpdateConstraints];
}
Когда я это сделаю, я переношу его в обновления tableView
и вызываю [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];
Когда я это делаю, моя ячейка расширяется (и анимируется при ее выполнении), но я получаю предупреждение о ограничениях:
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 - моя расчетная высота, другие ограничения на UITextView
являются моими из Xcode/IB.
Последний беспокоит меня - я предполагаю, что UIView-Encapsulated-Layout-Height
- это вычисленная высота ячейки при ее первом рендеринге (я установил, что мой размер UITextView
должен быть >= 70,0), однако он не кажется правильным, что это производное ограничение затем перекрывает обновленный пользовательский cnstraint.
Хуже того, хотя код макета говорит, что он пытается сломать ограничение по высоте, он этого не делает - он продолжает пересчитывать высоту ячейки, и все рисует, как хотелось бы.
Итак, что такое NSLayoutConstraint
UIView-Encapsulated-Layout-Height
(я предполагаю, что это расчетная высота для автоматического выбора размеров ячеек) и как мне заставить заставить его пересчитать чисто?