我尝试使用故事板使用自动布局创建带有标题视图的UITableView
。它在Xcode中看起来很好,但是当我运行应用程序时,它看起来不一样。
在Xcode中:
在应用中:
图像的约束为150x150,顶部图像,图像中间标签,中间描述标签和描述标签底部之间存在8个高限制。
两个标签的numberOfRows
设置为0
,lineBreakMode
设置为ByWordWrapping
。
我尝试通过以下方式设置框架:
if let headerView = self.tableView.tableHeaderView {
headerView.setNeedsLayout()
headerView.layoutIfNeeded()
let height = headerView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
println("Setting height to \(height)")
var headerFrame = headerView.frame
headerFrame.size.height = height
headerView.frame = headerFrame
self.tableView.tableHeaderView = headerView
}
原始问题之一是我有一些错误的约束(由于某种原因,Xcode仅在今天开始抱怨),所以我删除了那些并设置了contentHuggingPriority
252
(高于应用程序名称标签上的所有其他内容。当我在故事板中手动调整标题视图的大小时,图像和应用程序名称标签保持相同的高度,并且描述标签会增长。看起来应用程序在运行时使用了故事板中标题的大小,并且没有从其子节点获得高度。
答案 0 :(得分:2)
在这里回答我自己的问题:
有两个步骤似乎让这个工作。第一个是ViewDidLoad
,第二个是viewDidLayoutSubviews
:
var headerView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
if let currentTableHeaderView = self.tableView.tableHeaderView {
currentTableHeaderView.removeFromSuperview()
}
// Setting the table header view with a height of 0.01 fixes a bug that adds a gap between the
// tableHeaderView (once added) and the top row. See: http://stackoverflow.com/a/18938763/657676
self.tableView.tableHeaderView = UIView(frame: CGRectMake(0, 0, CGRectGetWidth(self.tableView.frame), 0.01))
self.headerView = AboutTableViewHeaderView(frame: CGRectZero)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if let tableHeaderView = self.headerView {
var frame = CGRectZero
frame.size.width = self.tableView.bounds.size.width
frame.size.height = tableHeaderView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
if self.tableView.tableHeaderView == nil || !CGRectEqualToRect(frame, tableHeaderView.frame) {
tableHeaderView.frame = frame
tableHeaderView.layoutIfNeeded()
self.tableView.tableHeaderView = tableHeaderView
}
}
}
希望一切都有道理。 viewDidLayoutSubview
代码是http://osdir.com/ml/general/2014-06/msg19399.html