2010-11-29 27 views
8

Estoy intentando escribir una característica de "resaltado" en un NSTextView. Actualmente, todo funciona bien. Selecciona un rango de texto y el color de fondo de ese texto cambia a amarillo. Sin embargo, mientras está seleccionado, el fondo es el azul estándar del texto seleccionado. ¿Cómo hago que el color del indicador de selección estándar no aparezca en ciertos casos?Cambio del color de selección de texto en NSTextView

Gracias!

Respuesta

16

Utilice -[NSTextView setSelectedTextAttributes:...].

Por ejemplo:

[textView setSelectedTextAttributes: 
    [NSDictionary dictionaryWithObjectsAndKeys: 
     [NSColor blackColor], NSBackgroundColorAttributeName, 
     [NSColor whiteColor], NSForegroundColorAttributeName, 
     nil]]; 

Usted puede simplemente pasar un diccionario vacío si no desea que la selección se indica de ninguna manera en absoluto (por debajo de ocultar el punto de inserción).

Otra opción es observar los cambios de selección y aplicar la "selección" usando temporary attributes. Tenga en cuenta que los atributos temporales se utilizan para mostrar errores ortográficos y gramaticales y encontrar resultados; así que si te importa preservar estas características de NSTextView, asegúrate de agregar y eliminar atributos temporales, no de reemplazarlos.

Un ejemplo de esto es (en una subclase NSTextView):

- (void)setSelectedRanges:(NSArray *)ranges affinity:(NSSelectionAffinity)affinity stillSelecting:(BOOL)stillSelectingFlag; 
{ 
    NSArray *oldRanges = [self selectedRanges]; 
    for (NSValue *v in oldRanges) { 
     NSRange oldRange = [v rangeValue]; 
     if (oldRange.length > 0) 
      [[self layoutManager] removeTemporaryAttribute:NSBackgroundColorAttributeName forCharacterRange:oldRange]; 
    } 

    for (NSValue *v in ranges) { 
     NSRange range = [v rangeValue]; 
     if (range.length > 0) 
      [[self layoutManager] addTemporaryAttributes:[NSDictionary dictionaryWithObject:[NSColor blueColor] forKey:NSBackgroundColorAttributeName] 
             forCharacterRange:range]; 
    } 

    [super setSelectedRanges:ranges affinity:affinity stillSelecting:stillSelectingFlag]; 
} 
+0

Al establecer el color de fondo a clearColor, lo más destacado funciona sólo después de toda la selección sea completa. ¿Cómo puedo aplicar estos atributos ya que la selección está en curso? – DexterW

+0

Las notificaciones no se entregan hasta que se suelta el botón del mouse (es decir, ya no está 'stillSelecting'). Si desea manejar las selecciones en progreso, debe crear una subclase de NSTextView (editó mi respuesta para proporcionar algún código de muestra). –

Cuestiones relacionadas