objective c - Qué pasó con "HelveticaNeue-Italic" en iOS 7.0.3
objective-c ios7 (10)
Acabo de actualizar mi iPod touch a iOS 7.0.3 y "HelveticaNeue-Italic" parece haber desaparecido. Cuando consulto en el teléfono con:
[UIFont fontNamesForFamilyName:@"Helvetica Neue"]
Obtengo los siguientes fontNames (13):
HelveticaNeue-BoldItalic,
HelveticaNeue-Light,
HelveticaNeue-UltraLightItalic,
HelveticaNeue-CondensedBold,
HelveticaNeue-MediumItalic,
HelveticaNeue-Thin,
HelveticaNeue-Medium,
HelveticaNeue-ThinItalic,
HelveticaNeue-LightItalic,
HelveticaNeue-UltraLight,
HelveticaNeue-Bold,
HelveticaNeue,
HelveticaNeue-CondensedBlack
Cuando hago la misma consulta ejecutándose en el simulador, obtengo (14):
HelveticaNeue-BoldItalic,
HelveticaNeue-Light,
**HelveticaNeue-Italic,**
HelveticaNeue-UltraLightItalic,
HelveticaNeue-CondensedBold,
HelveticaNeue-MediumItalic,
HelveticaNeue-Thin,
HelveticaNeue-Medium,
HelveticaNeue-Thin_Italic,
HelveticaNeue-LightItalic,
HelveticaNeue-UltraLight,
HelveticaNeue-Bold,
HelveticaNeue,
HelveticaNeue-CondensedBlack
¿Alguien más ve esto?
---- Nueva información ----
Volví al video de la WWDC 2013 "Uso de la fuente con el kit de texto" y la parte interesante comienza a las 12:22. El presentador habla sobre "MetaFonts" en OS X como ejemplo. Lo que dice es que la fuente bajo llamadas como:
+ (NSFont *)messageFontOfSize:(CGFloat)fontSize
no se garantiza que devuelvan la misma fuente subyacente en versiones o incluso diferentes usos. Su ejemplo fue Lucinda Grande. Parecía no decir que el uso de "HelveticaNeue-Italic" podría pasar de una versión a otra.
Así que construí un experimento en iOS 7. Creé mi fuente con el siguiente código:
UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithName:@"Helvetica Neue" size:16.0];
UIFontDescriptor *symbolicFontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];
UIFont *fontWithDescriptor = [UIFont fontWithDescriptor:symbolicFontDescriptor size:16.0];
Obtuve un UIFont válido para fontWithDescriptor y cuando consulté la fuente para el fontName con:
[fontWithDescriptor fontName]
Regresé...
HelveticaNeue-Italic
¿¿¿Imagínate???
Entonces, una posible respuesta a 7.0.3 parece ser el código anterior.
---- Tweak adicional ----
Aunque la solución funcionó anteriormente, no creo que sea formalmente correcta. He cambiado a la siguiente solución
UIFontDescriptor *fontDescriptor = [[UIFontDescriptor alloc] init];
UIFontDescriptor *fontDescriptorForHelveticaNeue = [fontDescriptor fontDescriptorWithFamily:@"Helvetica Neue"];
UIFontDescriptor *symbolicFontDescriptor = [fontDescriptorForHelveticaNeue fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];
textFont = [UIFont fontWithDescriptor:symbolicFontDescriptor size:textFontPointSize];
Esto parece hacer todas las cosas correctas. Probé el enfoque anterior con otra familia de fuentes y pareció confundirse con un fontName y fontFamily. ¡Espero que esto ayude!
Actualmente no encuentro la sesión pero me dijeron algo de que ya no puedes confiar en que las fuentes estén disponibles en iOS7. Incluso pueden cambiar durante la vida de su aplicación. Lo que básicamente significa: cuando especifica las fuentes en su aplicación, ¡está jodido, use descriptores de fuentes o fuentes preferidas!
Dado que nadie ha mencionado nada sobre HelveticaNeue soporte de cursiva en UIWebView, pensé en compartir mis hallazgos.
A partir de 7.0.6, la cursiva regular aún falta en UIWebView y parece recaer en UltraLightItalic en la misma familia. Esto se ve un poco raro cuando está justo al lado del texto HelveticaNeue que no es de cursiva, ya que es mucho más liviano.
Mi solución fue utilizar Helvetica normal en lugar de HelveticaNeue, pero solo para las cursivas. Entonces, si tienes CSS que se ve así:
.myCssClass {
font-family:HelveticaNeue;
/* etc, etc */
}
... agregaría otras dos clases para anular <i>
y <em>
:
.myCssClass i { font-family:Helvetica; }
.myCssClass em { font-family:Helvetica; }
La fuente de cursiva Helvetica normal se ve bien y no creo que nadie se daría cuenta de que no es HelveticaNeue.
El error parece haberse solucionado en iOS 7.1 beta 1. [UIFont fontWithName:@"HelveticaNeue-Italic" size:size];
devuelve una fuente.
El informe de error que archivé con Apple se ha marcado como "Cerrado como duplicado". Tengo la esperanza de que eso signifique que lo consideran un error. Sin embargo, iOS 7.0.4 no soluciona el error.
Es mi creencia que es un error. Lo he archivado como tal con Apple. Tristemente para mí, mi aplicación ahora se está cayendo. La fuente se usa en una biblioteca de terceros que estoy usando. Mucha gente en Twitter está reportando problemas.
Este es un error de Apple. Se introdujo en iOS 7.0.3 y aún no se ha solucionado a partir de iOS 7.0.4. Parece que se corrigió en la vista previa del desarrollador de iOS 7.1. Aquí hay un código (proporcionado por Apple en los foros de desarrollo) para solucionar el problema:
#import <CoreText/CoreText.h>
CGFloat size = 14;
UIFont *font = [UIFont fontWithName:@"HelveticaNeue-Italic" size:size];
if (font == nil && ([UIFontDescriptor class] != nil)) {
font = (__bridge_transfer UIFont*)CTFontCreateWithName(CFSTR("HelveticaNeue-Italic"), size, NULL);
}
También vale la pena señalar que en la versión actual de Xcode (5.0.1 (5A2053)) esta fuente no aparece como una opción en la lista desplegable Fuente en el Creador de interfaces. Entonces, si previamente configuró una etiqueta con esta fuente, notará que la interfaz de usuario está confundida y la etiqueta termina siendo asignada con otra fuente y tamaño en el tiempo de ejecución (vea ui screencap a continuación). Para las etiquetas configuradas en storyboards / xibs, deberá restablecer la fuente en el código.
Para referencia here está la discusión del problema en los foros de desarrollo.
Este es un error en iOS 7.0.3.
Si está utilizando explícitamente HelveticaNeue-Italic, puede crearlo utilizando esta solución alternativa:
UIFont* font = (__bridge_transfer UIFont*)CTFontCreateWithName(CFSTR("HelveticaNeue-Italic"), fontSize, NULL);
Sin embargo, tenga en cuenta que esta solución solo funcionará en iOS 7; no se puede implementar en iOS 6 (debido a que CTFontRef
y UIFont
no tenían puente de conexión gratuita en iOS 6). Sin embargo, en iOS 6 puedes usar tu código de búsqueda de fuente habitual.
Si accede dinámicamente a la fuente en cursiva, en lugar de acceder a la fuente por nombre [UIFont fontWithName:@"HelveticaNeue-Italic" size:15.0f]
use [UIFont italicSystemFontOfSize:15.0f]
esto funciona bien para mí.
Tuve un mismo bloqueo que usé para colgar solo en iOS 7.0.3 y 7.0.4, y funciona perfectamente en todas las demás versiones. Después de tanta investigación, llegué a saber que @ "HelveticaNeue-Italic" no está disponible en las versiones de iOS 7.0.3 y 7.0.4, por lo que solía tener un fallo superior en esas versiones.
He solucionado el problema con el código a continuación, esto podría ser útil para alguien necesitado.
self.headerFont = [UIFont fontWithName:@"HelveticaNeue-Italic" size:16.0f];
if (self.headerFont == nil) {
self.headerFont = [UIFont fontWithName:@"HelveticaNeue" size:16.0f];
}
El registro de bloqueo es:
[__NSCFConstantString pointSize]: unrecognized selector sent to instance
He encontrado otra solución que parece funcionar. Cerré una llamada a
[[UIFont italicSystemFontOfSize:12.0] fontName]
para ver cuál es la fuente cursiva del sistema que se está utilizando, y devolvió ".HelveticaNeueInterface-ItalicM3". Una simple prueba muestra que usando
[UIFont fontWithName:@".HelveticaNeueInterface-ItalicM3" size:12.0]
¡trabajos! Comparando visualmente, la fuente devuelta por la llamada anterior parece ser exactamente la misma que la fuente original ''HelveticaNeue-Italic''.
Este problema es casi seguro un error ... Helvetica Neue es la fuente predeterminada en iOS 7, por lo que las fuentes de esa familia no deberían faltar. Todo funcionó bien en Xcode v.5.0, pero inmediatamente después de actualizar a 5.0.1, este problema comenzó a aparecer. He archivado un error con Apple notando tanto. Hasta entonces, esta solución parece funcionar ...