57

我有一个严重的问题,我似乎无法解决,过去两天让我发疯。我进行了广泛的搜索,但我找不到解决方案,即使我尝试了很多。

我有一个UITextView里面的UIScrollView。我能够动态调整UITextView滚动视图内部的大小以显示文本。但是当UITextView包含非常大的文本时,当我几乎滚动到最后时它会被切断。但是,UIScrollView' 框架的大小仍然正确。

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

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

这是我当前的代码和屏幕截图,您可以看到屏幕截图中的空白点应该用文本填充。请帮忙。

在此处输入图像描述

- (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];
}
4

17 回答 17

139

此问题自 iOS 7 以来就存在,并且在 iOS 12 中仍然存在。

scrollEnabled = NO但是,正如@igz 建议的那样,我无法通过在调整大小之前进行设置来保持正常的滚动行为。相反,我切换了滚动onoff在调整大小后

// Resize text view here

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

这迫使被切断的文本正确呈现。

于 2013-11-05T19:59:58.943 回答
14

感谢大家的帮助。这最终在 iOS7 中为我工作。

我不得不为这个特定的 xib禁用自动布局

然后做了以下事情:

[textView setScrollEnabled:YES];
[textView setText:text];
[textView sizeToFit];
[textView setScrollEnabled:NO];
于 2013-11-22T00:48:47.603 回答
12

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

[self.yourTextView sizeToFit];

这应该是您在操作 textview 时做的最后一件事,而不应该是在您填充内容文本之前。

于 2015-08-07T21:36:36.943 回答
7

绝对是iOS7。我有同样的问题适用于所有调整大小的 UITextViews,包括 xib 和生成的代码。我发现在 UITextView 框架更改后需要调整 textContainer.size。

我创建了这个类别代码来调整 textContainer.size 但它似乎也需要在设置文本值之后进行调整,所以如果没有设置框架大小,我必须在任何文本更改后调用 adjustAfterFrameChange。这段代码假设 UITextView 没有对 setFrame: 本身做任何事情,所以如果你想避免这种风险,请取出 setFrame: 并手动调用 adjustAfterFrameChange

编辑:改变

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

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
于 2013-11-18T22:47:31.177 回答
7

可以通过将连续布局属性设置为 false 来解决此问题。

textView.layoutManager.allowsNonContiguousLayout = false

虽然文档说默认值为 false,但实际上对于 UITextView 设置为 true。

于 2018-02-03T21:20:42.707 回答
5

试试这个

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

它适用于 UITextView 中的截断文本显示。

于 2013-10-20T16:44:45.383 回答
5

我有一个类似的问题,其中长文本在调整文本视图大小后被截断。在调整大小之前关闭 scrollingEnabled 似乎可以解决它。当然看起来像一个IOS 7错误。

于 2013-10-23T18:59:23.713 回答
2

我们遇到了同样的问题,除了 UITextView 的左半边或右半边被切断了。发生在 iOS 7 和 iOS 6 上,在各种手机上。来电:

myTextView.scrollEnabled = NO;

在 viewWillAppear 中解决了这个问题。

于 2015-04-30T22:34:55.430 回答
2

试试这个。

在 IOS 8 和 Xcode 6.3 中,

textview.scrollEnabled=YES;
[self.textview setContentInset:UIEdgeInsetsMake(-10.0, 0, -5.0, 0)];
于 2015-12-18T07:41:42.853 回答
1

我们在推出 iOS7 时遇到了这样的问题。当我们调用 setText 向我们的 UITextView 添加新行(或行)时,textview 没有使用正确的新高度进行重绘。setNeedsDisplay、setNeedsLayout、重绘图层、重绘整个视图等都不起作用。最后,我们强迫失去和获得焦点:

[textView resignFirstResponder];
[textView becomeFirstResponder];

这迫使重新计算高度并正确重绘。值得庆幸的是,它不会导致键盘弹出和弹出,但值得在您的应用支持的任何 iOS 版本上进行回归测试。

于 2013-11-11T18:44:42.923 回答
1

这一直发生在 Interface Builder 中。

When text view selected, in Utilities Inspector uncheck the option Shows Vertical Indicator. 现在出现裁剪的文本。

于 2014-11-08T17:11:41.013 回答
1

这些答案都不适合我。

我在玩故事板,不知何故它现在正在工作。它在情节提要中看起来仍然是错误的,但在设备上它现在显示正常。

我做了很多事情,包括切换文本字段的许多选项。

认为为我解决的问题是使视图更大,构建并再次使其大小合适

对于一个模糊的不确定答案,我深表歉意,但也许它会有所帮助。这个项目最初是为 iOS 5 编写的,从那时起,文本视图可能并没有太多混乱。

于 2016-02-04T00:35:03.047 回答
1

我对文本视图(没有滚动视图)有同样的问题。只需在属性检查器中取消选中“启用滚动”即可解决此问题(Xcode 7.3.1、iOS 9.3)。

于 2016-06-25T13:17:10.950 回答
0

我可能错了,但我不完全理解您的问题,但是使用 UIScrollView 有什么用,因为 UITextView 类实现了可滚动的多行文本区域的行为?

您应该丢弃 UIScrollView。

于 2013-09-09T11:17:18.243 回答
0

我面临同样的情况。我必须禁用 UITextView 的滚动,这样做会导致最后一行被剪切。这是我的解决方案:

//In the  UITextView subClass, override "gestureRecognizerShouldBegin" and let the scrolling of UITextView remain on.

-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && gestureRecognizer.view == self){
        return NO;
    }
    return [super gestureRecognizerShouldBegin:gestureRecognizer];
}
于 2017-04-09T05:45:24.843 回答
0

在 Swift 中,我通过简单地设置textContainerInsetmy来解决这个问题UITextView

textView.textContainerInset = UIEdgeInsets(top: 0.0, left: 0.0,
                                           bottom: 50.0, right: 0.0)
于 2017-05-17T19:37:41.687 回答
0

这对我有用:

textView.scrollEnabled = NO;

//resize here

textView.scrollEnabled=YES;
于 2020-06-15T10:17:42.903 回答