Как создать полужирный 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)
}