NSAttributedString - получить атрибуты шрифта

Мне нужно получить информацию о моей атрибутной строке, но не могу понять, как это сделать. Я получаю этот словарь:

2013-11-04 18:06:10.628 App[1895:60b] {
    NSColor = "UIDeviceWhiteColorSpace 0.3 1";
    NSFont = "<UICTFont: 0x17d8d4c0> font-family: \".HelveticaNeueInterface-MediumP4\"; font-weight: bold; font-style: normal; font-size: 17.00pt";
    NSUnderline = 0;
}

Легко проверить подчеркивание с помощью:

[attrs objectForKey:@"NSUnderline"]

Но как получить информацию о шрифте, например, стиль шрифта, шрифт и т.д.

Спасибо за любую помощь

Ответ 1

Вы получаете шрифт от:

UIFont *font = attrs[NSFontAttributeName];

Проблема заключается в определении того, выделен ли он или нет. Для этого нет никакой собственности. Единственный вариант - посмотреть на fontName шрифта и посмотреть, содержит ли он "Жирный шрифт" или какой-либо другой подобный термин. Не все жирные шрифты имеют "Bold" в названии.

Эта же проблема применяется для определения шрифта курсивом или примечанием. Вы должны смотреть на fontName и искать такие вещи, как "Курсив" или "Наклон".

Ответ 2

UIFont имеет функцию fontDescriptor, начиная с iOS7, чтобы вы могли попробовать это.

// Returns a font descriptor which describes the font.
    - (UIFontDescriptor *)fontDescriptor NS_AVAILABLE_IOS(7_0);

Использование:

// To get font size from attributed string attributes
UIFont *font = attributes[NSFontAttributeName];
UIFontDescriptor *fontProperties = font.fontDescriptor;
NSNumber *sizeNumber = fontProperties.fontAttributes[UIFontDescriptorSizeAttribute];
NSLog(@"%@, FONTSIZE = %f",fontProperties.fontAttributes, [sizeNumber floatValue]);

Подобно UIFontDescriptorSizeAttribute, вы можете найти другие черты, такие как UIFontDescriptorFaceAttribute, UIFontDescriptorNameAttribute и т.д., как указано в документах.

Ответ 3

Вы можете увидеть, как получить информацию о вашей атрибутной строке в этом примере, которая проверяет, является ли подстрока атрибутаText метки ярлыком.

-(BOOL)isLabelFontBold:(UILabel*)label forSubstring:(NSString*)substring
{
    NSString* completeString = label.text;
    NSRange boldRange = [completeString rangeOfString:substring];
    return [self isLabelFontBold:label forRange:boldRange];
}

-(BOOL)isLabelFontBold:(UILabel*)label forRange:(NSRange)range
{
    NSAttributedString * attributedLabelText = label.attributedText;

    __block BOOL isRangeBold = NO;

    [attributedLabelText enumerateAttribute:NSFontAttributeName inRange:range options:0 usingBlock:^(UIFont *font, NSRange range, BOOL *stop) {
        if (font) {
            if ([self isFontBold:font]){
                isRangeBold = YES;
            }
        }
    }];

    return isRangeBold;
}

-(BOOL)isFontBold:(UIFont*)font
{
    UIFontDescriptor *fontDescriptor = font.fontDescriptor;
    UIFontDescriptorSymbolicTraits fontDescriptorSymbolicTraits = fontDescriptor.symbolicTraits;
    BOOL isBold = (fontDescriptorSymbolicTraits & UIFontDescriptorTraitBold) != 0;
    return isBold;
}

Ответ 4

Обновление под управлением iOS 10.0 swift 3.0 и решение Ashok кода стали чем-то вроде этого.

let fontDescription = focus.font?.fontDescriptor
let fontAttributes = fontDescription!.fontAttributes[kCTFontNameAttribute as String]!