粗体`<b>`标签和斜体`<i>`标签未应用于自定义字体系列

时间:2015-07-25 12:12:30

标签: html css objective-c iphone nsattributedstring

我使用html<b>代码获得<i>字符串。

inputString = @"<b> Sample bold text </b> Normal Text <i> sample italic </i>";

以下方法将返回输入html字符串的属性文本。

+(NSAttributedString *) returnRichTextForString:(NSString *) inputString {

  NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithData:[inputString dataUsingEncoding:NSUTF8StringEncoding]  options:@{   
        NSDocumentTypeDocumentAttribute:  NSHTMLTextDocumentType,
        NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)
      }
  documentAttributes:nil
  error:nil];

   return attributedString;
}

然后自定义字体大小,系列并将其传递给上述方法。

NSString * strigAfterFontWrapper =  [NSString stringWithFormat:@"<style type='text/css'> body {font-size: %fpx}</style><font face='%@'>%@</font>", fontSize , customFontFamily, inputString];

label.numberOfLines = 0;

NSAttributedString *attributedstring = [NTUtilities returnRichTextForString:strigAfterFontWrapper];

label.attributedText = attributedstring;

但是,<b><i>未在标签上应用!

  

使用默认系统字体时效果很好!任何线索,为什么它失败了   自定义字体的情况?我应该包含哪些内容才能获得bolditalic   ?

2 个答案:

答案 0 :(得分:2)

用我自己的黑客解决了这个问题。在跳转到解决方案之前,我澄清了iOS中新添加的自定义字体的效果。也就是说,如果该字体系列带有现成的Bold / Italic等属性,则会导致上述问题。如果没有,你将面临这样的问题。

解决方案:

EILSEQ方法中,添加以下行以覆盖现有的NSAttributedString属性。

+(NSAttributedString *) returnRichTextForString:(NSString *) inputString

以下[attributedString beginEditing]; [attributedString enumerateAttribute:NSParagraphStyleAttributeName inRange:NSMakeRange(0, attributedString.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { if (value) { NSMutableParagraphStyle *myStyle = (NSMutableParagraphStyle *)value; //Hack for bold effect to custom fonts if (myStyle.minimumLineHeight == 101) { [myStyle setMinimumLineHeight:0]; [attributedString addAttribute:NSStrokeWidthAttributeName value:[NSNumber numberWithFloat:-3.0] range:range]; } //Hack for italic/skew effect to custom fonts if (myStyle.minimumLineHeight == 99) { [myStyle setMinimumLineHeight:0]; [attributedString addAttribute:NSObliquenessAttributeName value:[NSNumber numberWithFloat:0.30] range:range]; } } }]; [attributedString endEditing];

中的标记更新
inputString

因此,在取消上述行之后,最终标记为

<style type='text/css'> b { line-height:101px;} i {line-height:99px;} </style>

下面,

  

诀窍是根据inputString = @"<b> Sample bold text </b> Normal Text <i> sample italic </i><style type='text/css'> b { line-height:101px;} i {line-height:99px;} </style>"; 识别粗体和斜体标签   html中的值,并将其与line-height属性进行比较   款式。即,例如,如果行高101那么它将是   粗体,99然后将其视为斜体。

更新: 当两个都应用于同一文本时,这会失败。为了解决这个问题,我在这里分享了略微修改的逻辑。保持相同的逻辑以识别斜体和粗体我在结束编辑NSAttributedstring属性之前添加了以下行,

minimumLineHeight

和html,

//Hack for bold effect.
[attributedString enumerateAttribute:NSStrikethroughStyleAttributeName inRange:NSMakeRange(0, attributedString.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) {

    if (value) {

        [attributedString addAttribute:NSStrokeWidthAttributeName
                                                 value:[NSNumber numberWithFloat:-3.0] range:range];

        [attributedString addAttribute:NSStrikethroughStyleAttributeName
                                 value:[NSNumber numberWithFloat:0.0] range:range];
    }

}];

我的完整方法如下:

 b { text-decoration:line-through;}

答案 1 :(得分:1)

您应该尝试使用系统字体,以排除自定义字体未正确添加到项目中的可能性。

我曾经遇到过相同的问题,但有标签。

This answer为我解决了这个问题。也许这有助于你。

修改

在iOS应用的how to add custom fonts上发现了一篇非常好的文章