webentwicklung-frage-antwort-db.com.de

Benutzerdefinierte installierte Schriftart wird in UILabel nicht richtig angezeigt

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

Die Zeilenhöhe scheint korrekt berechnet zu werden (denke ich), aber wenn die Schrift angezeigt wird, wird sie ganz oben im Begrenzungsrahmen ausgerichtet. Ich rief [myLabel sizeToFit] an und passte nur die Breite an, um diese Bildschirmaufnahme zu erzeugen:

Screen capture of incorrect font rendering

Ich hatte das gleiche Problem mit der fetten und normalen Version der Schrift. Ich konnte eine Version von Helvetica Neue Bold von OSX abrufen und auf mein Gerät setzen, und es wird gut angezeigt (grüner Hintergrund in obigem Bild).

Was könnte an der Schriftdatei oder meinem Code falsch sein, die dazu führen würde, dass sie so gezeichnet wird?

76
MikeQ

Ich habe eine Lösung veröffentlicht, die das Patchen der ttf-Schriftdatei hier beinhaltet:

Hier ist die Lösung, die für meine benutzerdefinierte Schriftart funktioniert, die das gleiche Problem in UILabel, UIButton und dergleichen hatte. Das Problem mit der Schriftart stellte sich als die Tatsache heraus, dass die Ascender-Eigenschaft im Vergleich zum Wert der Systemschriftarten zu klein war. Ascender ist ein vertikaler Leerraum über den Zeichen der Schrift. Um Ihre Schriftart zu korrigieren, müssen Sie die Befehlszeilen-Dienstprogramme Apple Font Tool Suite herunterladen. Dann nimm deine Schrift und mache folgendes:

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

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

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

Dann verwenden Sie einfach die resultierende ttf-Schriftart in Ihrer App.

116
kolyuchiy

Dies ist also eine modifizierte Version von kolyuchiys Antwort.

Ich habe meine Schrift mit Glyphs geöffnet und dann ohne Änderung exportiert. Irgendwie war das vertikale Ausrichtungsproblem magisch verschwunden! 

Was besser ist, ist, dass die neue Schriftart gut mit Methoden wie sizeWithFont: abgespielt wird, so dass die von Joshua genannten Probleme nicht auftreten.

Ich schaute mir die HHEA-Tabelle mit dem genannten Befehl kolyuchiy an und stellte fest, dass Glyphs nicht nur die ascender, sondern auch lineGap und numberOfHMetrics für mich modifizierte.

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 und kann das Warum und Wie nicht wirklich erklären. Wenn jemand eine bessere Erklärung geben kann, wäre das sehr dankbar! :)

64
Joseph Lin

iOS 6 berücksichtigt die lineGap-Eigenschaft der Schriftart, während iOS 7 diese ignoriert. Daher funktionieren nur benutzerdefinierte Schriftarten mit einem Zeilenabstand von 0 unter beiden Betriebssystemen ordnungsgemäß.

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

Eine robustere Lösung besteht darin, die Schrift nach diesem post selbst zu bearbeiten. Speziell,

  1. Installieren Sie OS X Font Tools.
  2. Ausgeben der Schriftartmetriken in eine Datei: ftxdumperfuser -t hhea -A d YOUR_FONT.ttf
  3. Öffnen Sie die abgelegte Datei in einem Editor.
  4. Bearbeiten Sie die ascender-Eigenschaft, indem Sie ihr den Wert der lineGap-Eigenschaft hinzufügen. Wenn lineGap beispielsweise 200 und ascender 750 ist, erstellen Sie ascender 950.
  5. Setzen Sie lineGap auf 0.
  6. Führen Sie die Änderungen in die Schriftart ein: ftxdumperfuser -t hhea -A f YOUR_FONT.ttf

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

31
phatmann

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

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

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

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

4
Naiko
  1. Laden Sie die Font Tools von Apple herunter und installieren Sie sie hier: https://developer.Apple.com/downloads/index.action?q=font (der Download-Link befindet sich unten)
  2. Öffnen Sie das Terminal und cd, wo sich Ihre Schrift befindet
  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 fügen Sie dem Wert 200 hinzu
  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. (Ich habe am Ende 250 zu meiner Konfiguration hinzugefügt)
4
nurxyz

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

Ich habe meine Schrift mit Glyphs geöffnet (funktioniert auch mit Glyphs Mini) und fand diesen Abschnitt dort (dies von Glyphs Mini, um dorthin zu gelangen.

enter image description here

Löschen Sie einfach alle Ausrichtungszonen (oder einige davon), um dieses Problem zu beheben. __ Funktionierte perfekt für mich.

3
DevilPinky

Wir hatten das gleiche Problem mit einer unserer benutzerdefinierten Schriftarten. Wir haben das Problem auch behoben, indem wir die Eigenschaft font ascender editiert haben. Wir stellten jedoch fest, dass dies zu anderen Problemen und Layoutproblemen führte. Die dynamische Einstellung der Zellenhöhe basierend auf der Etikettenhöhe würde zum Beispiel explodieren, wenn Sie die mit Ascender bearbeitete Schriftart verwenden. 

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

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

Nicht sicher, welche Methode besser ist, wollte aber nur eine andere Möglichkeit zur Behebung des Problems mitteilen. 

3
Joshua Dance

Haben Sie versucht, Core Text ? Ich hatte einige Erfolge beim Rendern benutzerdefinierter Schriftarten durch Core Text, aber ich weiß nicht, ob dies zu Ihrer Situation passt.

1
RyanR

Das Anlegen von attributiertem 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 eigene Schriftart erhielt ich das gewünschte Ergebnis von:

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

Dies funktioniert durch die Verwendung der systemeigenen NSMutableParagraphStyle(), die die Eigenschaften für Zeilenhöhe und Abstand enthält (auf die auch als @IBOutlet-Eigenschaften im Storyboard zugegriffen werden kann, wenn Sie Ihre Etiketten nicht programmieren). 

0
App Dev Guy

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

0
Gaurav