我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错误。 。至少我的还是。