2

我需要一个部分的标题视图在它下面是 aUIImageView和 a UILabel。图像视图的高度在创建后不会改变,但标签中的文本可能会由于某些用户操作而改变。我需要动态更新整个标题视图的高度(使用 AutoLayout,而不是更改框架)。

我一直在检查一些帖子,例如这个,但我尝试过的解决方案对我不起作用。当我更改标签中的文本时,我的标题视图的高度不会更新。

也许我需要从一开始就了解这是如何工作的。首先,我想明确一点:

  1. UIView将标题视图作为in的子类tableView(_:viewForHeaderInSection:)提供与将其作为in 的子类提供并将其UITableViewHeaderFooterView注册到表视图有什么区别?

  2. 标题视图中的子视图需要哪些约束才能具有动态高度?

  3. 我应该如何动态更新标题视图的高度?

4

2 回答 2

0

您可能想要使用如下所示的功能。调整属性以适合您用于标签的字体和字体大小:

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 像素左右才能在所有设备上工作。反复试验。

于 2018-01-21T17:19:27.587 回答
0

我相信这很简单:

  1. 设置tableView

    tableView.estimatedSectionHeaderHeight = 63
    tableView.sectionHeaderHeight = UITableViewAutomaticDimension
    
  2. 实现您的自定义部分标题并在委托方法中返回它:

    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    
        switch section {
        case 0:
            return sectionHeader
    
        default:
            fatalError("Unreachable code")
        }
    }
    
  3. 最后,如果在显示标题时标题部分中的内容发生了变化,那么在更改之后,您必须tableView使用以下命令告诉重新绘制自身:

    // method in the tableViewController
    func refreshTableAfterCellExpansion() {
        self.tableView.beginUpdates()
        self.tableView.setNeedsLayout()
        self.tableView.endUpdates()
    }
    
于 2018-01-21T17:18:17.627 回答