2017-02-22 46 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使用的完整模拟器。