2017-02-22 89 views
0

我使用Core Text顯示NSAttributed字符串列。它工作正常。在使用系統字體時,它在模擬器和設備中都不會顯示任何延遲。但是,使用自定義字體時,需要更多時間來顯示設備中的內容。但在模擬器中,結果很快。更多時間用自定義字體顯示NSAttributed字符串

- (void)updateAttributedString 
{ 
     // Existing Code 
    if (self.text != nil) 
    { 

     self.attributedString = [[NSMutableAttributedString alloc] initWithString:self.text]; 
     NSRange range = NSMakeRange(0, [self.text length]); 
     // Regarding Fixed font 
//  [ self.attributedString addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"TAUN_Elango_Abirami" size:20] range:range];//This is my custom font 


      // Regarding custom Font using below code 
     if (self.font != nil) { 
      CTFontRef font = [self createCTFont]; 
      [self.attributedString addAttribute:(NSString *)kCTFontAttributeName 
              value:(__bridge id)font 
              range:range]; 
      CFRelease(font); 
     } 
     } 
} 



- (CTFontRef)createCTFont; 
{ 

    CTFontRef font = CTFontCreateWithName((CFStringRef)self.fontName, self.pointSize, NULL); 

    return font; 
} 

如果我添加的代碼下面的行,

[self.attributedString addAttribute:(NSString *)kCTFontAttributeName 
               value:(__bridge id)font 
               range:range]; 

顯示歸因串是在設備慢。 但是,在模擬器中它很快。如果我不添加那段代碼,文本將在模擬器和設備中快速顯示。

+0

你的問題是? –

+0

@AlbertRenshaw我需要使用自定義字體,並且希望文本在設備中毫不拖延地顯示。緩慢是問題。 – Sharon

+0

如果您使用XCode Instruments的時間分析,它是否指出特定的行?另外,您是否需要使用CoreText,CFStuff和橋接器? – Larme

回答

0

一次創建您的字體對象,並堅持下去。如果你有多個對象並且需要共享,我可能會將它們緩存在一個靜態字典中。每次更新字符串時不要創建一個新的字符串。字體對象幾乎可以肯定在首先需要的地方進行所有複雜的解碼工作(而不是創建它)。系統字體總是被加載和解碼,但是如果沒有引用它們的話,自定義字體可能不會被保留。

您可能還想在這裏試驗UIFont而不是CTFontUIFont是一個更高級別的對象,我的經驗是它緩存更多。我還沒有探討這種特殊情況。一般來說,除非您真的需要Core Text,否則通常應該使用UIKit類型。這可能是違反直覺的,因爲「不是更低的水平更快?」那麼,如果你確切地知道你在做什麼,更低的水平可以更快,。但真正的低層意味着「你必須自己處理更多的東西」。相信UIKit通常是更好的一階解決方案,除非你知道你需要更細粒度的東西。

模擬器會更快,這並不奇怪。這是在Mac上運行,它具有比iPhone更高的處理能力和更快的磁盤。在模擬器上運行時,它們實際上只是在特殊用戶界面中運行的Mac應用程序;它不是像Android使用的完整模擬器。