Pregunta

En un iPhone ¿Cómo se calcula el tamaño de un carácter en píxeles para un tamaño de punto dado?

¿Fue útil?

Solución

tamaños de punto son definido como 1/72 de pulgada . Es decir, una fuente de 72 puntos es de aproximadamente 1 pulgada de la parte de descenso más bajo al más alto ascenso. Así que la altura máxima de un glifo en una fuente 72pt es de aproximadamente 1 pulgada.

página de especificaciones de Apple iPhone tecnología de afirma que el iPhone actualmente tiene una resolución de 163 píxeles por pulgada. Así que 72 puntos es de 163 píxeles, o alrededor de 2,2639 píxeles por punto. Sólo recuerde que cada glifo varía en altura y anchura, así que esto es una estimación muy aproximada del tamaño. Generalmente, la distancia entre las líneas de base será un poco más grande que el tamaño de punto de la fuente de manera que líneas de texto no chocan entre sí.

Si se requieren mediciones exactas (y probablemente lo hacen), entonces usted tendrá que medir realmente los glifos utilizando la información métrica de fuente. Usted puede hacer esto mediante el uso de adiciones de UIKit NSString , que le permitirá medir el tamaño de una cadena en particular cuando se representa en la pantalla.

Otros consejos

para que coincida con los tamaños de fuente (en puntos) en el iPhone4 con tamaños de fuente (en puntos) en Photoshop usted tiene que configurar su documento de Photoshop a 144dpi. He ejecutar una serie de pruebas y esa es la resolución que produce. 1: 1 resultados

Pasos:

  • Tome una captura de pantalla de “Ajustes» General »Accesibilidad» Texto de gran tamaño” en un iPhone4
  • Abra la pantalla en Photoshop
  • Cambiar la resolución de 72 ppp a 144dpi con “Remuestrear la imagen” de
  • Vuelva a escribir el texto en Photoshop (en puntos) para que coincida con el tamaño de la pantalla

he ido a través de un número de diferentes resoluciones, incluyendo el 163dpi que se mencionó en la respuesta anterior, y encontrado que 144dpi produce 1: 1 resultados. También he probado esto en contra de una aplicación nativa donde sé que los tamaños de punto y la 144dpi fue partido allí también.

Nuestro artista gráfico fue muy específico en ciertos dispositivos para utilizar tamaños de pixel en vez de tamaño de punto. por debajo de la función devolverá un tipo de letra en función del tamaño de píxel. Se utiliza un método de fuerza bruta para encontrar la fuente del armario, pero luego almacena en caché los resultados hasta la próxima vez que el regreso será muy rápido. Siempre aprecio comentarios sobre cómo este código se podría hacer mejor. Yo uso esta función como un miembro de la clase estática en utilidades clase llamada. Se puede pegar fácilmente en cualquier clase que esté utilizando. Espero que sea de alguna ayuda.

/** return a font as close to a pixel size as possible
example:
    UIFont *font = [Utils fontWithName:@"HelveticaNeue-Medium" sizeInPixels:33];
 @param fontName name of font same as UIFont fontWithName
 @param sizeInPixels size in pixels for font
 */
+(UIFont *) fontWithName:(NSString *) fontName sizeInPixels:(CGFloat) pixels {
    static NSMutableDictionary *fontDict; // to hold the font dictionary
    if ( fontName == nil ) {
        // we default to @"HelveticaNeue-Medium" for our default font
        fontName = @"HelveticaNeue-Medium";
    }
    if ( fontDict == nil ) {
        fontDict = [ @{} mutableCopy ];
    }
    // create a key string to see if font has already been created
    //
    NSString *strFontHash = [NSString stringWithFormat:@"%@-%f", fontName , pixels];
    UIFont *fnt = fontDict[strFontHash];
    if ( fnt != nil ) {
        return fnt; // we have already created this font
    }
    // lets play around and create a font that falls near the point size needed
    CGFloat pointStart = pixels/4;
    CGFloat lastHeight = -1;
    UIFont * lastFont = [UIFont fontWithName:fontName size:.5];\

    NSMutableDictionary * dictAttrs = [ @{ } mutableCopy ];
    NSString *fontCompareString = @"Mgj^";
    for ( CGFloat pnt = pointStart ; pnt < 1000 ; pnt += .5 ) {
        UIFont *font = [UIFont fontWithName:fontName size:pnt];
        if ( font == nil ) {
            NSLog(@"Unable to create font %@" , fontName );
            NSAssert(font == nil, @"font name not found in fontWithName:sizeInPixels" ); // correct the font being past in
        }
        dictAttrs[NSFontAttributeName] = font;
        CGSize cs = [fontCompareString sizeWithAttributes:dictAttrs];
        CGFloat fheight =  cs.height;
        if ( fheight == pixels  ) {
            // that will be rare but we found it
            fontDict[strFontHash] = font;
            return font;
        }
        if ( fheight > pixels ) {
            if ( lastFont == nil ) {
                fontDict[strFontHash] = font;
                return font;
            }
            // check which one is closer last height or this one
            // and return the user
            CGFloat fc1 = fabs( fheight - pixels );
            CGFloat fc2 = fabs( lastHeight  - pixels );
            // return the smallest differential
            if ( fc1 < fc2 ) {
                fontDict[strFontHash] = font;
                return font;
            } else {
                fontDict[strFontHash] = lastFont;
                return lastFont;
            }
        }
        lastFont = font;
        lastHeight = fheight;
    }
    NSAssert( false, @"Hopefully should never get here");
    return nil;
}

Creo que usted está buscando las extensiones UIFont NSString que le permiten calcular el tamaño de una cadena dada a sizeWithFont.

Aquí está el Enlace

Específicamente los <=> métodos.

La forma más fácil de obtener la altura de píxeles para un tipo de letra y tamaño dado es utilizar el método boundingRect en NSString. (Estoy usando @"Ap" aquí para asegurarse de que contiene un dispositivo de descenso y un ascendente.)

- (CGFloat)heightForFont:(UIFont *)font
{
    NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
    CGRect boundingRect = [@"Ap" boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:context];
    return boundingRect.size.height;
}

No es posible convertir de forma fiable los puntos de píxeles que el ppi (puntos por pulgada) cambiará de un monitor a otro. Tiene una lectura;

http://hsivonen.iki.fi/units/

Convierte píxeles de Puntos

Dicho esto, algunas personas han puesto juntos un par de tablas de referencia y calculadoras que pueden ayudarle a empezar;

http://www.unitconversion.org /typography/postscript-points-to-pixels-x-conversion.html

http://sureshjain.wordpress.com/2007/07/06/ 53 /

voy a agregar como les averiguar:

A sizedToFit UILabel con un SystemFont 12pt es de 15 píxeles de altura.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top