Добавление полужирного шрифта к UILabel

Я пытаюсь выяснить, как лучше всего выделить и убрать жирный шрифт UILabel со шрифтом, который был определен в построителе интерфейсов.

Я знаю, что могу сделать это, например:

[myLabel setFont:[UIFont boldSystemFontOfSize:14.0]];

Но затем я заставляю шрифт потенциально отличаться (как по стилю, так и по размеру) от того, как он был разработан в IB.

Я ищу что-то, что по существу делает это:

[myLabel setBold:TRUE];

или False, в зависимости от обстоятельств.

Есть ли способ сделать это?


person Nico teWinkel    schedule 25.09.2013    source источник
comment
какой шрифт вы используете?   -  person incmiko    schedule 25.09.2013


Ответы (4)


К сожалению, в UIKit нет настоящего понятия «жирный шрифт». Если вы когда-нибудь попытаетесь установить для части атрибутированной строки значение «Жирный», вы фактически выберете вариант полужирного шрифта в том же семействе шрифтов.

Вы могли бы сделать что-то полухакерское, например:

@implementation UIFont (BoldVariant)

- (UIFont *)boldVariant
{
    for (NSString *fontName in [UIFont fontNamesForFamilyName:self.familyName]) {
        if ([fontName hasSuffix:@"-Bold"]) {
            return [UIFont fontWithName:fontName size:self.pointSize];
        }
    }

    // If we couldn't find it, return the same font.
    return self;
}

@end

Это предполагает, что шрифт следует стандартной схеме именования. Также предполагается, что fontNamesForFamilyName: возвращает любые значения. Я заметил, что с системным шрифтом он возвращает пустой массив.

person Brian Nickel♦    schedule 25.09.2013
comment
Спасибо! Это работает очень хорошо, и спасибо за включение примера кода. В итоге я возвращал полужирный системный шрифт, если ничего не было найдено, что также охватывает случай, когда шрифт изначально является системным, а массив пуст: return [UIFont boldSystemFontOfSize:self.pointSize]; - person Nico teWinkel; 25.09.2013

Если вы используете, например, системный шрифт Helvetica, вы можете выделить label.text полужирным шрифтом следующим образом:

myLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:14];

Вы можете найти шрифты iOS, например, на этом сайте: ссылка

person incmiko    schedule 25.09.2013
comment
Это именно то, чего я пытаюсь избежать, так как мне нужна гибкость использования с любой меткой, и я хочу иметь возможность менять шрифты в дизайнере IB без необходимости искать соответствующие изменения кода. Но спасибо за помощь :) - person Nico teWinkel; 25.09.2013

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

Как насчет этого?

Получить текущий шрифт из метки, используя его свойство шрифта.

Получите имя семейства шрифтов для этого шрифта.

Запросите у семейства шрифтов список шрифтов, используя пользовательский интерфейс fontNamesForFamilyName.

Посмотрите, сможете ли вы найти полужирный шрифт в списке шрифтов, которые вы получите обратно. Если это так, запросите этот шрифт с вашим текущим размером шрифта. Если нет, используйте полужирный системный шрифт текущего размера. (Возможно, вам придется проанализировать имена шрифтов в поисках слова «жирный» в названии. Тьфу.)

Не идеально, но вы должны быть в состоянии заставить его работать.

person Duncan C    schedule 25.09.2013
comment
хех, да, я тоже об этом подумал, но кажется таким неуклюжим искать слово жирный. Я надеялся, что будет способ получить подробную информацию о шрифте, который укажет, что это жирный вариант. Спасибо за помощь :) - person Nico teWinkel; 25.09.2013

Мне удалось найти красивое и понятное решение:

extension UIFont {

    /// Returns same font but with specific `symbolicTraits`.
    func with(symbolicTraits: UIFontDescriptor.SymbolicTraits) -> UIFont {
        let descriptor = fontDescriptor.withSymbolicTraits(symbolicTraits) ?? fontDescriptor
        return UIFont(descriptor: descriptor, size: pointSize)
    }
}

Применение:

label.font = label.font.with(symbolicTraits: .traitBold)

Или, если вы хотите смешать несколько черт:

label.font = label.font.with(symbolicTraits: [.traitBold, .traitItalic) // возвращает тот же шрифт (название и размер), но жирный и курсивный.

person Palli    schedule 04.06.2020