Was ist mit "HelveticaNeue-Italic" unter iOS 7.0.3 passiert?

100

Ich habe gerade meinen iPod touch auf iOS 7.0.3 aktualisiert und "HelveticaNeue-Italic" scheint verschwunden zu sein. Wenn ich am Telefon abfrage mit:

[UIFont fontNamesForFamilyName:@"Helvetica Neue"]

Ich erhalte die folgenden 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

Wenn ich dieselbe Abfrage im Simulator ausführe, erhalte ich (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

Hat das noch jemand gesehen?

---- Neue Informationen ----

Ich ging zurück zum WWDC 2013-Video "Verwenden von Schrift mit Text-Kit" und der interessante Teil beginnt um 12:22 Uhr. Der Moderator spricht als Beispiel über "MetaFonts" in OS X. Was er sagt ist, dass die Schriftart unter Aufrufen wie folgt lautet:

+ (NSFont *)messageFontOfSize:(CGFloat)fontSize

Es wird nicht garantiert, dass dieselbe zugrunde liegende Schriftart über Versionen oder sogar unterschiedliche Verwendungszwecke hinweg zurückgegeben wird. Sein Beispiel war Lucinda Grande. Er schien nicht zu sagen, dass die Verwendung von "HelveticaNeue-Italic" von Version zu Version gehen könnte.

Also habe ich ein Experiment in iOS 7 erstellt. Ich habe meine Schriftart mit dem folgenden Code erstellt:

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

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

Ich habe ein gültiges UIFont für fontWithDescriptor zurückbekommen und als ich die Schriftart für den fontName abfragte mit:

[fontWithDescriptor fontName]

Ich bin zurückgekommen...

HelveticaNeue-Italic

Stelle dir das vor???

Eine mögliche Antwort auf 7.0.3 scheint also der obige Code zu sein.

---- Weitere Optimierung ----

Obwohl die oben beschriebene Lösung funktioniert hat, denke ich nicht, dass sie formal korrekt ist. Ich habe auf die folgende Lösung umgestellt

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

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

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

Dies scheint die richtigen Dinge zu tun. Ich habe den vorherigen Ansatz mit einer anderen Schriftfamilie ausprobiert und es schien mit dem fontName und der fontFamily verwechselt zu werden. Hoffe das hilft!

Scott Sarnikowski
quelle
Ich habe das auch gesehen. Ich weiß nicht, was passiert ist, aber das ist eine ziemliche Regression.
Ipodishima
Interessanterweise zeigt Pages unter iOS 7.0.3 Helvetica Neue Italic: i.stack.imgur.com/xpJKl.png
Leo Natan
Es scheint also, dass Sie meine Frage mit Ihrer eigenen Frage und Recherche beantwortet haben. Die Verwendung des Schriftdeskriptors zeigt tatsächlich die kursive Schrift auf meinem 7.0.3 iPhone an.
Rick van der Linde
Dies ist auch ein Problem in iOS 7.0.4
17.

Antworten:

31

Dies ist ein Apple-Fehler. Es wurde in iOS 7.0.3 eingeführt und wurde ab iOS 7.0.4 noch nicht behoben. Es scheint in der Entwicklervorschau von iOS 7.1 behoben zu sein. Hier ist Code (von Apple in den Entwicklerforen bereitgestellt), um das Problem zu umgehen:

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

Es ist auch erwähnenswert, dass in der aktuellen Version von Xcode (5.0.1 (5A2053)) diese Schriftart nicht als Option in der Dropdown-Liste Schriftart im Interface Builder aufgeführt ist. Wenn Sie zuvor ein Etikett mit dieser Schriftart konfiguriert haben, werden Sie feststellen, dass die Benutzeroberfläche verwirrt ist und dem Etikett zur Laufzeit eine andere Schriftart und Größe zugewiesen wird (siehe UI-Bildschirmabdeckung unten). Für Beschriftungen, die in Storyboards / Xibs konfiguriert sind, müssen Sie die Schriftart im Code zurücksetzen.

Als Referenz dient hier die Diskussion des Themas in den Entwicklerforen.

Geben Sie hier die Bildbeschreibung ein

Mike Vosseller
quelle
Sie sagen, Sie haben alle Ihre Verwendungen durch etwas anderes ersetzt. Womit haben Sie es ersetzt? Wir haben festgestellt, dass beim Ersetzen durch HelveticaNeue-MediumItalic in der XIB-Datei unter iOS 6 und früheren Versionen falsche Ergebnisse angezeigt werden, da diese Schriftart anscheinend in iOS 7 eingeführt wurde.
GBegen
Ich habe es durch HelveticaNeue-LightItalic ersetzt. Ich bin mir nicht sicher, wann es eingeführt wurde. Meine App ist iOS7 +
Mike Vosseller
7

Dies ist ein Fehler in iOS 7.0.3.

Wenn Sie HelveticaNeue-Italic explizit verwenden, können Sie es mithilfe dieser Problemumgehung erstellen:

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

Beachten Sie jedoch, dass diese Problemumgehung nur unter iOS 7 funktioniert. es ist nicht ausfahrbaren auf iOS 6 (da CTFontRefund UIFontwaren nicht gebührenfrei auf iOS überbrückte 6). Unter iOS 6 können Sie jedoch nur Ihren normalen Code für die Suche nach Schriftarten verwenden.

Dave DeLong
quelle
4

Ich glaube, dass es ein Fehler ist. Ich habe es als solches bei Apple eingereicht. Leider stürzt meine App jetzt ab. Die Schriftart wird in einer von mir verwendeten Drittanbieter-Bibliothek verwendet. Viele Leute auf Twitter berichten über Probleme.

David Lari
quelle
1
Zu Ihrer Information: Ich habe gerade getestet und der Fehler existiert immer noch in iOS 7.0.4.
David Lari
3

Wenn Sie dynamisch die kursive Schrift dann statt den Zugriff auf die Schrift mit Namen zugreifen, [UIFont fontWithName:@"HelveticaNeue-Italic" size:15.0f] verwenden [UIFont italicSystemFontOfSize:15.0f]dies funktioniert gut für mich.

Kapil Chandel
quelle
Dies ist vielleicht die sauberste Lösung für dieses Problem. Wenn iOS 6-Unterstützung erforderlich ist, können Sie versuchen, fontWithName:size:zuerst nilauszuführen , und wenn das Ergebnis lautet , ausführen italicSystemFontOfSize:, was immer etwas zurückgeben sollte, und zumindest einen Absturz vermeiden.
SaltyNuts
2

Ich finde die Sitzung derzeit nicht, aber sie haben etwas gesagt, auf das Sie sich nicht mehr verlassen können, wenn Schriftarten unter iOS7 verfügbar sind. Sie können sich sogar während der Lebensdauer Ihrer App ändern. Was im Grunde bedeutet: Wenn Sie Schriftarten in Ihrer App angeben, werden Sie geschraubt, verwenden Sie stattdessen Schriftbeschreibungen oder bevorzugte Schriftarten!

Michael Ochs
quelle
2
Die nächste Übereinstimmung, die ich finden kann, ist asciiwwdc.com/2013/sessions/223 , aber es sieht so aus, als würden sie sich auf herunterladbare Schriftarten beziehen, nicht auf vom System bereitgestellte Schriftarten.
Hilton Campbell
Siehe die neuen Informationen oben. Ich denke, der Moderator sagt, dass Sie sich nicht darauf verlassen können, dass "MetaFonts" über Versionen oder sogar Verwendungen hinweg denselben zugrunde liegenden Schriftarten zugeordnet werden. Ich glaube nicht, dass er sagt, dass es sogar eine Möglichkeit gibt, dass so etwas wie "HelveticaNeue-Italic" jemals verschwinden könnte.
Scott Sarnikowski
1

Ich habe eine andere Lösung gefunden, die zu funktionieren scheint. Ich habe einen Anruf bei abgemeldet

[[UIFont italicSystemFontOfSize:12.0] fontName]

Um zu sehen, welche kursive Systemschrift tatsächlich verwendet wird, wird ".HelveticaNeueInterface-ItalicM3" zurückgegeben. Ein einfacher Test zeigt, dass mit

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

funktioniert! Wenn Sie sie visuell vergleichen, scheint die vom obigen Aufruf zurückgegebene Schriftart genau mit der ursprünglichen 'HelveticaNeue-Italic'-Schriftart übereinzustimmen.

Dieses Problem ist mit ziemlicher Sicherheit ein Fehler ... Helvetica Neue ist die Standardschriftart in iOS 7, daher sollten Schriftarten in dieser Familie nicht fehlen. In Xcode v.5.0 hat alles einwandfrei funktioniert, aber unmittelbar nach dem Upgrade auf 5.0.1 trat dieses Problem auf. Ich habe einen Fehler bei Apple gemeldet, der dies ebenfalls bemerkt. Bis dahin scheint diese Lösung zu funktionieren ...

Fateh Khalsa
quelle
1

Der Fehlerbericht, den ich bei Apple eingereicht habe, wurde als "Als Duplikat geschlossen" markiert. Ich bin zuversichtlich, dass dies bedeutet, dass sie es als Fehler betrachten. IOS 7.0.4 behebt den Fehler jedoch nicht.

David Lari
quelle
1
Ich habe die gleiche Antwort bekommen. Hoffe, sie reparieren es.
Scott Sarnikowski
1

Der Fehler scheint in iOS 7.1 Beta 1 behoben worden zu sein. [UIFont fontWithName:@"HelveticaNeue-Italic" size:size];Gibt eine Schriftart zurück.

Leo Natan
quelle
Gute Nachrichten, aber das steht immer noch unter NDA.
Vincent Tourraine
9
Ich werde dieses Risiko eingehen.
Leo Natan
0

Ich hatte den gleichen Absturz, der früher nur in iOS 7.0.3 und 7.0.4 abgestürzt war und in allen anderen Versionen einwandfrei funktioniert. Nach so vielen Nachforschungen stellte ich fest, dass @ "HelveticaNeue-Italic" in den Versionen iOS 7.0.3 und 7.0.4 nicht verfügbar ist, so dass ich in diesen Versionen immer über den Absturz hinausging.

Ich habe das Problem mit dem folgenden Code behoben. Dies kann für Bedürftige hilfreich sein.

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

Das Absturzprotokoll lautet:

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

Da in UIWebView niemand etwas über die kursive Unterstützung von HelveticaNeue erwähnt hat, dachte ich, ich würde meine Ergebnisse teilen.

Ab 7.0.6 fehlt die reguläre Kursivschrift in UIWebView noch und scheint auf UltraLightItalic in derselben Familie zurückzugreifen. Dies sieht etwas seltsam aus, wenn es direkt neben dem nicht kursiven HelveticaNeue-Text mit normalem Gewicht steht, da es so viel leichter ist.

Meine Problemumgehung bestand darin, gewöhnliche Helvetica anstelle von HelveticaNeue zu verwenden, jedoch nur für Kursivschrift. Wenn Sie also CSS haben, das so aussieht:

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

... Sie würden zwei weitere Klassen zum Überschreiben hinzufügen <i>und <em>:

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

Die normale kursive Helvetica-Schrift sieht gut aus und ich glaube, niemand würde bemerken, dass es sich nicht um HelveticaNeue handelt.

Brian Rak
quelle