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?


Was ist falsch an dem in der ersten verwandten Frage aufgeführten Ansatz?
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!

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)")
    }
}

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


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!


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 ...


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 .


5

Swift 3.0

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

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


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

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.


3

Swift 1.2:

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

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.


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>

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.