Wie erhalte ich den Schriftnamen aus einer otf- oder ttf-Datei?

82

Ich habe in meiner vorherigen App eine benutzerdefinierte Schriftart verwendet.

Der Dateiname war "ProximaNova-Regular.otf" und um die Schriftart zu laden, die ich gerade verwendet habe ...

[UIFont fontWithName:@"ProximaNova-Regular" size:20];

Das hat perfekt funktioniert.

Jetzt in dieser neuen App habe ich drei Schriftdateien ...

Dude_Willie.otf
Impact
handsean.ttf

Aber ich bin mir nicht sicher, wie ich diese laden soll.

Ich habe versucht

[UIFont fontWithName:<the file name> size:20];

Dies geht jedoch nur auf die Verwendung von Helvetica zurück.

Wie finde ich den zu verwendenden Namen?

Fogmeister
quelle
Was ist falsch an dem in der ersten verwandten Frage aufgeführten Ansatz?
Borrrden
Mögliches Duplikat des Namens der Nicht-System-Schriftart im iPhone
borrrden
"Was ist los mit der ersten doppelten Frage?" es sagt mir nichts. Ich habe die [UIFont-Familiennamen] ausgedruckt und keine davon bezieht sich auf meine Schriftarten.
Fogmeister
1
Dann ist Ihre Schriftart nicht richtig installiert
borrrden
Gah! Ich hatte sie nicht in die info.plist aufgenommen ...
Fogmeister

Antworten:

81

Befolgen Sie diese vier einfachen Schritte, um eine neue Schriftart in Ihrer iOS-App hinzuzufügen und zu verwenden:

  • Fügen Sie your_new_font.ttf oder your_new_font.otf zu Ihrem Xcode-Projekt hinzu
  • Fügen Sie in der info.plist Ihres Projekts einen neuen Eintrag für your_new_font.ttf oder your_new_font.otf zum UIAppFontsArray hinzu (Klartext für dieses Feld lautet "Von der Anwendung bereitgestellte Schriftarten").
  • An dieser Stelle empfehle ich, diesen temporären Teil des Debug-Codes hinzuzufügen, um alle Schriftarten zu sichern, auf die Ihre App zugreifen kann, einschließlich Ihrer neu hinzugefügten your_new_font:

//Schnell

    for family: String in UIFont.familyNames {
        print("\(family)")
        for names: String in UIFont.fontNames(forFamilyName: family) {
            print("== \(names)")
        }
    }

//Ziel c

for(NSString *fontfamilyname in [UIFont familyNames]) {
    NSLog(@"family:'%@'",fontfamilyname);
    for(NSString *fontName in [UIFont fontNamesForFamilyName:fontfamilyname]) {
        NSLog(@"\tfont:'%@'",fontName);
    }
    NSLog(@"-------------");
}
  • Suchen Sie in der Debug-Ausgabe nach dem Namen "Familie" und "Schriftart" Ihrer neuen Schriftart. Übergeben Sie alles, was als "Schriftart" -Name angezeigt wird, der Ihrer neuen Schriftfamilie entspricht (es kann mehr als eine "Schrift" geben, die Ihrer neuen Schriftfamilie zugeordnet ist), UIFont *myNewFont = [UIFont fontWithName:@"font_name_from_debug_output" size:20]und Sie sollten im Geschäft sein!
John Jacecko
quelle
2
Danke, du hast meinen Tag gerettet
Yahya Alshaar
121

Klicken Sie mit der rechten Maustaste auf TTF -> Info abrufen

"Vollständiger Name" ist das, wonach Sie suchen.

Das hat bei mir mit TTFs funktioniert.

Bearbeiten:

Ich habe gerade eine Schriftart verwendet, die einen anderen Namen als "Vollständiger Name" in Get Info hatte.

Führen Sie für die Zusammenstellung dieser Antwort den folgenden Code in Ihrem Projekt aus, wenn die obige Schnellprüfung nicht funktioniert:

for (NSString *fontFamilyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:fontFamilyName]) {
        NSLog(@"Family: %@    Font: %@", fontFamilyName, fontName);
    }
}

Suchen Sie nach dem richtigen Namen der Schriftart, die Sie verwenden möchten.

Swift 3.0 Code:

for fontFamilyName in UIFont.familyNames{
    for fontName in UIFont.fontNames(forFamilyName: fontFamilyName){
        print("Family: \(fontFamilyName)     Font: \(fontName)")
    }
}
Segev
quelle
Es hängt wirklich vom Hersteller der Schriftart ab. Wir hatten einige schreckliche Schriftarten, die wir von einem Kunden erhalten haben, und die Schriftnamen sind ernsthaft willkürlich, sobald sie von iOS verwendet werden. Ich habe diese Methode gerade mit einer unserer Schriftarten ausprobiert und sie ist fehlgeschlagen.
Borrrden
@borrrden Bisher hat diese Methode jedes Mal für mich funktioniert. Ich habe selbst nie eine Schriftart erstellt, damit Sie Recht haben, ich weiß es nicht.
Segev
Es wird höchstwahrscheinlich für gut gemachte Schriftarten funktionieren. Die Schriften, die wir bekommen haben, wurden vor ungefähr 2 Jahrzehnten erstellt (es war schlecht ...). Der einzige Weg, um sicher zu sein, besteht darin, das System zu fragen.
Borrrden
3
Vielen Dank, dies hat funktioniert, nachdem ich die Schriftarten in der Datei info.plist ordnungsgemäß installiert hatte.
Fogmeister
6
Dies funktioniert nicht für alle Schriftarten. Beispielsweise wird der Wert "Vollständiger Name" als "Proxima Nova Regular" angezeigt, wenn die Familie im Code "ProximaNova-Regular" ist
rrbrambley
56
  • Installieren Sie die Schriftart
  • Öffnen Sie die Font Book App auf Ihrem Mac
  • Wählen Sie die Schriftart und klicken Sie auf die Schaltfläche "Info"
  • Der gesuchte Name ist PostScript-Name
    • MacOS: Ansicht -> Schriftinfo anzeigen

Beispiel

Elin Gersin
quelle
5
scheint der einfachste Weg zu sein
Eyal Alsheich
6
fwiw, ich musste auf Ansicht> Schriftinfo anzeigen gehen, um die Details zu sehen. Ich bin mir nicht sicher, warum es auf meinem Computer standardmäßig deaktiviert war.
Mark Robson
38

Um Schriftarten in iOS zu verwenden, müssen Sie die Schriftart basierend auf dem vollständigen Namen der Schriftart (PostScript-Name) laden , der sich manchmal (und normalerweise) vom tatsächlichen Dateinamen der Schriftart unterscheidet .

Stellen Sie sich vor, Sie benennen die Schriftartdatei "Arial-regulär.ttf" in "foo.ttf" um. Die Schriftart in der soeben umbenannten Schriftartdatei ist immer noch "Arial-regulär".

Es gibt einige gute programmatische Möglichkeiten, um den Schriftnamen bereits in diesem Thread abzurufen, aber ich habe einen anderen Ansatz über die Befehlszeile.

Wenn Sie auf einem Mac oder Linux arbeiten, führen Sie dieses Skript einfach über die Befehlszeile in dem Verzeichnis aus, in dem Sie Ihre benutzerdefinierten Schriftarten haben (verwendet das fc-scanDienstprogramm von fontconfig, das wahrscheinlich bereits installiert ist, aber wenn nicht, können Sie es über Homebrew installieren :) brew install fontconfig:

for file in "$arg"*.{ttf,otf}; do fc-scan --format "%{postscriptname}\n" $file; done

Hier ist ein Screenshot des obigen Befehls, der in meinem ~/Library/FontsVerzeichnis ausgeführt wird:

Geben Sie hier die Bildbeschreibung ein

Das obige Skript durchläuft alle .ttfund .otf-Dateien im aktuellen Verzeichnis und druckt dann den PostScript-Namen aus für jede Schriftart aus, mit der Sie auf die Schriftartdatei in XCode oder anderswo verweisen können.

Wenn Sie zusätzliche Informationen (PostScriptName, Dateiname) und eine Farbcodierung wünschen, können Sie dieses alternative Skript ausführen:

for file in "$arg"*.{ttf,otf}; do 
    postscriptname=$(fc-scan --format "%{postscriptname}\n" $file);
    printf "\033[36m PostScript Name:\033[0m %s \e[90m(%s)\033[0m\n" "$postscriptname" "$file";
done

Geben Sie hier die Bildbeschreibung ein

Dies ist etwas schneller als das Einfügen von Code in Ihre AppDelegate.m-Datei, um die Namen jedes Mal auszudrucken, wenn Sie eine neue Schriftartdatei hinzufügen möchten. Dies ist die beliebte Methode und auch schneller als das Öffnen der Schriftart in FontBook to Überprüfen Sie den PostScript-Namen.

NÜTZLICHER TIPP: Wenn Sie das obige Skript in Ihrem Terminal als Alias ​​verwenden, müssen Sie nur einen einzigen Befehl eingeben , um alle PostScript-Schriftnamen für alle Dateien im aktuellen Verzeichnis abzurufen (meine Funktion heißt fontnamesalso alles, was ich tun muss ist Typfontnames am Terminal innerhalb des Verzeichnisses mit Schriftarten in ihm, und die Postscript - Namen automatisch gedruckt wird, dann werden Sie Zeit in Ihrem Entwicklungs Workflow und haben dieses handliche Skript einsatzbereit, wenn Sie es brauchen speichern.

Hoffe das hilft!

radiovisuell
quelle
Ich benutze einen Mac. Ich habe fontConfig über den angegebenen Link heruntergeladen. Aber es enthält so viele Dateien. Wie verwende ich es oder installiere fontConfig auf meinem Mac?
Sujay UN
@SujayUN Wenn Sie einen Mac verwenden, ist das fc-scanDienstprogramm möglicherweise bereits installiert. Was passiert, wenn Sie fc-scan -Vauf dem Terminal laufen ?
Radiovisuelle
3
Sie können fontConfig auch über Homebrew installieren : brew install fontconfig.
Radiovisuelle
Ich bekomme das, wenn ich ur cmd -bash: fc-scan: Befehl nicht gefunden
Sujay UN
Ok, ich empfehle Ihnen, über Homebrew zu installieren, wenn Sie es nicht auf Ihrem Computer installiert haben. Siehe den Link zu Homebrew und Installationsbefehl in meinem Kommentar oben.
Radiovisuelle
6

Sie möchten wissen, wie Sie einen Namen dafür bekommen: -

  NSArray *familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]];

  for (NSInteger indFamily=0; indFamily<[familyNames count]; ++indFamily) 
  {
        NSLog(@"Family name: %@", [familyNames objectAtIndex:indFamily]);

        NSArray *fontNames = [[NSArray alloc] initWithArray:
              [UIFont fontNamesForFamilyName:[familyNames objectAtIndex:indFamily]]];

        for (NSInteger indFont=0; indFont<[fontNames count]; ++indFont) 
        {
              NSLog(@"    Font name: %@", [fontNames objectAtIndex:indFont]);
        }
  }

hoffe es hilft dir ...

Arpit Kulshrestha
quelle
6

Wenn Sie den Schriftnamen für eine bestimmte Schriftdatei programmgesteuert suchen möchten:

import Foundation

func loadFontName(for file: URL) throws -> String {
    let data = try Data(contentsOf: file)

    guard let provider = CGDataProvider(data: data as CFData) else {
        throw Error("Could not create data provider")
    }

    guard let font = CGFont(provider) else {
        throw Error("Could not load font")
    }

    guard let name = font.postScriptName else {
        throw Error("Could not get font name from font file")
    }

    return name as String
}

Ersetzen Sie sie Errornach Bedarf durch Ihre eigenen Wurfgegenstände .

Robert
quelle
5

Swift 3.0

for familyName in UIFont.familyNames {
        for fontName in UIFont.fontNames(forFamilyName: familyName ) {
            print("\(familyName) : \(fontName)")
        }
    }

quelle
5

Schnelle 4.0+ Lösung

    for fontFamilyName in UIFont.familyNames {
        print("family: \(fontFamilyName)\n")

        for fontName in UIFont.fontNames(forFamilyName: fontFamilyName) {
            print("font: \(fontName)")
        }
    }

Wird ausgegeben:

Familie: Apple SD Gothic Neo

Schriftart: AppleSDGothicNeo-Thin

Schriftart: AppleSDGothicNeo-Light

JaredH
quelle
4

Nachdem Sie Ihre Schriftarten zu Ihrem Projekt / Ihrer App hinzugefügt haben, fügen Sie diesen Code hinzu (wahrscheinlich nur in der Methode didFinishLaunchingWithOptions des App-Delegaten), um alle verfügbaren Schriftarten für Ihre App auszudrucken. Anhand dieser Liste sollten Sie in der Lage sein, die gewünschte Schriftart zu identifizieren. Vergessen Sie nicht, den unnötigen Code danach zu entfernen.

for (NSString *fontFamilyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:fontFamilyName]) {
        NSLog(@"Family: %@    Font: %@", fontFamilyName, fontName);
    }
}
Oliver Pearmain
quelle
3

Sie können auch otfinfo --info arial.ttf verwenden, um den Namen von der Befehlszeile abzurufen. Der Postscript-Name ist derjenige, den Sie an den UIFont-Konstruktor übergeben müssen.

Moritz
quelle
3

Swift 1.2:

    for familyName in UIFont.familyNames() {
        for fontName in UIFont.fontNamesForFamilyName(familyName as! String) {
            println("\(familyName) : \(fontName)")
        }
    }
Harry Ng
quelle
1

Protokollieren Sie die Familiennamen der Schriftartdatei und greifen Sie dann auf die Schriftarten zu:

// You can log all font family names suing **fontNamesForFamilyName**

NSLog(@" font name %@", [UIFont fontNamesForFamilyName:@"the file name"]);

Hoffe es hilft dir.

Nishant Tyagi
quelle
Scheint bei uns nicht zu funktionieren - Wenn sich der Dateiname vom Namen der Schriftfamilie unterscheidet, schlägt er fehl
Blitz
Sie sollten den Schriftnamen in get info erhalten.
Nishant Tyagi
1

Ein weiterer "schneller, praktischer" Hack, bei dem nicht alle Standardschriftarten durchsucht werden, die entweder auf dem Emulator oder auf dem Gerät vorhanden sind, besteht darin, die Schriftart für etwas in Ihrem Storyboard zu verwenden. Wenn Sie dann das Storyboard mit einem Texteditor bearbeiten, können Sie die mit "internen" Namen verwendeten Schriftarten anzeigen, wenn Sie nach dem Tag "customFonts" suchen:

<customFonts key="customFonts">
    <array key="Linotype - AvenirNextLTPro-Bold.otf">
        <string>AvenirNextLTPro-Bold</string>
    </array>
    <array key="Linotype - AvenirNextLTPro-Regular.otf">
        <string>AvenirNextLTPro-Regular</string>
    </array>
    <array key="TradeGothicLTPro-BdCn20.otf">
        <string>TradeGothicLTPro-BdCn20</string>
    </array>
</customFonts>
Kaolin Feuer
quelle
0

Listen Sie Schriftnamen und Familien für macOS mit Swift 4.1 auf :

NSFontManager.shared.availableFonts.map { print($0) }
NSFontManager.shared.availableFontFamilies.map { print($0) }
Ben Stahl
quelle
-2

Swift 4.0 unterstützt

Dies ist nur ein Zeilencode zum Drucken aller Schriftfamilien und der Namen der Schriftarten

override func viewDidLoad() {
    super.viewDidLoad()
    //Main line of code
    UIFont.familyNames.sorted().forEach({ print($0); UIFont.fontNames(forFamilyName: $0 as String).forEach({print($0)})})
}
NiravS
quelle
Lies die Frage.
Fogmeister
@Fogmeister Ihre akzeptierte Antwort ist dieselbe, deshalb schreibe ich diesen Code auf kürzere Weise.
NiravS
Diese Zeile liest die ttf- oder otf-Datei und gibt dann die Schriftfamilie und den Namen aller Schriftarten an. @Fogmeister
NiravS
Wenn die akzeptierte Antwort dieselbe ist wie Ihre ... warum schreiben Sie diese? Bearbeiten Sie einfach die bereits vorhandene (dafür ist die Schaltfläche Bearbeiten gedacht). Versuchen Sie nicht, die Wiederholungspunkte anderer Personen zu stehlen, indem Sie ihre Antworten für geringfügige, unbedeutende Änderungen kopieren. Ich habe jetzt die akzeptierte Frage in eine neuere geändert, die zeigt, wie die Schriftarten richtig installiert werden. Danke
Fogmeister
Außerdem lautet Ihre Antwort "nur eine Codezeile", ist aber so gut wie unlesbar. Ich würde eine Antwort bevorzugen, die mehrere Zeilen enthält, die leicht gescannt werden können, um zu sehen, was sie tut.
Fogmeister