Objective-C - CTFont изменить стиль шрифта? - PullRequest
1 голос
/ 21 сентября 2011

У меня есть CTFont, который содержит стиль шрифта и черты характера.

Я хочу создать новый шрифт с новым стилем, который наследует символические черты первого шрифта. Как мне этого добиться?

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

новый шрифт здесь нулевой Я не знаю, что я должен передать параметру 4th в CTFontCreateCopyWithSymbolicTraits.

1 Ответ

9 голосов
/ 21 сентября 2011

Я делаю эту строку кода, чтобы создать жирный шрифт из не жирного шрифта:

CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits(currentFont, 0.0, NULL, (wantBold?kCTFontBoldTrait:0), kCTFontBoldTrait);
  • currentFont - это CTFontRef Я хочу добавить символические черты к
  • wantBold - логическое значение, указывающее, хочу ли я добавить или удалить жирную черту шрифта
  • kCTFontBoldTrait - это символическая черта, которую я хочу изменить в шрифте.

4-й параметр - это значение, которое вы хотите применить. Пятая - это маска для выбора символической черты.


Вы можете использовать битовую маску для символической черты, где 4-й параметр CTFontCreateCopyWithSymbolicTraits является значением, а 5-й параметр является маской:

  • Если вы хотите установить symtrait и добавить его к шрифту, iOS, вероятно, будет применять sthg наподобие newTrait = oldTrait | (value&mask), устанавливая бит, соответствующий mask, в значение value.
  • Если вы хотите сбросить symtrait и удалить его из шрифта, вы будете использовать значение 0 в качестве 4-го параметра, и iOS, вероятно, применит sthg, например newTrait = oldTrait & ~mask, чтобы сбросить бит .

  • Но если вам нужно, вы также можете устанавливать и сбрасывать несколько битов (таким образом, несколько символьных признаков) одновременно, используя правильное значение value, для которого нужно установить 1 бит и 0 для сброса бит (или игнорировать), и и используя правильные mask, которые имеют 1 на биты, которые необходимо изменить, и 0 на биты, которые не нужно изменять.


[EDIT2]

Мне наконец-то удалось найти решение для вашего конкретного случая: вам нужно получить маску symtraits вашего font, как вы уже делаете ... и побитовую - или ее с символами вашего newFontWithoutTraits шрифт.

Это потому, что newFontWithoutTraits на самом деле do имеют symtraits по умолчанию (в отличие от того, что я думал, оно имеет ненулевое значение CTFontSymbolicTraits), так как значение symtraits также содержит информацию для класса шрифта и такие вещи (чтобы даже не выделенный жирным шрифтом, не курсивный шрифт мог иметь ненулевое значение symtraits, запишите шестнадцатеричное значение symtraits вашего шрифта для лучшего понимания).

Итак это код, который вам нужен :

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);
...