2012-02-09 11 views
12

UILabelのカスタムフォントを使用します。私は[UILabel setFont:]で使用するUIFontCGFontRefに変換することができますどのようCGFontRefをUIFontに変換するには?

NSString *fontPath = ... ; // a TTF file in iPhone Documents folder 
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]); 
CGFontRef customFont = CGFontCreateWithDataProvider(fontDataProvider); 
CGDataProviderRelease(fontDataProvider); 

:カスタムフォントは、ファイルからによってロードされますか?

+2

サポートするiOSのバージョンを教えてください。 Info.plistを編集することで、バンドルされたフォントを 'UIFont'インスタンスとして読み込むことができます。 – Costique

+1

私はCGFontRefをUIFontに変換することについてはわかりませんが、CGFontRefをとるUILabelのサブクラスを作成することができます。この[blog](http://blog.mro.name/2010/08/uilabel-with-a-custom-cgfont/)をチェックしてください。 –

+0

@Costique iOS 4.3以降は問題ありません。フォントは、アプリをダウンロードした後にユーザーによって追加されるため、Info.plistをプリセットすることはできません。 – ohho

答えて

15

コンラッドの答えは近いですが、かなりの作業を行いません。フルネームではなく、PostScript名をUIFontに提供する必要があります。

NSString *fontName = (NSString *)CGFontCopyPostScriptName(fontRef); 
UIFont *font = [UIFont fontWithName:fontName size:someSize] 
+0

+1、正しいスクリプト名を使用する必要があります。それ以外の場合は失敗します。 – ZYiOS

+3

'CGFontCopyPostScriptName'は後で' CFRelease'に 'CFStringRef'を割り当てて返します。返り値をNSStringにキャストすることは、読みやすくするための悪い考えです。 –

3

これらは原則として直接変換できません。 1つの単純な理由は、UIFontがフォントサイズをカプセル化するのに対し、CGFontはサイズに依存しない(サイズはグラフィックスコンテキストのプロパティでCGContextSetFontSize()を参照)。私は実際にこれをテストしていない

NSString *fontName = (NSString *)CGFontCopyFullName(someCGFontRef); 
UIFont *font = [UIFont fontWithName:fontName size:someSize]; 
[fontName release]; 

が、それは(おそらくいくつかのマイナーな追加で)動作するはずです:あなたがそうでなければ、あなたはのようなものにできるはずです、何をしたいフォントサイズを決定したと仮定した場合、

。私は、CGFontとUIFontの名前の間には一致があると信じていますが、そうでない場合、これは明らかに機能しません。

2

CGFontをCTFontに変換することはできますが、残念ながらどちらもUIFontを取得しません。 UIFontを入手する方法は次のとおりです:システムフォントを尋ねるか、PostScript名でフォントを尋ねます。したがって、UILabelのカスタムフォントでは、後者を使用することをお勧めします。

あなたはフォントがあなたのアプリが+ fontWithName、先にあなたのバンドルに追加し、UIFontでそれを読み込むことができ、時間の使用するファイルがわかっている場合:UIFontはそれで、フォントファイルのためのあなたのバンドルを検索して:サイズPostScript名。例えば

は、TrueTypeフォントファイル "VeraMono.ttfは" ポストスクリプト名 "ビットストリームベラなきモノ" を持っているので、それはのようにUILabelにロードされています:

label.font = [UIFont fontWithName:@"Bitstream Vera Sans Mono" size:12];

がPostScript名以外を取得するには動的に、フォントツールを使用するか、上記の場合、PostScript名はFinder> Get Infoで "Full Name"の表示と等しくなります。

しかし、事前にフォントのPostScript名(ユーザ定義フォントのサポートなど)がわからない場合は、ファイル名をNSDataに、grepをPostScript名として読み込むことができます。 。

幸運、

+0

ありがとうございます。あなたの反応は、ジョシュブラウンの答えで、4年後に私を助けました! –

15

あなたは直接CGFontRefUIFontに変換することはできませんが、CTFontManagerRegisterGraphicsFontを使用してCGFontRefを登録してからUIFont対応作成することができます。

NSString* fpath = [documentsDirectory stringByAppendingPathComponent:@"custom_font_file_name.ttf"]; 
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fpath UTF8String]); 
CGFontRef customFont = CGFontCreateWithDataProvider(fontDataProvider); 
CGDataProviderRelease(fontDataProvider); 
NSString *fontName = (__bridge NSString *)CGFontCopyFullName(customFont); 
CFErrorRef error; 
CTFontManagerRegisterGraphicsFont(customFont, &error); 
CGFontRelease(customFont); 
UIFont* uifont = [UIFont fontWithName:fontName size:12]; 
+0

このエラーが発生しましたフォントの読み込みに失敗しました:操作を完了できませんでした。 (com.apple.coretextエラー105 - CGFont 'CGFont(0x89919a0):Melville>'を登録できませんでした) – Durgaprasad

+0

documentsDirectory .. "宣言されていない識別子 'documentsDirectoryを使用しています...どういう意味ですか? ? – Morkrom

+2

エラー105 =フォントは既に登録されています – dulgan

関連する問題