¿Qué pasó con "HelveticaNeue-Italic" en iOS 7.0.3

100

Acabo de actualizar mi iPod touch a iOS 7.0.3 y "HelveticaNeue-Italic" parece haber desaparecido. Cuando consulto por 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 vio esto?

---- Nueva información ----

Volví al video de la WWDC 2013 "Uso de fuentes con el kit de texto" y la parte interesante comienza a las 12:22. El presentador habla de "MetaFonts" en OS X como ejemplo. Lo que dice es que la fuente debajo de llamadas como:

+ (NSFont *)messageFontOfSize:(CGFloat)fontSize

no se garantiza que devuelvan la misma fuente subyacente en todas las versiones o incluso en diferentes usos. Su ejemplo fue Lucinda Grande. No parecía estar diciendo que el uso de "HelveticaNeue-Italic" pudiera 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 fontName con:

[fontWithDescriptor fontName]

Regresé...

HelveticaNeue-Italic

¿¿¿Imagínate???

Entonces, una posible respuesta a 7.0.3 parece ser el código anterior.

---- Más retoques ----

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 fontName y fontFamily. ¡Espero que esto ayude!

Scott Sarnikowski
fuente
Yo también he visto esto. No sé qué pasó, pero eso es una gran regresión.
ipodishima
Curiosamente, Pages en iOS 7.0.3 muestra Helvetica Neue Italic: i.stack.imgur.com/xpJKl.png
Leo Natan
Así que parece que respondiste a mi pregunta con tu propia pregunta e investigación, el uso del descriptor de fuente muestra la fuente en cursiva en mi iPhone 7.0.3.
Rick van der Linde
Esto también es un problema en iOS 7.0.4
s.ka

Respuestas:

31

Este es un error de Apple. Se introdujo en iOS 7.0.3 y aún no se ha corregido a partir de iOS 7.0.4. Parece estar corregido en la vista previa para desarrolladores 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 Interface Builder. Entonces, si configuró previamente una etiqueta con esta fuente, notará que la interfaz de usuario se confunde y la etiqueta termina asignándose otra fuente y tamaño en tiempo de ejecución (consulte la captura de pantalla de la interfaz de usuario a continuación). Para las etiquetas configuradas en guiones gráficos / xibs, deberá restablecer la fuente en el código.

Como referencia, aquí está la discusión del problema en los foros de desarrollo.

ingrese la descripción de la imagen aquí

Mike Vosseller
fuente
Dice que reemplazó todos sus usos con otra cosa. ¿Con qué lo reemplazaste? Notamos que si lo reemplaza con HelveticaNeue-MediumItalic en el archivo XIB, obtenemos resultados incorrectos en iOS 6 y versiones anteriores porque esa fuente parece haber sido introducida en iOS 7.
GBegen
Lo reemplacé con HelveticaNeue-LightItalic. Sin embargo, no estoy seguro de cuándo se presentó. Mi aplicación es iOS7 +
Mike Vosseller
7

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 (porque CTFontRefy UIFontno fueron puenteados sin cargo en iOS 6). Sin embargo, en iOS 6 solo puede usar su código de búsqueda de fuentes habitual.

Dave DeLong
fuente
4

Creo que es un error. Lo he presentado como tal a Apple. Lamentablemente para mí, mi aplicación ahora se bloquea. La fuente se usa en una biblioteca de terceros que estoy usando. Mucha gente en Twitter informa de problemas.

David Lari
fuente
1
FYI: Acabo de probar y el error todavía existe en iOS 7.0.4.
David Lari
3

Si está accediendo de forma dinámica el tipo de letra cursiva a continuación, en lugar de acceder a la fuente por su nombre [UIFont fontWithName:@"HelveticaNeue-Italic" size:15.0f] utilizar [UIFont italicSystemFontOfSize:15.0f]esto está muy bien trabajando para mí.

Lámpara Kapil
fuente
Esta es quizás la solución más limpia para solucionar este problema. Si se requiere compatibilidad con iOS 6, puede intentar ejecutar fontWithName:size:primero y, si el resultado es nil, ejecutar italicSystemFontOfSize:, que siempre debería devolver algo y al menos evitar un bloqueo.
SaltyNuts
2

Actualmente no encuentro la sesión, pero dijeron algo que no puede confiar en que las fuentes ya estén disponibles en iOS7. Incluso pueden cambiar durante la vida útil de su aplicación. Lo que básicamente significa: cuando especificas fuentes en tu aplicación, estás jodido, ¡usa descriptores de fuentes o fuentes preferidas en su lugar!

Michael Ochs
fuente
2
La coincidencia más cercana que puedo encontrar es asciiwwdc.com/2013/sessions/223 , pero parece que se refieren a fuentes descargables, no fuentes proporcionadas por el sistema.
Hilton Campbell
Consulte la nueva información anterior. Creo que lo que dice el presentador es que no se puede contar con la asignación de "MetaFonts" a las mismas fuentes subyacentes en todas las versiones o incluso usos. No creo que esté diciendo que existe la posibilidad de que algo como "HelveticaNeue-Italic" pueda desaparecer.
Scott Sarnikowski
1

Encontré otra solución que parece funcionar. Salí de una llamada a

[[UIFont italicSystemFontOfSize:12.0] fontName]

para ver cuál es la fuente en cursiva del sistema real que se está utilizando, y devolvió ".HelveticaNeueInterface-ItalicM3". Una prueba simple muestra que usar

[UIFont fontWithName:@".HelveticaNeueInterface-ItalicM3" size:12.0]

¡trabajos! Comparándolos visualmente, la fuente devuelta por la llamada anterior parece ser exactamente la misma que la fuente original 'HelveticaNeue-Italic'.

Este problema es casi con certeza 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. Presenté un error con Apple notando eso. Hasta entonces, esta solución parece funcionar ...

Fateh Khalsa
fuente
1

El informe de error que presenté a Apple se ha marcado como "Cerrado como duplicado". Espero que eso signifique que lo consideren un error. Sin embargo, iOS 7.0.4 no corrige el error.

David Lari
fuente
1
Recibí la misma respuesta. Espero que lo arreglen.
Scott Sarnikowski
1

El error parece haberse solucionado en iOS 7.1 beta 1. [UIFont fontWithName:@"HelveticaNeue-Italic" size:size];devuelve una fuente.

Leo Natan
fuente
Buenas noticias, pero eso todavía está bajo NDA.
Vincent Tourraine
9
Asumiré ese riesgo.
Leo Natan
0

Tuve un mismo bloqueo que solía fallar en iOS 7.0.3 y 7.0.4 solamente, y funciona perfectamente en todas las demás versiones. Después de tanta investigación, me enteré de que @ "HelveticaNeue-Italic" no está disponible en las versiones de iOS 7.0.3 y 7.0.4, por lo que solía superar el bloqueo en esas versiones.

He solucionado el problema con el siguiente código, 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 fallos es:

[__NSCFConstantString pointSize]: unrecognized selector sent to instance 
Suresh Durishetti
fuente
-1

Como nadie ha mencionado nada sobre el soporte en cursiva de HelveticaNeue en UIWebView, pensé en compartir mis hallazgos.

A partir de 7.0.6, todavía falta la cursiva regular en UIWebView y parece recurrir a UltraLightItalic en la misma familia. Esto se ve un poco extraño cuando está justo al lado del texto de HelveticaNeue sin cursiva de peso normal, ya que es mucho más ligero.

Mi solución fue usar Helvetica ordinaria en lugar de HelveticaNeue, pero solo para las cursivas. Entonces, si tiene 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 en cursiva Helvetica normal se ve bien y no creo que nadie se dé cuenta de que no es HelveticaNeue.

Brian Rak
fuente