2010-10-12 8 views
5

Estoy intentando crear una etiqueta mediante programación utilizando NSTextField, pero sale borrosa: screenshotCrear una etiqueta utilizando NSTextField es borrosa

Este es mi código hasta ahora:

NSTextfield *textfield = [[NSTextField alloc] initWithFrame:NSMakeRect(5,5,150,20)]; 
[texField setStringValue:@"some text here"]; 
[textField setEditable:NO]; 
[textField setSelectable:NO]; 
[textField setBordered:NO] 
[textField setDrawsBackground:NO] 

tengo rastreó el problema hasta la línea setDrawsBackground. También intenté usar [textField setBackgroundColor: [NSColor clearColor] también, pero no tuve suerte.

Por cierto, agregué un textField a la subvista de una vista que es una subvista de una vista de desplazamiento. También estoy jugando con isOpaque en todos los niveles de vista, pero no tuve suerte allí de nuevo.

Cualquier ayuda es muy apreciada.

+0

Hay alguna información adicional útil que se encuentra [en esta entrada del blog] (http: //waffle.wootest.net/2010/09/16/setdrawsbackground-nstextfield-calayer /), que viene de aproximadamente el mismo período de tiempo que esta pregunta original. Mi propio problema fue resuelto por la fuerza dibujando un fondo sólido detrás de mi etiqueta NSTextField (usando "DrawBackground" con un color no funcionó). –

Respuesta

0

Ya que esta fue la primera vez que la subclasificación NSView, que había puesto el código anterior en el método en lugar del métodoinitWithFrame drawRect. Hice esto porque estaba siguiendo una de las aplicaciones de muestra del sitio Dev de Apple.

Esto también era la causa del uso de la CPU a pico cuando se desplazaba

6

Si no tiene ningún fondo (incluido el borrado) y su texto es una subvista de cualquier superview respaldada por capas (ha activado "quiere capa" en el código o en IB para permitir animaciones/transiciones), tendrá obtener texto borroso. Debe elegir ya sea vista sin capa o una etiqueta con un color de fondo sólido.

+0

Gracias por la respuesta. Originalmente pensé en eso, pero esperaba encontrar una mejor solución. Intenté establecer wantsLayer en NO en las vistas, pero todavía no tuve suerte. – IEb

+0

Nunca he visto este problema causado por algo más que -wantsLayers siendo SÍ. ¿Estás seguro de que has escalado toda la jerarquía de vistas y te has asegurado de que todo estaba desactivado? ¿Cómo hiciste esto, en IB o en código? Si está en el código, ¿dónde/cómo? –

+0

Estoy haciendo esto todo el código. Tengo la siguiente configuración de vista: -NSScrollView que contiene NSView 1. -NSView 1 contiene NSView 2 -NSView 2 es donde tengo el NSTextField en ¿Estás diciendo que quieres que listeLayer sea SÍ en todos los niveles de vista? – IEb

0

Si lo ha creado a través de un XI ter y es borrosa, he encontrado la solución:

[textField setStringValue:@""]; 

Si comento esto se pone borroso; si lo vuelves a ver, queda claro como el cristal.

0

asegurarse de que está estableciendo el marco de su NSTextField a algo con todo valores enteros.

Use roundf() si es necesario.

Me estaba poniendo borroso NSTextField, y ni agregar un fondo sólido ni eliminar capas de Core Animation de la jerarquía de mi vista eran opciones para mí. Noté que estaba fijando el marco de este campo de texto a algo con un valor Y de 4,5, por lo que los siguientes cambios ha solucionado el problema para mí:

etiqueta borrosa:

_label.frame = NSOffsetRect(_labelFrame, 
          -0.5 * (someRect.size.width + someConstant), 
          0.0); 

Sin desenfoque:

_label.frame = NSOffsetRect(_labelFrame, 
          roundf(-0.5 * (someRect.size.width + someConstant)), 
          0.0); 

(en los ejemplos anteriores, _labelFrame y someRect son NSRect s, y someConstant es una CGFloat. Como se puede ver, el cálculo que estaba haciendo en la segunda línea del primer ejemplo pasaba un no-integ valor de er a NSOffsetRect).

1

he tenido el mismo problema, pero lo he resuelto por:

textfield.canDrawSubviewsIntoLayer = true 
Cuestiones relacionadas