UITextView在有大量文本时会被截断

4

我有一个UITableViewCell子类,其中包含一个UITextView,滚动已关闭。在我的表视图单元格layoutSubviews方法中,我设置其框架如下:

    CGRect frame = self.bodyTextView.frame;
    CGSize size = self.bodyTextView.contentSize;
    frame.size = size;
    self.bodyTextView.frame = frame;

这段时间一直运行良好,但我发现在某些情况下,当文本量特别大时,文本会被截断。我将文本视图框架背景颜色设置为橙色,以验证框架是否正确设置。以下是一个示例(仅显示文本视图的底部部分): enter image description here 根据文本大小,框架的大小是正确的(在此示例中为1019点),但文本在文本视图底部之前停止。我还看到过文本在一行的中途被截断的情况(即最后一个可见文本行的文本在水平方向上被截断了一半)。有人知道这里发生了什么吗?
还有几点需要注意:
- 对于所有内容较短的表格视图单元格,文本视图都能很好地工作。 - 如果我增加上述情况中的文本量,文本视图的高度会增加,但文本仍然在同一位置被截断。

你是否也根据内容大小增加单元格高度? - Nishant Tyagi
是的,在表视图代理方法heightForRowAtIndexPath中设置了单元格高度,并为表视图单元格设置了正确的高度。 - Darren
3个回答

4
根据this和类似的答案,问题可能是“正确的contentSize只在UITextView添加到视图后才可用...在此之前它等于frame.size”。
我建议您以不同的方式计算高度,例如-sizeWithFont:或-sizeTofit。

谢谢提供链接。很有趣,但是我的框架似乎已经设置正确了,只是出现了某些原因导致文本被截断了。我尝试自己计算框架高度并使用sizeToFit,但它们没有效果。 - Darren
非常抱歉,我误解了问题。 所以调整UITextView的框架似乎不会影响在更大空间中重新绘制内容大小。你已经看过这个[问题](https://dev59.com/JXHYa4cB1Zd3GeqPM5PL)了吗? - dimuz
这让我找到了答案:当我在我的表视图单元格类中重写它时,我忘记调用 [super layoutSubviews]...唉... - Darren
在我的情况下,问题不在于长度或大小,而是内容。我在进入UITextView时使用stripHTML来去除HTML标签:self.textView.text = [self.sourceText stripHTML]; 源代码中有一些错误的HTML导致了不完整的内容。 - plm

1
使用此代码获取文本大小。
// find the text width; so that btn width can be calculate
CGSize textSize = [@"YOUR TEXT" sizeWithFont:[UIFont fontWithName:@"Arial" size:20.0] 
                              constrainedToSize:CGSizeMake(320.0f, 99999.0f)
                                  lineBreakMode:UILineBreakModeWordWrap];

然后使用此内容设置高度:

CGRect frame = self.bodyTextView.frame;

frame.size = textSize;
self.bodyTextView.frame = frame;

希望它能帮到你。

谢谢您的建议。我的框架已经被正确设置了,但是由于某些原因文本仍然被截断了。我尝试了这个解决方案,只是为了看看会发生什么,但是没有任何改变。 - Darren
你是通过编程创建了TextView还是通过NIB创建的? - Nishant Tyagi
它在我的子类化UITableViewCell的xib中。 - Darren
你能在程序中使用它吗?我认为这是iOS中的一个错误。通过编程创建并检查它是否工作。 - Nishant Tyagi
1
问题是我在表格视图单元格子类中重写了它,但忘记调用 [super layoutSubviews]。 - Darren
显示剩余3条评论

1
我遇到了相同的问题,并通过调整textView的填充解决了它(在swift5中): yourTextView.textContainerInset = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5) 希望能有所帮助 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接