Je viens de mettre à niveau mon iPod touch vers iOS 7.0.3 et "HelveticaNeue-Italic" semble avoir disparu. Quand j'interroge au téléphone avec:
[UIFont fontNamesForFamilyName:@"Helvetica Neue"]
Je reçois 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
Quand je fais la même requête en cours d'exécution dans le simulateur, je reçois (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 voit ça?
---- Nouvelle information ----
Je suis retourné à la vidéo de la WWDC 2013 "Utilisation de la police avec le kit de texte" 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 les appels ressemble à:
+ (NSFont *)messageFontOfSize:(CGFloat)fontSize
ne sont pas garantis pour retourner la même police sous-jacente à travers les versions ou même des utilisations différentes 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 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.
---- Tweak supplémentaire ----
Bien que la solution ait fonctionné plus haut, 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 a semblé se confondre avec un fontName et un fontFamily. J'espère que cela t'aides!
C'est un bug d'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 résolu dans l'aperçu du développeur d'iOS 7.1. Voici le code (fourni par Apple sur les forums de développement) pour résoudre 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 en tant qu'option dans la liste déroulante Police dans Interface Builder. Ainsi, si vous avez déjà configuré une étiquette avec cette police, vous remarquerez que l'interface utilisateur 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 ui ci-dessous). Pour les étiquettes configurées dans les storyboards/xibs, vous devrez réinitialiser la police dans le code.
Pour référence ici est la discussion de la question dans les forums de développement.
Ceci est un bogue dans iOS 7.0.3.
Si vous utilisez explicitement HelveticaNeue-Italic, vous pouvez le créer à l'aide de cette solution de contournement:
UIFont* font = (__bridge_transfer UIFont*)CTFontCreateWithName(CFSTR("HelveticaNeue-Italic"), fontSize, NULL);
Notez toutefois que cette solution de contournement ne fonctionnera que uniquement sur iOS 7; il n'est pas déployable sur iOS 6 (car CTFontRef
et UIFont
n'étaient pas pontés sans frais sur iOS 6). Cependant, sur iOS 6, vous pouvez simplement utiliser votre code de recherche de police habituel.
C'est ma conviction que c'est un bug. Je l'ai déposé en tant que tel auprès d'Apple. Malheureusement pour moi, mon application se bloque maintenant. La police est utilisée dans une bibliothèque tierce que j'utilise. Beaucoup de gens sur Twitter signalent des problèmes.
Si vous accédez de manière dynamique à la police en italique, au lieu d’y accéder par la police. [UIFont fontWithName:@"HelveticaNeue-Italic" size:15.0f]
Utilisez [UIFont italicSystemFontOfSize:15.0f]
cela fonctionne très bien pour moi.
Je ne trouve pas la session actuellement 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 foutus, utilisez plutôt des descripteurs de police ou des polices préférées!
Le rapport de bogue que j'ai déposé avec Apple a été marqué "Fermé en double". J'espère que cela signifie qu'ils le considèrent comme un bug. Cependant, iOS 7.0.4 ne corrige pas le bogue.
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 qui a renvoyé ".HelveticaNeueInterface-ItalicM3". Un simple test montre que l'utilisation de
[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 presque certainement un bug ... Helvetica Neue est la police par défaut dans iOS 7, les polices de cette famille ne devraient donc 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 noté un bug avec Apple. Jusque-là, cette solution semble fonctionner ...
Le bogue semble avoir été corrigé dans iOS 7.1 beta 1. [UIFont fontWithName:@"HelveticaNeue-Italic" size:size];
renvoie une police.
J'ai eu le même crash qui ne fonctionnait que dans iOS 7.0.3 et 7.0.4, et fonctionnait parfaitement dans toutes les autres versions. Après tant de recherches, je me suis rendu compte que @ "HelveticaNeue-Italic" n'était pas disponible dans les versions iOS 7.0.3 et 7.0.4, de sorte que j'avais l'habitude d'obtenir un crash supérieur à ces versions.
J'ai corrigé 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 incidents est:
[__NSCFConstantString pointSize]: unrecognized selector sent to instance
Étant donné que personne n'a encore mentionné le support italic HelveticaNeue dans UIWebView, j'ai pensé partager mes découvertes.
À compter de la version 7.0.6, l'italique normal manque toujours dans UIWebView et semble revenir à UltraLightItalic dans la même famille. Cela semble un peu bizarre quand il se trouve juste à côté du texte HelveticaNeue non italique de poids normal, car il est tellement plus léger.
Ma solution consistait à utiliser Helvetica ordinaire au lieu de HelveticaNeue, mais uniquement pour l'italique. Donc, si vous avez des CSS qui ressemblent à ceci:
.myCssClass {
font-family:HelveticaNeue;
/* etc, etc */
}
... vous ajouteriez deux autres classes pour remplacer <i>
et <em>
:
.myCssClass i { font-family:Helvetica; }
.myCssClass em { font-family:Helvetica; }
La police Helvetica italic standard a l'air bien et je pense que personne ne remarquera que ce n'est pas HelveticaNeue.