У меня 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
(я предполагаю, что это расчетная высота для автоматического определения размера ячеек) и как мне заставить его пересчитывать чисто?
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
. Я думаю, что изначально установка маски авторазмера останавливает добавление последнего ограничения. Я нашел это решение здесь: github.com/wordpress-mobile/WordPress-iOS/commit/…
<rect key="frame" x="0.0" y="0.0" width="600" height="110"/>
в ее определении, что заставило меня поверить, что это ошибка IB. , По крайней мере, мой был в любом случае.