NSAttributedString - get font attributes

Deadly 提交于 2019-12-10 01:44:23

问题


I need to get info about my attributed string but can't figure out how. I'm getting this dictionary:

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;
}

It is easy to check the underline with:

[attrs objectForKey:@"NSUnderline"]

But how to get info about font like the font-style, font-weight etc.

Thanks for any help


回答1:


You get the font from:

UIFont *font = attrs[NSFontAttributeName];

The issue is determining whether it is bold or not. There is no property for that. The only option is to look at the fontName of the font and see if contains "Bold" or some other similar term. Not all bold fonts have "Bold" in the name.

The same issue applies for determining of the font is italic or note. You have to look at the fontName and look for things like "Italic" or "Oblique".




回答2:


UIFont has fontDescriptor starting iOS7 so you can try out that..

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

Usage:

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

Similar to UIFontDescriptorSizeAttribute you can find other traits like UIFontDescriptorFaceAttribute, UIFontDescriptorNameAttribute etc as mentioned in the docs.




回答3:


You can see how to get info about your attributed string in this example that checks if a substring of the attributedText of a label is BOLD.

-(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:


A update running iOS 10.0 swift 3.0 and the code Ashok solution has become something along these lines.

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


来源:https://stackoverflow.com/questions/19773129/nsattributedstring-get-font-attributes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!