UIButton alineación vertical de fuente personalizada

118

Tengo una UIButtonque usa una fuente personalizada, que se establece cuando se carga mi vista:

- (void)viewDidLoad
{
    [super viewDidLoad];    
    self.searchButton.titleLabel.font = [UIFont fontWithName: @"FONTNAME" size: 15.0 ];
}

El problema que tengo es que la fuente parece flotar hacia arriba de la línea central. Si comento esta línea, la fuente predeterminada aparece bien centrada verticalmente. Pero cambiar a la fuente personalizada rompe la alineación vertical.

También tengo el mismo problema en una celda de tabla con una fuente personalizada.

¿Debo decirle a la vista en algún lugar que la fuente personalizada no es tan alta como otras fuentes?

EDITAR: Me acabo de dar cuenta de que la fuente que estoy usando es una fuente TrueType de Windows. Puedo usarlo bien en TextEdit en Mac, solo un problema con la alineación en mi aplicación

El texto del botón no está centrado verticalmente

Pete
fuente
Tengo el mismo problema con esta fuente (.otf, no .ttf): fontsquirrel.com/fonts/bebas-neue
Neal Ehardt

Respuestas:

312

Se discutió un problema similar en La fuente instalada personalizada no se muestra correctamente en UILabel . No se dio ninguna solución.

Aquí está la solución que funcionó para mi fuente personalizada que tenía el mismo problema en UILabel, UIButton y demás. El problema con la fuente resultó ser el hecho de que su propiedad ascendente era demasiado pequeña en comparación con el valor de las fuentes del sistema. Ascender es un espacio en blanco vertical sobre los caracteres de la fuente. Para arreglar su fuente, tendrá que descargar las utilidades de línea de comandos de Apple Font Tool Suite . Luego toma tu fuente y haz lo siguiente:

~$ ftxdumperfuser -t hhea -A d Bold.ttf

Esto creará Bold.hhea.xml. Ábralo con un editor de texto y aumente el valor del ascenderatributo. Tendrá que experimentar un poco para encontrar el valor exacto que mejor funcione para usted. En mi caso, lo cambié de 750 a 1200. Luego, ejecute la utilidad nuevamente con la siguiente línea de comando para fusionar sus cambios nuevamente en el archivo ttf:

~$ ftxdumperfuser -t hhea -A f Bold.ttf

Luego, use la fuente ttf resultante en su aplicación.

OS X El Capitán

El instalador de Apple Font Tool Suite ya no funciona en OSX El Capitan debido a SIP porque intenta instalar los archivos binarios en un directorio protegido. Tienes que extraer manualmente ftxdumperfuser. Primero copie el paquete del dmg a un directorio local, luego descomprima el paquete OS X Font Tools.pkgcon

~$ xar -xf OS\ X\ Font\ Tools.pkg

Ahora navegue a la carpeta fontTools.pkgcon

~$ cd fontTools.pkg/

Extraiga la carga útil con

~$ cat Payload | gunzip -dc | cpio -i

Ahora el ftxdumperfuserbinario está en su carpeta actual. Puede moverlo para /usr/local/bin/poder usarlo en cada carpeta dentro de la aplicación de terminal con lo siguiente.

~$ mv ftxdumperfuser /usr/local/bin/
kolyuchiy
fuente
4
+1 ¡Gran consejo! Aquí hay algo de información sobre Ascenders y Descenders typophile.com/node/13081
tidwall
35
Funcionó igualmente bien para archivos OTF.
mharper
2
Si utiliza una fuente personalizada modificada con esta solución y establece el texto, es decir, en un UITextView con varias líneas, la distancia entre líneas se vuelve demasiado grande.
The dude
5
Descubrí que en iOS 7 beta 6, solucionaron el problema de alineación de fuentes. Entonces, si hace esta solución, será bueno en iOS 6, pero fallará en iOS 7 ... Sin embargo, 7 todavía está en beta, así que quién sabe
tybro0103
3
Las herramientas de fuentes se han actualizado para Xcode 9, se instalan bien en High Sierra. Enlace directo: developer.apple.com/download/more/?=font
Andrés Pizá Bückmann
49

Resolví el problema ajustando el contenido superior (¡no el título!).

Por ejemplo: button.contentEdgeInsets = UIEdgeInsetsMake (10.0, 0.0, 0.0, 0.0);

¡Buena suerte!

Jordi Corominas
fuente
15
Esta fue una buena solución rápida para mí que parecía más simple que intentar editar la fuente. myButton.titleLabel.font = [UIFont fontWithName: @ "FontName" tamaño: 20.0]; myButton.contentEdgeInsets = UIEdgeInsetsMake (3.0, 0.0, 0.0, 0.0);
Jamie Hamick
¡Brillante! ¡Gracias! Mi problema era ligeramente diferente, tenía botones simples + y - que usaban la fuente predeterminada y aparecían más bajos que centrados, pude usar la solución aquí para elevar el texto ligeramente para que no se viera mal.
Patrick T Nelson
7

No estoy seguro si esto ayudará, ya que puede depender de su fuente, pero podría ser que su línea de base esté desalineada.

self.searchButton.titleLabel.baselineAdjustment = 
    UIBaselineAdjustmentAlignCenters;
Esteras
fuente
3
Funciona muy bien en un titleLabel para un UIButton cuando el tamaño de fuente se ajusta con minimumScaleFactor
smitt04
2

Puede probar esto en Interface Builder. Aquí hay una instantánea de cómo hacerlo:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Como puede ver, intentar hacer esto en IB tiene sus propios beneficios.

Srikar Appalaraju
fuente
1
Esa configuración ya está en su lugar, y en IB la fuente se muestra verticalmente, pero se muestra como la fuente predeterminada. Es solo cuando ejecuto mi aplicación que aparece mi fuente personalizada, y no está centrada verticalmente
Pete
¿Establece su "fuente personalizada" en IB? ¿Es compatible con las fuentes de iOS?
Srikar Appalaraju
La fuente está configurada en IB, y también por el código especificado en mi publicación original. En realidad, no aparece en la maqueta de la pantalla de IB, aunque sí en el menú desplegable de selección de fuente en IB.
Pete
2

Llegó tarde a la fiesta, pero como este problema me golpeó por enésima vez, pensé en publicar la solución más simple que he encontrado: usar Python FontTools .

  1. Instale Python 3 si no está disponible en su sistema.

  2. Instalar FontTools

    pip3 install fonttools

    FontTools incluye una herramienta TTX que permite la conversión desde y hacia XML.

  3. Convierta su fuente a .ttx en la misma carpeta

    ttx myFontFile.otf

  4. Realice las ediciones necesarias en .ttx y elimine el archivo .otf, ya que se reemplazará en el siguiente paso.

  5. Convierta el archivo de nuevo a .otf

    ttx myFontFile.ttx


Motivación: La solución de kolyuchi está incompleta, e incluso con este flujo de instalación extendido , la ejecución ftxdumperfuserprodujo un error en 10.15.2 Catalina.

NiFi
fuente