UITextView 中的大文本在 UIScrollView 中被截断

57

我遇到了一个严重的问题,我似乎无法解决,已经让我疯狂了两天。我四处搜寻,尝试了许多方法,但仍然找不到解决方案。

我有一个UIScrollView里面嵌套了一个UITextView。我可以动态调整UITextView的大小来显示文本。但是当UITextView包含非常大的文本时,在我滚动到接近末尾时,文本会被截断。但是,UIScrollView的框架仍然可以正确地调整大小。

我读了这些帖子:this this 和许多类似的帖子。

UIScrollviewUITextview都是使用AutoLayout在xib中创建的。

以下是我的当前代码和屏幕截图,如您所见,屏幕截图中的空白处应该填充文本。请帮帮我。

enter image description here

- (void)viewDidAppear:(BOOL)animated
{
    CGRect frame = self.longDescField.frame;
    frame.size.height = self.longDescField.contentSize.height;
    self.longDescField.frame = frame;

    self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width,  self.longDescField.contentSize.height + 200);
    self.scrollView.scrollEnabled = YES;
    [self.scrollView flashScrollIndicators];
}

在哪里设置self.scrollView.contentSize的+200是什么意思? - LudoZik
你能改变滚动视图的高度吗?试着将它设为500,看看是否会增加。似乎内容大小设置不起作用了。 - DogCoffee
由于某种原因,框架总是短了200个点,所以我不得不添加200个点才能看到最后几行文本。 - sudo
问题不在滚动视图框架上,而似乎是UITextView框架的问题。 - sudo
17个回答

139

这个问题存在于iOS 7以来,而且在iOS 12中仍然存在。

然而,我无法通过在调整大小之前设置 scrollEnabled = NO 来保持正常的滚动行为,正如@igz建议的那样。相反,在调整大小后,我切换了滚动开关的状态来解决问题。

// Resize text view here

textView.scrollEnabled = NO;
textView.scrollEnabled = YES;

这样可以强制截断的文本正确地呈现。


1
这帮助了我解决问题。谢谢。 - sudo
6
也适用于 iOS9.1。无法相信苹果没有修复这个问题。看起来已经存在很久了。 - Morpheus78
绝对是解决方案。我已经提交了:http://www.openradar.me/24435091 — 你也应该这样做! - StuFF mc
2
无法相信这个错误在iOS 9.2.1上仍然存在(应用程序是使用Xcode 7.2.1构建的) - Valeriy Van
1
为什么这个答案没有99999个赞?我花了3个小时找到了这个答案,非常感谢。 - Emma Labbé
显示剩余8条评论

14

感谢大家的帮助。最终这是我在iOS7中使用的解决方法。

我不得不为这个特定的XIB文件禁用自动布局

然后执行以下操作:

[textView setScrollEnabled:YES];
[textView setText:text];
[textView sizeToFit];
[textView setScrollEnabled:NO];

5
仅仅设置scrollEnabled为NO就解决了我的问题。 - amergin

12

对我来说,解决方案是在自定义textView之后加上sizeToFit

[self.yourTextView sizeToFit];

当操作文本视图时,这应该是您最后要做的事情,不应该在填充内容文本之前进行。


可以用。你应该在你的视图控制器函数viewWillLayoutSubviews或viewDidLayoutSubviews中调用[self.yourTextView sizeToFit];。 - AleX

8
这个问题可以通过将连续布局属性设置为false来解决。
textView.layoutManager.allowsNonContiguousLayout = false

尽管文档中说默认值为false,但实际上对于UITextView来说它被设置为true。

7
肯定是iOS7。我遇到了同样的问题,包括xib和代码生成的所有UITextView都会被调整大小。我发现在修改UITextView框架后,需要调整textContainer.size。
我创建了这个类别代码来调整textContainer.size,但在设置文本值之后似乎也需要调整它,因此如果不跟随设置框架大小,则必须在任何文本更改后调用adjustAfterFrameChange。
该代码假设UITextView没有使用setFrame:,因此如果要避免该风险,请删除setFrame:并手动调用adjustAfterFrameChange。
self.textContainer.size = self.frame.size; // fix for cut off text

to

self.textContainer.size = self.contentSize; // fix for cut off text

@interface UITextView(Extras)

- (void)adjustAfterFrameChange;

@end



@implementation UITextView(Extras)

- (void)adjustAfterFrameChange {
#if defined(__IPHONE_7_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_7_0
    if ([self respondsToSelector:@selector(textContainer)])
        self.textContainer.size = self.contentSize; // fix for cut off text
#endif
}


- (void)setFrame:(CGRect)frame {
    [super setFrame:frame];

    [self adjustAfterFrameChange];
}

@end

在我设置了“myTextView.scrollEnabled = false”之后,文本被截断在textView的底部。我添加了“self.textContainer.size = self.contentSize”,文本重新正确绘制出来。在使用Swift的iOS 8.1.1上有效。 - MB_iOSDeveloper
这是在UITextView中裁剪内容的真正原因。 - Ryan

5

我曾经遇到相似的问题,当调整文本视图大小后,长文本会被截断。 在调整大小之前关闭scrollingEnabled选项似乎可以解决问题。这似乎是iOS 7的一个bug。


5

试试这个

[self.textView setContentInset:UIEdgeInsetsMake(-8.0, 0, -8.0, 0)];

它可以用于在UITextView中截断文本的显示。


2
我们遇到了同样的问题,除了UITextView 的左半部分或右半部分被剪裁掉了。该问题在iOS 7和iOS 6上都出现,在多种手机上测试均如此。解决方法是调用:
myTextView.scrollEnabled = NO;

在viewWillAppear中解决了这个问题。


3
这并没有提供任何之前未被讨论或回答过的信息。 - sudo

2

请试一下。

在IOS 8和Xcode 6.3中,

textview.scrollEnabled=YES;
[self.textview setContentInset:UIEdgeInsetsMake(-10.0, 0, -5.0, 0)];

1
我们在iOS7发布时遇到了这样的问题。当我们调用setText方法向UITextView中添加新行时,textview没有使用正确的新高度进行重绘。setNeedsDisplay、setNeedsLayout、重绘图层、重绘整个视图等方法都无效。最后我们强制失去并重新获取焦点解决了问题。
[textView resignFirstResponder];
[textView becomeFirstResponder];

这将强制进行高度重新计算和正确的重绘。值得庆幸的是,它不会导致键盘弹出和收起,但需要在您的应用程序支持的任何iOS版本上进行回归测试。

1
通过组合使用 [myTextView setScrollEnabled:NO]; [myTextView setText:myTextFileContents]; [myTextView setScrollEnabled:YES]; 然后再进行 resign / become first responder 操作,我成功地让我的文本视图按照预期工作了。 - Symanski

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