UITableView tableHeaderView使用autolayout高度太小

时间:2014-11-05 21:19:25

标签: ios xcode uitableview

我尝试使用故事板使用自动布局创建带有标题视图的UITableView。它在Xcode中看起来很好,但是当我运行应用程序时,它看起来不一样。

在Xcode中: enter image description here

在应用中: enter image description here

图像的约束为150x150,顶部图像,图像中间标签,中间描述标签和描述标签底部之间存在8个高限制。

两个标签的numberOfRows设置为0lineBreakMode设置为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(高于应用程序名称标签上的所有其他内容。当我在故事板中手动调整标题视图的大小时,图像和应用程序名称标签保持相同的高度,并且描述标签会增长。看起来应用程序在运行时使用了故事板中标题的大小,并且没有从其子节点获得高度。

1 个答案:

答案 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

相关问题