用更多的时间来显示带有自定义字体的NSAttributedstring

我正在使用核心文本明智地显示NSAttributedstring列。 它工作正常。 使用系统字体时,在模拟器和设备中都不会显示任何延迟。 但是使用自定义字体时,会花费更多的时间来显示设备中的内容。 但在模拟器中,结果很快。

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

显示属性的string是慢的设备。 但是,在模拟器很快。 如果我不添加这段代码,文本将在模拟器和设备中快速显示。

一次创build您的字体对象,并坚持下去。 如果你有多个对象并且需要共享,我可能会把它们caching在一个静态字典中。 每次更新string时都不要创build一个新的。 字体对象几乎肯定是在首先需要的地方进行所有复杂的解码工作(而不是创build它)。 系统字体总是被加载和解码,但是如果没有引用它们的话,自定义字体可能不会被保留。

您可能也想在这里尝试UIFont而不是CTFontUIFont是一个更高级的对象,我的经验是它caching更多。 我还没有探讨这个特殊的情况。 一般来说,除非您确实需要Core Text,否则通常应该使用UIKittypes。 这可能是反直觉的,因为“不是更低的水平更快?” 那么,如果你确切地知道你在做什么,更低的水平可以更快。 但是真正的低一点意味着“你必须自己照顾更多的东西”。 相信UIKit通常是更好的一阶解决scheme,直到你知道你需要更细粒度的东西。

模拟器会更快,这并不奇怪。 这是运行在Mac上,它具有比iPhone更高的处理能力和更快的磁盘。 当你在模拟器上运行的时候,他们实际上只是在一个特殊的UI中运行的Mac应用程序; 它不是像Android使用的完整模拟器。