792 Stimmen

Kann ich eine benutzerdefinierte Schriftart in ein iPhone-Programm einbetten?

Ich möchte, dass eine Anwendung eine benutzerdefinierte Schriftart für das Rendern von Text, laden Sie es, und verwenden Sie es dann mit Standard UIKit Elemente wie UILabel . Ist dies möglich?

5 Stimmen

In einer der CS193p-Vorlesungen (iPhone Application Development) in Stanford stellte Evan fest, dass die Installation einer eigenen Schriftart auf einem Gerät "eine Menge Arbeit" ist, was zumindest bedeutet, dass es möglich ist :-)

2 Stimmen

IPhone 3.2 erlaubt benutzerdefinierte Schriftarten, aber nur für das iPad (siehe Antwort unten)

6 Stimmen

Am Ende habe ich Bilder verwendet.

34voto

Dima Deplov Punkte 3598

Mit iOS 8 + und Xcode 6 + Sie können es leicht herstellen. Hier sind die Schritte:

1) Ziehen Sie Ihre Schriftart per Drag & Drop auf Xcode Ordner "Supporting Files". Vergessen Sie nicht, Ihre App zu markieren unter Zu den Zielen hinzufügen Abschnitt. Von diesem Moment an können Sie diese Schriftart verwenden in IB und wählen Sie sie aus der Schriftartenpalette aus.

enter image description here

2) Um diese Schriftart auf Ihrem Gerät verfügbar zu machen, öffnen Sie Ihr info.plist und hinzufügen Fonts provided by application Taste. Er enthält den Schlüssel Item 0, als Wert müssen Sie den Namen Ihrer Schrift hinzufügen. Der Name der Schriftart kann vom Namen Ihrer Schriftartdatei abweichen. Versuchen Sie zunächst, Ihren Dateinamen hinzuzufügen, was in den meisten Fällen funktioniert.

enter image description here

Wenn nicht, dieser Artikel hat mir immer geholfen.

Hier ist ein schneller Codeschnipsel 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)")
       }

   }

}

EDIT

Ich möchte erwähnen, dass Sie die Schriftartendateien zu Ihrem Die Bauphasen von Target , Ressourcen des Kopierpakets . Ohne sie sehen Sie Ihre Schrift auf dem Gerät nicht. Und es könnte zu unerwartetem Verhalten führen.

Ich stoße zum Beispiel auf eine bug wenn UITextField benutzerdefinierte Schriftart haben, aber diese Schriftart war nicht in der Ressourcen des Kopierpakets . Und wenn ich zum Thema viewcontroller mit diesem textfield gibt es eine Verzögerung von etwa 4 Sekunden, bevor viewDidLoad Funktion aufgerufen wurde. Die Behebung der Probleme mit der Schriftart hat diese Verzögerung beseitigt. Ich empfehle also, es zweimal zu überprüfen (rdar://20028250). Übrigens konnte ich den Fehler nicht reproduzieren, aber ich bin sicher, dass das Problem mit der Schriftart zusammenhing.

1 Stimmen

Nur eine Anmerkung. Benutzerdefinierte Schriftarten sind in LaunchScreens nicht verfügbar, auch wenn sie in IB richtig konfiguriert sind. Was vielleicht logisch ist.

0 Stimmen

@Rivera wow, tolle Note! Das habe ich nicht gewusst. Mögliche Alternative ist, UIImage mit Text stattdessen zu verwenden, ich denke.

0 Stimmen

@Rivera, danke für diese Information - ist sie irgendwo dokumentiert? Ich bin die Schritte wiederholt durchgegangen und dachte, ich hätte einen Schritt übersehen.

27voto

Genericrich Punkte 4558

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 Ihrem drawRect: tun Sie etwas in dieser Art:

-(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 den Text mit roher Gewalt durchgehen und mit der magischen Zahl herumspielen, um Ihren Offset (hier: 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, also seien Sie gewarnt.

1 Stimmen

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 Wortumbruch, Positionierung und Bearbeitung.

1 Stimmen

AFAICS, dies funktioniert nur mit Großbuchstaben, daher der Aufruf "uppercaseString".

2 Stimmen

Ich stimme ab, da der Trick mit der "magischen Zahl" ein reiner Hack ist, der nicht wirklich funktioniert. Die wirkliche Lösung ist, die cmap-Tabelle aus der TTF-Datei zu holen.

21voto

August Punkte 12061

Ja, Sie können benutzerdefinierte Schriftarten einfügen. Schauen Sie in die Dokumentation zu UIFont, insbesondere in die fontWithName:size: Methode.

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

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

3) Vergewissern Sie sich, dass Sie das Recht haben, diese Schriftart zu verwenden. Indem Sie sie in Ihre App einbinden, verbreiten Sie sie auch, und dazu müssen Sie das Recht haben.

0 Stimmen

Haben Sie dies tatsächlich erfolgreich getan? Ich kann es nicht zum Laufen bringen, und beim Googeln finde ich nur andere Leute, die es versucht haben und gescheitert sind.

0 Stimmen

Ja, das habe ich. Vergewissern Sie sich noch einmal, dass Sie den richtigen Schriftnamen verwenden.

1 Stimmen

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

20voto

SKris Punkte 201

Wenn Sie Folgendes verwenden xcode 4.3 müssen Sie die font zum Build Phase unter Copy Bundle Resources nach https://stackoverflow.com/users/1292829/arne in dem Thema, Benutzerdefinierte Schriftarten Xcode 4.3 . Dies funktionierte für mich, hier sind die Schritte, die ich nahm für benutzerdefinierte Schriftarten in meiner App zu arbeiten:

  1. Fügen Sie die Schriftart zu Ihrem Projekt hinzu. Ich habe die Schrift per Drag and Drop OTF (o TTF ) Dateien in eine neue Gruppe, die ich erstellt habe, und akzeptierte die von xcode gewählte copying the files over to the project folder .
  2. Erstellen Sie die UIAppFonts Array mit Ihren Schriften als Elemente innerhalb des Arrays. Nur die names und nicht die Erweiterung (z. B. " GothamBold ", " GothamBold-Italic ").
  3. Klicken Sie auf das project name Weg an der Spitze des Project Navigator auf der linken Seite des Bildschirms.
  4. Klicken Sie auf das Build Phases die im Hauptbereich von xcode angezeigt wird.
  5. Erweitern Sie die " Copy Bundle Resources "Abschnitt und klicken Sie auf "+" um die Schriftart hinzuzufügen.
  6. Wählen Sie die Schriftdatei aus dem Datei-Navigator, der sich öffnet, wenn Sie auf die Schaltfläche "+" .
  7. Tun Sie dies für jede Schriftart, die Sie benötigen add to the project .

14voto

Chris Klingler Punkte 5168

Ich empfehle Ihnen, einem meiner Lieblings-Kurztutorials hier zu folgen: 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 vom Finder in Ihr Projekt

HINWEIS - Stellen Sie sicher, dass Sie das Feld "Zu Zielen hinzufügen" auf dem Ziel Ihrer Hauptanwendung anklicken.

Drag font files into your project and click to add them to your target

Wenn Sie vergessen haben, sie zu Ihrem Ziel hinzuzufügen, klicken Sie auf die Schriftartdatei in Ihrer Projekthierarchie und klicken Sie auf der rechten Seite auf das Ziel der Hauptanwendung im Bereich Ziel-Mitgliedschaft Abschnitt

how to add fonts to app target if you forgot

Um sicherzustellen, dass Ihre Schriftarten Teil Ihres App-Ziels sind, stellen Sie sicher, dass sie in Ihrem Ressourcen des Kopierpakets en Bauphasen

how to check resources to see if fonts are part of app target

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

Gehen Sie zum Benutzerdefinierte iOS-Zieleigenschaften in Ihrem Infos Abschnitt und fügen Sie den Einträgen in diesem Abschnitt einen Schlüssel namens Fonts provided by application (Sie sollten sehen, dass es als Option erscheint, wenn Sie es eingeben, und es wird sich als ein Array einrichten. Klicken Sie auf den kleinen Pfeil, um die Array-Elemente zu öffnen, und geben Sie die Namen der .ttf- oder .otf-Dateien ein, die Sie hinzugefügt haben, damit Ihre Anwendung weiß, dass es sich um die gewünschten Schriftdateien handelt

HINWEIS - Wenn Ihre Anwendung direkt nach diesem Schritt abstürzt, überprüfen Sie die Rechtschreibung der Elemente, die Sie hier hinzufügen

example plist with custom fonts added

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

Oft ist der Schriftname, den Ihre Anwendung sieht, ein anderer als der, den Sie aufgrund des Dateinamens für die Schrift vermuten. Fügen Sie dies in Ihren Code ein und sehen Sie sich das Protokoll Ihrer Anwendung an, um zu sehen, welchen Schriftnamen Sie in Ihrem Code aufrufen müssen

Schnell

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

Zielsetzung C

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

Ihr Protokoll sollte in etwa so aussehen:

Example of searching log to find font names

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

Schnell

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

Zielsetzung C

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X