我需要一个节的头视图是一个UIImageView
,下面是一个UILabel
。图像视图的高度在创建后不会改变,但是标签中的文本可能会由于某些用户操作而改变。我需要动态更新整个标题视图的高度(使用AutoLayout,而不是更改框架)。
我一直在查看一些帖子,比如this one,但是我尝试过的解决方案并不适用于我。更改标签中的文本时,不会更新标题视图的高度。
也许我需要从一开始就明白这是怎么回事。首先,我想澄清这一点:
UIView
在tableView(_:viewForHeaderInSection:)
中的子类提供与将其作为UITableViewHeaderFooterView
的子类并将其注册到表视图之间有什么区别?发布于 2018-01-21 09:18:17
我相信这很简单:
tableView
:
tableView.estimatedSectionHeaderHeight = 63 tableView.sectionHeaderHeight = UITableViewAutomaticDimensiontableView
使用以下方法重绘自己:
//方法中的tableViewController func refreshTableAfterCellExpansion() { self.tableView.beginUpdates() self.tableView.setNeedsLayout() self.tableView.endUpdates() }发布于 2018-01-21 09:19:27
您可能需要使用如下所示的函数。调整属性以适应用于标签的字体和字体大小:
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个像素左右的工作在所有设备上。反复试验。
https://stackoverflow.com/questions/48369292
复制相似问题