Estoy intentando utilizar una fuente Helvetica Neue Condensed que obtuve del paquete Adobe Font Collection Pro. Desafortunadamente, parece dibujarse incorrectamente cuando lo uso dentro de un UILabel
.
La altura de la línea parece calculada correctamente (creo), pero cuando se muestra la fuente, se alinea con la parte superior del cuadro delimitador. Llamé [myLabel sizeToFit]
y solo ajusté el ancho para producir esta captura de pantalla:
Tuve el mismo problema con la versión regular y en negrita de la fuente. Pude sacar una versión de Helvetica Neue Bold de OSX y ponerla en mi dispositivo y se ve bien (fondo verde en la imagen de arriba).
¿Qué podría estar mal con el archivo de fuente o con mi código que haría que se dibujara de esta manera?
Respuestas:
Publiqué una solución que implica parchear el archivo de fuente ttf aquí :
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 tome su fuente y haga lo siguiente:
Esto creará
Bold.hhea.xml
. Ábralo con un editor de texto y aumente el valor delascender
atributo. 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:Luego, use la fuente ttf resultante en su aplicación.
fuente
Entonces esta es una versión modificada de la respuesta de kolyuchiy .
Abrí mi fuente con Glyphs y luego la exporté sin modificar nada. De alguna manera, mágicamente, ¡el problema de la alineación vertical desapareció!
Lo que es mejor es que la nueva fuente funciona bien con métodos como
sizeWithFont:
, por lo que no tiene los problemas mencionados por Joshua .Eché un vistazo a la tabla HHEA con el comando que mencionó kolyuchiy, y noté que Glyphs modificaba no solo el
ascender
, sino tambiénlineGap
ynumberOfHMetrics
para mí.Aquí están los datos sin procesar, antes:
versionMajor="1" versionMinor="0" ascender="780" descender="-220" lineGap="200" advanceWidthMax="1371" minLeftSideBearing="-73" minRightSideBearing="-52" xMaxExtent="1343" caretSlopeRise="1" caretSlopeRun="0" caretOffset="0" metricDataFormat="0" numberOfHMetrics="751"
y después:
versionMajor="1" versionMinor="0" ascender="980" descender="-220" lineGap="0" advanceWidthMax="1371" minLeftSideBearing="-73" minRightSideBearing="-52" xMaxExtent="1343" caretSlopeRise="1" caretSlopeRun="0" caretOffset="0" metricDataFormat="0" numberOfHMetrics="748"
Entonces, la moraleja de la historia: no solo aumenta el ascendente, sino que también modifica otros valores relacionados.
No soy un experto en tipografía, así que no puedo explicar el por qué ni el cómo. Si alguien puede proporcionar una mejor explicación, ¡sería muy apreciado! :)
fuente
iOS 6 respeta la propiedad lineGap de la fuente, mientras que iOS 7 la ignora. Por lo tanto, solo las fuentes personalizadas con un espacio de línea de 0 funcionarán correctamente en ambos sistemas operativos.
La solución es hacer que lineGap sea 0 y hacer que el ascendente sea correspondientemente más grande. Según la respuesta anterior, una solución es importar y exportar desde Glyphs. Sin embargo, tenga en cuenta que una versión futura de la aplicación podría solucionar este "error".
Una solución más sólida es editar la fuente usted mismo, según esta publicación . Específicamente,
ftxdumperfuser -t hhea -A d YOUR_FONT.ttf
ascender
propiedad agregando el valor de lalineGap
propiedad. Por ejemplo, silineGap
es 200 yascender
es 750, haz elascender
950.lineGap
en 0.ftxdumperfuser -t hhea -A f YOUR_FONT.ttf
Una vez que haga esto, es posible que deba ajustar su interfaz de usuario en consecuencia.
fuente
Tuvimos el mismo problema con una de nuestras fuentes personalizadas. También "arreglamos" el problema editando la propiedad de fuente ascendente. Sin embargo, descubrimos que esto creaba otros problemas y problemas de diseño. Por ejemplo, establecer dinámicamente la altura de la celda en función de la altura de la etiqueta explotaría al usar nuestra fuente editada por ascendente.
Lo que terminamos haciendo fue cambiar la propiedad UIButton contentEdgetInsets.
yourButton.contentEdgeInsets = UIEdgeInsetsMake(-10, 0, 0, 0);
No estoy seguro de qué método es mejor, pero solo quería compartir otra forma de solucionar el problema.
fuente
fuente
Para aquellos que ejecutan OS X El Capitan y llegan a este hilo, es posible que hayan notado que Apple Font Tool Suite ya no es compatible (al menos por ahora).
Pero aún puede realizar los cambios descritos por kolyuchiy y Joseph Lin con el software gratuito de edición de fuentes FontForge .
Abra la fuente con FontForge y seleccione Elemento en el menú superior, luego vaya a Información de fuente> OS / 2> Métricas. Allí desea editar los valores de HHEad Line Gap y HHead Ascent Offset.
Una vez que haya realizado las ediciones necesarias, puede exportar la fuente en Archivo> Generar fuentes y seleccionar el formato de fuente correcto
fuente
Gracias a esta respuesta , solucioné mi problema con Glyphs, pero de manera un poco diferente.
Abrí mi fuente con Glyphs (también funciona con Glyphs mini) y encontré esta sección allí (esto de Glyphs mini, para llegar presione el botón i en la esquina superior derecha):
Simplemente elimine todas estas zonas de alineación (o algunas de ellas) y solucionará este problema. Funcionó perfectamente para mí.
fuente
Crear texto atribuido a partir del texto de sus etiquetas fue la solución para mí. Aquí hay una extensión:
extension UILabel { /// You can call with or without param values; without will use default 2.0 func setLineSpacing(lineSpacing: CGFloat = 2.0, lineHeightMultiple: CGFloat = 2.0) { guard let labelText = self.text else { return } let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = lineSpacing paragraphStyle.lineHeightMultiple = lineHeightMultiple let attributedString:NSMutableAttributedString if let labelattributedText = self.attributedText { attributedString = NSMutableAttributedString(attributedString: labelattributedText) } else { attributedString = NSMutableAttributedString(string: labelText) } // (Swift 4.2 and above) Line spacing attribute attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length)) self.attributedText = attributedString } }
Para mi fuente personalizada obtuve el resultado que necesito de:
self.myLabel.setLineSpacing(lineSpacing: 1.2, lineHeightMultiple: 1.2)
Esto funciona utilizando el nativo proporcionado
NSMutableParagraphStyle()
que contiene la altura de la línea y las propiedades de espaciado (que también son accesibles como@IBOutlet
propiedades en el Storyboard si no está programando sus etiquetas).fuente
¿Has probado Core Text ? He tenido cierto éxito renderizando fuentes personalizadas a través de Core Text, pero no sé si encajaría en su situación.
fuente
Usé https://github.com/fonttools/fonttools , muy fácil de usar y gratuito. En mi caso, el cambio de 'ascender' = 1000 y 'lineGap' = 0 en la tabla 'hhea' funcionó.
Basado en el artículo de Trevor Harmon https://medium.com/@thetrevorharmon/how-to-use-apples-font-tools-to-tweak-a-font-a386600255ae
fuente
Si tiene problemas con estas utilidades de línea de comandos, pruebe fontcreator en la ventana. y cambiar el asistente de fuente desde su menú de configuración.
fuente
Para cualquiera que tenga dificultades para usar
ftxdumperfuser
( kolyuchiy answer) en Mac OS Mojave debido al error de comando no encontrado:export PATH="$PATH:$HOME/font-tools/FontCommandLineTools.pkg/Payload"
) o copiar las utilidades a su carpeta bin.fuente
Tuve un problema similar con la fuente icónica "FontAwesome" en mi juego Sprite Kit. Establecer la propiedad SKLabelVerticalAlignmentMode de SKLabelNode en .Center funcionó para mí.
myLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center
Solo quería compartir en caso de que alguien tuviera el mismo problema.
fuente