【问题标题】:How to set UITextView's height dynamically in UITableViewCell based on string size?如何根据字符串大小在 UITableViewCell 中动态设置 UITextView 的高度?
【发布时间】:2018-06-16 12:57:09
【问题描述】:

我知道有人问过这个问题here,但它并没有解决我的问题,因为接受的答案中的链接已关闭,并且最小示例没有帮助。

这是我的自定义 UITableViewCell 及其所有约束的图片:

每个帖子都包含这些 UI 元素。唯一可以使每个单元格的高度不同的元素是messageView,因为它的高度取决于正在显示的字符串。问题是,如何动态设置每个单元格的高度?这是我现在拥有的(不起作用,messageView 根本不显示):

func cellForRowAt(indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(...) as! PostCell

    let message = ...
    cell.messageView.text = message

    return cell
}

func heightForRowAt(indexPath: IndexPath) -> CGFloat {
    var cellMinimumHeight: CGFloat = 120
    if let cell = tableView.cellForRow(at: indexPath) as? PostCell {
        let size = cell.messageView.sizeThatFits(cell.messageView.frame.size)
        cellMinimumHeight += size.height
    }

    return cellMinimumHeight
}

heightForRowAt函数中,if没有被执行,因此所有单元格的高度都是cellMinimumHeight = 120

如何让每个单元格的高度 = 120 + messageView 的高度?

---------------------------------编辑 1--------- ------------------------

图片打错了,messageView的高度没有设置

【问题讨论】:

  • 你会改变messageView中的文字吗?如果没有,为什么不使用 UILabel 代替?
  • @trungduc,谢谢你的回复。我使用UITextView 是因为我希望能够检测消息中的电子邮件、链接、电话号码。 UITextView 提供了这样的功能
  • 您是否设置了scrollEnabled = falseUITextView
  • @nayem,太棒了!!!这解决了问题!请在下面发布答案,以便我接受它,除非您不关心声誉(然后我会稍后发布答案)
  • 嗯,补充一下,等一下

标签: ios swift uitableview


【解决方案1】:

当使用自动布局来动态调整单元格大小时,您实际上不需要实现sizeThatFits(...)。如果约束设置正确,那么您只需要禁用UITextView 的滚动即可。

来自代码:

yourTextView.scrollEnabled = false

来自 IB:

选择您的文本视图并打开 属性检查器,然后

【讨论】:

    【解决方案2】:

    在属性检查器中选择您的UITextView(messageView) 并取消选中“启用滚动”。

    然后将你的UITextView(messageView)'s内容抗压缩优先级更改如下: 水平 = 750 垂直 = 1000

    希望对你有所帮助。

    【讨论】:

      【解决方案3】:

      只需禁用 UITextview 滚动... 但是这里没有使用UITextview,你也可以使用label。

      在 HeightForRow tableview 委托方法中删除这些东西并使用

      return UITableViewAutomaticDimension
      

      【讨论】:

        【解决方案4】:

        您已经使用约束使单元格高度动态化

        形成苹果文档

        要定义单元格的高度,您需要一个完整的约束链 和视图(具有定义的高度)来填充内容之间的区域 视图的上边缘和下边缘。

        所以对于你的情况,你需要

        cell 的高度 = 120 + messageView 的高度?

        所以从个人资料图片开始,从上到下测量完整的约束链

        1. 个人资料图片顶部 = 10 + ImageHeight = 60 ----> 70

        2. MessageView top = 10 + 将消息的最小高度设置为 20 一行如果每个单元格都应该有消息,即使是一个单词,并将此 高度设置为大于或等于 20 确保你设置 Scroll enable = false 所以消息高度最小值 = 10 顶部 + 20 + 10 底部 ---> 40

        3. 菜单堆栈视图高度 ---> 30

        所以所有 Total = 70 + 40 + 30 = 140 这个默认高度没有单元格会小于这个

        您还必须将表格视图的 rowHeight 属性设置为 UITableViewAutomaticDimension。您还必须为 estimatedRowHeight 属性赋值

        tableView.estimatedRowHeight = 130.0
        tableView.rowHeight = UITableViewAutomaticDimension
        

        这里是苹果文档Here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-20
          • 2016-03-13
          • 2013-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多