Пракрутка UITextView данізу

Я раблю дадатак, якое мае UITextView і кнопку.

Пры націску на кнопку нейкі тэкст будзе дадаць у UITextView .

Але пры націску на кнопку, я wan't для пракруткі ўніз да ніжняй частцы тэкставага поля, так што карыстальнік можа ўбачыць апошні дададзены тэкст.

Як зрабіць 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);
20
@andrewlattis гаворка ідзе пра UITextView , які з'яўляецца падгрупы з UIScrollView , які мае contentSize у якасці ўласцівасці.
дададзена аўтар Dan Rosenstark, крыніца
Перш за ўсё, гэта выгляд тэксту, паколькі ў UITextView, так як тэкставае поле не мае скрутак. ;) А можа быць, вы можаце выкарыстоўваць scrollRangeToVisible метад :)
дададзена аўтар danypata, крыніца
а сумнеў @danypata, ці з'яўляецца гэта UITextView або UITextField ў UIScrollView? вы спасылацца як тэкставае поле і тэкставае прадстаўленне ў гэтым пытанні.
дададзена аўтар andrew lattis, крыніца

8 адказы

Вы можаце выкарыстоўваць наступны код, калі вы кажаце пра 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)
    }
}
53
дададзена
Не забывайце ADD [TextView setScrollEnabled: NO]; [TextView setScrollEnabled: ДА];
дададзена аўтар Ofir Malachi, крыніца

Паспрабуйце гэта, калі ў вас ёсць праблемы на прашыўцы 7 або вышэй. См гэта ТАК адказаць .

- (void)scrollTextViewToBottom:(UITextView *)textView {
    NSRange range = NSMakeRange(textView.text.length, 0);
    [textView scrollRangeToVisible:range];
   //an iOS bug, see https://stackoverflow.com/a/20989956/971070
    [textView setScrollEnabled:NO];
    [textView setScrollEnabled:YES];
}
12
дададзена

З Swift 3

let bottom = self.textView.contentSize.height - self.textView.bounds.size.height
self.textView.setContentOffset(CGPoint(x: 0, y: bottom), animated: true)
7
дададзена
Ён павінен працаваць. Дзе вы выкарыстоўваеце гэты код? Пераканайцеся, што вы выкарыстоўваеце яго пасля таго, як было загружана TextView.
дададзена аўтар zeeawan, крыніца
Я проста паўторна правераныя, і гэта працуе выдатна. Я стварыў новы сінгл выгляд праекта, перацягнуць TextView з памерам па змаўчанні і тэкст па змаўчанні, разеткай, змесціце гэты код ўнутры viewDidAppear. І гэта правільна пракручваецца ўніз.
дададзена аўтар zeeawan, крыніца
Не працуе для мяне (борзды 3)
дададзена аўтар xaphod, крыніца
Гэта пасля таго, як viewDidAppear і TextView цалкам загружаны, з утрыманнем. Можа быць звязана з тым, што ўтрыманне TextView з'яўляецца больш, чым межы экрана з вялікім адрывам
дададзена аўтар xaphod, крыніца
Не працуе для мяне (iOS11). Мой тэкст ахоплівае шмат радкоў і выкарыстоўвае карыстацкі шрыфт.
дададзена аўтар neoneye, крыніца
Гэта лепш дадаць праверку, калі ніжні станоўчы ці не, таму што калі ён адмоўны, то няма неабходнасці мяняць contentOffset.
дададзена аўтар Mansurov Ruslan, крыніца

Вы павінны рэалізаваць метад дэлегаты. Ніжэй правярае код, ці быў уведзены сімвал перакладу радкі і, калі так, то пракручвае ў ніжняй частцы 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];
3
дададзена
Гэта добра працуе, калі вы павінны зрабіць гэта без анімацыі (з анімаваным: НЕ, вядома). Звярніце ўвагу, што вы можаце дадаць у тах (0, ... для пракруткі ўніз толькі тады, калі гэта неабходна.
дададзена аўтар David Lawson, крыніца

Зрабіце выбар, паказаўшы кадоўку, да апошняга знака, затым вылучыце гэты дыяпазон Нешта іншае, чым utf8 можа быць мэтазгодным у залежнасці ад вашага ўтрымання

let range = NSMakeRange(self.OutputTextView.text.lengthOfBytes(using: String.Encoding.utf8), 0);
self.OutputTextView.scrollRangeToVisible(range);
2
дададзена
Лепшае рашэнне ўсіх з мінімальным адставаннем!
дададзена аўтар Daniele Ceglia, крыніца

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 .

1
дададзена

У якасці агульнага падыходу для пракруткі ўніз, гэта можа быць зроблена на 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 і г.д ..

1
дададзена