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



我有一个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中出现了先到顶部的描述

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

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

看起来你正在尝试做一些与我在这里尝试做的非常相似的事情,尽管你使用scrollRangeToVisible来进行滚动,而不是玩contentOffset。

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

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

最新更新