调整从 xib 加载的 UIView 的大小作为 tableHeaderView

Resize UIView loaded from xib as tableHeaderView

我有一个以编程方式创建的 UITableViewController(没有 xib)。我正在尝试使用从具有自动布局约束的 xib 加载的 UIView,并将其用作我的 tableHeaderView(不是 headers 部分)。然后,我需要根据其中包含动态文本的 UILabel 的缩放比例来自动调整 UIView 的大小。

这就是我创建 UIView 的方式:

class HeaderTableLargeHeaderView: UIView {

    // Our title label with autolayout constraints
    @IBOutlet weak var titleLabel: UILabel!

    // Convience method to load for xib
    class func instanceFromNib() -> UIView {
        return UINib(nibName: "HeaderTableLargeHeaderView", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! UIView
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        titleLabel.preferredMaxLayoutWidth = titleLabel.bounds.width
    }
}

然后我尝试在我的UITableViewController中像这样加载它:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    let header = HeaderTableLargeHeaderView.instanceFromNib()
    header.frame = CGRectMake(0, 0, self.view.frame.size.width, 100)

    let height = header.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
    var frame = header.frame
    frame.size.height = height
    header.frame = frame

    header.setNeedsLayout()
    header.layoutIfNeeded()

    tableView.tableHeaderView = header
}

但是我得到了这些错误:

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. 
(
    "<NSLayoutConstraint:0x7c061050 V:[UILabel:0x7c0b77e0'Label']-(8)-|   (Names: '|':Care_Com.HeaderTableLargeHeaderView:0x7c04a550 )>",
    "<NSLayoutConstraint:0x7c0c6590 V:|-(8)-[UILabel:0x7c0b77e0'Label']   (Names: '|':Care_Com.HeaderTableLargeHeaderView:0x7c04a550 )>",
    "<NSLayoutConstraint:0x797576d0 'UIView-Encapsulated-Layout-Height' V:[Care_Com.HeaderTableLargeHeaderView:0x7c04a550(0)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7c061050 V:[UILabel:0x7c0b77e0'Label']-(8)-|   (Names: '|':Care_Com.HeaderTableLargeHeaderView:0x7c04a550 )>

我想我明白了,但不确定如何解决。我认为它告诉我的是,它无法正确设置 UILabel 的约束,因为它不知道 UIView 的范围......我想。

如果我这样做,我不会收到任何错误并且加载正常,但是高度是静态的 100

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    let header = HeaderTableLargeHeaderView.instanceFromNib()
    header.frame = CGRectMake(0, 0, self.view.frame.size.width, 100)

    header.setNeedsLayout()
    header.layoutIfNeeded()

    tableView.tableHeaderView = header
}

我已经尝试设置这些但仍然无济于事:(

    self.view.translatesAutoresizingMaskIntoConstraints      = false
    self.tableView.translatesAutoresizingMaskIntoConstraints = false

我也试过这样做:

header.translatesAutoresizingMaskIntoConstraints = false

它消除了错误但是高度没有调整:

这是你的答案。从上面删除下面的一堆代码,一切都会正常工作。

header.translatesAutoresizingMaskIntoConstraints = false
header.frame = CGRectMake(0, 0, self.view.frame.size.width, 0)

header.setNeedsLayout()
header.layoutIfNeeded()

let height = header.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
var frame = header.frame
frame.size.height = height
header.frame = frame

titleLabel.preferredMaxLayoutWidth = titleLabel.bounds.width

那些是不必要的。更新了以下 url.

中的存储库

https://github.com/mahesh-agrawal/HeaderTestStack

尽情享受吧:)