Benutzerdefinierte installierte Schriftarten werden in UILabel nicht korrekt angezeigt


82

Ich versuche, eine Helvetica Neue Condensed- Schriftart zu verwenden, die ich aus dem Adobe Font Collection Pro-Paket erhalten habe. Leider scheint es falsch zu zeichnen, wenn ich es in einem verwende UILabel.

Die Zeilenhöhe scheint korrekt berechnet zu sein (glaube ich), aber wenn die Schriftart angezeigt wird, wird sie ganz oben im Begrenzungsrahmen ausgerichtet. Ich habe angerufen [myLabel sizeToFit]und nur die Breite angepasst, um diese Bildschirmaufnahme zu erstellen:

Screenshot der falschen Schriftwiedergabe

Ich hatte das gleiche Problem sowohl mit der fetten als auch mit der regulären Version der Schriftart. Ich konnte eine Version von Helvetica Neue Bold aus OSX ziehen und auf mein Gerät übertragen, und es wird gut angezeigt (grüner Hintergrund im obigen Bild).

Was könnte an der Schriftartdatei oder meinem Code falsch sein, die dazu führen würden, dass sie auf diese Weise gezeichnet wird?


Könnte ich irgendwie eine Unterklasse von UIFont erstellen, die diese Probleme beheben kann?
MikeQ

+1 - das gleiche Problem für mich. Ich habe versucht, ZFont zu verwenden, um dabei zu helfen, und es hilft etwas, aber bei weitem nicht genug. Könnte etwas falsch sein, wie die Überschrift mit diesen benutzerdefinierten Schriftarten interpretiert wird (eigentlich keine Ahnung - aber ich muss denken, dass das etwas damit zu tun haben könnte!).
Joe D'Andrea

Hallo! Haben Sie schließlich die Lösung gefunden? Bitte beantworten Sie Ihre Frage, wenn ja. Danke im Voraus.
Bald

Leider nein, habe ich nicht. Und ich habe keinen Zugriff mehr auf die ursprüngliche Schriftartdatei, die dieses Problem verursacht hat. Ich mag die Antwort von kolyuchiy. Ich wünschte nur, ich könnte sie in meinem speziellen Fall testen.
MikeQ

Nur damit Sie wissen, wurde dies in iOS7 behoben.
Der Typ

Antworten:


125

Ich stellte eine Lösung , die Schriftart Patchen ttf beinhaltet Datei hier :

Hier ist die Lösung, die für meine benutzerdefinierte Schriftart funktioniert hat, bei der das gleiche Problem in UILabel, UIButton usw. aufgetreten ist. Das Problem mit der Schriftart war die Tatsache, dass ihre Ascender-Eigenschaft im Vergleich zum Wert von Systemschriftarten zu klein war. Ascender ist ein vertikales Leerzeichen über den Schriftzeichen. Um Ihre Schriftart zu korrigieren, müssen Sie die Befehlszeilenprogramme der Apple Font Tool Suite herunterladen . Nehmen Sie dann Ihre Schriftart und gehen Sie wie folgt vor:

~$ ftxdumperfuser -t hhea -A d Bold.ttf

Dies wird erstellen Bold.hhea.xml. Öffnen Sie es mit einem Texteditor und erhöhen Sie den Wert des ascenderAttributs. Sie müssen ein wenig experimentieren, um den genauen Wert herauszufinden, der für Sie am besten geeignet ist. In meinem Fall habe ich es von 750 auf 1200 geändert. Führen Sie das Dienstprogramm dann erneut mit der folgenden Befehlszeile aus, um Ihre Änderungen wieder in der ttf-Datei zusammenzuführen:

~$ ftxdumperfuser -t hhea -A f Bold.ttf

Verwenden Sie dann einfach die resultierende ttf-Schriftart in Ihrer App.


Vielen Dank, dass Sie dieses Tool vorgeschlagen haben! Es kann auch zum Umbenennen einer Schriftart verwendet werden, indem der Abschnitt "-t Name" ebenfalls bearbeitet wird.
Philippe

1
Sie können auch Mensis oder FontForge ausprobieren . Diese Apps können auch zum Ändern der Ascender-Eigenschaft verwendet werden.
kolyuchiy

1
Du hast meinen Tag gerettet. Ich war seit einigen Wochen mit diesem Problem konfrontiert. Ich kann es ziemlich oft benutzen!
TheGrumpyCoda

1
Bitte beachten Sie, dass Sie durch Erhöhen des Aufsteigers den Zeilenabstand erhöhen. Dies kann das Problem sein, wenn Ihre App mehrzeiligen Text enthält.
Pavel Alexeev

2
** BITTE SEHEN SIE AUCH DIE ANTWORT VON JOSEPH LIN UNTEN ** Sie sollten sowohl den Aufsteiger als auch den Zeilenabstand auf Null setzen, um eine gute Ausrichtung sowohl auf iOS 6 als auch auf iOS 7 sicherzustellen!
Ken M. Haggerty

64

Dies ist also eine modifizierte Version von kolyuchiy's Antwort.

Ich habe meine Schriftart mit Glyphen geöffnet und sie dann exportiert, ohne etwas zu ändern. Irgendwie war das Problem der vertikalen Ausrichtung auf magische Weise verschwunden!

Was besser ist, ist, dass die neue Schriftart gut mit Methoden wie spielt sizeWithFont:, so dass sie nicht die von Joshua erwähnten Probleme hat .

Ich warf einen Blick auf die HHEA-Tabelle mit dem erwähnten Befehl kolyuchiy und bemerkte, dass Glyphen nicht nur das ascender, sondern auch lineGapund modifiziertennumberOfHMetrics für mich .

Hier sind die Rohdaten vor:

versionMajor="1"
versionMinor="0"
ascender="780"
descender="-220"
lineGap="200"
advanceWidthMax="1371"
minLeftSideBearing="-73"
minRightSideBearing="-52"
xMaxExtent="1343"
caretSlopeRise="1"
caretSlopeRun="0"
caretOffset="0"
metricDataFormat="0"
numberOfHMetrics="751"

und danach:

versionMajor="1"
versionMinor="0"
ascender="980"
descender="-220"
lineGap="0"
advanceWidthMax="1371"
minLeftSideBearing="-73"
minRightSideBearing="-52"
xMaxExtent="1343"
caretSlopeRise="1"
caretSlopeRun="0"
caretOffset="0"
metricDataFormat="0"
numberOfHMetrics="748"

Die Moral der Geschichte erhöht also nicht nur den Aufstieg, sondern modifiziert auch andere verwandte Werte.

Ich bin kein Typografie-Experte, daher kann ich das Warum und Wie nicht wirklich erklären. Wenn jemand eine bessere Erklärung liefern kann, wäre er sehr dankbar! :) :)


Nachdem ich die TTF, die ich wieder verwende, mit Glyphen gespeichert habe, verhält sich die Schriftart unter iOS 6 und iOS 7 ziemlich gleich. Zuvor war ihre Grundlinie unter iOS 6 falsch ausgerichtet.
Leolobato

6
Danke, dass du es endlich herausgefunden hast! Anscheinend berücksichtigt iOS 6 die lineGap-Eigenschaft, während iOS 7 sie ignoriert. Die Lösung besteht darin, die lineGap 0 zu machen und den Ascender entsprechend größer zu machen. Dies ist genau das, was Glyphs getan hat, und es funktioniert sowohl auf iOS 6 als auch auf iOS 7.
Phatmann

Ja. Das Reduzieren der Zeilenlücke auf Null (0) und das Verlassen des Aufsteigers (1991) löste das Problem für mich mit der kostenlosen Schriftart "Overpass" von Fedora. Vielen Dank für die Anleitung zu einer Lösung. Funktioniert sowohl mit iOS6 als auch mit iOS7.
stephenhouser

Ich bin gerade nach mehreren fehlgeschlagenen Versuchen mit Glyphs und OS X Font Tools zu dem gleichen Ergebnis gekommen wie @ phatmann. Die Sache ist, dass es besser ist, diesen Trick mit OS X Font Tools zu verwenden, als einfach mit Glyphen zu exportieren, da Glyphen auch den Stilnamen und den Nachskriptnamen der Schriftart bearbeiten, wodurch xCode in einigen Situationen die Schriftart nicht findet.
Huong

32

iOS 6 berücksichtigt die lineGap-Eigenschaft der Schriftart, während iOS 7 sie ignoriert. Daher funktionieren nur benutzerdefinierte Schriftarten mit einer Zeilenlücke von 0 auf beiden Betriebssystemen ordnungsgemäß.

Die Lösung besteht darin, die lineGap 0 zu machen und den Ascender entsprechend größer zu machen. Gemäß der obigen Antwort besteht eine Lösung darin, Glyphen zu importieren und zu exportieren. Beachten Sie jedoch, dass eine zukünftige Version der App diesen "Fehler" beheben kann.

Eine robustere Lösung besteht darin, die Schriftart gemäß diesem Beitrag selbst zu bearbeiten . Speziell,

  1. Installieren Sie die OS X Font Tools.
  2. Speichern Sie die Schriftmetriken in einer Datei: ftxdumperfuser -t hhea -A d YOUR_FONT.ttf
  3. Öffnen Sie die Speicherauszugsdatei in einem Editor.
  4. Bearbeiten Sie die ascenderEigenschaft, indem Sie den Wert der Eigenschaft hinzufügen lineGap. Wenn zum Beispiel lineGap200 und ascender750 ist, machen Sie den ascender950.
  5. Setzen Sie das lineGapauf 0.
  6. Führen Sie die Änderungen in der Schriftart zusammen: ftxdumperfuser -t hhea -A f YOUR_FONT.ttf

Sobald Sie dies getan haben, müssen Sie möglicherweise Ihre Benutzeroberfläche entsprechend anpassen.


4

Wir hatten das gleiche Problem mit einer unserer benutzerdefinierten Schriftarten. Wir haben das Problem auch "behoben", indem wir die Eigenschaft font ascender bearbeitet haben. Wir haben jedoch festgestellt, dass dies zu anderen Problemen und Layoutproblemen führte. Zum Beispiel würde die dynamische Einstellung der Zellenhöhe basierend auf der Etikettenhöhe bei Verwendung unserer von Ascender bearbeiteten Schriftart explodieren.

Am Ende haben wir die UIButton-Eigenschaft contentEdgetInsets geändert.

yourButton.contentEdgeInsets = UIEdgeInsetsMake(-10, 0, 0, 0);

Ich bin mir nicht sicher, welche Methode besser ist, wollte aber nur einen anderen Weg zur Behebung des Problems aufzeigen.


2
einverstanden. Der Ascender Property Fix ist nicht die ideale Lösung
Max MacLeod

1
Hallo Joshua, ich habe gerade eine Methode veröffentlicht, mit der das von Ihnen erwähnte Problem behoben werden kann. Kurz gesagt, einige weitere Eigenschaften müssen zusammen mit dem Aufsteiger geändert werden.
Joseph Lin

4
  1. Laden Sie die Apple Font Tools hier herunter und installieren Sie sie: https://developer.apple.com/downloads/index.action?q=font (der Download-Link befindet sich unten)
  2. Öffnen Sie das Terminal und gehen Sie zu Ihrer Schriftart
  3. Führen Sie diesen Befehl aus: ftxdumperfuser -t hhea -A d MY_FONT_NAME.ttf
  4. Jetzt haben Sie eine XML-Datei mit einigen Eigenschaften der Schriftart. Bearbeiten Sie sie in Ihrem Texteditor
  5. Suchen Sie nach der Eigenschaft "lineGap" und addieren Sie 200 zu ihrem Wert
  6. Speichern Sie die XML-Datei
  7. Führen Sie diesen Befehl aus: ftxdumperfuser -t hhea -A f MY_FONT_NAME.ttf
  8. Löschen Sie die XML-Datei
  9. Probieren Sie die konfigurierte Schriftart unter iOS 6 aus und prüfen Sie, ob sie besser aussieht.
  10. Bei Bedarf können Sie zu Schritt 3 zurückkehren und die Eigenschaft "lineGap" hinzufügen / subtrahieren. (Am Ende habe ich meiner Konfiguration 250 hinzugefügt)

4

Für diejenigen, die OS X El Capitan ausführen und zu diesem Thread kommen, ist möglicherweise aufgefallen, dass die Apple Font Tool Suite (zumindest vorerst) nicht mehr kompatibel ist.

Sie können die von kolyuchiy und Joseph Lin beschriebenen Änderungen jedoch weiterhin mit der kostenlosen Software zur Schriftbearbeitung FontForge durchführen .

Öffnen Sie die Schriftart mit FontForge und wählen Sie im oberen Menü Element aus. Gehen Sie dann zu Schriftinfo> OS / 2> Metriken. Dort möchten Sie die Werte für HHEad Line Gap und HHead Ascent Offset bearbeiten.

Sobald Sie die erforderlichen Änderungen vorgenommen haben, können Sie die Schriftart einfach unter Datei> Schriftarten generieren exportieren und das richtige Schriftformat auswählen


3

Dank dieser Antwort habe ich mein Problem mit Glyphen behoben, aber ein bisschen anders.

Ich habe meine Schrift mit Glyphs geöffnet (funktioniert auch mit Glyphs mini) und dort diesen Abschnitt gefunden (dieser von Glyphs mini, um dorthin zu gelangen, drücke den i-Knopf in der rechten oberen Ecke):

Geben Sie hier die Bildbeschreibung ein

Löschen Sie einfach alle diese Ausrichtungszonen (oder einige davon) und das Problem wird behoben. Hat perfekt für mich funktioniert.


2

Das Erstellen von zugeordnetem Text aus Ihrem Etikettentext war für mich die Lösung. Hier ist eine Erweiterung:

extension UILabel {
    /// You can call with or without param values; without will use default 2.0
    func setLineSpacing(lineSpacing: CGFloat = 2.0, lineHeightMultiple: CGFloat = 2.0) {
        guard let labelText = self.text else { return }
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = lineSpacing
        paragraphStyle.lineHeightMultiple = lineHeightMultiple
        let attributedString:NSMutableAttributedString
        if let labelattributedText = self.attributedText {
            attributedString = NSMutableAttributedString(attributedString: labelattributedText)
        } else {
            attributedString = NSMutableAttributedString(string: labelText)
        }
        // (Swift 4.2 and above) Line spacing attribute
        attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
        self.attributedText = attributedString
    }
}

Für meine benutzerdefinierte Schriftart habe ich das Ergebnis erhalten, das ich benötige von:

self.myLabel.setLineSpacing(lineSpacing: 1.2, lineHeightMultiple: 1.2)

Dies funktioniert unter Verwendung des bereitgestellten Native, NSMutableParagraphStyle()das @IBOutletEigenschaften für Zeilenhöhe und -abstand enthält (auf die auch im Storyboard als Eigenschaften zugegriffen werden kann, wenn Sie Ihre Beschriftungen nicht programmieren).


1

Haben Sie Core Text ausprobiert ? Ich hatte einige Erfolge beim Rendern von benutzerdefinierten Schriftarten über Core Text, aber ich weiß nicht, ob dies zu Ihrer Situation passen würde.


1
Ich kann bestätigen, dass der Kerntext dieses Problem nicht hat.
Überbieten


0

Wenn Sie Probleme mit diesen Befehlszeilenprogrammen haben, versuchen Sie es mit fontcreator im Fenster. und ändern Sie den Schriftarten-Assender aus dem Einstellungsmenü.


0

Für alle, die Schwierigkeiten haben, ftxdumperfuser( kolyuchiy answer) unter Mac OS Mojave zu verwenden, weil der Befehl Fehler nicht gefunden hat:

  • Laden Sie das Font Tools-Paket von Apple herunter. Sie wurden unter https://developer.apple.com/download/more/?q=font gefunden und für XCode 11 ausgewählt.
  • Hängen Sie die dmg-Datei ein
  • Geben Sie die Disk-Image-CD / Volumes / macOS \ Font \ Tools ein
  • Extrahieren Sie das Paket in einen Ordner Ihrer Wahl: pkgutil --expand-full macOS \ Font \ Tools.pkg ~ / font-tools
  • Die CLI-Tools sind jetzt unter ~ / font-tools / FontCommandLineTools.pkg / Payload verfügbar. Sie können den Ordner Ihrem Pfad hinzufügen ( export PATH="$PATH:$HOME/font-tools/FontCommandLineTools.pkg/Payload") oder die Utils in Ihren bin-Ordner kopieren.

-3

Ich hatte ein ähnliches Problem mit der legendären "FontAwesome" -Schrift in meinem Sprite Kit-Spiel. Das Festlegen der SKLabelVerticalAlignmentMode-Eigenschaft von SKLabelNode auf .Center hat für mich funktioniert.

myLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center

Ich wollte nur teilen, falls jemand mit dem gleichen Problem zu kämpfen hat.

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.