是否调整表视图的表头视图的大小以考虑属性文本?



我想确保在tableView内动态地生长我的headerView,以说明我的属性字符串的大小。

这个概念可以很好地适用于我的细胞视图,而无需进行太多工作。

但是,我的标题有问题(一个Uiview(,所以我试图手工计算高度,但由于某种原因,此代码给出的高度太小了?

 func setupTableHeader () {
    let str = "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?"
    let attributedStr = NSAttributedString(string: str)
    headerViewLabel.attributedText = attributedStr
    let rect = attributedStr.boundingRect(with: CGSize(width: view.frame.width, height: 100000000000000000), options: [.usesFontLeading, .usesLineFragmentOrigin], context: nil)
    tableView.tableHeaderView = headerView
    let height = rect.height
    headerView.frame = CGRect(x: 0, y: 0, width: self.view.width, height: height + headerView.frame.height)
}

NSAttributedString上创建一个扩展名,该扩展基于给定的宽度计算高度:

extension NSAttributedString {
    func height(forConstantWidth width: CGFloat) -> CGFloat {
        let constraintBox = CGSize(width: width, height: .greatestFiniteMagnitude)
        let calculatedBox = boundingRect(with: constraintBox, options: .usesLineFragmentOrigin, context: nil)
        return calculatedBox.height
    }
}

您可以称呼它并传递到表观的宽度,例如:

let height = myAttrString.height(forConstantWidth: tableView.frame.size.width)

您可以使UITableView's标头大小进行计算以计算其子元素的大小。

您可以使用以下扩展名。

extension UITableView {
    func automaticHeaderViewSize() {
        if let headerView = self.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
                self.tableHeaderView = headerView
            }
        }
    }
}

只要确保您的标签具有numberOfLines = 0

所以,最后您的代码将是(根据您的问题(。

 func setupTableHeader () {
    let str = "your long text..."
    let attributedStr = NSAttributedString(string: str)
    headerViewLabel.attributedText = attributedStr
    tableView.tableHeaderView = headerView
    tableView.automaticHeaderViewSize()
}

最新更新