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

查看:33
本文介绍了什么是 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];

}

每当我这样做时,我都会将它包装在 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-Height 是单元格第一次呈现时的计算高度 - (我设置了我的 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.

补充:虽然系统提供的约束是否正确可能存在争议,但与框架抗争是没有意义的.简单地接受系统约束优先.如果您认为系统约束是错误的,请确保从委托中返回正确的 rowHeight.

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

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