【问题标题】:Large Text Being Cut Off in UITextView That is Inside UIScrollViewUIScrollView 内部的 UITextView 中的大文本被截断
【发布时间】:2013-09-12 20:26:48
【问题描述】:

我遇到了一个似乎无法解决的严重问题,这让我在过去两天发疯了。尽管我已经尝试了很多,但我已经搜索了很多,但我找不到解决方案。

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

我读过这些帖子:thisthis 和许多类似的帖子。

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

【问题讨论】:

  • 你设置 self.scrollView.contentSize 的 +200 是什么?
  • 你能改变滚动视图的高度吗,试试 500 看看它是否增加,看起来内容大小设置不起作用。
  • 由于某种原因,框架总是短 200 点,所以我添加到添加 200 以查看文本的最后几行。
  • 问题不在于滚动视图框架,但似乎是 uitextview 框架的问题。

标签: iphone ios uiscrollview uitextview


【解决方案1】:

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

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

// Resize text view here

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

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

【讨论】:

  • 这对我的解决方案很有帮助。谢谢。
  • 干得好。我之前发现的所有东西都不能在 iOS 7.1 上运行,但这对我来说是个好答案。
  • 也适用于 iOS9.1。不敢相信苹果没有解决这个问题。它似乎很旧。
  • 不敢相信 iOS 9.2.1 上仍然存在这个错误(应用是使用 Xcode 7.2.1 构建的)
  • 为什么这个答案没有 99999 票?我花了 3 个小时才找到这个答案,非常感谢
【解决方案2】:

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

我必须为这个特定的 xib禁用自动布局

然后执行以下操作:

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

【讨论】:

  • 只是设置 scrollEnabled:NO 为我做了。
【解决方案3】:

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

[self.yourTextView sizeToFit];

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

【讨论】:

  • 为我工作。你应该调用 [self.yourTextView sizeToFit];在您的视图控制器函数 viewWillLayoutSubviews 或 viewDidLayoutSubviews 中。
【解决方案4】:

绝对是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

【讨论】:

  • 设置“myTextView.scrollEnabled = false”后,文本视图底部的文本被截断。我添加了“self.textContainer.size = self.contentSize”并且文本重新出现正确绘制。使用 swift 运行 iOS 8.1.1。
  • 这才是UITextView中剪切内容的真正原因。
【解决方案5】:

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

textView.layoutManager.allowsNonContiguousLayout = false

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

【讨论】:

    【解决方案6】:

    试试这个

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

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

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

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

        myTextView.scrollEnabled = NO;
        

        在 viewWillAppear 中解决了这个问题。

        【讨论】:

        • 这不会提供任何以前未讨论/回答过的内容。
        【解决方案9】:

        试试这个。

        在 IOS 8 和 Xcode 6.3 中,

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

        【讨论】:

          【解决方案10】:

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

          [textView resignFirstResponder];
          [textView becomeFirstResponder];
          

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

          【讨论】:

          • 结合[myTextView setScrollEnabled:NO]; [myTextView setText:myTextFileContents]; [myTextView setScrollEnabled:YES];接下来是你的辞职/成为第一响应者我设法让我的文本视图正常工作。
          【解决方案11】:

          这一直发生在 Interface Builder 中。

          选择文本视图时,在实用程序检查器中取消选中显示垂直指示器选项。现在出现裁剪的文本。

          【讨论】:

            【解决方案12】:

            这些答案都不适合我。

            我在玩故事板,不知何故它现在可以工作了。它在情节提要中看起来仍然有问题,但在设备上它现在显示正常。

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

            认为解决这个问题的原因是放大视图、构建视图并再次使其大小合适

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

            【讨论】:

              【解决方案13】:

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

              【讨论】:

                【解决方案14】:

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

                你应该丢弃 UIScrollView。

                【讨论】:

                • 我正在使用滚动视图,因为整个视图是一篇文章,顶部是 uilabels 和图像,使 textview 区域变小。因此,如果用户可以滚动整个页面以查看文章的所有文本,而不仅仅是滚动浏览一个小的 uitextview 框,那么用户阅读文章会更容易。有意义吗?哦,我没有提到我是从 SQLite 数据库中提取的,而且我不知道数据库中存储的文章的文本大小。
                【解决方案15】:

                我也面临同样的情况。我必须禁用 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];
                }
                

                【讨论】:

                  【解决方案16】:

                  在 Swift 中,我通过简单地设置 UITextViewtextContainerInset 解决了这个问题:

                  textView.textContainerInset = UIEdgeInsets(top: 0.0, left: 0.0,
                                                             bottom: 50.0, right: 0.0)
                  

                  【讨论】:

                    【解决方案17】:

                    这对我有用:

                    textView.scrollEnabled = NO;
                    
                    //resize here
                    
                    textView.scrollEnabled=YES;
                    

                    【讨论】:

                      猜你喜欢
                      • 2013-05-26
                      • 1970-01-01
                      • 2017-02-02
                      • 2012-12-16
                      • 1970-01-01
                      • 2018-07-29
                      • 2010-11-23
                      • 2013-02-16
                      • 1970-01-01
                      相关资源
                      最近更新 更多