使用自定义字体显示NSAttributed字符串的时间更长

时间:2017-02-22 05:11:34

标签: ios objective-c nsattributedstring core-text uifont

我使用Core Text显示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];

显示属性字符串在设备中很慢。 但是,在模拟器中它很快。如果我没有添加那段代码,文本会在模拟器和设备中快速显示。

1 个答案:

答案 0 :(得分:0)

创建一次字体对象并按住它。如果您有多个并且需要跨对象共享,我可能会将它们缓存在静态字典中。每次更新字符串时都不要创建新的。几乎可以肯定,字体对象在它首次需要时完成所有复杂的解码工作(而不是你创建它的那一点)。系统字体总是被加载和解码,但如果没有任何引用它们的话,自定义字体可能不会被保留。

您可能还想在此处试用UIFont而不是CTFontUIFont是一个更高级别的对象,我的经验是它缓存更多。我还没有探究过这种特殊情况。通常,除非确实需要Core Text,否则通常应该使用UIKit类型。这可能是违反直觉的,因为"不会更快降低水平?"那么,如果您确切知道自己在做什么,那么较低级别的可以更快。但真正较低的水平只是意味着你必须自己照顾更多的东西。"信任UIKit通常是更好的一阶解决方案,直到你知道你需要更细粒度的东西。

模拟器速度更快也就不足为奇了。它在Mac上运行,具有比iPhone更强大的处理能力和更快的磁盘。当您在模拟器上运行时,它们实际上只是在特殊UI中运行的Mac应用程序;它并不是Android使用的完整模拟器。