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


Diese Frage bezieht sich auf iOS vor 3.2. Ab Version 3.2 ist diese Funktionalität mit der folgenden Antwort von samvermette leicht erreichbar, und ich habe die Accepted Answer (vom Befehl zu samvermette) geändert, um dies zu berücksichtigen. Ich kann beiden Antworten (neben Upvotes) nicht zustimmen, aber sie sind beide gut.

Ich möchte eine App eine benutzerdefinierte Schriftart zum Rendern von Text enthalten, laden Sie es und verwenden Sie es dann mit Standard UIKit Elemente wie UILabel. Ist das möglich?

Ich habe folgende Links gefunden:

aber diese würden erfordern, dass ich jedes Glyph selbst rendere, was ein bisschen zu sehr nach harter Arbeit ist, besonders nach mehrzeiligem Text.

Ich habe auch Posts gefunden, die direkt sagen, dass das nicht möglich ist, aber ohne Begründung, also suche ich nach einer definitiven Antwort.


BEARBEITEN - gescheitert -[UIFont fontWithName:size:] Experiment

Ich habe Harrowprint.tff heruntergeladen (heruntergeladen von Hier) und fügte es meinem Ressourcenverzeichnis und dem Projekt hinzu. Ich habe dann diesen Code ausprobiert:

UIFont* font = [UIFont fontWithName:@"Harrowprint" size:20];

was dazu führte, dass eine Ausnahme ausgelöst wurde. Ein Blick auf die TTF-Datei im Finder bestätigte, dass der Name der Schriftart Harrowprint war.


BEARBEITEN - Bisher gab es eine Reihe von Antworten, in denen ich angewiesen wurde, die Dokumentation zu X oder Y zu lesen. Ich habe intensiv mit all diesen Experimenten experimentiert und kam nirgendwohin. In einem Fall stellte sich heraus, dass X nur unter OS X und nicht auf dem iPhone relevant war. Folglich setze ich ein Kopfgeld für diese Frage, und ich werde das Kopfgeld an die erste Person vergeben, die eine Antwort gibt (unter Verwendung nur dokumentierter APIs), die mit ausreichenden Informationen antwortet, um dies am Gerät arbeiten zu lassen. Auch das Arbeiten am Simulator wäre ein Bonus.


BEARBEITEN - Es scheint, dass das Kopfgeld automatisch die Antwort mit der höchsten Anzahl von Stimmen vergibt. Interessant. Niemand hat tatsächlich eine Antwort geliefert, die die gestellte Frage gelöst hat - die Lösung, die das eigene Kodieren beinhaltet UILabel Die Unterklasse unterstützt kein Word-Wrap, was für mich ein wesentliches Merkmal ist - obwohl ich denke, dass ich es erweitern könnte, um dies zu tun.


738
2017-12-11 20:21


Ursprung


Antworten:


iOS 3.2 und höher unterstützen dies. Gerade von der Was ist neu in iPhone OS 3.2 doc:

Benutzerdefinierte Schriftartunterstützung
  Anwendungen, die benutzerdefinierte Schriftarten verwenden möchten, können jetzt diese Schriftarten in ihr Anwendungspaket aufnehmen und diese Schriftarten mit dem System registrieren, indem sie den UIAppFonts-Schlüssel in ihre Info.plist-Datei aufnehmen. Der Wert dieses Schlüssels ist ein Array von Strings, die die Schriftartdateien im Paket der Anwendung identifizieren. Wenn das System den Schlüssel sieht, lädt er die angegebenen Schriftarten und stellt sie der Anwendung zur Verfügung.

Sobald die Schriftarten in der Info.plistSie können Ihre benutzerdefinierten Schriftarten wie jede andere Schriftart in IB oder programmatisch verwenden.

Es gibt einen laufenden Thread in den Apple Entwicklerforen:
https://devforums.apple.com/thread/37824 (Anmeldung erforderlich)

Und hier ist ein hervorragendes und einfaches 3-Schritte-Tutorial, wie Sie das erreichen können (defekter Link entfernt)

  1. Fügen Sie Ihre benutzerdefinierten Schriftartdateien zu Ihrem Projekt hinzu, indem Sie Xcode als Ressource verwenden
  2. Fügen Sie einen Schlüssel zu Ihrem hinzu Info.plist Datei aufgerufen UIAppFonts.
  3. Machen Sie diesen Schlüssel zu einem Array
  4. Geben Sie für jede Schriftart, die Sie haben, den vollständigen Namen Ihrer Schriftartendatei (einschließlich der Erweiterung) als Elemente für die UIAppFonts Array
  5. sparen Info.plist
  6. Jetzt in Ihrer Anwendung können Sie einfach anrufen [UIFont fontWithName:@"CustomFontName" size:12] um die benutzerdefinierte Schriftart mit Ihrem zu verwenden UILabels und UITextViews, etc…

Außerdem: Stellen Sie sicher, dass sich die Schriftarten in den Ressourcen für das Kopieren von Bundles befinden.


624
2018-04-11 05:01



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

Ich habe ein einfaches Modul erstellt, das erweitert wird UILabel und behandelt das Laden von .ttf-Dateien. Ich habe es Open Source unter der Apache-Lizenz veröffentlicht und es auf Github gesetzt Hier. 

Die wichtigen Dateien sind FontLabel.h und FontLabel.m.

Es verwendet einen Teil des Codes von Genericrichs Antwort.

Durchsuchen Sie die Quelle Hier.

ODER

  • Kopieren Sie Ihre Schriftartdatei in Ressourcen

  • Fügen Sie einen Schlüssel zu Ihrem hinzu Info.plist Datei namens UIAppFonts. ("Schriftarten von Anwendung bereitgestellt)"

  • Machen Sie diesen Schlüssel zu einem Array

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

  • sparen Info.plist

  • Jetzt in Ihrer Anwendung können Sie einfach anrufen [UIFont fontWithName:@"CustomFontName" size:15] um die benutzerdefinierte Schriftart mit Ihrem zu verwenden UILabels und UITextViews, etc…

Für mehr Informationen


290
2018-04-30 21:57



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

  1. Fügen Sie Ihre Schriftartdatei hinzu (zum Beispiel Chalkduster.ttf) zu Ressourcen Ordner des Projekts in XCode.
  2. Öffnen info.plist und fügen Sie einen neuen Schlüssel hinzu UIAppFonts. Der Typ dieses Schlüssels sollte Array sein.
  3. Fügen Sie diesem Array einen benutzerdefinierten Zeichensatznamen einschließlich Erweiterung hinzu (Chalkduster.ttf).
  4. Jetzt können Sie verwenden [UIFont fontWithName:@"Chalkduster" size:16] in Ihrer Bewerbung.

Leider erlaubt IB nicht, Etiketten mit benutzerdefinierten Schriftarten zu initialisieren. Sehen diese Frage um dieses Problem zu lösen. Meine Lieblingslösung ist die Verwendung von benutzerdefinierten UILabel Unterklasse:

@implementation CustomFontLabel

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

@end

112
2017-07-07 21:05



Fügen Sie in Info.plist den Eintrag "Fonts by application" hinzu und fügen Sie die Fontnamen als Strings hinzu:

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

Überprüfen Sie dann, 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 derselbe Name ist, den Sie verwenden, wenn Sie die Schriftart für Ihr Etikett festlegen (Sie können den obigen Code verwenden, um den Parameter "fontWithName" zu erhalten):

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

50
2017-10-17 13:29



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

Der einzige Weg, wie ich erfolgreich benutzerdefinierte laden konnte UIFontDies geschieht über das private GraphicsServices-Framework.

Der folgende lädt alle .ttf Schriftarten im Hauptpaket der Anwendung:

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 die Zeichensätze geladen sind, können sie wie die von Apple bereitgestellten Zeichensätze 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 nicht mehr vorhanden sein sollte:

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

35
2018-04-30 23:25



Mit iOS 8+ und Xcode 6+ du kannst das leicht machen. Hier sind die Schritte:

1) Ziehen Sie Ihre Schriftart und legen Sie sie ab Xcode Unterstützungsdateien-Ordner. Vergiss nicht, deine App zu markieren Zu Zielen hinzufügen Sektion. Ab diesem Moment können Sie diese Schriftart in verwenden IBund wähle es aus der Schriftpalette aus.

enter image description here

2) Um diese Schriftart auf Ihrem Gerät verfügbar zu machen, öffnen Sie Ihre info.plist und hinzufügen Fonts provided by application Schlüssel. Es enthält Schlüssel Nr. 0, Sie müssen Ihren Schriftnamen als Wert hinzufügen. Der Name der Schriftart kann vom Namen der Schriftart abweichen. Aber zuerst, versuchen Sie, Ihren Dateinamen in den meisten Fällen diese Arbeit hinzuzufügen.

enter image description here

Wenn nicht, Dieser Artikel hat mir immer geholfen.

Hier ist ein kurzer Codeausschnitt aus diesem Artikel, der Ihnen hilft, den Namen Ihrer Schriftart 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 Schriftartdateien zu Ihrem hinzufügen müssen Build-Phasen des Ziels, Kopieren Sie Bundle-Ressourcen. Ohne sie wird Ihre Schriftart auf dem Gerät nicht angezeigt. Und es könnte zu unerwartetem Verhalten führen.

Zum Beispiel treffe ich ein bug, wann UITextField benutzerdefinierte Schrift haben, aber diese Schriftart war nicht in der Kopieren Sie Bundle-Ressourcen. Und wenn ich an die viewcontroller mit diesem textfield, es gibt eine Verzögerung von ca. 4 Sekunden vorher viewDidLoad Funktion wurde aufgerufen. Die Lösung von Font-Problemen hat diese Verzögerung behoben. Also, empfehlen Sie es zweimal zu überprüfen. (rdar: // 20028250) Übrigens konnte ich den Fehler nicht reproduzieren, aber ich bin mir sicher, dass das Problem mit der Schriftart zu tun hatte.


30
2017-09-02 08:08



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

Jetzt in deinem drawRect:, mache so etwas:

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

Im Grunde müssen Sie einige rohe Kraft durch den Text schleifen und herumfummeln mit der magischen Zahl, um Ihren Offset (hier, siehe mich 29) in der Schriftart zu finden, aber es funktioniert.

Außerdem müssen Sie sicherstellen, dass die Schriftart rechtlich eingebettet ist. Die meisten sind nicht und es gibt Anwälte, die sich auf so etwas spezialisiert haben, also seien Sie gewarnt.


26
2017-12-16 01:28