У мене 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 . Принаймні моя була все одно.