如何修复奇怪的NSLayoutConstraint错误,这些错误似乎不会影响自定义UITableViewCell中的布局

Sha*_*oop 6 iphone uitableview ios autolayout nslayoutconstraint

每次我的一个自定义UITableViewCells由tableView绘制时:cellForRowAtIndexPath:控制台吐出一堆NSLayoutConstraint不一致.我理解其中大部分内容:

 Unable to simultaneously satisfy constraints. ...boring stuff..

 "<NSLayoutConstraint:0x8b0eb60 V:|-(NSSpace(20))-[UILabel:0x8b0cb30]   (Names: '|':UITableViewCellContentView:0x8bd7d40 )>",
"<NSLayoutConstraint:0x8b0db70 V:[UILabel:0x8b0cb30]-(NSSpace(8))-[UITextView:0x91dba00]>",
"<NSLayoutConstraint:0x8b0dba0 V:[UITextView:0x91dba00]-(NSSpace(20))-|   (Names: '|':UITableViewCellContentView:0x8bd7d40 )>",
"<NSLayoutConstraint:0x8b0d5a0 V:[UITextView:0x91dba00(1000)]>",
"<NSAutoresizingMaskLayoutConstraint:0x8b00330 h=--& v=--& V:[UITableViewCellContentView:0x8bd7d40(44)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x8b0db70 V:[UILabel:0x8b0cb30]-(NSSpace(8))-[UITextView:0x91dba00]>
Run Code Online (Sandbox Code Playgroud)

或者至少我认为我做到了.让我感到困惑的是我的UITableViewCell正在工作,似乎没有任何约束被打破.我认为错误中列出的一些约束,特别是最后一个约束,是系统添加的约束.如果我不使用.xibs并且只在代码中添加了约束,这可能吗?错误的最后一行特别突出,因为我动态生成每个代码的高度,但我注意到那里的44,默认的单元格高度.

是否默认添加了一些约束,例如我打电话时[super updateConstraints]?我将如何解决这些错误或找出它们的来源?

另外,我知道浸入Core Text比我的UITextView + Auto Layout解决方案要好得多.现在我正在努力缓存单元格高度.但是,这些布局错误是否会导致滚动时滞后,或者仅仅因为我使用自动布局来计算屏幕上显示的每个单元格高度?

我发布了在Github上发生这些错误的项目,如果有人想下载并体验自己的怪异.

Sha*_*oop 2

根据亚伦的建议,我在初始化时手动更改单元格的高度,以便在自动布局进行计算时约束可以控制它。如果最初没有设置内容框架,则默认框架为{0, 0, 320, 44}。这太小了,无法满足约束,并且错误会显示在控制台中。

同样,当重用单元格时,旧的 contentView.frame (由自动布局计算)会保留下来。如果您使用相同数量的文本(或更少),这很好,但是如果新单元格需要更多文本(因此需要更大的 contentView.frame),我们会遇到同样的问题,contentView.frame 太小并且不能满足约束条件。

因此,在我的自定义 UITableViewCell 中,我现在手动将 contentView.frame.height 设置为initWithStyle:足够prepareForReuse:大的常量,以容纳任意数量的文本(足以容纳 App.net 帖子和一些额外的净空)。这可以确保自动布局进行计算时不会出现错误。

我什至可能会考虑将此值设置得更高一些,甚至是动态设置,以适应 iOS 7 中的动态文本。至于滚动,似乎错误并没有加剧滚动的不稳定,这都是因为自动布局计算(我思考)。下一步是在viewDidAppear:调用时计算像元高度...