Kann ich eine benutzerdefinierte Schriftart in eine iPhone-Anwendung einbetten?


772

Ich möchte, dass eine App eine benutzerdefinierte Schriftart zum Rendern von Text enthält, diese lädt und dann mit Standardelementen UIKitwie verwendet UILabel. Ist das möglich?


5
In einer der CS193p-Vorlesungen (iPhone Application Development) in Stanford stellte Evan fest, dass die Installation einer eigenen Schriftart auf einem Gerät „viel Arbeit“ bedeutet, was zumindest bedeutet, dass dies möglich ist :-)
Ilya Birman,

2
iPhone 3.2 erlaubt benutzerdefinierte Schriftart, aber es ist nur iPad (siehe Antwort unten)
Samvermette

6
Ich habe am Ende Bilder verwendet.
Airsource Ltd

2
wow ... nach all dem ist die Antwort immer noch Bilder ... unglaublich. Ich hatte wirklich auf eine solide Implementierung von benutzerdefinierten Schriftarten gehofft, die die gleichen Funktionen wie Systemschriftarten aufweisen. leider ...
d2burke

1
Ich habe die ursprüngliche Frage erheblich gekürzt, um das Jahrzehnt widerzuspiegeln, das vergangen ist, seit ich sie gestellt habe. Ich möchte alle anderen ermutigen, ihre Kommentare und Antworten angemessen zu kürzen.
Airsource Ltd

Antworten:


646

iOS 3.2 und höher unterstützen dies. Direkt aus dem neuen Dokument in iPhone OS 3.2 :

Unterstützung
für benutzerdefinierte Schriftarten Anwendungen, die benutzerdefinierte Schriftarten verwenden möchten, können diese Schriftarten jetzt in ihr Anwendungspaket aufnehmen und diese Schriftarten beim System registrieren, indem sie den Schlüssel UIAppFonts in ihre Datei Info.plist aufnehmen. Der Wert dieses Schlüssels ist ein Array von Zeichenfolgen, die die Schriftdateien im Bundle der Anwendung identifizieren. Wenn das System den Schlüssel sieht, lädt es die angegebenen Schriftarten und stellt sie der Anwendung zur Verfügung.

Sobald die Schriftarten in festgelegt wurden Info.plist, können Sie Ihre benutzerdefinierten Schriftarten wie jede andere Schriftart in IB oder programmgesteuert verwenden.

In den Apple Developer Forums gibt es einen laufenden Thread:
https://devforums.apple.com/thread/37824 (Anmeldung erforderlich)

Und hier ist ein exzellentes und einfaches 3-Schritte-Tutorial, wie dies erreicht werden kann (defekter Link entfernt)

  1. Fügen Sie Ihre benutzerdefinierten Schriftdateien mit Xcode als Ressource zu Ihrem Projekt hinzu
  2. Fügen Sie Ihrer Info.plistDatei einen Schlüssel mit dem Namen hinzu UIAppFonts.
  3. Machen Sie diesen Schlüssel zu einem Array
  4. Geben Sie für jede Schriftart den vollständigen Namen Ihrer Schriftartdatei (einschließlich der Erweiterung) als Elemente in das UIAppFontsArray ein
  5. speichern Info.plist
  6. Jetzt können Sie in Ihrer Anwendung einfach aufrufen [UIFont fontWithName:@"CustomFontName" size:12], um die benutzerdefinierte Schriftart für Ihre UILabels und zu erhalten UITextViews usw. zu erhalten.

Außerdem: Stellen Sie sicher, dass sich die Schriftarten in Ihren Copy Bundle-Ressourcen befinden.


14
Hier ist eine Schritt-für-Schritt-Anleitung für iOS4: blog.beefyapps.com/2010/06/custom-fonts-in-ios-4
pm_labs

15
Dieses Tutorial ist sehr gut. shang-liang.com/blog/custom-fonts-in-ios4 Wichtig ist, dass das NSString-Argument für [UIFont fontWithName: ...] der Betriebssystemname für die Schriftart und nicht der Dateiname ist.
Willster

152
Bevor jemand anderes 3 Stunden damit verbringt, fontforge zu installieren, um den tatsächlichen Postscript-Namen der von iOS benötigten Schriftart zu ermitteln. Ich werde darauf hinweisen, dass Sie einfach Cmd + I auf die Schriftart im Schriftbuch drücken können, um diese Informationen zu finden.
Daniel Wood

42
Nachdem ich mich bemüht hatte, den richtigen Schriftnamen zu finden, habe ich nur die installierten Schriftarten aufgelistet und gefunden. Sehr hilfreich. Hier ist der Code: for (NSString * familyName in [UIFont familyNames]) {NSLog (@ "Family% @", familyName); NSLog (@ "Names =% @", [UIFont fontNamesForFamilyName: familyName]); }
Steve Potter

26
Wenn Ihr Code nicht funktioniert, stellen Sie sicher, dass die gefundene Schriftartdatei in "Build Phases" -> "Copy Bundle Resouces"
Mickey

299

Bearbeiten: Ab iOS 3.2 ist diese Funktionalität integriert. Wenn Sie Pre-3.2 unterstützen müssen, können Sie diese Lösung weiterhin verwenden.

Ich habe ein einfaches Modul erstellt, UILabeldas das Laden von .ttf-Dateien erweitert und handhabt. Ich habe es Open Source unter der Apache-Lizenz veröffentlicht und es hier auf Github gestellt .

Die wichtigen Dateien sind FontLabel.hund FontLabel.m.

Es verwendet einen Teil des Codes aus Genericrichs Antwort .

Durchsuchen Sie die Quelle hier.

ODER

  • Kopieren Sie Ihre Schriftartdatei in Ressourcen

  • Fügen Sie Ihrer Info.plistDatei einen Schlüssel mit dem Namen UIAppFonts hinzu. ("Von der Anwendung bereitgestellte Schriftarten)

  • Machen Sie diesen Schlüssel zu einem Array

  • Geben Sie für jede Schriftart den vollständigen Namen Ihrer Schriftartdatei (einschließlich der Erweiterung) als Elemente in das UIAppFonts-Array ein

  • speichern Info.plist

  • Jetzt können Sie in Ihrer Anwendung einfach aufrufen [UIFont fontWithName:@"CustomFontName" size:15], um die benutzerdefinierte Schriftart für Ihr UILabelsund UITextViewsusw. zu erhalten.

Für mehr Informationen


2
Ich habe versucht, Ihren Code zu verwenden, aber er stürzt je nach Schriftart ziemlich oft ab. Versuchen Sie beispielsweise, die afrikanischen oder Tiki-Schriftarten von hier aus zu verwenden: fontspace.com/category/tiki .
4thSpace

2
Diese Bibliothek funktioniert hervorragend. Ich brauche allerdings Hilfe beim vertikalen Abstand. Ich kann nicht herausfinden, wie es geht. Ich habe also diese message.numberOfLines = 3; Wie steuere ich den vertikalen Abstand zwischen Zeile 1 und Zeile 2 und Zeile 3? Vielen Dank, Tee
Teepusink

2
@commanda Hallo Kommanda, der Link, den Sie in Ihrer Antwort angegeben haben, scheint nicht verfügbar zu sein.
Parth Bhatt

5
@ParthBhatt Sie sollten anstelle von FontLabel die in stackoverflow.com/a/2616101/21447 bereitgestellte Lösung verwenden, da diese Funktionalität jetzt von CocoaTouch bereitgestellt wird.
Kommanda

2
@ParthBhatt: Ich weiß nicht, warum das Repo nicht mehr bei Zynga gehostet wird, aber es ist verfügbar unter github.com/kballard/fontlabel
Lily Ballard

116

Es gibt eine einfache Möglichkeit, benutzerdefinierte Schriftarten in iOS 4 zu verwenden .

  1. Fügen Sie Ihre Schriftartdatei (z. B. Chalkduster.ttf) zum Ordner Ressourcen des Projekts in XCode hinzu.
  2. Öffnen Sie info.plistund fügen Sie einen neuen Schlüssel mit dem Namen hinzu UIAppFonts. Der Typ dieses Schlüssels sollte Array sein.
  3. Fügen Sie diesem Array Ihren benutzerdefinierten Schriftnamen hinzu, einschließlich der Erweiterung ( Chalkduster.ttf).
  4. Jetzt können Sie [UIFont fontWithName:@"Chalkduster" size:16]in Ihrer Anwendung verwenden.

Leider erlaubt IB nicht, Beschriftungen mit benutzerdefinierten Schriftarten zu initialisieren. Siehe diese Frage , um dieses Problem zu lösen. Meine Lieblingslösung ist die Verwendung einer benutzerdefinierten UILabelUnterklasse:

@implementation CustomFontLabel

- (id)initWithCoder:(NSCoder *)decoder
{
    if (self = [super initWithCoder: decoder])
    {
        [self setFont: [UIFont fontWithName: @"Chalkduster" size: self.font.pointSize]];
    }
    return self;
}

@end

3
Dies scheint auf 3.2 zurück unterstützt zu werden, nicht nur auf 4.0+
Jesse Rusak

1
Vielen Dank! Das Problem, das ich hatte, ist, dass benutzerdefinierte Schriftarten im Vergleich zu ihren integrierten Gegenstücken etwas schief zu sein scheinen (zusätzlicher Platz darunter). Ich habe versucht, das FontLabel-Repo von GitHub zu verwenden, was manchmal hilft, aber nicht immer.
Joe D'Andrea

12
Es ist erwähnenswert, dass die Zeichenfolge, die Sie an den UIFont-Konstruktor übergeben, NICHT der Dateiname minus der Erweiterung ist, sondern der interne Name der Schriftart. Ich hatte Probleme beim Laden einer Schriftart mit einem Dateinamen, den ich gekürzt hatte. Wenn ich den gesamten Schriftnamen verwendet habe, der in der Datei enthalten ist, wurde die Schriftart gut geladen.
Slayton

5
Was Slayton gerade gesagt hat, ist kritisch. [UIFont fontWithName: erwartet den "vollständigen Namen" der Schriftart, der sichtbar wird, indem er im Schriftbuch geöffnet und ausgewählt wird: Vorschau -> Schriftinfo anzeigen
Elektromaggot

51

Fügen Sie in Info.plist den Eintrag "Von der Anwendung bereitgestellte Schriftarten" hinzu und fügen Sie die Schriftnamen als Zeichenfolgen ein:

Fonts provided by application
           Item 0        myfontname.ttf
           Item 1        myfontname-bold.ttf
           ...

Überprüfen Sie anschließend, ob Ihre Schriftart enthalten ist, indem Sie Folgendes ausführen:

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

Beachten Sie, dass Ihr ttf-Dateiname möglicherweise nicht mit dem Namen übereinstimmt, den Sie beim Festlegen der Schriftart für Ihre Beschriftung verwenden (Sie können den obigen Code verwenden, um den Parameter "fontWithName" abzurufen):

[label setFont:[UIFont fontWithName:@"MyFontName-Regular" size:18]];

36

Bearbeiten: Diese Antwort ist ab iOS3.2 nicht mehr gültig. Verwenden Sie UIAppFonts

Die einzige Möglichkeit, benutzerdefinierte UIFonts erfolgreich zu laden, ist das private GraphicsServices-Framework.

Im Folgenden werden alle .ttfSchriftarten im Hauptpaket der Anwendung geladen :

BOOL GSFontAddFromFile(const char * path);
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
        newFontCount += GSFontAddFromFile([fontFile UTF8String]);
    return newFontCount;
}

Sobald Schriftarten geladen sind, können sie genau wie die von Apple bereitgestellten Schriftarten verwendet werden:

NSLog(@"Available Font Families: %@", [UIFont familyNames]);
[label setFont:[UIFont fontWithName:@"Consolas" size:20.0f]];

GraphicsServices können sogar zur Laufzeit geladen werden, falls die API in Zukunft verschwindet:

#import <dlfcn.h>
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    NSBundle *frameworkBundle = [NSBundle bundleWithIdentifier:@"com.apple.GraphicsServices"];
    const char *frameworkPath = [[frameworkBundle executablePath] UTF8String];
    if (frameworkPath) {
        void *graphicsServices = dlopen(frameworkPath, RTLD_NOLOAD | RTLD_LAZY);
        if (graphicsServices) {
            BOOL (*GSFontAddFromFile)(const char *) = dlsym(graphicsServices, "GSFontAddFromFile");
            if (GSFontAddFromFile)
                for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
                    newFontCount += GSFontAddFromFile([fontFile UTF8String]);
        }
    }
    return newFontCount;
}

Hinweis für diejenigen, die sich fragen, dies funktioniert, aber Sie müssen loadFonts direkt vor der Verwendung der Schriftart aufrufen - sie scheinen nicht in der gesamten Anwendung geladen zu bleiben
Pixel

In OS 3.0 müssen Sie unbedingt das zweite zweite Beispiel verwenden. Vergessen Sie den Import nicht. Hat ziemlich gut für mich funktioniert.
M. Ryan

Ein weiterer Hinweis: Dies ist ein privates Framework, das dynamisch geladen wird. Beides wird wahrscheinlich die Akzeptanz Ihrer App im AppStore stoppen.
Pixel

Was ist die Schlussfolgerung? Welche Alternativen zu dieser Methode?
Raj Pawan Gumdal

1
Beachten Sie auch, dass [NSString sizeWithFont:[UIFont fontWithName:@"customFont" size:14]];für alle benutzerdefinierten Schriftarten, die ich ausprobiert habe , 0 Breite und Höhe zurückgegeben werden.
Luke Mcneice

34

Mit iOS 8+ und Xcode 6+ können Sie dies einfach machen. Hier sind die Schritte:

1) Ziehen Sie Ihre Schriftart Xcodeper Drag & Drop in den Ordner "Unterstützende Dateien". Vergessen Sie nicht, Ihre App im Abschnitt Zu Zielen hinzufügen zu markieren . Ab diesem Moment können Sie diese Schriftart in verwenden IBund sie aus der Schriftartenpalette auswählen.

Geben Sie hier die Bildbeschreibung ein

2) Um diese Schriftart auf Ihrem Gerät verfügbar zu machen, öffnen Sie Ihren info.plistund fügen Sie den Fonts provided by applicationSchlüssel hinzu. Es enthält den Schlüssel Element 0, Sie müssen Ihren Schriftnamen als Wert hinzufügen. Der Name der Schriftart kann von Ihrem Dateinamen abweichen. Versuchen Sie jedoch zunächst, in den meisten Fällen Ihren Dateinamen hinzuzufügen.

Geben Sie hier die Bildbeschreibung ein

Wenn nicht, hat mir dieser Artikel immer geholfen.

Hier ist ein kurzer Ausschnitt des Codes aus diesem Artikel, der Ihnen hilft, Ihren Schriftnamen zu finden.

func allFonts(){

   for family in UIFont.familyNames(){

       println(family)


       for name in UIFont.fontNamesForFamilyName(family.description)
       {
           println("  \(name)")
       }

   }

}

BEARBEITEN

Ich möchte erwähnen, dass Sie Schriftarten zu den Build-Phasen Ihres Ziels hinzufügen und Bundle-Ressourcen kopieren müssen . Ohne diese Option wird Ihre Schriftart nicht auf dem Gerät angezeigt. Und es könnte zu unerwartetem Verhalten führen.

Zum Beispiel, in denen ich ein bug, wenn UITextFieldbenutzerdefinierten Schriftart, aber diese Schrift war nicht in den Copy Bundle - Ressourcen . Und wenn ich an die segue viewcontrollermit diesem textfield, gibt es eine Verzögerung von 4 Sekunden , bevor viewDidLoadFunktion aufgerufen wurde. Durch das Beheben von Schriftartproblemen wurde diese Verzögerung behoben. Empfehlen Sie es daher zweimal zu überprüfen. (rdar: // 20028250) Übrigens konnte ich den Fehler nicht reproduzieren, aber ich bin mir sicher, dass das Problem bei der Schriftart lag.


1
Nur eine Notiz. Benutzerdefinierte Schriftarten sind in LaunchScreens nicht verfügbar, selbst wenn sie in IB ordnungsgemäß konfiguriert wurden. Welches kann Logik sein.
Rivera

@ Rivera wow, tolle Nachricht! Wusste das nicht. Eine mögliche Alternative ist, UIImage stattdessen mit Text zu verwenden, denke ich.
Dima Deplov

@ Rivera, danke für diese Info - ist sie irgendwo dokumentiert? Ich ging wiederholt über die Stufen und dachte, ich hätte einen Schritt verpasst.
Spongessuck

@spongessuck nicht sicher über Ihre Frage, aber es gibt einige Dokumente developer.apple.com/library/ios/documentation/StringsTextFonts/…
Dima Deplov

27

Ich habe das so gemacht:

Laden Sie die Schriftart:

- (void)loadFont{
  // Get the path to our custom font and create a data provider.
  NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"mycustomfont" ofType:@"ttf"]; 
  CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]);

  // Create the font with the data provider, then release the data provider.
  customFont = CGFontCreateWithDataProvider(fontDataProvider);
  CGDataProviderRelease(fontDataProvider); 
}

drawRect:Tun Sie jetzt in Ihrem Fall Folgendes:

-(void)drawRect:(CGRect)rect{
    [super drawRect:rect];
    // Get the context.
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect);
    // Set the customFont to be the font used to draw.
    CGContextSetFont(context, customFont);

    // Set how the context draws the font, what color, how big.
    CGContextSetTextDrawingMode(context, kCGTextFillStroke);
    CGContextSetFillColorWithColor(context, self.fontColor.CGColor);
    UIColor * strokeColor = [UIColor blackColor];
    CGContextSetStrokeColorWithColor(context, strokeColor.CGColor);
    CGContextSetFontSize(context, 48.0f);

    // Create an array of Glyph's the size of text that will be drawn.
    CGGlyph textToPrint[[self.theText length]];

    // Loop through the entire length of the text.
    for (int i = 0; i < [self.theText length]; ++i) {
        // Store each letter in a Glyph and subtract the MagicNumber to get appropriate value.
        textToPrint[i] = [[self.theText uppercaseString] characterAtIndex:i] + 3 - 32;
    }
    CGAffineTransform textTransform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
    CGContextSetTextMatrix(context, textTransform);
    CGContextShowGlyphsAtPoint(context, 20, 50, textToPrint, [self.theText length]);
}

Grundsätzlich müssen Sie eine Brute-Force-Schleife durch den Text ausführen und mit der magischen Zahl herumfummeln, um Ihren Versatz (hier sehe ich 29) in der Schriftart zu finden, aber es funktioniert.

Außerdem müssen Sie sicherstellen, dass die Schriftart legal eingebettet werden kann. Die meisten sind es nicht und es gibt Anwälte, die sich auf solche Dinge spezialisiert haben. Seien Sie also gewarnt.


1
Ich bin mir sicher, dass es gut funktioniert, aber ich möchte (wirklich wirklich) nicht meine eigene Layout-Engine schreiben, um alles zu handhaben, was UILabel und UITextView derzeit für mich tun - insbesondere das Umbrechen, Positionieren und Bearbeiten von Wörtern.
Airsource Ltd

1
AFAICS, dies funktioniert nur mit Großbuchstaben, daher der Aufruf 'uppercaseString'.
Martin Cote

2
Ich stimme ab, da der Trick "magische Zahl" ein reiner Hack ist, der nicht wirklich funktioniert. Die eigentliche Lösung besteht darin, die cmap-Tabelle aus der TTF-Datei abzurufen.
Martin Cote

1
Dies ist eine nette Information über die Verwendung von Schriftarten direkt mit Core Graphics. Nur zum Aktualisieren für zukünftige Leser: In neueren Betriebssystemen könnte und sollte man Core Text verwenden. Alternativ könnte man verwenden CGContextShowTextAtPoint()- obwohl es mit UTF-8 nicht funktioniert.
Ivan Vučica

20

Ja, Sie können benutzerdefinierte Schriftarten einfügen. Weitere Informationen zur fontWithName:size:Methode finden Sie in der Dokumentation zu UIFont .

1) Stellen Sie sicher, dass Sie die Schriftart in Ihren Ressourcenordner aufnehmen.

2) Der "Name" der Schriftart ist nicht unbedingt der Dateiname.

3) Stellen Sie sicher, dass Sie das gesetzliche Recht haben, diese Schriftart zu verwenden. Indem Sie es in Ihre App aufnehmen, verteilen Sie es auch, und Sie müssen das Recht dazu haben.


Haben Sie das tatsächlich erfolgreich gemacht? Ich kann es nicht zum Laufen bringen, und beim Googeln werden nur andere Leute gefunden, die es versucht haben und versagt haben.
Airsource Ltd

Ja. Ich habe. Stellen Sie erneut sicher, dass Sie den richtigen Schriftnamen verwenden.
August

1
Wenn Sie "Der" Name "der Schriftart ist nicht unbedingt der Dateiname" ... wie finden Sie den richtigen Namen?
Keith Fitzgerald

7
Ja, diese Antwort ist falsch. Sie können dies nicht sofort tun.
Jonathan Sterling

iOS 9 Update, UIFont-Dokumente erwähnen nichts über benutzerdefinierte Schriftarten
Cbas

20

Wenn Sie verwenden xcode 4.3, müssen Sie fontdas Build Phaseunter Copy Bundle Resources, gemäß https://stackoverflow.com/users/1292829/arne im Thread, Custom Fonts Xcode 4.3 , hinzufügen . Dies hat bei mir funktioniert. Hier sind die Schritte, die ich unternommen habe, damit benutzerdefinierte Schriftarten in meiner App funktionieren:

  1. Fügen Sie die Schriftart Ihrem Projekt hinzu. Ich habe die OTF(oder TTF) Dateien per Drag & Drop in eine neue Gruppe gezogen, die ich erstellt habe, und die Auswahl von xcode akzeptiert copying the files over to the project folder.
  2. Erstellen Sie das UIAppFontsArray mit Ihren Schriftarten, die als Elemente im Array aufgeführt sind. Nur die names, nicht die Erweiterung (zB " GothamBold", " GothamBold-Italic").
  3. Klicken Sie project nameoben Project Navigatorlinks auf dem Bildschirm auf den Weg .
  4. Klicken Sie auf die Build PhasesRegisterkarte, die im Hauptbereich von xcode angezeigt wird.
  5. Erweitern Sie den Copy Bundle ResourcesAbschnitt " " und klicken Sie auf "+", um die Schriftart hinzuzufügen.
  6. Wählen Sie die Schriftartdatei aus dem Datei-Navigator aus, der geöffnet wird, wenn Sie auf klicken "+".
  7. Tun Sie dies für jede Schriftart, die Sie müssen add to the project.

12

Hier finden Sie eine schrittweise Anleitung dazu. Keine zusätzliche Bibliothek oder spezielle Codierung erforderlich.

http://shang-liang.com/blog/custom-fonts-in-ios4/

Meistens liegt das Problem bei der Schriftart, nicht bei der Methode. Der beste Weg, dies zu tun, ist die Verwendung einer Schriftart, die mit Sicherheit funktioniert, wie Verdana oder Geogia. Wechseln Sie dann zur gewünschten Schriftart. Wenn es nicht funktioniert, stimmt der Schriftname möglicherweise nicht oder die Schrift ist nicht gut formatiert.


12

Es ist sehr einfach, Ihrer vorhandenen iOS-App eine neue Schriftart hinzuzufügen.

Sie müssen nur die Schriftart, z. B. font.ttf, in Ihren Ressourcenordner einfügen.

Öffnen Sie Ihre Anwendung info.plist. Fügen Sie eine neue Zeile als "Von der Anwendung bereitgestellte Schriftarten" hinzu und geben Sie den Schriftnamen als font.ttf ein.

Und wenn Sie die Schriftart einstellen, gehen Sie wie folgt vor setFont:"corresponding Font Name"

Sie können überprüfen, ob Ihre Schriftart hinzugefügt wurde oder nicht NSArray *check = [UIFont familyNames];.

Es gibt alle Schriftarten zurück, die Ihre Anwendung unterstützt.


11

Ich würde empfehlen, eines meiner bevorzugten kurzen Tutorials hier zu befolgen : http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/, aus dem diese Informationen stammen.

Schritt 1 - Ziehen Sie Ihre .ttf oder .otf aus dem Finder in Ihr Projekt

HINWEIS - Stellen Sie sicher, dass Sie auf das Feld "Zu Zielen hinzufügen" in Ihrem Hauptanwendungsziel klicken

Ziehen Sie Schriftdateien in Ihr Projekt und klicken Sie, um sie Ihrem Ziel hinzuzufügen

Wenn Sie vergessen haben, darauf zu klicken, um es Ihrem Ziel hinzuzufügen, klicken Sie auf die Schriftartdatei in Ihrer Projekthierarchie und im rechten Bereich auf das Hauptziel der App im Abschnitt Zielmitgliedschaft

So fügen Sie dem App-Ziel Schriftarten hinzu, wenn Sie dies vergessen haben

Um sicherzustellen, dass Ihre Schriftarten Teil Ihres App-Ziels sind, stellen Sie sicher, dass sie in Ihren Copy Bundle-Ressourcen in Build-Phasen angezeigt werden

So überprüfen Sie Ressourcen, um festzustellen, ob Schriftarten Teil des App-Ziels sind

Schritt 2 - Fügen Sie die Namen der Schriftdateien zu Ihrer Plist hinzu

Gehen Sie zu den benutzerdefinierten iOS-Zieleigenschaften in Ihrem Info- Bereich und fügen Sie den Elementen in diesem Abschnitt einen Schlüssel mit dem Namen hinzu Fonts provided by application(Sie sollten sehen, dass er bei der Eingabe als Option angezeigt wird und sich selbst als Array einrichtet. Klicken Sie auf den kleinen Pfeil Öffnen Sie die Array-Elemente und geben Sie die Namen der von Ihnen hinzugefügten .ttf- oder .otf-Dateien ein, damit Ihre App weiß, dass dies die gewünschten Schriftartdateien sind

HINWEIS - Wenn Ihre App direkt nach diesem Schritt abstürzt, überprüfen Sie die Rechtschreibung der hier hinzugefügten Elemente

Beispielplist mit benutzerdefinierten Schriftarten hinzugefügt

Schritt 3 - Finden Sie die Namen Ihrer Schriftarten heraus, damit Sie sie aufrufen können

Sehr oft unterscheidet sich der von Ihrer Anwendung angezeigte Schriftname von dem, von dem Sie glauben, dass er auf dem Dateinamen für diese Schrift basiert. Fügen Sie diesen in Ihren Code ein und überprüfen Sie das Protokoll, das Ihre Anwendung erstellt, um festzustellen, welcher Schriftname in Ihrem Code aufgerufen werden soll

Schnell

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

Ziel c

for (NSString* family in [UIFont familyNames]){
    NSLog(@"%@", family);
    for (NSString* name in [UIFont fontNamesForFamilyName: family]){
        NSLog(@"  %@", name);
    }
}

Ihr Protokoll sollte ungefähr so ​​aussehen:

Beispiel für die Suche nach Protokollen, um Schriftnamen zu finden

Schritt 4 - Verwenden Sie Ihre neue benutzerdefinierte Schriftart unter Verwendung des Namens aus Schritt 3

Schnell

 label.font = UIFont(name: "SourceSansPro-Regular", size: 18)

Ziel c

 label.font = [UIFont fontWithName:@"SourceSansPro-Regular" size:18];

10

Finden Sie die TTF im Finder und "Get Info". Unter der Überschrift "Vollständiger Name:" gab es einen Namen, mit dem ich ihn dann verwendete fontWithName(ich habe nur den genauen Namen kopiert und eingefügt, in diesem Fall war keine Erweiterung '.ttf' erforderlich).


8

Es ist noch nicht erschienen, aber die nächste Version von cocos2d (2d Game Framework) unterstützt Bitmap-Schriftarten mit variabler Länge als Character Maps.

http://code.google.com/p/cocos2d-iphone/issues/detail?id=317

Der Autor hat kein genaues Veröffentlichungsdatum für diese Version, aber ich habe einen Beitrag gesehen, der darauf hinweist, dass er in den nächsten ein oder zwei Monaten erscheinen wird.


8

Ein wichtiger Hinweis: Sie sollten den der Schriftart zugeordneten "PostScript-Namen" verwenden, nicht den vollständigen Namen oder den Familiennamen. Dieser Name kann sich häufig vom normalen Namen der Schriftart unterscheiden.


7

Folgen Sie diesem Schritt

1) Kopieren Sie Ihre Schriftart in Ihr Projekt

2) Öffnen Sie Ihre .plistDatei im Quellcodemodus ... (Hinweis - Nicht öffnen info.plist)

3) Vorher - Klicken Sie mit der rechten Maustaste auf Ihre Schriftart und öffnen Sie sie in fontforge oder einem ähnlichen Editor. installIn Ihrem System sollte dies der Fall seininstall

4) Geben Sie dies ein

 <key>UIAppFonts</key>
<array>
    <string>MyriadPro.otf</string>
</array>

5) Geben Sie diesen Code in Ihr class .m

 [lblPoints setFont:[UIFont fontWithName:@"Myriad Pro" size:15.0]];

Hier werden lblPoints ab Ihrem Zeitpunkt geändert UILabel

Erledigt!! Wenn Ihre Schriftart immer noch nicht funktioniert, überprüfen Sie zuerst die Kompatibilität Ihrer Schriftarten


1
warum nicht öffnen info.plist?
Raptor

Warum Platz zwischen Myraid & Pro im 5. Punkt, wenn es in Punkt 4 keinen in Plist gibt?
Jayant Rawat

@jayantrawat Der Schriftartname, der nach der Installation der Schriftart im System angezeigt wird, und .plist ist der Name der Schriftartdatei [.ttl oder otf]
Kirtikumar A.

@KirtikumarA. ja habe es bekommen .. erfolgreich in app
implementiert

@jayantrawat Wenn meine Lösung hilft, fordern Sie Sie auf, die Antwort zu bewerten, damit andere Benutzer auf die gleiche Weise Hilfe in
Anspruch

6

Vielleicht hat der Autor vergessen, der Schrift einen Mac FOND-Namen zu geben ?

  1. Öffnen Sie die Schriftart in FontForge und gehen Sie zu Element> Schriftinfo
  2. Es gibt eine "Mac" -Option, bei der Sie den FOND-Namen festlegen können.
  3. Unter Datei> Schriftart exportieren können Sie eine neue ttf erstellen

Sie können auch die Option "Apple" im Exportdialog ausprobieren.

HAFTUNGSAUSSCHLUSS : Ich bin kein IPhone-Entwickler!


6

Ich habe die verschiedenen Vorschläge auf dieser Seite unter iOS 3.1.2 ausprobiert und dies sind meine Schlussfolgerungen:

Die einfache Verwendung [UIFont fontWithName:size:]mit den Schriftarten im Ressourcenverzeichnis funktioniert nicht, selbst wenn der FOND-Name mit FontForge festgelegt wird.

[UIFont fontWithName:size:]funktioniert, wenn die Schriftarten zuerst mit GSFontAddFromFile geladen werden. Aber GSFontAddFromFileist nicht Teil von iOS 3.1.2 , so dass es dynamisch geladen werden muss , wie durch @rpetrich beschrieben.


5

Nachsehen ATSApplicationFontsPath

Ein einfacher Plist-Eintrag, mit dem Sie die Schriftartendatei (en) in Ihren App-Ressourcenordner aufnehmen können und die in Ihrer App "nur funktionieren".


Haben Sie dies auf dem Gerät versucht? Ich hatte keine Freude und googeln deutet darauf hin, dass dieser Plist-Eintrag auf dem iPhone nicht unterstützt wird, obwohl er für das iPhone OS dokumentiert ist.
Airsource Ltd

1
Entschuldigung, ich verwende es momentan nur in einer OS X-App.
Matt Sephton

5

Ich habe einige der Ratschläge auf dieser Seite zu etwas zusammengefasst, das für mich unter iOS 5 funktioniert.

Zunächst müssen Sie Ihrem Projekt die benutzerdefinierte Schriftart hinzufügen. Befolgen Sie dann die Anweisungen von @iPhoneDev und fügen Sie die Schriftart zu Ihrer Datei info.plist hinzu.

Nachdem Sie das getan haben, funktioniert dies:

UIFont *yourCustomFont = [UIFont fontWithName:@"YOUR-CUSTOM-FONT-POSTSCRIPT-NAME" size:14.0];
[yourUILabel setFont:yourCustomFont];

Sie müssen jedoch den Postscript-Namen Ihrer Schriftart kennen. Folgen Sie einfach den Ratschlägen von @Daniel Wood und drücken Sie Befehl-i, während Sie in FontBook sind.

Dann genießen Sie Ihre benutzerdefinierte Schriftart.


5

Fügen Sie zuerst die Schriftart im .odt-Format zu Ihren Ressourcen hinzu. In diesem Fall verwenden wir DINEngschriftStd.otf und weisen den Code dann mit diesem Code der Beschriftung zu

[theUILabel setFont:[UIFont fontWithName:@"DINEngschriftStd" size:21]];

Um sicherzustellen, dass Ihre Schriftart in das Projekt geladen ist, rufen Sie einfach auf

NSLog(@"Available Font Families: %@", [UIFont familyNames]);

In der .plist müssen Sie die Schriftart deklarieren. Fügen Sie einfach einen Datensatz "Von der Anwendung bereitgestellte Schriftarten" hinzu und fügen Sie eine Zeichenfolge für Element 0 mit dem Namen der Schriftart hinzu (DINEngschriftStd.otf).


5

Für iOS 3.2 und höher: Verwenden Sie die oben genannten Methoden:

  1. Fügen Sie Ihre Schriftartdatei (z. B. Chalkduster.ttf ) zum Ressourcenordner des Projekts in XCode hinzu.
  2. Öffnen Sie info.plist und fügen Sie einen neuen Schlüssel namens UIAppFonts hinzu. Der Typ dieses Schlüssels sollte Array sein.
  3. Fügen Sie diesem Array Ihren benutzerdefinierten Schriftnamen einschließlich der Erweiterung (" Chalkduster.ttf " hinzu) ") hinzu.
  4. Verwenden Sie [UIFont fontWithName:@"Real Font Name" size:16]in Ihrer Anwendung.

ABER der "echte Schriftname" ist nicht immer der, den Sie im Schriftbuch sehen. Am besten fragen Sie Ihr Gerät, welche Schriftarten es sieht und wie die genauen Namen lauten.

Ich benutze den uifont-name- grabber unter : uifont-name-grabber

Fügen Sie einfach die gewünschten Schriftarten in das xcode-Projekt ein, fügen Sie den Dateinamen zur Liste hinzu und führen Sie ihn auf dem Gerät aus, für das Sie erstellen. Sie erhalten dann eine vollständige Liste der Schriftarten mit den UIFont fontWithName:erwarteten Namen per E-Mail .


5

Eine bessere Lösung besteht darin Fonts provided by application, Ihrer info.plistDatei eine neue Eigenschaft " " hinzuzufügen .

Anschließend können Sie Ihre benutzerdefinierte Schriftart wie gewohnt verwenden UIFont.


3

Es gibt eine neue Möglichkeit, benutzerdefinierte Schriftarten zu verwenden, beginnend mit iOS 4.1. Sie können Schriftarten dynamisch laden, sei es aus Dateien, die in der App enthalten sind, heruntergeladene Daten oder was Sie haben. Außerdem können Sie Schriftarten nach Bedarf laden, während die alte Methode sie alle beim Start der App lädt. Dies kann zu lange dauern, wenn Sie über viele Schriftarten verfügen.

Die neue Methode wird beim Laden von ios-dynamic-font beschrieben

Sie verwenden die CTFontManagerRegisterGraphicsFontFunktion und geben ihr einen Puffer mit Ihren Schriftdaten. Es ist dann für UIFontund Webansichten verfügbar , genau wie bei der alten Methode. Hier ist der Beispielcode von diesem Link:

NSData *inData = /* your font-file data */;
CFErrorRef error;
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)inData);
CGFontRef font = CGFontCreateWithDataProvider(provider);
if (! CTFontManagerRegisterGraphicsFont(font, &error)) {
    CFStringRef errorDescription = CFErrorCopyDescription(error)
    NSLog(@"Failed to load font: %@", errorDescription);
    CFRelease(errorDescription);
}
CFRelease(font);
CFRelease(provider);

Ich habe diesen Code verwendet, erhalte aber den Fehler & Fehler Fehler beim Laden der Schriftart: Der Vorgang konnte nicht abgeschlossen werden. (com.apple.coretext error 105 - CGFont '<CGFont (0x14fe7df0): Shruti>' konnte nicht registriert werden)
Hiren

Gemäß der Dokumentation lautet Fehler 105 kCTFontManagerErrorAlreadyRegistered: "Die Datei wurde bereits im angegebenen Bereich registriert." developer.apple.com/library/ios/#documentation/Carbon/Reference/…
David M.

3

Swift, Code Way: (funktioniert auch mit Swift 2.0)

Fügen Sie Ihrem Projekt die erforderlichen Schriftarten hinzu (genau wie beim Hinzufügen von Bildern, ziehen Sie sie einfach auf Xcode), stellen Sie sicher, dass sie auf Ihr Projekt ausgerichtet sind.
Fügen Sie diese Methode hinzu und laden Sie benutzerdefinierte Schriftarten (empfohlen in appDelegate didFinishLaunchingWithOptions).

func loadFont(filePath: String) {

    let fontData = NSData(contentsOfFile: filePath)!

    let dataProvider = CGDataProviderCreateWithCFData(fontData)
    let cgFont = CGFontCreateWithDataProvider(dataProvider)!

    var error: Unmanaged<CFError>?
    if !CTFontManagerRegisterGraphicsFont(cgFont, &error) {
        let errorDescription: CFStringRef = CFErrorCopyDescription(error!.takeUnretainedValue())
        print("Unable to load font: %@", errorDescription, terminator: "")
    }

}

Anwendungsbeispiel:

if let fontPath = NSBundle.mainBundle().pathForResource("My-Font", ofType: "ttf"){
      loadFont(fontPath)
}

Verwenden Sie die Schriftart:

UIFont(name: "My-Font", size: 16.5)

Ich frage mich nur, warum Sie nicht einfach die Schriftart in Ihre Info.plist einfügen. Das scheint viel mehr Arbeit für im Wesentlichen dasselbe zu sein.
Stephen Jesse

2

Sie können die erforderlichen "FONT" -Dateien im Ressourcenordner hinzufügen. Gehen Sie dann zur Projektdatei Info.plistund verwenden Sie den SCHLÜSSEL "Von der Anwendung bereitgestellte Schriftarten" und den Wert "SCHRIFTNAME".

Dann können Sie die Methode aufrufen [UIFont fontwithName:@"FONT NAME" size:12];


1

Ich habe alles möglich gemacht, aber die neuen Schriftarten werden nicht angezeigt, also habe ich die Lösung gefunden:

Wenn Sie die Fot-Dateien (otf oder ttf) ziehen, vergessen Sie NICHT, das Kontrollkästchen unter "Zu Zielen hinzufügen" zu aktivieren.

Danach erscheint Ihre Schriftart und alles funktioniert einwandfrei.


1

Obwohl einige der obigen Antworten richtig sind, habe ich ein detailliertes visuelles Tutorial für Leute geschrieben, die immer noch Probleme mit Schriftarten haben.

Die oben genannten Lösungen weisen Sie an, die Schriftart zur Liste hinzuzufügen und zu verwenden

[self.labelOutlet setFont:[UIFont fontWithName:@"Sathu" size:10]];

sind die richtigen. Bitte verwenden Sie jetzt einen anderen hackischen Weg. Wenn Sie immer noch Probleme haben, Schriftnamen zu finden und hinzuzufügen, finden Sie hier das Tutorial:

Verwenden von benutzerdefinierten Schriftarten in der iOS-Anwendung


Ich habe es gerade versucht. Scheint zu funktionieren, aber meine Schrift ist winzig, egal welche Größe ich eingestellt habe. Für das, was es wert ist, verwende ich eine frei verfügbare OTF-Datei: philsfonts.com/index.php/free_fonts
ari gold

Versuchen Sie es mit einer anderen benutzerdefinierten Schriftart. Wenn das Problem weiterhin besteht, lassen Sie es mich wissen. Wenn es so funktioniert, liegt ein Problem mit Ihrer Schriftart vor.
Bharat Gulati

1

Ja, Sie können in Ihrer Anwendung eine benutzerdefinierte Schriftart verwenden

Schritt für Schritt folgen dort:

Fügen Sie Ihre benutzerdefinierten Schriftdateien in unterstützenden Dateien zu Ihrem Projekt hinzu

Fügen Sie Ihrer Info.plist-Datei einen Schlüssel mit dem Namen UIAppFonts hinzu.

Machen Sie diesen Schlüssel zu einem Array

Geben Sie für jede Schriftart den vollständigen Namen Ihrer Schriftartdatei (einschließlich der Erweiterung) als Elemente in das UIAppFonts-Array ein

Info.plist speichern Jetzt können Sie in Ihrer Anwendung einfach [UIFont fontWithName: @ "Ihr benutzerdefinierter Schriftname" Größe: 20] aufrufen, um die benutzerdefinierte Schriftart für Ihre UILabels zu erhalten, nachdem Sie diese angewendet haben. Wenn Sie nicht die richtige Schriftart erhalten, doppelklicken Sie Klicken Sie hier auf die benutzerdefinierte Schriftart und kopieren Sie diese Schriftart. Fügen Sie sie hier ein. [UIFont fontWithName: @ "hier hinter Ihrem benutzerdefinierten Schriftartennamen" Größe: 20]

Ich hoffe, Sie erhalten die richtige Antwort


1

Ja, Sie können in Ihrer Anwendung eine benutzerdefinierte Schriftart verwenden

Schritt für Schritt folgen dort:

  • Fügen Sie Ihre benutzerdefinierten Schriftdateien in unterstützenden Dateien zu Ihrem Projekt hinzu
  • Fügen Sie Ihrem Schlüssel einen Schlüssel hinzu Info.plist Datei Namen UIAppFonts hinzu.
  • Machen Sie diesen Schlüssel zu einem Array
  • Geben Sie für jede Schriftart den vollständigen Namen Ihrer Schriftartdatei (einschließlich der Erweiterung) als Elemente in das UIAppFonts-Array ein
  • Info.plist Jetzt speichern in Ihrer Anwendung können Sie einfach anrufen [UIFont fontWithName:@"your Custom font Name" size:20], um die benutzerdefinierte Schriftart für Ihre zu erhaltenUILabels

Nachdem Sie dies angewendet haben, wenn Sie nicht die richtige Schriftart erhalten, doppelklicken Sie auf die benutzerdefinierte Schriftart und sehen sorgfältig, dass der Name der oberen Schriftart kommt. Kopieren Sie diese Schriftart und fügen Sie sie ein. Hier [UIFont fontWithName:@" here past your Custom font Name" size:20] hoffe ich, dass Sie die richtige Antwort erhalten

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.