Прокрутите UITextView до нижнего
Я создаю приложение с UITextView
и кнопкой.
Когда я нажимаю кнопку, текст добавляется в UITextView
.
Но при нажатии кнопки я не прокручиваю вниз до текстового поля, чтобы пользователь мог видеть последний добавленный текст.
Как сделать UITextView
прокруткой вниз?
Я пробовал:
int numLines = LogTextView.contentSize.height / LogTextView.font.lineHeight+1;
NSLog(@"%d",numLines);
NSUInteger length = self.LogTextView.text.length;
self.LogTextView.selectedRange = NSMakeRange(0, length);
но это не сработает...
Я также пробовал:
self.LogTextView.contentSize=CGSizeMake(length,0);
Ответы
Ответ 1
Вы можете использовать следующий код, если вы говорите о UITextView:
-(void)scrollTextViewToBottom:(UITextView *)textView {
if(textView.text.length > 0 ) {
NSRange bottom = NSMakeRange(textView.text.length -1, 1);
[textView scrollRangeToVisible:bottom];
}
}
SWIFT 4:
func scrollTextViewToBottom(textView: UITextView) {
if textView.text.count > 0 {
let location = textView.text.count - 1
let bottom = NSMakeRange(location, 1)
textView.scrollRangeToVisible(bottom)
}
}
Ответ 2
Попробуйте это, если у вас есть проблема на iOS 7 или выше. См. этот ответ SO.
- (void)scrollTextViewToBottom:(UITextView *)textView {
NSRange range = NSMakeRange(textView.text.length, 0);
[textView scrollRangeToVisible:range];
// an iOS bug, see /questions/218551/scroll-to-bottom-of-uitextview-erratic-in-ios-7/1165074#1165074
[textView setScrollEnabled:NO];
[textView setScrollEnabled:YES];
}
Ответ 3
С Swift 3
let bottom = self.textView.contentSize.height - self.textView.bounds.size.height
self.textView.setContentOffset(CGPoint(x: 0, y: bottom), animated: true)
Ответ 4
Вам необходимо реализовать метод делегата. В приведенном ниже коде проверяется, была ли введена новая строка и, если да, прокручивается в нижней части textView:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if ([text isEqualToString:@"\n"]) {
textView.contentOffset = CGPointMake(0.0, textView.contentSize.height);
}
return YES;
}
Ответ 5
Это работает для меня!: D
CGPoint bottomOffset = CGPointMake(0, self.textView.contentSize.height - self.textView.bounds.size.height);
[self.description1 setContentOffset:bottomOffset animated:YES];
Ответ 6
Swift 4
extension UITextView {
func simple_scrollToBottom() {
let textCount: Int = text.count
guard textCount >= 1 else { return }
scrollRangeToVisible(NSMakeRange(textCount - 1, 1))
}
}
// Usage
textView.simple_scrollToBottom()
Я не смог найти решение без использования NSRange
.
Ответ 7
Сделайте диапазон, указав кодировку, последнему символу, затем прокрутите до этого диапазона
Возможно, что-то, кроме utf8, зависит от вашего контента.
let range = NSMakeRange(self.OutputTextView.text.lengthOfBytes(using: String.Encoding.utf8), 0);
self.OutputTextView.scrollRangeToVisible(range);
Ответ 8
Как общий подход для прокрутки вниз, это можно сделать в UIScrollView.
extension UIScrollView {
func scrollToBottom() {
let contentHeight = contentSize.height - frame.size.height
let contentoffsetY = contentHeight > 0 ? contentHeight : 0
setContentOffset(CGPoint(x: 0, y: contentoffsetY), animated: true)
}
}
Это будет работать на всех потомках UIScrollView, таких как UITextView, UITableView и т.д.
Ответ 9
Версия Swa @Hong Duan answer
func scrollTextViewToBottom(textView: UITextView) {
if textView.text.count > 0 {
let location = textView.text.count - 1
let bottom = NSMakeRange(location, 1)
textView.scrollRangeToVisible(bottom)
// an iOS bug, see https://stackoverflow.com/a/20989956/971070
textView.isScrollEnabled = false
textView.isScrollEnabled = true
}
}