Cosa è successo a "HelveticaNeue-Italic" su iOS 7.0.3


100

Ho appena aggiornato il mio iPod touch a iOS 7.0.3 e "HelveticaNeue-Italic" sembra essere scomparso. Quando eseguo una query al telefono con:

[UIFont fontNamesForFamilyName:@"Helvetica Neue"]

Ottengo i seguenti 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

Quando eseguo la stessa query in esecuzione nel simulatore ottengo (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

Qualcun altro lo vede?

---- Nuova informazione ----

Sono tornato al video del WWDC 2013 "Using Font with Text Kit" e la parte interessante inizia alle 12:22. Il presentatore parla di "MetaFonts" in OS X come esempio. Quello che dice è che il carattere sotto chiama come:

+ (NSFont *)messageFontOfSize:(CGFloat)fontSize

non è garantito che restituisca lo stesso carattere sottostante tra versioni o usi diversi. Il suo esempio è stato Lucinda Grande. Non sembrava dire che l'uso di "HelveticaNeue-Italic" potesse passare da una versione all'altra.

Quindi ho costruito un esperimento in iOS 7. Ho creato il mio font con il seguente codice:

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

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

Ho ricevuto un UIFont valido per fontWithDescriptor e quando ho richiesto il font per fontName con:

[fontWithDescriptor fontName]

Sono tornato...

HelveticaNeue-Italic

Vai a capire???

Quindi una possibile risposta a 7.0.3 sembra essere il codice sopra.

---- Ulteriori ritocchi ----

Sebbene la soluzione abbia funzionato sopra, non penso che sia formalmente corretta. Sono passato alla seguente soluzione

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

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

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

Questo sembra fare tutte le cose giuste. Ho provato l'approccio precedente con un'altra famiglia di font e mi è sembrato di essere confuso con fontName e fontFamily. Spero che questo ti aiuti!


Ho visto anche questo. Non so cosa sia successo, ma è una vera regressione.
ipodishima

È interessante notare che Pages su iOS 7.0.3 mostra Helvetica Neue Italic: i.stack.imgur.com/xpJKl.png
Leo Natan

Quindi sembra che tu abbia risposto alla mia domanda con la tua stessa domanda e ricerca, utilizzando il descrittore del carattere sta effettivamente mostrando il carattere corsivo sul mio iPhone 7.0.3.
Rick van der Linde

Questo è anche un problema in iOS 7.0.4
s.ka

Risposte:


31

Questo è un bug di Apple. È stato introdotto in iOS 7.0.3 e non è stato ancora corretto a partire da iOS 7.0.4. Sembra essere stato risolto nell'anteprima per sviluppatori di iOS 7.1. Ecco il codice (fornito da Apple nei forum degli sviluppatori) per risolvere il 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);
}

Vale anche la pena notare che nella versione corrente di Xcode (5.0.1 (5A2053)) questo font non è elencato come opzione nell'elenco a discesa Font in Interface Builder. Quindi, se hai precedentemente configurato un'etichetta con questo carattere, noterai che l'interfaccia utente è confusa e all'etichetta viene assegnato un altro carattere e dimensione in fase di esecuzione (vedi sotto). Per le etichette configurate in storyboard / xibs sarà necessario reimpostare il carattere nel codice.

Per riferimento, ecco la discussione del problema nei forum degli sviluppatori.

inserisci qui la descrizione dell'immagine


Dici di aver sostituito tutti i tuoi usi con qualcos'altro. Con cosa l'hai sostituito? Abbiamo notato che se lo sostituisci con HelveticaNeue-MediumItalic nel file XIB, otteniamo risultati errati su iOS 6 e precedenti perché quel carattere sembra essere stato introdotto in iOS 7.
GBegen

L'ho sostituito con HelveticaNeue-LightItalic. Non sono sicuro di quando sia stato introdotto però. La mia app è iOS7 +
Mike Vosseller

7

Questo è un bug in iOS 7.0.3.

Se stai usando esplicitamente HelveticaNeue-Italic, puoi crearlo usando questa soluzione alternativa:

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

Nota, tuttavia, che questa soluzione alternativa funzionerà solo su iOS 7; non è distribuibile su iOS 6 (perché CTFontRefe UIFontnon erano collegati gratuitamente a ponte su iOS 6). Tuttavia, su iOS 6 puoi semplicemente usare il tuo normale codice di ricerca dei caratteri.


4

È mia convinzione che sia un bug. L'ho archiviato come tale con Apple. Purtroppo per me, la mia app ora si blocca. Il carattere viene utilizzato in una libreria di terze parti che sto utilizzando. Molte persone su Twitter segnalano problemi.


1
FYI: ho appena testato e il bug esiste ancora in iOS 7.0.4.
David Lari

3

Se stai accedendo dinamicamente al carattere corsivo, invece di accedere al carattere per nome, [UIFont fontWithName:@"HelveticaNeue-Italic" size:15.0f] usa [UIFont italicSystemFontOfSize:15.0f]questo funziona bene per me.


Questo è forse il modo più pulito per risolvere questo problema. Se è richiesto il supporto di iOS 6, puoi provare a eseguire fontWithName:size:prima e, se il risultato è nil, eseguire italicSystemFontOfSize:, che dovrebbe sempre restituire qualcosa, e almeno evitare un arresto anomalo.
SaltyNuts

2

Al momento non trovo la sessione ma hanno detto qualcosa su cui non puoi fare affidamento sul fatto che i caratteri siano più disponibili su iOS7. Possono persino cambiare durante il ciclo di vita della tua app. Che in pratica significa: quando specifichi i caratteri nella tua app, sei fregato, usa invece descrittori di caratteri o caratteri preferiti!


2
La corrispondenza più simile che riesco a trovare è asciiwwdc.com/2013/sessions/223 , ma sembra che si riferiscano a caratteri scaricabili, non a caratteri forniti dal sistema.
Hilton Campbell,

Vedere le nuove informazioni sopra. Penso che quello che sta dicendo il presentatore è che non puoi contare sulla mappatura "MetaFonts" sugli stessi caratteri sottostanti tra le versioni o anche gli usi. Non credo che stia dicendo che è nemmeno una possibilità che qualcosa come "HelveticaNeue-Italic" possa mai andare via.
Scott Sarnikowski

1

Ho trovato un'altra soluzione che sembra funzionare. Ho disconnesso una chiamata a

[[UIFont italicSystemFontOfSize:12.0] fontName]

per vedere qual è il carattere corsivo di sistema effettivamente utilizzato e ha restituito ".HelveticaNeueInterface-ItalicM3". Un semplice test mostra che l'utilizzo di

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

lavori! Confrontandoli visivamente, il carattere restituito dalla chiamata precedente sembra essere esattamente lo stesso del carattere originale "HelveticaNeue-Italic".

Questo problema è quasi certamente un bug ... Helvetica Neue è il carattere predefinito in iOS 7, quindi i caratteri di quella famiglia non dovrebbero mancare. Tutto ha funzionato bene in Xcode v.5.0, ma subito dopo l'aggiornamento a 5.0.1, questo problema ha iniziato a comparire. Ho segnalato un bug con Apple notando altrettanto. Fino ad allora, questa soluzione sembra funzionare ...


1

La segnalazione di bug che ho presentato ad Apple è stata contrassegnata come "Chiusa come duplicata". Spero che questo significhi che lo considerano un bug. Tuttavia, iOS 7.0.4 non risolve il bug.


1
Ho avuto la stessa risposta. Spero che lo risolvano.
Scott Sarnikowski

1

Il bug sembra essere stato corretto in iOS 7.1 beta 1. [UIFont fontWithName:@"HelveticaNeue-Italic" size:size];restituisce un carattere.


Buone notizie, ma è ancora sotto NDA.
Vincent Tourraine

9
Io corro questo rischio.
Leo Natan

0

Ho avuto lo stesso crash che si verificava solo in iOS 7.0.3 e 7.0.4 e funziona perfettamente in tutte le altre versioni. Dopo così tante indagini, sono venuto a sapere che @ "HelveticaNeue-Italic" non è disponibile nelle versioni iOS 7.0.3 e 7.0.4, quindi ero solito ottenere il crash di cui sopra in quelle versioni.

Ho risolto il problema con il codice sottostante, questo potrebbe essere utile a qualcuno bisognoso.

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

Il registro degli arresti anomali è:

[__NSCFConstantString pointSize]: unrecognized selector sent to instance 

-1

Dato che nessuno ha menzionato nulla sul supporto corsivo di HelveticaNeue in UIWebView, ho pensato di condividere le mie scoperte.

A partire dalla 7.0.6, il corsivo regolare è ancora mancante in UIWebView e sembra ricadere su UltraLightItalic nella stessa famiglia. Questo sembra un po 'strano quando si trova proprio accanto a un testo HelveticaNeue non corsivo di peso normale poiché è molto più leggero.

La mia soluzione è stata quella di utilizzare Helvetica normale invece di HelveticaNeue, ma solo per il corsivo. Quindi, se hai CSS che assomiglia a questo:

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

... aggiungeresti altre due classi da sovrascrivere <i>e <em>:

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

Il normale carattere corsivo Helvetica sembra a posto e non credo che nessuno noterebbe che non è HelveticaNeue.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.