2013-11-26 11 views
8

W poprzednich wersjach iOS, mój UITextView będą przewijać do dołu przy użyciuco używać zamiast scrollRangeToVisible w iOS7 lub TextKit

[displayText scrollRangeToVisible:NSMakeRange(0,[displayText.text length])]; 

lub

CGFloat topCorrect = displayText.contentSize.height -[displayText bounds].size.height; 
topCorrect = (topCorrect<0.0?0.0:topCorrect); 
displayText.contentOffset = (CGPoint){.x=0, .y=topCorrect}; 

ale były mają teraz dziwne efekt zaczynania u góry długiego tekstu i animowanie przewijania do dołu za każdym razem, gdy dołączam tekst do widoku. Czy istnieje sposób na zejście na dół tekstu po dodaniu tekstu?

Odpowiedz

2

Wierzę, że jest to błąd w iOS 7. Przełączanie scrollEnabled na UITextView wydaje się to naprawić:

[displayText scrollRangeToVisible:NSMakeRange(0,[displayText.text length])]; 
displayText.scrollEnabled = NO; 
displayText.scrollEnabled = YES; 
+1

nie działa dla mnie na iOS 7.1. –

+1

@ stian-høiland wydaje się mieć rację, że to obejście już nie działa. –

+0

@ user3907849 ma działające rozwiązanie. Ważnym jest ustawienie 'scrollEnabled = NO' przed wywołaniem' scrollRangeToVisible: '. Użycie całego ciągu znaków lub tylko ostatniego znaku będzie działać, aby przewinąć do dołu. –

0

Myślę, że parametry są odwrócone w NSMakeRange. Lokalizacja to pierwszy, a następnie ile chcesz wybrać (o długości).

NSMakeRange(0,[displayText.text length]) 

... utworzy zaznaczenie zaczynając od znaku 0. (pierwszy?) I przechodząc przez całą długość ciągu znaków. Aby przewinąć do dołu, prawdopodobnie chcesz wybrać pojedynczy znak na końcu.

Działa to dla mnie w pakiecie SDK iOS 7.1 z Xcdoe 5.1.1.

[textView scrollRangeToVisible:NSMakeRange(textView.text.length - 1,0)]; 
textView.scrollEnabled = NO; 
textView.scrollEnabled = YES; 

zrobić ten tekst jak dodam programowo, a widoki tekstowe pozostaje na dnie jak Terminal lub wyjście linii poleceń.

3
textView.scrollEnabled = NO; 
[textView scrollRangeToVisible:NSMakeRange(textView.text.length - 1,0)]; 
textView.scrollEnabled = YES; 

To naprawdę działa dla mnie w iOS 7.1.2.

0

Najlepszym sposobem jest ustawienie granic dla UITextView. Nie powoduje przewijania i ma natychmiastowy efekt zmiany położenia tego, co jest widoczne. Można to zrobić poprzez znalezienie położenia karetki, a następnie repozycjonowanie:

- (void)userInsertingNewText { 
    UITextView *textView; 
    // find out where the caret is located 
    CGRect caret = [textView caretRectForPosition:textView.selectedTextRange.start]; 
    // there are insets that offset the text, so make sure we use that to determine the actual text height 
    UIEdgeInsets textInsets = textView.textContainerInset; 
    CGFloat textViewHeight = textView.frame.size.height - textInsets.top - textInsets.bottom; 
    // only set the offset if the caret is out of view 
    if (textViewHeight < caret.origin.y) { 
     [self repositionScrollView:textView newOffset:CGPointMake(0, caret.origin.y - textViewHeight)]; 
    } 
} 

/** 
This method allows for changing of the content offset for a UIScrollView without triggering the scrollViewDidScroll: delegate method. 
*/ 
- (void)repositionScrollView:(UIScrollView *)scrollView newOffset:(CGPoint)offset { 
    CGRect scrollBounds = scrollView.bounds; 
    scrollBounds.origin = offset; 
    scrollView.bounds = scrollBounds; 
} 
2

Dla przyszłych turystów, budując off użytkownika @ mikeho poczta, znalazłem coś, co cuda dla mnie, ale jest nieco prostsze.

1) Upewnij się, że twoje s są prawidłowo ustawione & twój tekstView jest już firstResponder() przed wykonaniem tego.
2) Po moich z wypustkami są gotowe do pracy, a kursor jest aktywny, wzywam następującą funkcję:

private func scrollToCursorPosition() { 
    let caret = textView.caretRectForPosition(textView.selectedTextRange!.start) 
    let keyboardTopBorder = textView.bounds.size.height - keyboardHeight! 

    // Remember, the y-scale starts in the upper-left hand corner at "0", then gets 
    // larger as you go down the screen from top-to-bottom. Therefore, the caret.origin.y 
    // being larger than keyboardTopBorder indicates that the caret sits below the 
    // keyboardTopBorder, and the textView needs to scroll to the position. 
    if caret.origin.y > keyboardTopBorder { 
     textView.scrollRectToVisible(caret, animated: true) 
    } 
} 
Powiązane problemy