UITextView автоматическая прокрутка вниз - PullRequest
30 голосов
/ 09 февраля 2009

У меня есть UIView, и я добавляю к нему редактируемый UITextView,

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

Когда я печатаю, он не выключается автоматически. У кого-нибудь есть идея?

Ответы [ 9 ]

52 голосов
/ 19 августа 2009

Только что понял, что нужно использовать длину> 0. Т.е.

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

Все равно работало на меня.

11 голосов
/ 14 октября 2010

Для прокрутки до конца буфера я пробовал

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

Но ничего не произошло. Вместо этого это работает

textView.selectedRange = NSMakeRange(textView.text.length - 1, 0);
7 голосов
/ 09 февраля 2009

Я думаю, тебе придется сделать

[textView scrollRangeToVisible:[textView selectedRange]];

в textDidChange.

3 голосов
/ 24 марта 2015

При программном добавлении текста в текстовое поле я обнаружил, что мне также необходимо добавить «[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]

Без этого добавления текстовое поле иногда не будет прокручиваться или будет прокручивать несколько строк каждый раз, когда добавляется одна строка данных.

2 голосов
/ 14 апреля 2016

Свифт 2.2. У меня работает

func textViewDidChange(textView: UITextView) {

   let bottomOffset = CGPointMake(0, textView.contentSize.height - textView.bounds.size.height)
   textView.setContentOffset(bottomOffset, animated: true)
}
0 голосов
/ 12 июля 2017

Я обнаружил, что если текст, добавленный в UITextView, содержит возврат каретки, то текстовое представление будет прокручиваться неправильно.

Я добавил следующую логику, чтобы можно было правильно рассчитать границы перед прокруткой до диапазона.

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)];
    });
}
0 голосов
/ 01 сентября 2014

Используйте contentOffset, автоматически прокрутится вниз

textView.contentOffset = CGPointMake(0, textView.contentSize.height - textView.frame.size.height);
0 голосов
/ 20 июня 2014

Это работает:

- (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;
}
0 голосов
/ 10 февраля 2009

если найдено решение

я поместил текстовое представление в представление и установил представление к clipToBounds = YES Затем я помещаю textView на высоту 70

это решило проблему.

очень странное решение, но оно наконец работает :) 1007 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...