2014-11-05 49 views
0

我试图创建一个UITableView与标题视图使用自动布局使用故事板。它在Xcode中看起来很好,但是当我运行该应用程序时,它看起来不一样。UITableView tableHeaderView使用自动布局高度太小

在Xcode中: enter image description here

在应用程式: enter image description here

图像具有150×150的约束,并有顶部图像,图像中的标签,中间之间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中才开始抱怨今天),所以我已删除的和在应用程序名称标签上设置一个contentHuggingPriority252(高于所有其他)。当我在故事板中手动调整标题视图的大小时,图像和应用程序名称标签保持相同的高度,并且说明标签也在增长。看起来这些应用程序在运行时使用了故事板中标题的大小,并没有从其子节点获取高度。

+0

您是否尝试以编程方式设置tableHeaderView的框架属性? – carlodurso 2014-11-05 23:28:13

+0

我用一些代码更新了我的问题,我尝试过最初没有包含 – 2014-11-06 20:11:54

回答

2

回答我的问题在这里:

有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

+0

在我的例子中,viewDidLayoutSubviews可以看到视图出现错误的大小,并重新计算一点滞后。 调用'viewWillLayoutSubviews'中的相同代码使视图以所需高度显示。 – jdev 2017-01-26 08:57:10

相关问题