2013-11-26 7 views
8

Nelle versioni precedenti di iOS, il mio UITextView sarà scorrere fino in fondo utilizzandocosa da usare al posto di scrollRangeToVisible in iOS7 o TextKit

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

o

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

Ma l'ex avranno ora la strana effetto di iniziare nella parte superiore di una lunga lunghezza del testo e di animare lo scorrimento verso il basso ogni volta che appendo il testo alla vista. C'è un modo per comparire in fondo al testo quando aggiungo del testo?

risposta

2

Credo che questo è un bug in iOS 7. Commutazione scrollEnabled sul UITextView sembra per risolvere il problema:

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

non funziona per me su iOS 7.1. –

+1

@ stian-høiland sembra essere corretto che questa soluzione alternativa non funziona più. –

+0

@ user3907849 ha una soluzione funzionante. Il bit importante è impostare 'scrollEnabled = NO' prima di chiamare' scrollRangeToVisible: '. Usando l'intera stringa o solo l'ultimo carattere, entrambi lavoreranno per scorrere verso il basso. –

0

penso che i parametri sono invertiti in NSMakeRange. Posizione è il primo, quindi quanti si desidera selezionare (lunghezza).

NSMakeRange(0,[displayText.text length]) 

... creerebbe una selezione a partire dal carattere 0 (primo?) E passando per l'intera lunghezza della stringa. Per scorrere fino in fondo probabilmente vuoi solo selezionare un singolo carattere alla fine.

Questo funziona per me in iOS SDK 7.1 con Xcdoe 5.1.1.

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

faccio questo testo come aggiungo programmazione, e il punto di vista del testo rimane in fondo come terminale o uscita riga di comando.

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

Questo funziona davvero per me in iOS 7.1.2.

0

Il modo migliore è impostare i limiti per lo UITextView. Non attiva lo scorrimento e ha l'effetto immediato di riposizionare ciò che è visibile. È possibile farlo trovando la posizione del cursore e poi riposizionamento:

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

Per i futuri viaggiatori, la costruzione di fuori del post di @ mikeho, ho trovato qualcosa che ha funzionato meraviglie per me, ma è un po 'più semplice.

1) Accertarsi che il proprio UITextView di contentInset s sia impostato correttamente su & prima di eseguire questa operazione.
2) Dopo le mie gli inserti sono pronti ad andare, e il cursore è attivo, che io chiamo la seguente funzione:

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