什么是NSLayoutConstraint" UIView-Encapsulated-Layout-Height"我应该如何强制它干净地重新计算? [英] What is NSLayoutConstraint "UIView-Encapsulated-Layout-Height" and how should I go about forcing it to recalculate cleanly?

查看:196
本文介绍了什么是NSLayoutConstraint" UIView-Encapsulated-Layout-Height"我应该如何强制它干净地重新计算?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在iOS 8下运行了 UITableView ,我在故事板中使用约束中的自动单元格高度。

I have a UITableView running under iOS 8 and I'm using automatic cell heights from constraints in a storyboard.

我的一个单元格包含一个 UITextView ,我需要它根据用户输入收缩和扩展 - 点击缩小/展开文本。

One of my cells contains a single UITextView and I need it to contract and expand based on user input - tap to shrink/expand the text.

我这样做是通过向文本视图添加运行时约束并更改约束的常量来响应用户事件:

I'm doing this by adding a runtime constraint to the text view and changing the constant on the constraint in response to user events:

-(void)collapse:(BOOL)collapse; {

    _collapsed = collapse;

    if(collapse)
            [_collapsedtextHeightConstraint setConstant: kCollapsedHeight]; // 70.0
        else
            [_collapsedtextHeightConstraint setConstant: [self idealCellHeightToShowFullText]];

    [self setNeedsUpdateConstraints];

}

当我这样做时,我将它包装在<$ c中$ c> tableView 更新并调用 [tableView setNeedsUpdateConstraints]

Whenver I do this, I wrap it in tableView updates and call [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];

当我这样做时,我的单元确实会扩展(并在进行动画时动画)但是我得到了约束警告:

When I do this, my cell does expand (and animates whilst doing it) but I get a constraints warning:

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的。

388 is my calculated height, the other constraints on the UITextView are mine from Xcode/IB.

最后一个困扰我 - 我猜测 UIView-Encapsulated-Layout-高度是第一次渲染时单元格的计算高度 - (我将 UITextView 高度设置为> = 70.0)但它没有'这似乎是正确的,这个派生约束然后否决了更新的用户cnstraint。

The final one is bothering me - I'm guessing that UIView-Encapsulated-Layout-Height is the calculated height of the cell when it is first rendered - (I set my UITextView height to be >= 70.0) however it doesn't seem right that this derived constraint then overrules an updated user cnstraint.

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

Worse, although the layout code says it's trying to break my height constraint, it doesn't - it goes on to recalculate the cell height and everything draws as I would like.

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

So, what is NSLayoutConstraint UIView-Encapsulated-Layout-Height (I'm guessing it is the calculated height for automatic cell sizing) and how should I go about forcing it to recalculate cleanly?

推荐答案

尝试降低哟的优先级你的 _collapsedtextHeightConstraint 到999.这样系统提供的 UIView-Encapsulated-Layout-Height 约束始终优先。

Try to lower the priority of your _collapsedtextHeightConstraint to 999. That way the system supplied UIView-Encapsulated-Layout-Height constraint always takes precedence.

它基于你在 -tableView:heightForRowAtIndexPath:中返回的内容。确保返回正确的值和您自己的约束,生成的约束应该相同。只有暂时需要您自己约束的较低优先级,以防止崩溃/扩展动画在飞行中发生冲突。

It is based on what you return in -tableView:heightForRowAtIndexPath:. Make sure to return the right value and your own constraint and the generated one should be the same. The lower priority for your own constraint is only needed temporarily to prevent conflicts while collapse/expand animations are in flight.

这篇关于什么是NSLayoutConstraint&quot; UIView-Encapsulated-Layout-Height&quot;我应该如何强制它干净地重新计算?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆