AutoLayout breaks constraints when layoutIfNeeded() is called(调用 layoutIfNeeded() 时 AutoLayout 会破坏约束)
问题描述
我正在尝试使用 Swift 使用 XCode6 在 UITableView
中实现动态高度 UITaleViewCell
.
I'm trying to implement a dynamic height UITaleViewCell
in UITableView
with XCode6 using Swift.
通过以图形方式设置约束,我将单元格布局如下(屏幕截图来自 XCode5,因为 XCode6 上的 NDA).我还将 BodyLabel 的 Line Break 属性设置为自动换行",并将行号设置为0"以允许多行.
I laid out my cell as following, by setting up the constraints graphically(Screenshot is from XCode5, because of NDA on XCode6). I also set the BodyLabel's Line Break property to 'Word Wrap', and set the Line number to '0' to allow multiple lines.
现在,如果我只是在 tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?)
方法中设置单元格的内容,那么我可以正确获得动态高度行为.
Now if I just set up the cell's contents inside tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?)
method, then I get the dynamic height behavior correctly.
但是,由于我正在关注在线可用的教程(特别是 这个),我添加了另一种方法来确定单元格的高度 tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!)
.在我关注的教程中,它告诉我添加 cell.layoutIfNeeded()
,所以我也添加了它.
However, since I was following along tutorials available online(specifically this one), I added another method to determine the height of the cell with tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!)
.
In the tutorial that I was following, it told me to add cell.layoutIfNeeded()
, so I added that too.
override func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
var cell = tableView!.dequeueReusableCellWithIdentifier(kCellIdentifier) as GroupFeedCell
// Configure the cell
if let frc = self.fetchedResultsController {
let feed = frc.objectAtIndexPath(indexPath) as GroupFeed
cell.titleLabel.text = feed.name
if let message = feed.message {
cell.bodyLabel.text = message
}
}
// Layout the cell
cell.layoutIfNeeded()
// Get the height
var height : CGFloat = cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
return height
}
但是,当我运行程序时,虽然表格视图仍然正确显示单元格的动态高度,但它显示的错误如下:
However, when I ran the program, although the table view still displayed the dynamic heights of the cells correctly, it displayed the errors like this:
2014-07-27 13:59:22.599 FBGroups[4631:979424] 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:0x17809e780 H:[UILabel:0x14fd12f50'Body Label Contents...']-(8)-| (Names: '|':UITableViewCellContentView:0x178185d70 )>",
"<NSLayoutConstraint:0x17809e7d0 H:|-(8)-[UILabel:0x14fd12f50'Body Label Contents...'] (Names: '|':UITableViewCellContentView:0x178185d70 )>",
"<NSLayoutConstraint:0x17809ea50 'UIView-Encapsulated-Layout-Width' H:[UITableViewCellContentView:0x178185d70(0)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x17809e780 H:[UILabel:0x14fd12f50'Body Label Contents...']-(8)-| (Names: '|':UITableViewCellContentView:0x178185d70 )>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
我试图找出可能出了什么问题,并在上面花费了大量时间,我发现每当我删除 cell.layoutIfNeeded()
方法时,约束错误就会消失.
I tried to figure out what might have gone wrong, and spend good amount of time on it, and I figured out that whenever I delete cell.layoutIfNeeded()
method, then the constraints error disappears.
似乎在冲突的约束中,UIView-Encapsulated-Layout-Width
不是我添加的,除此之外,所有约束对我来说都是无辜的.我试图搜索可以生成 UIView-Encapsulated-Layout-Width
约束的内容,但在我的情况下无法得到令人满意的解释.我想知道此错误消息的原因以及如何解决此问题.
And it seemed that among the constraints that are conflicting, UIView-Encapsulated-Layout-Width
was not the one I added, and other than that, the all of the constraints looked innocent to me. I tried to search through what could generate UIView-Encapsulated-Layout-Width
constraints, but I couldn't get the satisfying explanation in my situation. I would like to know what would be the cause of this error message and how to resolve this problem.
另外,有人可以解释在计算单元格高度时调用 cell.layoutIfNeeded()
方法的目的是什么,以及何时需要?大多数涉及动态高度 UITableViewCell
的教程都使用了这种方法,尽管我的程序在没有该方法调用的情况下仍能正确显示单元格,并且每当我尝试使用该方法时,都会导致异常.
Also, can someone explain what would be the purpose of calling cell.layoutIfNeeded()
method inside calculating height of the cell, and when it would be necessary? Most of the tutorials that were covering dynamic height UITableViewCell
utilized this method, although my program still displayed cells correctly without that method call, and whenever I tried to use that method, it caused the exceptions.
推荐答案
在 Xcode 中,将最底部垂直约束的优先级设置为 750(或小于 1000 的任何值).
In Xcode, set the priority of the very bottom vertical constraint to 750 (or anything less than a 1000).
这篇关于调用 layoutIfNeeded() 时 AutoLayout 会破坏约束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:调用 layoutIfNeeded() 时 AutoLayout 会破坏约束
基础教程推荐
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01