Ios 如何在表视图中正确设置动态标题视图?

Ios 如何在表视图中正确设置动态标题视图?,ios,swift,uitableview,autolayout,uitableviewsectionheader,Ios,Swift,Uitableview,Autolayout,Uitableviewsectionheader,我需要一个节的标题视图是UIImageView和它下面的UILabel。图像视图的高度在创建后不会更改,但标签中的文本可能会因某些用户操作而更改。我需要动态更新整个标题视图的高度(使用自动布局,而不是更改框架) 例如,我一直在查看一些帖子,但我尝试的解决方案对我不起作用。更改标签中的文本时,标题视图的高度不会更新 也许我需要从一开始就明白这是怎么回事。首先,我想澄清一下: 在tableView(\u:viewForHeaderInSection:)中作为UIView的子类提供标题视图与作为UIT

我需要一个节的标题视图是
UIImageView
和它下面的
UILabel
。图像视图的高度在创建后不会更改,但标签中的文本可能会因某些用户操作而更改。我需要动态更新整个标题视图的高度(使用自动布局,而不是更改框架)

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

也许我需要从一开始就明白这是怎么回事。首先,我想澄清一下:

  • tableView(\u:viewForHeaderInSection:)
    中作为
    UIView
    的子类提供标题视图与作为
    UITableViewHeaderFooterView
    的子类提供标题视图并将其注册到表视图之间有什么区别

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

  • 如何动态更新标题视图的高度


  • 我相信这很简单:

  • 设置
    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")
        }
    }
    
  • 最后,如果标题部分中的内容在显示标题时发生更改,则在更改后,您必须通知
    表视图
    使用以下方法重新绘制自身:

    // method in the tableViewController
    func refreshTableAfterCellExpansion() {
        self.tableView.beginUpdates()
        self.tableView.setNeedsLayout()
        self.tableView.endUpdates()
    }
    

  • 您可能需要使用下面的函数。调整属性以适合标签使用的字体和字体大小:

    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+HeaderImage ViewHeight中添加额外的几个像素,因为某些字体需要额外的12个像素左右才能在所有设备上使用。反复试验。

    谢谢,但这正是我试图避免的,必须“手动”计算收割台的高度。。。仅仅依靠AutoLayout是不可能的吗?@AppsDev Auto Layout将在单元格内完成它的工作,方法是使UILabels的高度取决于单元格内的内容,但不幸的是,无论采用何种方式,无论采用何种方法,
    tableView(uu:heightForHeaderInSection:)都必须手动设置tableView标题或行高度
    然后应该返回吗?我发现它是在
    tableView(\u:viewForHeaderInSection:)之前调用的
    @AppsDev它应该只在实现时调用,所以要么将其全部删除,要么返回
    UITableViewAutomaticDimension
    。我个人更喜欢不实现它(该方法在
    UITableViewDelegate
    中应该是可选的,所以您不必实现它)