Pregunta

Estoy intentando escribir una función de "destacado" en una NSTextView. Actualmente, todo funciona muy bien. Se selecciona un rango de texto y el color de fondo de que los cambios de texto a amarillo. Sin embargo, mientras aún está seleccionado, el fondo es que el azul estándar del texto seleccionado. ¿Cómo puedo hacer que el color del indicador de selección estándar no aparece en ciertos casos?

Gracias!

¿Fue útil?

Solución

Con -[NSTextView setSelectedTextAttributes:...] .

Por ejemplo:

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

Usted simplemente puede 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" utilizando atributos temporales . Nota que los atributos temporales se utilizan para mostrar los errores ortográficos y gramaticales y encontrar resultados; por lo que si se preocupan por preservar estas características de NSTextView continuación, asegúrese de que sólo añadir y eliminar atributos temporales, no las reemplaza.

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];
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top