2012-07-31 12 views
6

Cuando se mueve de línea a línea en una vista de texto con las teclas "arriba" y "abajo", muestra este comportamiento de desplazamiento: cuando el cursor está en la parte superior y toco "arriba" (y viceversa) versa), desplaza el documento media página hacia arriba, es decir, la línea actual se encuentra ahora en el medio de la vista de texto.Desplazamiento NSTextView línea por línea

¿Es posible deshabilitar este comportamiento? ¿Es posible hacer que se desplace por una sola línea? ¿Para que la línea actual permanezca siempre en la parte superior (o inferior)?

Respuesta

1

Sé que llego un poco tarde a la fiesta, pero como esto no se ha respondido correctamente, lo intentaré. Tuve el mismo problema con NSTextViews. Al usar -scrollRangeToVisible para llevar la posición de inserción a la vista visible de la vista, tenía el hábito de desplazarse para colocar el cursor en el centro (vertical) de la pantalla. Lo que hice fue usar [NSView scrollRectToVisible] lugar, ya que desplaza el mínimo distancia necesaria para traer un rect a la rect visible de la vista:

NSRange caretRng = NSMakeRange(caretLocation, 0); 
NSLayoutManager* lm = [view layoutManager]; 
NSRange glyphRange = [lm glyphRangeForCharacterRange:caretRng actualCharacterRange:nil]; 
NSRect glyphRect = [lm boundingRectForGlyphRange:glyphRange inTextContainer:[view textContainer]]; 
[view scrollRectToVisible:glyphRect]; 

espero que ayude!

+0

¡Gracias! ¿Pero dónde debería poner esto en mi subclase NSTextView? Entiendo que 'scrollRectToVisible:' se desplaza de la manera que quiero, el problema es que NSTextView parece llamar a 'scrollRangeToVisible:' - ¿cómo hacer que llame al método anterior? –

+0

¿Ha intentado anular ScrollRangeToVisible en su subclase NSTextView? En mi configuración anulo los mensajes de KeyDown y hago los movimientos de cursor manualmente, así que scrollRangeToVisible no se llama automáticamente y puedo llamar a scrollRectToVisible manualmente, pero eso debería hacerlo, aunque no sé sobre los posibles efectos secundarios. – Ibazan

+0

¡Más o menos funciona! El único problema es que a veces, cuando mantengo presionado arriba/abajo durante más tiempo, no se desplaza unas pocas filas para que el símbolo de intercalación no esté en la primera/última fila, pero quizás 2-3 líneas abajo/arriba. –

1

NSTextView (a través de NSText) tiene un método llamado -scrollRangeToVisible:. Considere la posibilidad de subclasificar NSTextView y overriding -scrollRangeToVisible para especificar su propio comportamiento de desplazamiento directamente.

Si necesita ayuda más específica para obtener el comportamiento correcto, publique una pregunta por separado que especifique exactamente el comportamiento que desea y el código que intentó obtener.

+0

Gracias por la respuesta. Especifiqué el comportamiento deseado ya en esta pregunta. –

Cuestiones relacionadas