dynamic设置tableHeaderView高度

我的应用程序创build一个UITableViewController,它包含一个可以有任意高度的自定义tableHeaderView。 我一直在努力dynamic地设置这个头,因为似乎build议的方法已经缩短了这个头。 我的UITableViewController的相关代码:

import UIKit import SafariServices class RedditPostViewController: UITableViewController, NetworkCommunication, SubViewLaunchLinkManager { //MARK: UITableViewDataSource var post: PostData? var tree: CommentTree? weak var session: Session! = Session.sharedInstance override func viewDidLoad() { super.viewDidLoad() // Get post info from api guard let postData = post else { return } //Configure comment table self.tableView.registerClass(RedditPostCommentTableViewCell.self, forCellReuseIdentifier: "CommentCell") let tableHeader = PostView(withPost: postData, inViewController: self) let size = tableHeader.systemLayoutSizeFittingSize(UILayoutFittingExpandedSize) let height = size.height let width = size.width tableHeader.frame = CGRectMake(0, 0, width, height) self.tableView.tableHeaderView = tableHeader session.getRedditPost(postData) { (post) in self.post = post?.post self.tree = post?.comments self.tableView.reloadData() } } } 

这导致以下不正确的布局: 在这里输入图像说明 如果我将tableHeader.frame = CGRectMake(0, 0, width, height)更改为tableHeader.frame = CGRectMake(0, 0, width, 1000) ,tableHeaderView将正确放置: 在这里输入图像说明

我不确定我在这里做错了什么。 另外,自定义UIView类,如果这有帮助:

 import UIKit import Foundation protocol SubViewLaunchLinkManager: class { func launchLink(sender: UIButton) } class PostView: UIView { var body: UILabel? var post: PostData? var domain: UILabel? var author: UILabel? var selfText: UILabel? var numComments: UILabel? required init?(coder aDecoder: NSCoder) { fatalError("Not implemented yet") } init(withPost post: PostData, inViewController viewController: SubViewLaunchLinkManager) { super.init(frame: CGRectZero) self.post = post self.backgroundColor = UIColor.lightGrayColor() let launchLink = UIButton() launchLink.setImage(UIImage(named: "circle-user-7"), forState: .Normal) launchLink.addTarget(viewController, action: "launchLink:", forControlEvents: .TouchUpInside) self.addSubview(launchLink) selfText = UILabel() selfText?.backgroundColor = UIColor.whiteColor() selfText?.numberOfLines = 0 selfText?.lineBreakMode = .ByWordWrapping selfText!.text = post.selfText self.addSubview(selfText!) selfText?.sizeToFit() //let attributedString = NSAttributedString(string: "Test"/*post.selfTextHtml*/, attributes: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType]) //selfText.attributedText = attributedString body = UILabel() body!.text = post.title body!.numberOfLines = 0 body!.lineBreakMode = .ByWordWrapping body!.textAlignment = .Justified self.addSubview(body!) domain = UILabel() domain!.text = post.domain self.addSubview(domain!) author = UILabel() author!.text = post.author self.addSubview(author!) numComments = UILabel() numComments!.text = "\(post.numComments)" self.addSubview(numComments!) body!.translatesAutoresizingMaskIntoConstraints = false domain!.translatesAutoresizingMaskIntoConstraints = false author!.translatesAutoresizingMaskIntoConstraints = false selfText!.translatesAutoresizingMaskIntoConstraints = false launchLink.translatesAutoresizingMaskIntoConstraints = false numComments!.translatesAutoresizingMaskIntoConstraints = false let views: [String: UIView] = ["body": body!, "domain": domain!, "author": author!, "numComments": numComments!, "launchLink": launchLink, "selfText": selfText!] //let selfTextSize = selfText?.sizeThatFits((selfText?.frame.size)!) //print(selfTextSize) //let metrics = ["selfTextHeight": selfTextSize!.height] self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[body]-[selfText]-[domain]-|", options: [], metrics: nil, views: views)) self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[body]-[selfText]-[author]-|", options: [], metrics: nil, views: views)) self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[body]-[selfText]-[numComments]-|", options: [], metrics: nil, views: views)) self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[launchLink]-[numComments]-|", options: [], metrics: nil, views: views)) self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[body][launchLink]|", options: [], metrics: nil, views: views)) self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[selfText][launchLink]|", options: [], metrics: nil, views: views)) self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[domain][author][numComments][launchLink]|", options: [], metrics: nil, views: views)) } override func layoutSubviews() { super.layoutSubviews() body?.preferredMaxLayoutWidth = body!.bounds.width } } 

  //Dynamically determine the height of the tableHeaderView -> this code was the result of much effort. //http://collindonnell.com/2015/09/29/dynamically-sized-table-view-header-or-footer-using-auto-layout/ override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() if let headerView = tableView.tableHeaderView { let height = headerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height var headerFrame = headerView.frame //Comparison necessary to avoid infinite loop if height != headerFrame.size.height { headerFrame.size.height = height headerView.frame = headerFrame tableView.tableHeaderView = headerView } } } 

OP的答案更加精简版本(让布局自然发生的好处):

 override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() if let header = tableView.tableHeaderView { let newSize = header.systemLayoutSizeFitting(UILayoutFittingCompressedSize) header.frame.size.height = newSize.height } } 

正如实现所示,苹果没有理由不支持自动表格视图页眉/页脚高度,因为他们现在使用单元格。 令人沮丧。

感谢TravMatth的原始答案。