【问题标题】:NSAttributedString - get font attributesNSAttributedString - 获取字体属性
【发布时间】:2013-11-15 09:22:46
【问题描述】:

我需要获取有关我的属性字符串的信息,但不知道如何。我得到了这本字典:

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"]

但是如何获取有关字体的信息,例如字体样式、字体粗细等。

感谢您的帮助

【问题讨论】:

  • 你从哪里得到的字典?它并没有让我觉得它是一个属性字符串。
  • 看起来可能是 attributesAtIndex: 方法的输出
  • 是的,我是从 enumerateAttributesInRange 方法得到的

标签: ios objective-c core-text


【解决方案1】:

字体来自:

UIFont *font = attrs[NSFontAttributeName];

问题在于确定它是否为粗体。没有财产。唯一的选择是查看字体的fontName,看看是否包含“粗体”或其他类似术语。并非所有粗体字体的名称中都包含“Bold”。

同样的问题也适用于确定字体是斜体还是注释。您必须查看fontName 并查找诸如“斜体”或“斜体”之类的内容。

【讨论】:

  • 即使我得到了上面的字典?我的意思是有一个我想要的属性 font-weight 和 font-style 。我只是不知道一个简单的方法来阅读它。所以信息在那里的问题是如何阅读它们。
  • 我相信@adam 有兴趣使用 font.description 来确定各种字体属性(字体粗细、字体大小等)。字体描述不适用于此,将来可能会中断。
  • 字体没有字典。这是UIFont 描述的输出。
  • 最后我使用了这个答案。它更容易完成,正如你所说的更可靠。谢谢
  • 好的,但如果您只支持 iOS 7(或更高版本),那么使用 UIFontDescriptor 会更容易、更可靠。我不知道 iOS 7 中有这个新功能。
【解决方案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's attributes
UIFont *font = attributes[NSFontAttributeName];
UIFontDescriptor *fontProperties = font.fontDescriptor;
NSNumber *sizeNumber = fontProperties.fontAttributes[UIFontDescriptorSizeAttribute];
NSLog(@"%@, FONTSIZE = %f",fontProperties.fontAttributes, [sizeNumber floatValue]);

类似于UIFontDescriptorSizeAttribute,您可以找到文档中提到的其他特征,例如UIFontDescriptorFaceAttributeUIFontDescriptorNameAttribute 等。

【讨论】:

  • 我成功地尝试这样做: UIFontDescriptor *desc = [attrs objectForKey:@"NSFont"];但是当我想记录 fontAttributes 字典时,它会因为无法识别的选择器发送到实例而失败。如何从描述符中获取这些信息?
  • @adam 您必须首先获得UIFont,就像我在回答中显示的那样。然后获取此答案中所示的字体描述符。
  • 感谢@rmaddy,您的回答帮助我完成了我的工作。我在上面编辑了我的答案以反映相同的情况。
  • @Ashok “属性”是什么意思?我无法获取 NSAttributedString 的属性
【解决方案3】:

您可以在此示例中查看如何获取有关属性字符串的信息,该示例检查标签的属性文本的子字符串是否为粗体。

-(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]!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 2021-07-19
      • 2013-03-20
      相关资源
      最近更新 更多