2012-10-29 61 views
4

我正在將一個簡單的HTML加載到NSTextView中。我已經爲NSTextView設置了字體屬性,但是HTML的加載忽略了這些字體,默認值始終爲'Times-Roman 12 size'。目前我正在枚舉屬性並設置字體大小。但爲了改變尺寸,這樣做似乎很昂貴。這是唯一的方法嗎?有沒有更好的辦法?在將HTML加載到NSTextView時設置默認字體和大小

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

回答

3

過這個問題來到最近,最後我發現這是可以在使用<style>塊HTML內容的前面並將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]; 

有可能是一個更優雅的解決方案,但我還沒有找到它。

2

您可以使用WebPreferences對象來控制從HTML創建屬性字符串時使用的字體。

方法-initWithHTML:options:documentAttributes:需要options字典。該字典的一個公認密鑰是NSWebPreferencesDocumentOption。該值是在解釋HTML時使用的WebPreferences實例。

A 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」。由於某些原因,使用WebPreferences對象將HTML轉換爲屬性字符串時,這些屬性無法使用。我最好的猜測是,這是因爲他們沒有在[[NSFontManager sharedFontManager] availableFontFamilies]中列出。當您嘗試使用這樣的字體系列時,系統默認爲Times(yuck!)。

相關問題