UITextView 根据 UITableViewCell 中的文本动态宽度

Posted

技术标签:

【中文标题】UITextView 根据 UITableViewCell 中的文本动态宽度【英文标题】:UITextView dynamic width according to text inside in UITableViewCell 【发布时间】:2019-02-14 13:58:24 【问题描述】:

我正在努力制作一个类似于 iMessage 的聊天气泡。我必须使用 UITextView 来利用 DataDetectors 自动检测 url、电话号码和地址。我的视图层次结构是这样的;

-UITableViewCell
 -ContentView
  -ChatBubbleContainerView
   -UITextView

ChatBubbleContainerView 有约束

10-pt 左、右、上、下边距 --> ContainerView

UITextView 有约束

10-pt 的左、右、上、下边距 --> ChatBubbleContainerView

我想实现一种行为,使文本视图根据其内部的内容自动扩展其高度和宽度,例如文本。但是文本视图没有固有的内容大小

这些是我尝试过但得到错误结果的方法

    覆盖文本视图的intrinsicContentSize 属性,但它是 也不行。 为ChatBubbleContainerView 提供宽度约束并将其更改为sizeThatFits() 方法的结果 为ChatBubbleContainerView 提供宽度约束并将其更改为text.boundingRect 方法的结果

这些是我得到的结果

    当我滚动表格视图时,它无法正常工作,并且单元格的布局不符合预期 它可以工作,但笔尖中单元格的初始宽度为 375-pt,这对于 4.7 英寸设备来说是不错的,但是当我切换到 iPhone SE 等设备时,在初始表格视图加载或单元格插入时有 4 英寸,单元格的宽度是根据 375-pt 而不是 320-pt 计算的。滚动单元格后,布局按预期布局。 与 2 相同。

当我尝试与UILabel 相同的布局时,它按预期工作。您可能知道UILabel 具有固有的内容大小。

谢谢

【问题讨论】:

您是否禁用了 UITextView 的滚动功能?如果没有,请这样做。然后它的行为方式应该与 UILabel @DonMag 我已禁用 UITextView 的滚动以防止滚动处于活动状态 好的,那么你有一些其他的限制导致了这个问题。试试这个测试:创建一个新的视图控制器;添加UITextView;关闭滚动;约束它Leading: 20Top: 100Trailing >= 20no 高度或底部约束;将 Lorum Ipsum 填充器的默认文本更改为“测试”并运行应用程序。您的文本视图应为 1 行高,并且仅与“测试”一词一样宽。在您键入时,文本视图将水平扩展直到需要换行,然后它会垂直扩展。 【参考方案1】:

TextView 约束很好,您需要对 ChatBubbleContainerView 约束进行一些更改。

ChatBubbleContainerView 约束:

顶部、前导、底部 -> 10 分

MaxWidth(GreaterThanOrEqual) 到 contentView,例如 0.85 或者您可以将 TrailingConstraint 设置为 maxConstant(GreaterThanOrEqual 到 contentView。

你需要设置 maxWidth 然后只有 ChatBubbleContainerView 会响应。

【讨论】:

以上是关于UITextView 根据 UITableViewCell 中的文本动态宽度的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局的 UITableView 中的动态 UITextView 高度?

如何根据文字长度增加 UITextview 高度,如 whatsapp

当 UITextView 的文本超出 1 行时展开 UITextView 和 UITableView

如何将 UITextView 添加到 UITableView 详细信息

通过 UITextView 内容大小调整 UITableView 单元格的大小

将 UITextView 放在 UITableView 页脚中