什么是NSLayoutConstraint“UIView-Encapsulated-Layout

我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 )>",


388是我计算的高度,其他约束UITextView是我的Xcode / IB。


最后一个困扰我 - 我猜UIView-Encapsulated-Layout-Height这是第一次渲染时单元格的计算高度 - (我将我的UITextView高度设置为> = 70.0)但是这个派生约束然后否定了更新了用户cnstraint。


更糟糕的是,虽然布局代码表示它试图打破我的高度限制,但它没有 - 它继续重新计算单元格高度,所有内容都按照我的意愿绘制。


那么,是什么NSLayoutConstraint UIView-Encapsulated-Layout-Height(我猜它是自动细胞大小的计算高度),我应该如何强制它干净地重新计算?


鸿蒙传说
浏览 1004回答 3
3回答

弑天下

尝试将您的优先级降低_collapsedtextHeightConstraint到999.这样系统提供的UIView-Encapsulated-Layout-Height约束始终优先。它取决于你的回归&nbsp; -tableView:heightForRowAtIndexPath:。确保返回正确的值和您自己的约束,生成的约束应该相同。只有暂时需要您自己的约束的较低优先级,以防止崩溃/扩展动画在飞行中时发生冲突。

慕标5832272

我有一个类似的场景:一个带有一个行单元格的表视图,其中有几行UILabel对象。我正在使用iOS 8和自动布局。当我旋转时,我得到了错误的系统计算行高(43.5远小于实际高度)。看起来像:"<NSLayoutConstraint:0x7bc2b2c0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7bc37f30(43.5)]>"这不仅仅是一个警告。我的表格视图单元格的布局非常糟糕 - 所有文本都重叠在一条文本行上。让我感到惊讶的是,以下一行神奇地“修复”了我的问题(autolayout没有任何抱怨,我得到了我在屏幕上的预期):myTableView.estimatedRowHeight = 2.0; // any number but 2.0 is the smallest one that works有或没有这条线:myTableView.rowHeight = UITableViewAutomaticDimension; // by itself this line only doesn't help fix my specific problem
打开App,查看更多内容
随时随地看视频慕课网APP