2013-05-22 16 views
18

Ich mache eine App, die eine UITextView und eine Schaltfläche hat.Blättern UITextView nach unten

Wenn ich auf die Schaltfläche klicke, wird ein Text in die UITextView eingefügt.

Aber wenn ich auf die Schaltfläche klicke, scrolle ich bis zum Ende des Textfelds, damit der Benutzer den letzten hinzugefügten Text sehen kann.

Wie macht man die UITextView nach unten scrollen?

Ich habe versucht:

int numLines = LogTextView.contentSize.height/LogTextView.font.lineHeight+1; 
NSLog(@"%d",numLines); 

NSUInteger length = self.LogTextView.text.length; 
self.LogTextView.selectedRange = NSMakeRange(0, length); 

aber es wird nicht funktionieren ...

ich auch versucht:

self.LogTextView.contentSize=CGSizeMake(length,0); 
+0

Zunächst ist Textansicht, weil ein UITextView, weil das Textfeld keinen Bildlauf hat. ;) Und vielleicht könntest du die 'scrollRangeToVisible' Methode verwenden :) – danypata

+1

als @danypata gefragt, ist das ein uitextview oder ein uitextfield in einem uiscrollview? Sie haben in der Frage sowohl das Textfeld als auch die Textansicht referenziert. –

+0

@andrewlattis Die Frage bezieht sich auf 'UITextView', eine Untereinheit von' UIScrollView', die 'contentSize' als Eigenschaft hat. –

Antwort

47

können Sie den folgenden Code verwenden, wenn Sie über UITextView sprechen:

-(void)scrollTextViewToBottom:(UITextView *)textView { 
    if(textView.text.length > 0) { 
     NSRange bottom = NSMakeRange(textView.text.length -1, 1); 
     [textView scrollRangeToVisible:bottom]; 
    } 

} 
+0

VERGESSEN SIE NICHT ZU HINZUFÜGEN [textView setScrollEnabled: NO]; [Textansicht setScrollEnabled: YES]; –

3

Das funktioniert für mich! : D

CGPoint bottomOffset = CGPointMake(0, self.textView.contentSize.height - self.textView.bounds.size.height); 
[self.description1 setContentOffset:bottomOffset animated:YES]; 
+0

Dies funktioniert gut, wenn Sie dies ohne Animation tun müssen (mit animiert: NEIN natürlich).Beachten Sie, dass Sie vielleicht ein 'max (0, ...' hinzufügen möchten, um nur nach unten zu scrollen. –

5

Sie müssen eine Delegate-Methode implementieren. Der folgende Code überprüft, ob ein Newline eingegeben und wurde, wenn ja, rollt auf dem Boden des 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; 
} 
9

diese versuchen, wenn Sie Problem auf iOS 7 oder höher. Siehe this SO answer.

- (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]; 
} 
7

Mit Swift 3

let bottom = self.textView.contentSize.height - self.textView.bounds.size.height 
self.textView.setContentOffset(CGPoint(x: 0, y: bottom), animated: true) 
+0

Funktioniert nicht für mich (swift 3) – xaphod

+0

Es sollte funktionieren. Wo verwenden Sie diesen Code? Stellen Sie sicher du verwendest es, nachdem textView geladen wurde – zeeawan

+0

Es ist nach viewDidAppear, und textview ist vollständig geladen, mit Inhalt.Möchten mit der Tatsache in Verbindung gebracht werden, dass der Inhalt der Textansicht größer ist als die Grenzen des Bildschirms mit einem großen Vorsprung – xaphod

1

Sie einen Bereich, Codierung spezifiziert, auf das letzte Zeichen, blättern Sie dann auf diesen Bereich Etwas anderes als UTF-8 kann je nach Inhalt angemessen sein

let range = NSMakeRange(self.OutputTextView.text.lengthOfBytes(using: String.Encoding.utf8), 0); 
self.OutputTextView.scrollRangeToVisible(range); 
0

Als generischer Ansatz zum Scrollen nach unten kann dies auf einem UIScrollView erfolgen.

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) 
    } 
} 

Dies wird auf alle Nachkommen von UIScrollView wie UITextView arbeiten, UITableView etc ..

0

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() 

Ich war eine Lösung zu finden, ohne NSRange nicht in der Lage.

Verwandte Themen