如何在表视图中正确设置动态标题视图?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在表视图中正确设置动态标题视图?相关的知识,希望对你有一定的参考价值。
我需要一个部分的标题视图是UIImageView
和它下面的UILabel
。一旦创建,图像视图的高度就不会改变,但标签中的文本可能会因某些用户操作而改变。我需要动态更新整个标题视图的高度(使用AutoLayout,而不是更改框架)。
我一直在检查一些帖子,例如this one,但我尝试的解决方案对我不起作用。当我更改标签中的文本时,标题视图的高度不会更新。
也许我需要了解它从一开始就是如何运作的。首先,我想清楚这一点:
- 在
UIView
中提供标题视图作为tableView(_:viewForHeaderInSection:)
的子类,并将其作为UITableViewHeaderFooterView
的子类并将其注册到表视图之间有什么区别? - 标题视图中的子视图需要哪些约束才能具有动态高度?
- 我该如何动态更新标题视图的高度?
答案
您可能想要使用如下所示的功能。调整属性以适合您用于标签的字体和字体大小:
func handleEstimatedFrameForText(_ text: String) -> CGRect {
let size = CGSize(width: 200, height: 1000)
let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)
return NSString(string: text).boundingRect(with: size, options: options, attributes: [NSAttributedStringKey.font: UIFont(name: "AvenirNext-Medium", size: 16) as Any], context: nil)
}
当您使用该方法设置标题的大小时,您希望使用此函数来获取文本添加后的UILabel
的高度,然后添加和填充类型,UIImageView
高度等。
在您的方法中设置标题大小
var height: CGFloat = 0
let headerMessage = messages[indexPath.item]
if let labelText = headerMessage.text {
let headerImageViewHeight: CGFloat = 80 /* ADD IN YOUR UIIMAGEVIEW HEIGHT */
height = self.handleEstimatedFrameForText(labelText).height + headerImageViewHeight
return CGSize(width: view.frame.width, height: height)
} else {
return CGSize(width: view.frame.width, height: 200) /* DEFAULT SIZE */
}
您可能希望在self.handleEstimatedFrameForText(labelText).height + headerImageViewHeight
上添加额外的几个像素,因为某些字体需要额外的12个像素才能在所有设备上工作。试错。
另一答案
我相信这很简单:
- 设置
tableView
:tableView.estimatedSectionHeaderHeight = 63 tableView.sectionHeaderHeight = UITableViewAutomaticDimension
- 实现自定义节标题并在委托方法中返回它:
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { switch section { case 0: return sectionHeader default: fatalError("Unreachable code") } }
- 最后,如果标题部分中的内容在呈现标题时发生更改,则在更改之后,您必须告诉
tableView
使用以下内容重绘自身:// method in the tableViewController func refreshTableAfterCellExpansion() { self.tableView.beginUpdates() self.tableView.setNeedsLayout() self.tableView.endUpdates() }
以上是关于如何在表视图中正确设置动态标题视图?的主要内容,如果未能解决你的问题,请参考以下文章