Как создать полужирный UIFont из обычного UIFont?
Если у меня есть объект UIFont
, можно ли его преобразовать в полужирный? Я не знаю имя шрифта, у меня просто есть объект UIFont. Я хочу, чтобы функция
UIFont *boldFontFromFont(UIFont *input)
{
return [input derivedFontWithFontWeight:UIFontWeightBold];
}
Как я могу изменить код так, чтобы он работал. (Код выше не работает, я просто сделал это, чтобы проиллюстрировать суть.)
Заранее спасибо.
Ответы
Ответ 1
Чтобы получить жирный шрифт, вам нужно передать определенное имя шрифта из семейства шрифтов. Вы можете получить фамилию шрифта из данного шрифта, а затем перечислить все шрифты из этого семейства. В общем, жирный шрифт будет содержать "полужирный" от его имени, но формат не является строгим, и, например, могут быть такие варианты, как "Helvetica-BoldOblique". Вы можете начать с этого кода:
- (UIFont *)boldFontFromFont:(UIFont *)font
{
NSString *familyName = [font familyName];
NSArray *fontNames = [UIFont fontNamesForFamilyName:familyName];
for (NSString *fontName in fontNames)
{
if ([fontName rangeOfString:@"bold" options:NSCaseInsensitiveSearch].location != NSNotFound)
{
UIFont *boldFont = [UIFont fontWithName:fontName size:font.pointSize];
return boldFont;
}
}
return nil;
}
Ответ 2
iOS 7 представляет новый класс UIFontDescriptor, который делает его намного проще:
UIFont *font = [UIFont fontWithName:@"Helvetica Neue" size:12];
NSLog(@"plain font: %@", font.fontName); // 'HelveticaNeue'
UIFont *boldFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold] size:font.pointSize];
NSLog(@"bold version: %@", boldFont.fontName); // 'HelveticaNeue-Bold'
UIFont *italicFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic] size:font.pointSize];
NSLog(@"italic version: %@", italicFont.fontName); // 'HelveticaNeue-Italic'
UIFont *boldItalicFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold | UIFontDescriptorTraitItalic] size:font.pointSize];
NSLog(@"bold & italic version: %@", boldItalicFont.fontName); // 'HelveticaNeue-BoldItalic'
Для людей, которые пришли сюда в поисках эквивалента cocoa (macOS), UIFontDescriptor
взята из NSFontDescriptor
, доступного с 10.3.
Ответ 3
И если вы ищете быструю реализацию:
let normalFont = UIFont(name: "FONT_NAME", size: CGFloat(20))!
let boldFont = UIFont(descriptor: normalFont.fontDescriptor.withSymbolicTraits(.traitBold)!, size: normalFont.pointSize)
Надеюсь это поможет! Ура!
Ответ 4
Попытка вывести жирный/курсивный шрифт с использованием шрифтов или фамилий уже не работает корректно с iOS 7 из-за загадочного имени семейства шрифтов. Ниже приведено простое расширение для вывода жирного/курсивного шрифта с использованием класса UIFontDescriptor.
+(UIFont *) font:(UIFont *)font bold:(BOOL)bold italic:(BOOL)italic
{
NSUInteger traits = 0;
if (bold)
{
traits |= UIFontDescriptorTraitBold;
}
if (italic)
{
traits |= UIFontDescriptorTraitItalic;
}
return [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:traits] size:font.pointSize];
}
Ответ 5
Вы можете использовать
[UIFont boldSystemFontOfSize:12].
Если вы используете пользовательские шрифты, вы должны использовать имя напрямую
[UIFont fontWithName:@"Helvetica-Bold" size:17.0].
Вы можете найти возможные имена шрифтов с помощью
[UIFont fontNamesForFamilyName:@"American Typewriter"].
В этом сообщении: fooobar.com/questions/2655972/... Ben M есть идея, как получить смелую версию динамически. Но расширьте этот метод, чтобы получить полужирную версию (если она существует), потому что есть и другие жирные версии, такие как CondensedBold.
Ответ 6
Поскольку этот вопрос всплывает при поиске смелых UIFonts в Swift, вот свежий ответ:
extension UIFont {
/// Returns a new font in the same family with the given symbolic traits,
/// or 'nil' if none found in the system.
func withSymbolicTraits(_ traits: UIFontDescriptor.SymbolicTraits) -> UIFont? {
guard let descriptorWithTraits = fontDescriptor.withSymbolicTraits(traits)
else { return nil }
return UIFont(descriptor: descriptorWithTraits, size: 0)
}
}
Пример:
myFont.withSymbolicTraits(.taitBold) // returns the bold version of myFont
Ответ 7
Это очень старая тема, но кто-то может быть заинтересован в том, как сделать это в Swift 5 в настоящее время.
Просто так:
var font: UIFont = UIFont.systemFont(ofSize: 18)
if let newDescriptor = font.fontDescriptor.withSymbolicTraits(.traitBold) {
font = UIFont(descriptor: newDescriptor, size: font.pointSize)
}