Zugeschriebene Zeichenfolge mit benutzerdefinierten Schriftarten im Storyboard wird nicht korrekt geladen


100

In unserem Projekt verwenden wir benutzerdefinierte Schriftarten. Es funktioniert gut in Xcode 5. In Xcode 6 funktioniert es im Klartext, der im Code als Zeichenfolge zugeordnet wird. Die im Storyboard festgelegten Zeichenfolgen werden jedoch alle auf Helvetica zurückgesetzt, wenn sie auf einem Simulator oder Gerät ausgeführt werden, obwohl sie im Storyboard in Ordnung aussehen.

Ich bin nicht sicher, ob es sich um einen Fehler im Xcode 6 oder iOS 8 SDK handelt oder ob die Verwendung benutzerdefinierter Schriftarten in Xcode 6 / iOS 8 geändert wurde.


Selbes Problem hier. Würde gerne wissen, was los ist.
Obeattie

1
Im Moment haben wir ein benutzerdefiniertes UILabel mit dem Namen GLMarkdownLabel erstellt und einige Eigenschaften mit IBInspectable exportiert, dann Markdown-Zeichenfolgen im Storyboard festgelegt und Markdown-Zeichenfolgen zurück in zugeordnete Zeichenfolgen übersetzt, wenn sie aus der Feder erwacht sind.
Allen Hsu

Es ist jetzt eine langfristige Lösung, ich hoffe, Apple wird diesen Fehler in der nächsten Version von Xcode beheben.
Allen Hsu

Huch, solche Cruft. Vielen Dank, dass Sie uns wissen lassen, dass dies kein Einzelfall ist. Gibt es ein Radar?
Obeattie

1
Unsere Problemumgehung bestand schließlich darin, IBCustomFonts für unsere zugewiesenen Labels wieder zu verwenden .
Yonix

Antworten:


30

Die Lösung für mich war, eine IBDesignableKlasse zu verwenden:

import UIKit

@IBDesignable class TIFAttributedLabel: UILabel {

    @IBInspectable var fontSize: CGFloat = 13.0

    @IBInspectable var fontFamily: String = "DIN Light"

    override func awakeFromNib() {
        var attrString = NSMutableAttributedString(attributedString: self.attributedText)
        attrString.addAttribute(NSFontAttributeName, value: UIFont(name: self.fontFamily, size: self.fontSize)!, range: NSMakeRange(0, attrString.length))
        self.attributedText = attrString
    }
}

Geben Sie dies im Interface Builder:

Benutzerdefinierte Schriftart des Interface Builder mit zugeordneter Zeichenfolge

Sie können Ihren Attributstring wie gewohnt einrichten, müssen jedoch Ihre Schriftgröße und Schriftfamilie in den neuen verfügbaren Eigenschaften erneut festlegen.

Da der Interface Builder standardmäßig mit der benutzerdefinierten Schriftart arbeitet, erhalten Sie das , was Sie sehen , was ich beim Erstellen von Apps bevorzuge.

Hinweis

Der Grund, warum ich dies anstelle der einfachen Version verwende, ist, dass ich Eigenschaften für die zugewiesene Beschriftung wie den Zeilenabstand festlege, die bei Verwendung des einfachen Stils nicht verfügbar sind.


1
Ihre Lösung unterstützt nur eine Schriftfamilie und -größe für ein Etikett. Warum also nicht einfach nur Text verwenden?
Allen Hsu

Ebenso verwenden wir @IBInspectablevorübergehend Attribute anstelle von Schriftart und Größe. Wir haben eine markdownTextEigenschaft, da wir die meiste Zeit eine zugeordnete Zeichenfolge für fett gedruckten oder unterstrichenen Text verwenden. Analysieren Sie dann den Markdown-Text in eine zugewiesene Zeichenfolge, wobei die Informationen zu Schriftart und Größe für einfachen Text festgelegt sind.
Allen Hsu

@ AllenHsu, du hast recht. Ich habe das nicht erwähnt, aber ich verwende den zugewiesenen Zeilenabstand für mein Etikett. Natürlich, sonst würden Sie einfach den einfachen Stil verwenden :)
Antoine

Guter Punkt, wir haben auch lineSpacing exportiert: p Ich denke, ich würde Ihre Antwort akzeptieren, da es sich tatsächlich um einen Fehler in Xcode handelt und es derzeit keine bessere Lösung gibt. Warten wir auf die nächste Version von Xcode.
Allen Hsu

2
Dies wird nicht funktionieren, wenn ich einen Teil des Textes fett
schreiben

28

Die einfachste Antwort, die funktioniert hat, ist das Ziehen der Schriftarten in FontBook. Wenn sich die Schriftarten in Ihrem Projekt befinden, jedoch nicht im FontBook Ihres Computers, hat IB manchmal Probleme, sie zu finden. Seltsam, hat aber schon mehrmals für mich gearbeitet.


17
Dadurch kann Xcode zwar die benutzerdefinierte Schriftart auswählen, dies funktioniert jedoch nicht. Zur Laufzeit wird die Schriftart nicht wie erwartet verwendet.
Daniel

Leider konnte ich keine Problemumgehung finden. Das Beste, was ich tun konnte, war, einen Fehler bei Apple zu protokollieren.
Daniel

Ja, das ist das Update. Ich hatte mein Storyboard von einem anderen Entwickler entworfen, SVN-Update in Ordnung, aber nie die Schriftart in der Benutzeroberfläche. Die Schriftart befand sich in den Ressourcen, wurde jedoch nicht in der Benutzeroberfläche des Geräts / Simulators angezeigt. Da er eine zugeschriebene Zeichenfolge verwendet, muss ich sie im Schriftbuch haben. Das löst das Problem.
Karim

Ja. Dies hilft mir, das gleiche Problem zu lösen. Wenn ich eine benutzerdefinierte Schriftart in das Schriftbuch einfüge, funktionieren die Dinge wie ein Zauber.
Sushant Jagtap

1
Während diese Lösung in einigen Fällen funktioniert, habe ich im selben Projekt mit derselben Schriftfamilie das gleiche Problem wie @Daniel. XCode muss dieses Problem lösen.
Dey.shin

15

Sie können dem Schriftbuch benutzerdefinierte Schriftarten hinzufügen.

Schritt 1 : Klicken Sie auf Schriftarten verwalten. Es öffnet das Schriftbuch.

Geben Sie hier die Bildbeschreibung ein

Schritt 2 : Klicken Sie auf Plus und fügen Sie Ihre Schriftarten hinzu.

Geben Sie hier die Bildbeschreibung ein

Wenn Sie das nächste Mal auf Schriftart mit zugeordnetem Text klicken, wird die neu hinzugefügte Schriftart ebenfalls in der Liste angezeigt. Stellen Sie jedoch sicher, dass Ihre benutzerdefinierte Schriftart in info.plist hinzugefügt wurde, und bündeln Sie die Ressourcen.


Dies funktioniert im Storyboard, aber nach dem Ausführen wird die Formatierung nicht angezeigt
Van

1
@ Van Formatierung? Kannst du mir bitte mehr erzählen? Wenn es nicht funktioniert?
Mahbaleshwar Hegde

Ich muss den Text einstellen, der eine Mischung aus rgualr und fetter Schrift ist. Ich habe die obige Lösung verwendet, so dass sie im Storyboard funktioniert hat, aber wenn ich die App starte, zeigt das Etikett nicht die angewendete Schriftart, sondern die Systemschriftart
Van

Haben Sie Ihre benutzerdefinierten Schriftarten in info.plist hinzugefügt? Danach drucken Sie einfach alle Schriftfamilien
mahbaleshwar hegde

2
Ja. Ich bin in der Lage, die benutzerdefinierte Schriftart für die gesamte App im Falle von Klartext festzulegen. Ich muss sie für zugewiesenen Text festlegen
Van

5

Dank dieses Threads bin ich zu dieser Lösung gekommen:

private let fontMapping = [
    "HelveticaNeue-Medium": "ITCAvantGardePro-Md",
    "HelveticaNeue": "ITCAvantGardePro-Bk",
    "HelveticaNeue-Bold": "ITCAvantGardePro-Demi",
]

func switchFontFamily(string: NSAttributedString) -> NSAttributedString {
    var result = NSMutableAttributedString(attributedString: string)
    string.enumerateAttribute(NSFontAttributeName, inRange: NSRange(location: 0, length: string.length), options: nil) { (font, range, _) in
        if let font = font as? UIFont {
            result.removeAttribute(NSFontAttributeName, range: range)
            result.addAttribute(NSFontAttributeName, value: UIFont(name: fontMapping[font.fontName]!, size: font.pointSize)!, range: range)
        }
    }
    return result
}

1
Gute Idee. Es ist wirklich unglaublich, dass dies in Apple kaputt ist. Erstaunlich.
Fattie

4

Meine Lösung ist ein bisschen umgangen. Die wirkliche Lösung besteht darin, dass Apple Interface Builder repariert.

Damit können Sie den gesamten fett und kursiv gedruckten Text im Interface Builder mit einer Systemschrift markieren und dann zur Laufzeit Ihre benutzerdefinierte Schrift rendern. Möglicherweise nicht in allen Fällen optimal.

 NSMutableAttributedString* ApplyCustomFont(NSAttributedString *attributedText,
                     UIFont* boldFont,
                     UIFont* italicFont,
                     UIFont* boldItalicFont,
                     UIFont* regularFont)
{

    NSMutableAttributedString *attrib = [[NSMutableAttributedString alloc] initWithAttributedString:attributedText];
    [attrib beginEditing];
    [attrib enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, attrib.length) options:0
                    usingBlock:^(id value, NSRange range, BOOL *stop)
    {
        if (value)
        {
            UIFont *oldFont = (UIFont *)value;
            NSLog(@"%@",oldFont.fontName);

            [attrib removeAttribute:NSFontAttributeName range:range];

            if([oldFont.fontName rangeOfString:@"BoldItalic"].location != NSNotFound && boldItalicFont != nil)
                [attrib addAttribute:NSFontAttributeName value:boldItalicFont range:range];
            else if([oldFont.fontName rangeOfString:@"Italic"].location != NSNotFound && italicFont != nil)
                [attrib addAttribute:NSFontAttributeName value:italicFont range:range];
            else if([oldFont.fontName rangeOfString:@"Bold"].location != NSNotFound && boldFont != nil)
                [attrib addAttribute:NSFontAttributeName value:boldFont range:range];
            else if(regularFont != nil)
                [attrib addAttribute:NSFontAttributeName value:regularFont range:range];
        }
    }];
    [attrib endEditing];

    return attrib;
}

Inspiriert von diesem Beitrag


4

Ich habe mit diesem Fehler zu kämpfen: UILabel wird in IB mit benutzerdefinierter Schriftart korrekt angezeigt, auf dem Gerät oder Simulator jedoch nicht korrekt (die Schriftart ist im Projekt enthalten und wird in einfachen UILabels verwendet).

Endlich gefunden Attributed String Creator im (Mac) App Store. Generiert Code, der in Ihrer App an der entsprechenden Stelle platziert werden soll. Fantastisch. Ich bin nicht der Schöpfer, nur ein glücklicher Benutzer.


3

Das gleiche Problem wurde behoben: Die für TextView im Storyboard festgelegte Attributschriftart funktionierte zur Laufzeit mit XCode 6.1 und iOS 8 SDK nicht.

So habe ich dieses Problem gelöst, könnte eine Problemumgehung für Sie sein:

  1. Öffnen Sie den Attributinspektor Ihrer Textansicht und ändern Sie den Text in "Einfach".

  2. Klicken Sie auf das Kreuz, um das "wC hR" (rot unten) zu löschen.

    Geben Sie hier die Bildbeschreibung ein

  3. Ändern Sie den Text in "Attributed", und Sie können dann die Schriftart und Größe für Ihren Text festlegen.

  4. Führen Sie aus, um zu überprüfen, ob es funktioniert

Es scheint, dass standardmäßig wC hRweder UILabelnoch eine Eigenschaft festgelegt ist UITextView.
Allen Hsu

Haben Sie mit xcode 6 eine andere Art von Höhenbreite eingestellt, z. B. "Normale Breite | Beliebige Höhe", "Kompakte Breite | Normale Höhe"? Da ich ein in Xcode 5 entwickeltes Projekt habe und die zugewiesene Textansicht auch mit iOS 8 SDK funktioniert, habe ich dort die Einstellungen überprüft und festgestellt, dass der einzige Unterschied darin besteht, dass Benutzer mit Xcode 6 die Schriftart für verschiedene Gerätegrößen festlegen können, wenn Sie den Text festlegen "Einfach". Diese neue Konfiguration könnte der Grund sein, warum das Setzen von Text auf "zugeordnet" erfolgt, die Schriftart jedoch nicht funktioniert.
Zhihao Yang

1
Verwenden Sie benutzerdefinierte Schriftarten? Ich meine selbst eingebettete, keine Systemschriftarten.
Allen Hsu

Aha, ich dachte, "Benutzerdefinierte" Schriftarten, die Sie erwähnt haben, werden von Xcode angeboten, vorausgesetzt, sie haben die Schriftart "System".
Zhihao Yang

Es funktioniert nicht bei mir. Es funktioniert für normale Zeichenfolgen, jedoch nicht für zugeordnete Zeichenfolgen.
Pratik Somaiya


2

Versuchen Sie dies, es wird funktionieren

In meinem Fall, wenn ich versuche, "Silversky Technology" als Attributed Text für Label vom Interface Builder festzulegen, wird es nicht angezeigt, wenn ich im Simulator ausgeführt werde, sondern im Interface Builder. Also habe ich einen Trick verwendet, bei dem ich Silversky-Schrift mit 1 Pixel größer als Technologietext gemacht habe.

Attributtext hat ein Problem mit der gleichen Schriftgröße, also ändern Sie die Größe von 1 Wort. Dieses Ding funktioniert mit mir.

Vielleicht ist das ein Xcode-Fehler, aber dieser Trick funktioniert für mich.


1

Dasselbe Problem.

Gelöst: Aktivieren Sie einfach in TextView die Option Auswählbar. Ohne dies habe ich Standard-Systemschriftart.


1

Doppelklicken Sie und installieren Sie die Schriftart auf dem System. Es wird funktionieren (Xcode 8.2)


1
Ich wünschte es würde. Bei FontAwesome funktioniert das bei mir nicht.
Peter DeWeese

1

Die @ Hamidptb-Lösung funktioniert. Stellen Sie sicher, dass Sie den korrekten Namen der Schriftart erhalten (sobald Sie sie dem Schriftbuch hinzugefügt haben).

  • Öffnen Sie die Schriftbuchanwendung, navigieren Sie zu Ihrer Schriftart und drücken Sie Befehlstaste + I. Das PostScript Name ist der Schriftartname, den Sie hier verwenden möchten:

    UILabel.appearance (). Font = UIFont (Name: " PostScriptName ", Größe: 17)


0

Ich habe versucht, tableView-Zellen mit Text mit mehreren Absätzen abzurufen. Die zugewiesenen Zeichenfolgen schienen eine Möglichkeit zu sein, zusätzlichen Platz zwischen den Absätzen zu schaffen (etwas, das etwas schöner aussieht, als zwei Zeilenvorschübe in der Zeichenfolge auszuführen). Kam über diesen und andere Beiträge, als ich feststellte, dass die IB-Einstellungen zur Laufzeit nicht zutrafen, als Sie anderen Text in die Zelle einfügen wollten.

Die Hauptsache, die ich mir ausgedacht habe, war das Hinzufügen einer Erweiterung zu String (unter Verwendung von Swift), um einen zugeordneten String mit bestimmten Eigenschaften zu erstellen. In diesem Beispiel wird die Markierungsfilzschrift verwendet, da sie leicht von Helvetica zu unterscheiden ist. Das Beispiel zeigt auch einen kleinen zusätzlichen Abstand zwischen Absätzen, um sie voneinander zu unterscheiden.

extension String {
func toMarkerFelt() -> NSAttributedString {
    var style = NSMutableParagraphStyle()
    style.paragraphSpacing = 5.0
    let markerFontAttributes : [NSObject : AnyObject]? = [
        NSFontAttributeName : UIFont(name: "Marker Felt", size: 14.0)!,
        NSParagraphStyleAttributeName: style,
        NSForegroundColorAttributeName : UIColor.blackColor()
    ]
    let s = NSAttributedString(string: self, attributes: markerFontAttributes)
    return s
    }
}

Dann senden Sie in meiner benutzerdefinierten tableViewCell den gewünschten Text und konvertieren ihn in eine zugeordnete Zeichenfolge auf dem UILabel.

//  MarkerFeltCell.swift
class MarkerFeltCell: UITableViewCell {
@IBOutlet weak var myLabel: UILabel!
func configureCellWithString(inputString : String) {
    myLabel.attributedText = inputString.toMarkerFelt()
}}

Im View Controller mit der tableView sollten Sie Ihre Zelle in viewDidLoad () registrieren. Ich habe eine Schreibfeder verwendet, also so etwas wie:

let cellName = "MarkerFeltCell"
tableView.registerNib(UINib(nibName: cellName, bundle: nil), forCellReuseIdentifier: cellName)

Um herauszufinden, wie hoch die Zelle sein soll, erstellen Sie eine Prototypzelle, die zum Abrufen von Größeninformationen verwendet wird und niemals zur Tabellenansicht hinzugefügt wird. Also, in den Variablen Ihres View Controllers:

var prototypeSummaryCell : MarkerFeltCell? = nil

Dann in (wahrscheinlich überschreiben - abhängig von Ihrem View Controller) heightForRowAtIndexPath:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        // ...
    if xib == "MarkerFeltCell" {
            if prototypeCell == nil {
                prototypeCell = tableView.dequeueReusableCellWithIdentifier(xib) as? MarkerFeltCell
            }
            let width : CGFloat = tableView.bounds.width
            let height : CGFloat = prototypeCell!.bounds.height
            prototypeCell?.bounds = CGRect(x: 0, y: 0, width: width, height: height)
            configureCell(prototypeCell!, atIndexPath: indexPath)
            prototypeSummaryCell?.layoutIfNeeded()
            let size = prototypeSummaryCell!.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
            let nextHeight : CGFloat = ceil(size.height + 1.0)
            return nextHeight
    } else {  // ...

Im obigen Code wird die prototypeCell beim ersten Mal ausgefüllt, wenn sie benötigt wird. Die prototypeCell wird dann verwendet, um die Höhe der Zelle nach dem automatischen Größenänderungsprozess zu ermitteln. Sie müssen die Höhe mit der Funktion decken () aufrunden. Ich habe auch einen zusätzlichen Fudge-Faktor hinzugefügt.

Das letzte Codebit gibt an, wie Sie den Text für die Zelle konfigurieren. Für dieses Beispiel einfach:

func configureCell(cell :UITableViewCell, atIndexPath indexPath: NSIndexPath) {
    if let realCell = cell as? MarkerFeltCell  {
        realCell.configureCellWithString("Multi-line string.\nLine 2.\nLine 3.")    // Use \n to separate lines
    }
}

Hier ist auch eine Aufnahme der Feder. Fixierte die Beschriftung an den Rändern der Zelle (mit dem gewünschten Rand), verwendete jedoch eine Einschränkung "Größer als oder gleich" mit einer Priorität von weniger als "Erforderlich" für die untere Einschränkung.

Zellenbeschränkungen

Stellen Sie die Schriftart des Etiketts auf Attributed ein. Die tatsächliche IB-Schriftart spielte keine Rolle.

LabelFont

Das Ergebnis in diesem Fall:

CellResults


0

Im Falle einer zugewiesenen Zeichenfolge können Sie eine benutzerdefinierte Schriftart in die Schriftartenliste aufnehmen, indem Sie auf das Schriftartensymbol klicken. Daraufhin wird das folgende Dialogfeld angezeigt. Im folgenden Dialogfeld können Sie eine eigene oder eine vorhandene Kategorie für eine benutzerdefinierte Schriftart hinzufügen. zugeschriebener Schriftdialog

Nachdem Sie auf Schriftarten verwalten geklickt haben, wird der folgende Dialog geöffnet. Wählen Sie eine Kategorie in der von Ihnen erstellten oder vorhandenen Kategorie aus. Klicken Sie auf + Zeichen, um der Kategorie eine Schriftart hinzuzufügen. Schriftartdialog verwalten


0

Das ist eine einfache und schnelle Lösung und das funktioniert in meinem Fall. Diese Lösung besteht darin, eine Codezeile in didFinishLaunchingWithOptions func in der Datei AppDelegate.swift hinzuzufügen:

für textViews :

UITextView.appearance().font = UIFont(name: "IranSans", size: 17)

für Etiketten :

UILabel.appearance().font = UIFont(name: "IranSans", size: 17)

und für den Rest von UiView wie diese beiden ☝️


0

Für alle, die benutzerdefinierte Schriftarten auf zugewiesene Zeichenfolgen im Code anwenden: Versuchen Sie, sie festzulegen viewDidLayoutSubviews. Mein Fehler war es viewDidLoad, es wird dort nicht angewendet.

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.