4

我正在将一个简单的 HTML 加载到 NSTextView 中。我已经为 NSTextView 设置了字体属性,但是 HTML 的加载会忽略这些字体,并且默认始终为“Times-Roman 12 大小”。目前我正在枚举属性并设置字体大小。但是仅仅为了改变大小而这样做似乎很昂贵。这是唯一的方法吗?有没有更好的办法?

HTML:

<p>This is just a <b>title</b></p>

将 HTML 加载到 NSTextView 并随后更改字体大小:

    NSData *valueInDataFormat = [bodyContent dataUsingEncoding:NSUTF8StringEncoding];
    NSAttributedString *textToBeInserted = [[NSAttributedString alloc] initWithHTML:valueInDataFormat documentAttributes:nil];

    NSDictionary *rtfTextAttributes = [self defaultTextAttributesFor:RTFText];
    //inserttext mimic what user do; so it takes the typingattributes
    //ref: http://www.cocoabuilder.com/archive/cocoa/113938-setting-default-font-of-an-nstextview.html#114071
    [entryContent setString:@""];
    [entryContent setTypingAttributes:rtfTextAttributes];
    [entryContent insertText:textToBeInserted];

    //now change font size
            NSTextStorage *content = [entryContent textStorage];
            [content beginEditing];
            NSRange totalRange = NSMakeRange (0, content.length);

            [content enumerateAttributesInRange: totalRange
                                                 options: 0
                                              usingBlock: ^(NSDictionary *attributes, NSRange range, BOOL *stop) {
                                                  NSLog (@"range: %@  attributes: %@",
                                                         NSStringFromRange(range), attributes);

                                                  NSFont *font = [attributes objectForKey:NSFontAttributeName];
                                                  if (font){
                                                      [content removeAttribute:NSFontAttributeName range:range];
                                                      font = [[NSFontManager sharedFontManager] convertFont:font toSize:[font pointSize] + 3];
                                                      [content addAttribute:NSFontAttributeName value:font range:range];
                                                  }
                                              }];
            [content endEditing];
            [entryContent didChangeText];
4

2 回答 2

3

最近遇到这个问题,最后发现可以<style>在HTML内容的前面使用一个block,并将其设置font-family为系统默认值。这很好用,允许 HTML 在使用系统字体时描述所有粗体和斜体属性。

NSString* bodyContent = @"<p>This is just a <b>title</b></p>";

NSMutableString *htmlContent = [NSMutableString string];
[html appendString: @"<style>body { font-family: "];
[html appendString: [[NSFont systemFontOfSize: 12] fontName]];
[html appendString: @"; }</style>"];
[html appendString: bodyContent];

NSData *htmlData = [htmlContent dataUsingEncoding:NSUTF8StringEncoding];
NSAttributedString *html = [[NSAttributedString alloc] initWithHTML: htmlDescriptionData baseURL: NULL documentAttributes: NULL];

可能有一个更优雅的解决方案,但我还没有找到它。

于 2013-05-07T22:04:10.377 回答
2

您可以使用WebPreferences对象来控制从 HTML 创建属性字符串时使用的字体。

该方法-initWithHTML:options:documentAttributes:需要一个options字典。该字典的公认键之一是NSWebPreferencesDocumentOption. 该值是WebPreferences解释 HTML 时使用的实例。

一个WebPreferences实例有几个字体系列设置。在 HTML 中没有指定其他字体属性时使用的字体是-standardFontFamily. 如果 HTML 指定了字体类(例如“sans-serif”)但没有指定特定字体,则使用该字体类的设置(例如-sansSerifFontFamily)。

WebPreferences也有字体大小的设置。

例如:

WebPreferences *webPreferences = [[WebPreferences alloc] initWithIdentifier:@"com.company.app.something"];
webPreferences.standardFontFamily = [someFont familyName]; // or a hard-coded family name like @"Helvetica Neue"
webPreferences.defaultFontSize = [NSFont systemFontSize];
...
[[NSAttributedString alloc] initWithHTML:htmlData
                                 options:@{NSWebPreferencesDocumentOption : webPreferences}
                      documentAttributes:NULL];

有一个警告:系统字体是一个隐藏在WebPreferences/中的系列NSAttributedString。在小牛队,它的名字是“.Lucida Grande UI”;在优胜美地,它的名字是“.Helvetica Neue UI”。由于某种原因,在使用对象将 HTML 转换为属性字符串时,不能使用这些WebPreferences。我最好的猜测是,这是因为它们没有列在[[NSFontManager sharedFontManager] availableFontFamilies]. 当您尝试使用这样的字体系列时,系统默认为 Times(糟糕!)。

于 2014-08-08T02:57:48.790 回答