Ответ 1
если найдено решение
я помещаю текстовое представление в представление и устанавливаю вид на clipToBounds = YES то я ставлю textView на высоту 70
что устранило проблему.
очень странное решение, но оно, наконец, работает:)
У меня есть UIView
, и я добавляю к нему редактируемый UITextView
,
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(5, 5, 219, 47)];
[self addSubview:textView];
textView.font = [UIFont systemFontOfSize:14];
Когда я печатаю его, он не спускается автоматически. Кто-нибудь понял?
если найдено решение
я помещаю текстовое представление в представление и устанавливаю вид на clipToBounds = YES то я ставлю textView на высоту 70
что устранило проблему.
очень странное решение, но оно, наконец, работает:)
Просто выяснилось, что вы должны использовать длину > 0. Т.е.
NSRange range = NSMakeRange(textView.text.length - 1, 1);
[textView scrollRangeToVisible:range];
Работал для меня в любом случае.
Чтобы прокрутить до конца буфера, я попробовал
[textView scrollRangeToVisible:NSMakeRange([textView.text length]-1, 1)];
Но ничего не произошло. Вместо этого это работает
textView.selectedRange = NSMakeRange(textView.text.length - 1, 0);
Думаю, вам придется делать
[textView scrollRangeToVisible:[textView selectedRange]];
в textDidChange
.
При добавлении текста в текстовое поле программно, я обнаружил, что мне также нужно добавить "[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]
Без этого добавления текстовое поле иногда не прокручивалось или прокручивало несколько строк каждый раз, когда добавлялась одна строка данных.
Swift 2.2. Это работает для меня
func textViewDidChange(textView: UITextView) {
let bottomOffset = CGPointMake(0, textView.contentSize.height - textView.bounds.size.height)
textView.setContentOffset(bottomOffset, animated: true)
}
Используйте contentOffset
, он автоматически прокрутит вниз
textView.contentOffset = CGPointMake(0, textView.contentSize.height - textView.frame.size.height);
Это работает:
- (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;
}
Я обнаружил, что если текст, добавленный в возвращаемый 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)];
});
}