2010-03-13 4 views
5

Quiero saber el ancho de un NSString que se muestra en la pantalla en píxeles. Así que puedo ajustar un límite de NSTextField para que sea exactamente la longitud de la cadena. Así que utilicé la "Etiqueta" de IB NSTextField y para aquellos que no saben lo que quiero decir, obtuve una etiqueta con el título "Etiqueta", letra "Lucida Grande 13px", no seleccionable, no editable, tamaño regular, sin fondo y de acuerdo para IB su ancho es de 38px de ancho.NSString sizeWithAttributes: Inexactitud

Si quiero conseguir su anchura programáticamente utilizo

[@"Label" sizeWithAttributes: [NSDictionary dictionaryWithObject: [NSFont fontWithName: @"Lucida Grande" size: 13] forKey: NSFontAttributeName]].width 

que me dará 33.293457. Entonces eso es aproximadamente 5 px del ancho real.

Respuesta

0

Eso suena razonable. Está comparando dos anchos diferentes; el ancho de una cadena sin formato frente al ancho de una cadena contenida en un NSTextField. La cadena contenida probablemente tiene solo un poco de relleno en cada extremo, entre otras diferencias menores.

+0

Podría ser, pero la altura es correcta con 6 dígitos después de la coma ... Después de hacer algunas pruebas parece que siempre resulta ~ 5 px más pequeño que el original ... Es por eso que sospecho que algo anda mal con los atributos. y no sé qué. Incluso pasar el color correcto, el estilo de fondo, el estilo de párrafo, el modo de salto de línea y la dirección me da los mismos resultados de ~ 5 px más pequeños. – Jef

7

Creo que lo que está notando es la diferencia entre el marco del control y su marco de diseño. Vea Frame vs Layout Frame para una buena explicación.

Está haciendo lo correcto al calcular el ancho. Para una etiqueta, no hay relleno extra en la parte superior o inferior del control, por lo que no ha visto ningún problema con la altura de su control. Sin embargo, a la izquierda y derecha del control, hay tres píxeles adicionales. Esto puede verificarse mirando el Marco y el Diseño de un control de Etiqueta en IB.

Por lo tanto, los ~ 5 píxeles que notó son en realidad exactamente 6. Una vez que tenga en cuenta este relleno, no debería tener más problemas.

Desafortunadamente, no hay API para determinar qué es el relleno para varios controles (los botones tienen 6 píxeles adicionales en cada lado). Sugeriría que se presente un informe de error al http://bugreport.apple.com - Apple basa las API que proporcionan en parte en el número de solicitudes para ellos. Si bien IB le dirá, tendrá que codificar esos valores usted mismo. Si cambian en la próxima versión del sistema operativo, deberá actualizar su aplicación.