100 votes

Qu'est-il arrivé à "HelveticaNeue-Italic" sous iOS 7.0.3 ?

Je viens de mettre à jour mon iPod touch vers iOS 7.0.3 et "HelveticaNeue-Italic" semble avoir disparu. Lorsque je fais une requête 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 j'exécute la même requête 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 ?

---- Nouvelles informations ----

Je suis retourné à la vidéo de la WWDC 2013 "Using Font with Text Kit" et la partie intéressante commence à 12:22. Le présentateur parle de "MetaFonts" dans OS X comme 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 d'une version à l'autre ou même d'une utilisation à l'autre. Son exemple était Lucinda Grande. Il ne semblait pas dire que l'utilisation de "HelveticaNeue-Italic" pouvait disparaître d'une version à l'autre.

J'ai donc construit une expérience dans 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 obtenu un UIFont valide pour fontWithDescriptor et lorsque j'ai interrogé la police pour le fontName avec :

[fontWithDescriptor fontName]

Je suis rentré...

HelveticaNeue-Italic

Allez comprendre.

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

---- Tweak supplémentaire ----

Bien que la solution ci-dessus ait fonctionné, je ne pense pas qu'elle soit formellement correcte. J'ai opté pour 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 il semble qu'il y ait eu confusion entre le fontName et le fontFamily. J'espère que cela vous aidera !

31voto

Mike Vosseller Points 1095

Il s'agit d'un bogue d'Apple. Il a été introduit dans iOS 7.0.3 et n'a pas encore été corrigé dans iOS 7.0.4. Il semble qu'il soit corrigé dans l'aperçu pour développeurs d'iOS 7.1. Voici un 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 est également intéressant de noter que dans la version actuelle de Xcode (5.0.1 (5A2053)), cette police n'est pas listée comme une option dans la liste déroulante des polices dans Interface Builder. Donc, si vous avez précédemment configuré une étiquette avec cette police, vous remarquerez que l'interface est confuse et que l'étiquette se voit attribuer une autre police et une autre taille au moment de l'exécution (voir la capture d'écran de l'interface 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 sur le problème dans les forums de développement : https://devforums.apple.com/message/910758

enter image description here

7voto

Dave DeLong Points 156978

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 va uniquement fonctionne sur iOS 7 ; il n'est pas déployable sur iOS 6 (parce que CTFontRef et UIFont n'ont pas été pontés sur iOS 6). Cependant, sur iOS 6, vous pouvez simplement utiliser votre code de recherche de police ordinaire.

4voto

David Lari Points 120

Je pense qu'il s'agit d'un bogue. Je l'ai signalé comme tel à Apple. Malheureusement pour moi, mon application se bloque maintenant. La police est utilisée dans une bibliothèque tierce que j'utilise. De nombreuses personnes sur Twitter signalent des problèmes.

3voto

Kapil Chandel Points 101

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

2voto

madboy Points 948

Je ne retrouve plus la session mais ils ont dit quelque chose comme quoi vous ne pouvez plus compter sur la disponibilité des polices sur iOS7. Elles peuvent même changer pendant la durée de vie de votre application. Ce qui veut dire en gros : Lorsque vous spécifiez des polices dans votre application, vous êtes foutu, utilisez des descripteurs de polices ou des polices préférées à la place !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X