UITextView自动向下滚动

时间:2009-02-09 14:13:11

标签: cocoa-touch

我有一个UIView,我在其中添加了一个可编辑的UITextView

UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(5, 5, 219, 47)];
[self addSubview:textView];
textView.font = [UIFont systemFontOfSize:14];

当我输入时,它不会自动下降。有人有个主意吗?

9 个答案:

答案 0 :(得分:52)

刚想出你必须使用长度>是的,

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

无论如何为我工作。

答案 1 :(得分:11)

要滚动到我试过的缓冲区的末尾

[textView scrollRangeToVisible:NSMakeRange([textView.text length]-1, 1)];

但什么都没发生。 相反,这工作

textView.selectedRange = NSMakeRange(textView.text.length - 1, 0);

答案 2 :(得分:7)

我认为你必须这样做

[textView scrollRangeToVisible:[textView selectedRange]];
textDidChange中的

答案 3 :(得分:3)

以编程方式向文本框添加文本时,我发现我还需要添加" [textView layoutIfNeeded]"在新卷轴位置可以正确计算之前进行设置。

例如:

[newString appendFormat:@"%@\n",addText];
textView.text = newString;
[textView layoutIfNeeded];
NSRange range = NSMakeRange(textView.text.length - 2, 1); //I ignore the final carriage return, to avoid a blank line at the bottom
[textView scrollRangeToVisible:range]

如果没有这个添加,文本框有时不会滚动,或者每次添加一行数据时都会滚动几行。

答案 4 :(得分:2)

Swift 2.2。它对我有用

func textViewDidChange(textView: UITextView) {

   let bottomOffset = CGPointMake(0, textView.contentSize.height - textView.bounds.size.height)
   textView.setContentOffset(bottomOffset, animated: true)
}

答案 5 :(得分:0)

如果找到解决方案

我将textview放入视图并将视图设置为clipToBounds = YES 然后我把textView放到70的高度

解决了这个问题。

非常奇怪的解决方案,但最终有效:)

答案 6 :(得分:0)

这有效:

- (void)textViewDidChange:(UITextView *)textView {
    if (_moveToBottom) {
        int y = textView.contentSize.height - textView.frameHeight + self.textView.contentInset.bottom + self.textView.contentInset.top;
        if(y > 0) {
            [textView setContentOffset:CGPointMake(0, y) animated:YES];
        }
        _moveToBottom = NO;
    }
    else {
        [textView scrollRangeToVisible:NSMakeRange([textView.text length]-1, 1)];
    }
}

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if ([text isEqualToString:@"\n"] && range.location == [textView.text length]) {
        _moveToBottom = YES;
    }
    return YES;
}

答案 7 :(得分:0)

使用contentOffset,它会自动滚动到下方

textView.contentOffset = CGPointMake(0, textView.contentSize.height - textView.frame.size.height);

答案 8 :(得分:0)

我发现如果添加到UITextView中的文本包含回车符,那么textview将无法正确滚动。

我添加了如下逻辑,以便在滚动到范围之前正确计算边界。

BOOL autoscroll = NO;

//I added a 10 px buffer here to allow for better detection as the textview is auto populated 
if (textView.contentOffset.y >= (textView.contentSize.height - textView.frame.size.height - 10))
{
    autoscroll = YES;
}

[textView setText:messageString];
[textView layoutSubviews];

if(autoscroll) {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)),     dispatch_get_main_queue(), ^{
        [textView scrollRangeToVisible:NSMakeRange(textView.text.length - 1, 1)];
    });
}