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
有约束
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: 20
,Top: 100
和Trailing >= 20
,no 高度或底部约束;将 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 详细信息