次のコード行を実行して、非ボールド フォントからボールド フォントを生成します。
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)
対応するビットを設定します。mask
value
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);