Qu'est-il arrivé à «HelveticaNeue-Italic» sur iOS 7.0.3


100

Je viens de mettre à niveau mon iPod touch vers iOS 7.0.3 et "HelveticaNeue-Italic" semble avoir disparu. Lorsque j'interroge au téléphone avec:

[UIFont fontNamesForFamilyName:@"Helvetica Neue"]

J'obtiens les fontNames suivants (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

Lorsque je fais la même requête en cours d'exécution dans le simulateur, j'obtiens (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

Quelqu'un d'autre a vu ça?

---- Nouvelle information ----

Je suis retourné à la vidéo de la WWDC 2013 "Using Font with Text Kit" et la partie intéressante commence à 12h22. Le présentateur parle de "MetaFonts" dans OS X à titre d'exemple. Ce qu'il dit, c'est que la police sous des appels comme:

+ (NSFont *)messageFontOfSize:(CGFloat)fontSize

ne sont pas garantis de renvoyer la même police sous-jacente entre les versions ou même les utilisations différentes. Son exemple était Lucinda Grande. Il ne semblait pas dire que l'utilisation de "HelveticaNeue-Italic" pouvait passer d'une version à l'autre.

J'ai donc construit une expérience sous iOS 7. J'ai créé ma police avec le code suivant:

UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithName:@"Helvetica Neue" size:16.0];
UIFontDescriptor *symbolicFontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];

UIFont *fontWithDescriptor = [UIFont fontWithDescriptor:symbolicFontDescriptor size:16.0];

J'ai récupéré un UIFont valide pour fontWithDescriptor et quand j'ai interrogé la police pour le fontName avec:

[fontWithDescriptor fontName]

Je suis rentré...

HelveticaNeue-Italic

Allez comprendre???

Donc, une réponse possible à 7.0.3 semble être le code ci-dessus.

---- Autres modifications ----

Bien que la solution ait fonctionné ci-dessus, je ne pense pas qu'elle soit formellement correcte. Je suis passé à la solution suivante

    UIFontDescriptor *fontDescriptor = [[UIFontDescriptor alloc] init];

    UIFontDescriptor *fontDescriptorForHelveticaNeue = [fontDescriptor fontDescriptorWithFamily:@"Helvetica Neue"];
    UIFontDescriptor *symbolicFontDescriptor = [fontDescriptorForHelveticaNeue fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];

    textFont = [UIFont fontWithDescriptor:symbolicFontDescriptor size:textFontPointSize];

Cela semble faire toutes les bonnes choses. J'ai essayé l'approche précédente avec une autre famille de polices et cela semblait être confondu avec le fontName et la fontFamily. J'espère que cela t'aides!


J'ai vu ça aussi. Je ne sais pas ce qui s'est passé, mais c'est une véritable régression.
ipodishima

Fait intéressant, Pages sur iOS 7.0.3 montre Helvetica Neue Italic: i.stack.imgur.com/xpJKl.png
Leo Natan

Il semble donc que vous ayez répondu à ma question avec votre propre question et votre propre recherche, l'utilisation du descripteur de police montre bien la police italique sur mon iPhone 7.0.3.
Rick van der Linde

C'est également un problème dans iOS 7.0.4
s.ka

Réponses:


31

C'est un bogue Apple. Il a été introduit dans iOS 7.0.3 et n'a pas encore été corrigé depuis iOS 7.0.4. Il semble être corrigé dans l'aperçu développeur d'iOS 7.1. Voici le code (fourni par Apple dans les forums de développement) pour contourner le problème:

#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);
}

Il convient également de noter que dans la version actuelle de Xcode (5.0.1 (5A2053)), cette police n'est pas répertoriée comme une option dans la liste déroulante Police dans Interface Builder. Donc, si vous avez précédemment configuré une étiquette avec cette police, vous remarquerez que l'interface utilisateur est confuse et que l'étiquette finit par se voir attribuer une autre police et une autre taille lors de l'exécution (voir la capture d'écran de l'interface utilisateur ci-dessous). Pour les étiquettes configurées dans les storyboards / xibs, vous devrez réinitialiser la police dans le code.

Pour référence, voici la discussion du problème dans les forums de développement.

entrez la description de l'image ici


Vous dites que vous avez remplacé toutes vos utilisations par autre chose. Par quoi l'avez-vous remplacé? Nous avons remarqué que si vous le remplacez par HelveticaNeue-MediumItalic dans le fichier XIB, nous obtenons des résultats incorrects sur iOS 6 et
versions

Je l'ai remplacé par HelveticaNeue-LightItalic. Je ne sais pas quand il a été introduit. Mon application est iOS7 +
Mike Vosseller

7

Il s'agit d'un bogue dans iOS 7.0.3.

Si vous utilisez explicitement HelveticaNeue-Italic, vous pouvez le créer en utilisant cette solution de contournement:

UIFont* font = (__bridge_transfer UIFont*)CTFontCreateWithName(CFSTR("HelveticaNeue-Italic"), fontSize, NULL);

Notez, cependant, que cette solution de contournement ne fonctionnera que sur iOS 7; il n'est pas déployable sur iOS 6 (car CTFontRefet UIFontn'était pas ponté sans frais sur iOS 6). Cependant, sur iOS 6, vous pouvez simplement utiliser votre code de recherche de police habituel.


4

Je pense que c'est un bug. Je l'ai déposé en tant que tel auprès d'Apple. Malheureusement pour moi, mon application plante maintenant. La police est utilisée dans une bibliothèque tierce que j'utilise. De nombreuses personnes sur Twitter signalent des problèmes.


1
FYI: Je viens de tester et le bogue existe toujours dans iOS 7.0.4.
David Lari

3

Si vous accédez dynamiquement à la police italique, au lieu d'accéder à la police par son nom, [UIFont fontWithName:@"HelveticaNeue-Italic" size:15.0f] utilisez [UIFont italicSystemFontOfSize:15.0f]cela fonctionne très bien pour moi.


C'est peut-être la solution la plus propre à ce problème. Si la prise en charge d'iOS 6 est requise, vous pouvez essayer d'exécuter d' fontWithName:size:abord, et si le résultat est nil, exécuter italicSystemFontOfSize:, ce qui devrait toujours renvoyer quelque chose et au moins éviter un crash.
SaltyNuts

2

Je ne trouve actuellement pas la session, mais ils ont dit quelque chose que vous ne pouvez plus compter sur les polices disponibles sur iOS7. Ils peuvent même changer pendant la durée de vie de votre application. Ce qui signifie essentiellement: lorsque vous spécifiez des polices dans votre application, vous êtes foutu, utilisez plutôt des descripteurs de police ou des polices préférées!


2
La correspondance la plus proche que je puisse trouver est asciiwwdc.com/2013/sessions/223 , mais il semble qu'elles se réfèrent à des polices téléchargeables, pas à des polices fournies par le système.
Hilton Campbell

Voir les nouvelles informations ci-dessus. Je pense que ce que le présentateur dit, c'est que vous ne pouvez pas compter sur le mappage des «MetaFonts» aux mêmes polices sous-jacentes à travers les versions ou même les utilisations. Je ne pense pas qu'il dise que c'est même une possibilité que quelque chose comme "HelveticaNeue-Italic" puisse disparaître.
Scott Sarnikowski

1

J'ai trouvé une autre solution qui semble fonctionner. J'ai déconnecté un appel à

[[UIFont italicSystemFontOfSize:12.0] fontName]

pour voir quelle est la police italique système utilisée, et elle a renvoyé ".HelveticaNeueInterface-ItalicM3". Un test simple montre que l'utilisation

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

travaux! En les comparant visuellement, la police renvoyée par l'appel ci-dessus semble être exactement la même que la police d'origine «HelveticaNeue-Italic».

Ce problème est certainement un bug ... Helvetica Neue est la police par défaut dans iOS 7, donc les polices de cette famille ne devraient pas manquer. Tout fonctionnait bien dans Xcode v.5.0, mais immédiatement après la mise à niveau vers la version 5.0.1, ce problème a commencé à apparaître. J'ai signalé un bug avec Apple en notant autant. Jusque-là, cette solution semble fonctionner ...


1

Le rapport de bogue que j'ai déposé auprès d'Apple a été marqué "Clôturé en double". J'espère que cela signifie qu'ils le considèrent comme un bogue. Cependant, iOS 7.0.4 ne résout pas le bogue.


1
J'ai eu la même réponse. J'espère qu'ils le répareront.
Scott Sarnikowski

1

Le bogue semble avoir été corrigé dans iOS 7.1 beta 1. [UIFont fontWithName:@"HelveticaNeue-Italic" size:size];renvoie une police.


Bonne nouvelle, mais c'est toujours sous NDA.
Vincent Tourraine

9
Je vais prendre ce risque.
Leo Natan

0

J'ai eu le même crash qui se produisait dans iOS 7.0.3 et 7.0.4 uniquement, et fonctionne parfaitement dans toutes les autres versions. Après tant d'investigations, j'ai appris que @ "HelveticaNeue-Italic" n'est pas disponible dans les versions iOS 7.0.3 et 7.0.4, de sorte que j'avais l'habitude de planter ci-dessus dans ces versions.

J'ai résolu le problème avec le code ci-dessous, cela pourrait être utile à quelqu'un dans le besoin.

self.headerFont = [UIFont fontWithName:@"HelveticaNeue-Italic" size:16.0f];
if (self.headerFont == nil) {
    self.headerFont = [UIFont fontWithName:@"HelveticaNeue" size:16.0f];
}

Le journal des pannes est:

[__NSCFConstantString pointSize]: unrecognized selector sent to instance 

-1

Puisque personne n'a mentionné quoi que ce soit à propos de la prise en charge de l'italique HelveticaNeue dans UIWebView, j'ai pensé partager mes découvertes.

À partir de la version 7.0.6, l'italique normal est toujours manquant dans UIWebView et semble revenir à UltraLightItalic dans la même famille. Cela semble un peu étrange quand il est juste à côté du texte HelveticaNeue non italique de poids normal, car il est beaucoup plus léger.

Ma solution de contournement était d'utiliser Helvetica ordinaire au lieu d'HelveticaNeue, mais uniquement pour les italiques. Donc, si vous avez un CSS qui ressemble à ceci:

.myCssClass {
    font-family:HelveticaNeue;
    /* etc, etc */
}

... vous ajouteriez deux autres classes à remplacer <i>et <em>:

.myCssClass i  { font-family:Helvetica; }
.myCssClass em { font-family:Helvetica; }

La police italique Helvetica classique a l'air bien et je ne pense pas que quiconque remarquerait que ce n'est pas HelveticaNeue.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.