保持对CTFramesetter的引用以加速Core Text绘图

时间:2011-11-21 20:47:42

标签: ios cocoa-touch core-text

我希望在大量的UITableViewCell上呈现文本。 文本以UITableViewCells drawRect:(CGRect)rect方法呈现。

每个单元格包含不同数量的行,文本具有重量和颜色等属性。

- (void) tableview:(UITableView*) tableView cellForRowAtIndexPath:(NSIndexPath*) indexPath; 中,我将tableString传递给了tableString,这是我在构建模型时预先创建的。 我附上了一些代码,显示了drawRect中发生的事情的要点。

我一直在阅读(文档,博客等),CTFrameSetter是最昂贵的对象。这是有道理的,因为这是计算字形和运行的所有计算。 我现在的问题是,我可以预先制作它并将其传递给我的手机 在cellForRowAtIndexPath上它是否可能对速度产生积极影响?

- (void) drawRect:(CGRect)rect
{   
/* These are pre-populated and the attributedString is passed to the cell at run time

    NSDictionary *stringAttributeDict = [NSDictionary dictionaryWithObjectsAndKeys:
                         (id)fontRef, (NSString*)kCTFontAttributeName, 
                         (id)[[UIColor blueColor] CGColor], (NSString*)(kCTForegroundColorAttributeName), nil]];
    NSDictionary *firstPartAttributeDict = [NSDictionary dictionaryWithObjectsAndKeys:
                          (id)fontRef, (NSString*)kCTFontAttributeName, 
                          (id)[[UIColor greenColor] CGColor], (NSString*)(kCTForegroundColorAttributeName), nil]];

    [attributedString addAttributes:stringAttributeDict range:NSMakeRange(0, [attributedString.string length])];
    [attributedString addAttributes:firstPartAttributeDict range:NSMakeRange(0, 5)];

*/
    rect = CGRectInset(rect, 5.0, 5.0);

    CGContextRef context = UIGraphicsGetCurrentContext();

    // Flip the coordinate system
    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    CGContextTranslateCTM(context, 0, self.bounds.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    //Make a path to render the text in
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRect(path, NULL, rect);

    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attributedString);
    CTFrameRef theFrame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, [attributedString length]), path, NULL);
    CFRelease(framesetter);
    CFRelease(path);

    //Draw the text:
    CTFrameDraw(theFrame, context);
    CFRelease(theFrame);
}

1 个答案:

答案 0 :(得分:0)

是的,您应该能够保留它并在单元格之间共享它。我在单个视图中保留了多个文本块的持久性CTFramesetterRef,我无法理解为什么在tableview中将多个单元格用于任何不同的文本块。