otfまたはttfファイルからフォント名を取得するにはどうすればよいですか?


83

以前のアプリでカスタムフォントを使用しました。

ファイル名は「ProximaNova-Regular.otf」で、使用したフォントをロードするために...

[UIFont fontWithName:@"ProximaNova-Regular" size:20];

これは完璧に機能しました。

この新しいアプリには、3つのフォントファイルがあります...

Dude_Willie.otf
Impact
handsean.ttf

しかし、これらをロードする方法がわかりません。

私が試してみました

[UIFont fontWithName:<the file name> size:20];

しかし、これはHelveticaの使用にフォールバックします。

使用する名前を見つけるにはどうすればよいですか?


最初の関連する質問にリストされているアプローチの何が問題になっていますか?
borrrden 2013年


「最初の重複した質問の何が問題になっていますか?」それは私に何も教えてくれません。[UIFont familyNames]を印刷しましたが、どれも私のフォントに関連していません。
フォグマイスター2013年

1
次に、フォントが正しくインストールされません
borrrden 2013年

ガー!私は... Info.plistファイルにそれらを追加していなかった
Fogmeister

回答:


85

次の4つの簡単な手順に従って、iOSアプリに新しいフォントを追加して使用します。

  • your_new_font.ttfまたはyour_new_font.otfをXcodeプロジェクトに追加します
  • プロジェクトのInfo.plistでは、のために新しいエントリを追加your_new_font.ttfまたはyour_new_font.otfUIAppFonts配列(この1のためのプレーンテキストは、「アプリケーションが提供するフォント」です)
  • この時点で、この一時的なデバッグコードのチャンクを追加して、新しく追加したyour_new_fontを含め、アプリからアクセスできるすべてのフォントをダンプすることをお勧めします。

//迅速

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

// Objective-c

for(NSString *fontfamilyname in [UIFont familyNames]) {
    NSLog(@"family:'%@'",fontfamilyname);
    for(NSString *fontName in [UIFont fontNamesForFamilyName:fontfamilyname]) {
        NSLog(@"\tfont:'%@'",fontName);
    }
    NSLog(@"-------------");
}
  • デバッグ出力で、新しいフォントの「ファミリ」と「フォント」の名前を探します。新しいフォントファミリーに対応する「フォント」名として表示されているもの(新しいフォント「ファミリー」に関連付けられた「フォント」が複数存在する可能性があります)を渡すUIFont *myNewFont = [UIFont fontWithName:@"font_name_from_debug_output" size:20]と、ビジネスを開始できます。

2
ありがとう、あなたは私の日を救った
Yahya Alshaar 2018年

123

TTFを右クリック->情報を見る

「フルネーム」はあなたが探しているものです。

それがTTFで私のために働いたものです。

編集:

GetInfoの「フルネーム」とは異なる名前のフォントを使用しました。

この回答をまとめるには、上記のクイックチェックが機能しない場合は、プロジェクトで次のコードを実行します。

for (NSString *fontFamilyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:fontFamilyName]) {
        NSLog(@"Family: %@    Font: %@", fontFamilyName, fontName);
    }
}

そして、使用したいフォントの正しい名前を検索します。

Swift 3.0コード:

for fontFamilyName in UIFont.familyNames{
    for fontName in UIFont.fontNames(forFamilyName: fontFamilyName){
        print("Family: \(fontFamilyName)     Font: \(fontName)")
    }
}

それは本当にフォントのメーカーに依存します。クライアントから受け取った恐ろしいフォントがいくつかありましたが、iOSで使用されると、フォント名は非常に任意になります。フォントの1つでこの方法を試しましたが、失敗しました。
borrrden 2013年

@borrrdenこれまでのところ、この方法は毎回うまくいきました。私は自分でフォントを作成したことがないので、あなたが正しいかもしれません、私は知りません。
Segev 2013年

よくできたフォントで機能する可能性があります。私たちが入手したフォントは約20年前に作成されました(それは悪かったです...)。ただし、確認する唯一の方法は、システムに問い合わせることです。
borrrden 2013年

3
おかげで、これはinfo.plistファイルにフォントを正しくインストールした後に機能しました。
フォグマイスター2013年

6
これはすべてのフォントで機能するわけではありません。たとえば、コード内のファミリが「ProximaNova-Regular」の場合、「FullName」の値は「ProximaNovaRegular」と表示されます
rrbrambley 2014

58
  • フォントをインストールします
  • MacでFontBookアプリを開きます
  • フォントを選択し、「情報」ボタンをクリックします
  • あなたが探している名前PostScript名です
    • MacOS:表示->フォント情報を表示

例


5
最も簡単な方法のようです
Eyal Alsheich 2017

6
fwiw、詳細を表示するには、[表示]> [フォント情報の表示]に移動する必要がありました。私のマシンでデフォルトでオフになっている理由がわかりません。
マークロブソン

41

iOSでフォントを使用するには、フォントのフルネーム(PostScript名)に基づいてフォントをロードする必要があります。これは、フォントの実際のファイル名とは異なる場合があります(通常は異なります)。

フォントファイル「Arial-regular.ttf」の名前を「foo.ttf」に変更することを想像してみてください。名前を変更したばかりのフォントファイルに含まれているフォントは、引き続き「Arial-regular」です。

このスレッドですでにフォント名を取得するための優れたプログラムによる方法がいくつかありますが、コマンドラインを使用した別のアプローチがあります。

MacまたはLinuxを使用している場合は、カスタムフォントがあるディレクトリのコマンドラインからこのスクリプトを実行するだけです(おそらくすでにインストールされているfontconfigfc-scanユーティリティを使用しますが、そうでない場合は自作でインストールできます:) :brew install fontconfig

for file in "$arg"*.{ttf,otf}; do fc-scan --format "%{postscriptname}\n" $file; done

これが私の~/Library/Fontsディレクトリで実行されている上記のコマンドのスクリーンショットです:

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

上記のスクリプトは、現在のディレクトリ内のすべてのファイル.ttf.otfファイルを実行し、XCodeまたは他の場所でフォントファイルを参照するために使用できる各フォントのPostScript名を出力します。

追加情報(PostScriptName、Filename)と色分けを使いたい場合は、次の代替スクリプトを実行できます。

for file in "$arg"*.{ttf,otf}; do 
    postscriptname=$(fc-scan --format "%{postscriptname}\n" $file);
    printf "\033[36m PostScript Name:\033[0m %s \e[90m(%s)\033[0m\n" "$postscriptname" "$file";
done

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

これは、AppDelegate.mファイル内にコードをコピーして貼り付けて、新しいフォントファイルを追加するたびに名前を印刷するよりも少し高速です。これは、一般的な方法です。また、FontBookでフォントを開くよりも高速です。 PostScript名を調べます。

役立つヒント:ターミナルで上記のスクリプトにエイリアスを設定して、現在のディレクトリ内のすべてのファイルのすべてのPostScriptフォント名を取得するために1つのコマンドを入力するだけの場合(私の関数が呼び出されるfontnamesので、すべての作業を行う必要があります)はfontnames、フォントを含むディレクトリ内のターミナルで入力すると、PostScript名が自動的に出力されるため、開発ワークフローの時間を節約し、この便利なスクリプトを必要なときにすぐに使用できるようになります。

お役に立てれば!


私はMacを使用しています。提供されたリンクからfontConfigをダウンロードしました。しかし、非常に多くのファイルが含まれています。それを使用する方法、またはfontConfigをMacにインストールする方法。
Sujay UN 2017

@SujayUN Macを使用している場合は、fc-scanユーティリティがすでにインストールされている可能性があります。fc-scan -Vターミナルで実行するとどうなりますか?
ラジオビジュアル2017年

3
homebrew経由でfontConfigをインストールすることもできます:brew install fontconfig
ラジオビジュアル2017年

ur cmd -bash:fc-scan:command not foundを実行すると、これが発生します
Sujay UN 2017

マシンにインストールされていない場合は、Homebrew経由でインストールすることをお勧めします。上記の私のコメントにあるHomebrewとinstallコマンドへのリンクを参照してください。
ラジオビジュアル2017年

6

あなたはこれのために名前を取得する方法を知りたいです:-

  NSArray *familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]];

  for (NSInteger indFamily=0; indFamily<[familyNames count]; ++indFamily) 
  {
        NSLog(@"Family name: %@", [familyNames objectAtIndex:indFamily]);

        NSArray *fontNames = [[NSArray alloc] initWithArray:
              [UIFont fontNamesForFamilyName:[familyNames objectAtIndex:indFamily]]];

        for (NSInteger indFont=0; indFont<[fontNames count]; ++indFont) 
        {
              NSLog(@"    Font name: %@", [fontNames objectAtIndex:indFont]);
        }
  }

それがあなたを助けることを願っています...


6

プログラムで特定のフォントファイルのフォント名を検索する場合:

import Foundation

func loadFontName(for file: URL) throws -> String {
    let data = try Data(contentsOf: file)

    guard let provider = CGDataProvider(data: data as CFData) else {
        throw Error("Could not create data provider")
    }

    guard let font = CGFont(provider) else {
        throw Error("Could not load font")
    }

    guard let name = font.postScriptName else {
        throw Error("Could not get font name from font file")
    }

    return name as String
}

Error必要に応じて、独自のスロー可能なオブジェクトと交換してください。


5

Swift 3.0

for familyName in UIFont.familyNames {
        for fontName in UIFont.fontNames(forFamilyName: familyName ) {
            print("\(familyName) : \(fontName)")
        }
    }

5

Swift4.0 +ソリューション

    for fontFamilyName in UIFont.familyNames {
        print("family: \(fontFamilyName)\n")

        for fontName in UIFont.fontNames(forFamilyName: fontFamilyName) {
            print("font: \(fontName)")
        }
    }

出力します:

ファミリー:Apple SD Gothic Neo

フォント:AppleSDGothicNeo-薄い

フォント:AppleSDGothicNeo-Light


4

プロジェクト/アプリにフォントを追加した後、アプリで使用可能なすべてのフォントを印刷するために、このコードを追加します(おそらくアプリデリゲートのdidFinishLaunchingWithOptionsメソッドに)。そのリストの中から、あなたが探しているフォントを識別できるはずです。後で不要なコードを削除することを忘れないでください。

for (NSString *fontFamilyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:fontFamilyName]) {
        NSLog(@"Family: %@    Font: %@", fontFamilyName, fontName);
    }
}

3

otfinfo --info arial.ttfを使用して、コマンドラインから名前を取得することもできます。追記名は、UIFontコンストラクターに渡す必要がある名前です。


3

スイフト1.2:

    for familyName in UIFont.familyNames() {
        for fontName in UIFont.fontNamesForFamilyName(familyName as! String) {
            println("\(familyName) : \(fontName)")
        }
    }

2

エミュレーターまたはデバイスのいずれかに存在するすべてのデフォルトフォントをスキャンする必要のないもう1つの「迅速で実用的な」ハックは、のフォントを使用することですstoryboard。次に、テキストエディタ(として開くsource code)でストーリーボードを編集する場合、「customFonts」タグを検索すると、「内部」名で使用されるフォントを確認できます。

<customFonts key="customFonts">
    <array key="Linotype - AvenirNextLTPro-Bold.otf">
        <string>AvenirNextLTPro-Bold</string>
    </array>
    <array key="Linotype - AvenirNextLTPro-Regular.otf">
        <string>AvenirNextLTPro-Regular</string>
    </array>
    <array key="TradeGothicLTPro-BdCn20.otf">
        <string>TradeGothicLTPro-BdCn20</string>
    </array>
</customFonts>

1

フォントファイルのfamilyNamesをログに記録してから、フォントにアクセスします。

// You can log all font family names suing **fontNamesForFamilyName**

NSLog(@" font name %@", [UIFont fontNamesForFamilyName:@"the file name"]);

それがあなたを助けることを願っています。


うまくいかないようです-ファイル名がフォントファミリー名と異なる場合は失敗します
Blitz

getinfoでフォント名を取得する必要があります。
Nishant Tyagi 2014

0

以下のためのリストのフォント名や家族のMacOSスウィフト4.1

NSFontManager.shared.availableFonts.map { print($0) }
NSFontManager.shared.availableFontFamilies.map { print($0) }

-2

Swift4.0をサポート

これは、すべてのフォントファミリとそのフォント名を印刷するための1行のコードです。

override func viewDidLoad() {
    super.viewDidLoad()
    //Main line of code
    UIFont.familyNames.sorted().forEach({ print($0); UIFont.fontNames(forFamilyName: $0 as String).forEach({print($0)})})
}

質問を読んでください。
フォグマイスター2018年

@Fogmeisterあなたの受け入れられた答えはこれと同じです。それが私がこのコードをより短い方法で書く理由です。
NiravS18年

この行は、TTFまたはOTFファイルを読み込んでフォントファミリを与え、それがすべてのフォント名です。.. @Fogmeister
NiravS

受け入れられた答えがあなたのものと同じであるならば...なぜあなたはこれを書いているのですか?すでに存在するものを編集するだけです(それが編集ボタンの目的です)。マイナーで重要でない変更に対する回答をコピーして貼り付けて、他の人の担当者ポイントを盗もうとしないでください。受け入れられた質問を、フォントを正しくインストールする方法を示す最近の質問に変更しました。ありがとう
フォグマイスター2018年

また、あなたの答えは「たった1行のコード」ですが、それはほとんど読めません。複数の行があり、簡単にスキャンして何をしているのかを確認できる回答が必要です。
フォグマイスター2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.