滚动 UITextView 以显示以编程方式添加的新文本

Posted

技术标签:

【中文标题】滚动 UITextView 以显示以编程方式添加的新文本【英文标题】:Scroll UITextView to Show New Text Added Programatically 【发布时间】:2014-05-01 06:27:31 【问题描述】:

我有一个UITextView,我以编程方式向其中添加文本。例如,粘贴粘贴板上的文本。所以我有以下内容:

UITextView* _pastedText;
_pastedText = [[UITextView alloc] initWithFrame:pastedTextFrame];
_pastedText.editable = NO;
_pastedText.selectable = NO;

当我(以编程方式)添加新文本时,文本视图将滚动到顶部(没有动画)。我没有触发这个滚动;我认为这是默认行为?

如何让文本视图滚动以显示新的下一个视图?

其他信息

我在这里看到了很多相关的问题/答案。我发布了这个问题,因为使用下面的代码,我看到了不受欢迎的行为。这是我正在使用的代码:

- (void)addText:(NSString*)text

    NSString* textToAdd = text;

    BOOL previouslyHadText = _pastedText.text.length > 0;
    if (previouslyHadText) 
        textToAdd = [NSString stringWithFormat:@"%@\n%@", _pastedText.text, text];
    

    NSMutableParagraphStyle* paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.lineSpacing = _lineSpacing;
    NSDictionary *attribute = @ NSParagraphStyleAttributeName : paragraphStyle,
                                 NSFontAttributeName : [UIFont systemFontOfSize:18.0] ;

    _pastedText.attributedText = [[NSAttributedString alloc] initWithString:textToAdd attributes:attribute];

    if (previouslyHadText) 
        NSRange range = NSMakeRange(_pastedText.text.length - 1, 1);
        [_pastedText scrollRangeToVisible:range];
    

我在这方面取得了一些成功,但看到以下错误/问题:

场景 1:

文本视图中有文本,内容顶部可见 我添加了文本,它成功滚动以查看新文本 我手动滚动文本视图 手动滚动后,如果我添加更多新文本,文本视图首先滚动到顶部(按照原始行为),然后我的显式滚动, 滚动到底部

场景 2:

文本视图开始为空 添加需要滚动文本视图的新文本;没有滚动发生 我手动滚动文本视图 添加新文本;现在滚动确实发生了,但是在场景 1 中遇到了 go-to-top-first 描述

我如何(我需要吗?)禁用隐式滚动(场景 1)?

我需要做什么才能在手动滚动视图之前进行滚动(场景 2)?

【问题讨论】:

【参考方案1】:

似乎您正在尝试做一些与我正在尝试做的事情非常相似的事情 here 尽管您使用 scrollRangeToVisible 来进行滚动而不是使用 contentOffset。

尽管如此,在向其中添加文本后 TextView 会自动滚动的问题的潜在解决方案是在更新 TextView 时禁用 setScrollEnabled。你已经试过了吗?

[_pastedText setScrollEnabled:NO];
    _pastedText.attributedText = [[NSAttributedString alloc] initWithString:textToAdd attributes:attribute];
[_pastedText setScrollEnabled:YES];

【讨论】:

感谢您的建议。我试过setScrollEnabled... 但实际上我认为这不是滚动问题。我正在替换UITextViews 的内容,所以我认为它已经完全更新了。我已经改用contentOffset - 正如我在此处的问题中所述:***.com/questions/23450407/… 我仍然认为UITextView 中存在错误,但现在,我有一个解决方法。谢谢。

以上是关于滚动 UITextView 以显示以编程方式添加的新文本的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将段落标题添加到 UITextView

如何以编程方式更新 UITextView maximumNumberOfLines 并查看 UI 更新。

滚动视图上不显示文本视图

以编程方式添加的子视图框架不会显示在滚动视图中

以编程方式设置时不显示 UITextView selectedRange

Swift - 以编程方式居中 UITextView