1

フォント スタイルとサンボリック特性を含む CTFont があります。

最初のフォントの記号特性を継承する新しいスタイルの新しいフォントを作成したいと考えています。どうすればこれを達成できますか?

CTFontRef newFontWithoutTraits = CTFontCreateWithName((CFString)newFontName, CTFontGetSize(font), NULL);
CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits(newFontWithoutTraits, CTFontGetSize(font), NULL, 0, CTFontGetSymbolicTraits(font));

4th新しいフォントはここでは null です。 のパラメーターに何を渡せばよいかわかりませんCTFontCreateCopyWithSymbolicTraits

4

1 に答える 1

9

次のコード行を実行して、非ボールド フォントからボールド フォントを生成します。

CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits(currentFont, 0.0, NULL, (wantBold?kCTFontBoldTrait:0), kCTFontBoldTrait);
  • currentFont記号特性を追加しCTFontRefたい
  • wantBoldフォントに太字の特性を追加または削除するかどうかを伝えるブール値です
  • kCTFontBoldTraitフォントで変更したい記号特性です。

4 番目のパラメーターは、適用する値です。5 番目は、記号特性を選択するためのマスクです。


シンボリック トレイトに適用するビットマスクと考えることができます。ここで、 の 4 番目のパラメーターCTFontCreateCopyWithSymbolicTraitsは値で、5 番目のパラメーターはマスクです。

  • symtrait を設定してフォントに追加したい場合、iOS はおそらく のように sthg を適用し、 の値にnewTrait = oldTrait | (value&mask)対応するビットを設定します。maskvalue
  • symtrait の設定を解除してフォントから削除する場合は、4 番目のパラメーターとして 0 の値を使用します。iOS は、ビットの設定を解除するように sthg を適用する可能性がnewTrait = oldTrait & ~maskあります。

  • ただし、必要に応じて、設定するビットvalueに 1 を設定し、設定を解除する (または無視する) ビットに 0 を持つ権利を使用して、一度に複数のビット (したがって、複数の記号特性) を設定および設定解除することもできます。mask変更する必要があるビットが 1 で、変更する必要がないビットが 0 です。


[編集2]

私は最終的にあなたの特定のケースの解決策を見つけることができました.fontあなたはあなたがすでに行っているようにあなたのsymtraitsマスクを取得する必要がありますnewFontWithoutTraits.

これは、symtraits の値にはフォント クラスなどの情報も含まれているため、newFontWithoutTraits実際にデフォルトの symtraits があるためです (私が考えていたのとは反対に、ゼロ以外の値を持っています)。CTFontSymbolicTraitsゼロ以外の symtraits 値を持っている場合は、フォントの symtraits の 16 進値を記録して理解を深めてください)。

だから、これはあなたが必要とするコードです

CTFontRef font = CTFontCreateWithName((CFStringRef)@"Courier Bold", 12, NULL);
CGFloat fontSize = CTFontGetSize(font);
CTFontSymbolicTraits fontTraits = CTFontGetSymbolicTraits(font);
CTFontRef newFontWithoutTraits = CTFontCreateWithName((CFStringRef)@"Arial", fontSize, NULL);
fontTraits |= CTFontGetSymbolicTraits(newFontWithoutTraits);
CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits(newFontWithoutTraits, fontSize, NULL, fontTraits, fontTraits);

// Check the results (yes, this NSLog create leaks as I don't release the CFStrings, but this is just for debugging)
NSLog(@"font:%@, newFontWithoutTraits:%@, newFont:%@", CTFontCopyFullName(font), CTFontCopyFullName(newFontWithoutTraits), CTFontCopyFullName(newFont));

// Clear memory (CoreFoundation "Create Rule", objects needs to be CFRelease'd)
CFRelease(newFont);
CFRelease(newFontWithoutTraits);
CFRelease(font);
于 2011-09-20T22:01:23.733 に答える