ストーリーボードのカスタムフォントを含む属性付き文字列が正しく読み込まれない


100

プロジェクトではカスタムフォントを使用しています。これはXcode 5でうまく機能します。Xcode6では、プレーンテキスト、コード内の属性付き文字列で機能します。ただし、ストーリーボードでは正常に表示されますが、ストーリーボードで設定された属性文字列は、シミュレータまたはデバイスで実行するとすべてHelveticaに戻ります。

Xcode 6またはiOS 8 SDKのバグなのか、Xcode 6 / iOS 8でカスタムフォントの使用方法が変更されたのかわかりません。


ここでも同じ問題。何が起こっているのか知りたいです。
obeattie 2014

1
ここでは、GLMarkdownLabelという名前のカスタムUILabelを作成し、IBInspectableで一部のプロパティをエクスポートし、ストーリーボードでマークダウン文字列を設定し、nibから目覚めたときにマークダウン文字列を属性付き文字列に戻します。
Allen Hsu 2014

これは長期的な解決策です。AppleがXcodeの次のバージョンでこのバグを修正することを願っています。
Allen Hsu 2014

なんてこった。ただし、それが単独の問題ではないことをお知らせいただきありがとうございます。レーダーはありますか?
obeattie 2014

1
私たちの回避策は、最終的には、属性付きラベルにIBCustomFontsを使用することでした
yonix、2014年

回答:


30

私のための修正はIBDesignableクラスを使用することでした:

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

Interface Builderでこれを与える:

属性付き文字列を持つInterface Builderカスタムフォント

通常どおりに属性付き文字列を設定できますが、新しい利用可能なプロパティでフォントサイズとフォントファミリーをもう一度設定する必要があります。

Interface Builderはデフォルトでカスタムフォントを使用しているので、アプリをビルドするときに私が好むものと同じものが表示されます。

注意

プレーンバージョンの代わりにこれを使用する理由は、ラインスペースのような属性付きラベルにプロパティを設定しているためです。これは、プレーンスタイルを使用するときには使用できません。


1
あなたのソリューションは、ラベルの1つのフォントファミリとサイズのみをサポートしています。
Allen Hsu

同様に、@IBInspectableフォントやサイズではなく、一時的に属性を使用しています。markdownTextほとんどの場合、太字または下線付きのテキストには属性付き文字列を使用するため、プロパティがあります。次に、プレーンテキストに設定されたフォントとサイズの情報を使用して、マークダウンテキストを属性付きの文字列に解析します。
Allen Hsu

@AllenHsu、あなたは正しい。それについては触れませんでしたが、私は自分のラベルに属性付きの行間を使用しています。オフコース、それ以外の場合はプレーンスタイルを使用するだけです:)
アントワーヌ

良い点、私たちはlineSpacingもエクスポートしました:pこれは実際にはXcodeのバグであり、今のところこれ以上の解決策はないので、私はあなたの答えを受け入れます。Xcodeの次のバージョンを待ちましょう。
Allen Hsu

2
テキストの一部を太字にしたい場合、これは機能しません
xtrinch

28

うまくいった最も単純な答えは、フォントをFontBookにドラッグすることです。フォントがプロジェクトに含まれているが、コンピューターのFontBookには含まれていない場合、IBはフォントを見つけられないことがあります。奇妙ですが、何度か私のために働いてきました。


17
これにより、Xcodeはカスタムフォントを選択できますが、実際には機能しません。実行時には、フォントは期待どおりに使用されません。
Daniel

残念ながら、私は回避策を考え出すことができませんでした。私ができる最善のことは、Appleにバグを記録することでした。
ダニエル

はい、これは修正です。ストーリーボードを別の開発者が設計しましたが、svn updateは問題ありませんでしたが、UIでフォントを取得できませんでした。フォントはリソースにありましたが、デバイス/シミュレーターUIには表示されませんでした。彼は属性付き文字列を使用しているので、Font Bookに持っている必要があります。これで問題は解決しました。
karim 2017

はい。これは私が同じ問題を解決するのに役立ちます。カスタムフォントをフォントブックに追加すると、チャームのように機能します。
Sushant Jagtap

1
このソリューションはいくつかのケースで機能しますが、同じフォントファミリーを使用する同じプロジェクトの@Danielと同じ問題にも直面しました。XCodeはこの問題を整理する必要があります。
dey.shin 2018年

16

カスタムフォントをフォントブックに追加できます。

ステップ1:フォントの管理をクリックします。フォントブックを開きます。

ここに画像の説明を入力してください

ステップ2:プラスをクリックして、フォントを追加します。

ここに画像の説明を入力してください

次回属性テキスト付きのフォントをクリックすると、新しく追加されたフォントもリストに表示されます。ただし、カスタムフォントがinfo.plistおよびバンドルリソースに追加されていることを確認してください。


これはストーリーボードでも機能しますが、実行後はフォーマットが表示されません
Van

1
@Vanフォーマット?もっと教えて頂けますか?それが機能していないときは?
mahbaleshwar hegde

rgualrとboldのフォントを混ぜ合わせたテキストを設定する必要があります。上記のソリューションを使用したので、ストーリーボードで機能しましたが、アプリを実行すると、ラベルには適用されたフォントが表示されず、システムフォントが表示されます
Van

info.plistにカスタムフォントを追加しましたか?その後、すべてのフォントファミリーを印刷します
mahbaleshwar hegde

2
はい。プレーンテキストの場合、アプリ全体でカスタムフォントを設定できます。属性付きテキストに設定する必要があります
Van

5

このスレッドのおかげで、私はこの解決策を見つけました:

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
良いアイデア。これがAppleで壊れているのは本当に信じられないことです。驚くべき。
Fattie 2016

4

私の解決策は少しの回避策です。本当の解決策は、AppleがInterface Builderを修正することです。

これを使用すると、システムフォントを使用してすべての太字および斜体のテキストをインターフェイスビルダーでマークし、実行時にカスタムフォントをレンダリングできます。すべてのケースで最適とは限りません。

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

この投稿に触発されました


4

このバグに苦労しました:UILabelはカスタムフォントを使用してIBで正しく表示されますが、デバイスまたはシミュレーターでは正しく表示されません(フォントはプロジェクトに含まれ、プレーンなUILabelsで使用されます)。

(Mac)App StoreでついにAttributed String Creatorが見つかりました。アプリの適切な場所に配置するコードを生成します。素晴らしい。私はクリエイターではなく、ただの幸せなユーザーです。


3

同じ問題に遭遇しました:ストーリーボードのTextViewの属性フォントセットは、XCode 6.1およびiOS 8 SDKで実行時に機能しませんでした。

これは私がこの問題を解決した方法です、あなたのための回避策かもしれません:

  1. テキストビューの属性インスペクターを開き、テキストを「プレーン」に変更します

  2. 十字をクリックして、「wC hR」を削除します(以下の赤)

    ここに画像の説明を入力してください

  3. テキストを「属性付き」に変更すると、テキストのフォントとサイズを設定できます。

  4. 動作するかどうかを確認するために実行します

デフォルトでは、wC hRプロパティセットも、もUILabelないようUITextViewです。
Allen Hsu

xcode 6では、「通常の幅|任意の高さ」、「コンパクトな幅|通常の高さ」など、別の種類の高さ-幅を設定しましたか?Xcode 5で開発されたプロジェクトがあり、その属性付きテキストビューがiOS 8 SDKでも機能しているので、設定を確認したところ、Xcode 6でユーザーがデバイスのさまざまなサイズのフォントを設定できることがわかりました。 「プレーン」。この新しい構成が、テキストを「属性付き」に設定する理由である可能性がありますが、フォントが機能しません。
Zhihao Yang 2014

1
カスタムフォントを使用していますか?システムフォントではなく、自己埋め込みフォントを意味します。
Allen Hsu

ああ、私はあなたが言及した「カスタム」フォントはそれがフォント「システム」を持っているという条件でXcodeが提供するものだと思いました。
Zhihao Yang 2014

私にはうまくいきません。通常の文字列では機能しますが、属性付き文字列では機能しません。
Pratik Somaiya 2015


2

これを試してみてください

私の場合、「Silversky Technology」をインターフェイスビルダーからのラベルの属性付きテキストとして設定しようとすると、シミュレーターで実行しても表示されませんが、インターフェイスビルダーでは表示されます。だから私は1つのトリックを使って、テクノロジーテキストよりも1ピクセル大きいSilverskyフォントを作りました。

属性テキストは同じサイズのフォントで問題があるので、1ワードのサイズを変更すると、これでうまくいきます。

これはxcodeのバグかもしれませんが、このトリックは私にとってはうまくいきます。


1

同じ問題。

解決済み:TextViewでSelectableをチェックするだけです。これがなければ、私は標準のシステムフォントを持っています。



1

@Hamidptbソリューションは機能します。フォントの正しい名前を取得してください(Font Bookに追加した後)。

  • Font Bookアプリケーションを開き、フォントに移動して、コマンド+ Iキーを押します。ポストスクリプト名は、ここで使用するフォントの名前です。

    UILabel.appearance()。font = UIFont(name: " PostScriptName "、size:17)


0

複数の段落を持つテキストを含むtableViewセルを取得しようとしました。属性付き文字列は、段落間に余分なスペースを設ける方法のように思われました(文字列で2つの改行を行うよりも少し見栄えが良いものです)。セルに別のテキストを入れたいときに実行時にIB設定が適用されないことを発見したとき、これと他の投稿に出くわしました。

私が思いついた主なことは、(Swiftを使用して)Stringに拡張機能を追加して、特定の特性を持つ属性付き文字列を作成することでした。ここの例では、Helveticaと簡単に区別できるMarker Feltフォントを使用しています。この例では、段落間の間隔を少し増やして、段落を互いに区別しやすくしています。

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

次に、私のカスタムtableViewCellで、必要なテキストを送信し、UILabelの属性付き文字列に変換します。

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

tableViewを備えたビューコントローラーでは、セルをviewDidLoad()に登録する必要があります。

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

セルの高さを把握するには、サイズ情報を取得するために使用され、tableViewに追加されないプロトタイプセルを作成します。だから、あなたのビューコントローラの変数で:

var prototypeSummaryCell : MarkerFeltCell? = nil

次に(おそらくオーバーライド-ビューコントローラーによって異なります)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 {  // ...

上記のコードでは、prototypeCellは最初に必要になったときに埋められます。次に、prototypeCellを使用して、自動サイズ設定プロセスを実行した後のセルの高さを計算します。ceil()関数で高さを切り上げる必要があります。ファッジファクターも追加しました。

最後のコードビットは、セルのテキストを構成する方法です。この例では、単に:

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

また、こちらはペン先のショットです。ラベルをセルの端に固定(必要なマージンを使用)しましたが、「より大きい」または「等しい」制約を使用し、下部の制約には「必須」未満の優先度を使用しました。

セルの制約

ラベルのフォントを属性に設定します。実際のIBフォントは問題ではありませんでした。

LabelFont

この場合の結果:

CellResults


0

属性付き文字列の場合、次のようにフォントリストにカスタムフォントを追加できます。-フォントアイコンをクリックすると、次のダイアログが表示されます。次のダイアログで、独自のカテゴリまたはカスタムフォントの既存のカテゴリを追加できます。属性付きフォントダイアログ

[フォントの管理 ]をクリックすると、次のダイアログが開き、作成したカテゴリまたは既存のカテゴリからカテゴリを選択できます。+記号をクリックして、カテゴリにフォントを追加します。 フォントダイアログの管理


0

それはシンプルで迅速な解決策であり、私の場合はそれでうまくいきます。その解決策は、AppDelegate.swiftファイルのdidFinishLaunchingWithOptions funcにコード行を追加することです。

textViewsの場合

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

ラベル用

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

そして、この2つのようなUiViewの残りのために☝️


0

コード内の属性付き文字列にカスタムフォントを適用する場合:で設定してみてくださいviewDidLayoutSubviews。私の間違いはそれをで行っていたのでviewDidLoad、そこでは適用されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.