Сохраните ссылку на CTFramesetter, чтобы ускорить прорисовку основного текста. - PullRequest
1 голос
/ 22 ноября 2011

Я хочу визуализировать текст на большом количестве UITableViewCell's. Текст отображается в методе UITableViewCells drawRect:(CGRect)rect.

Каждая ячейка содержит различное количество строк, а текст имеет такие атрибуты, как вес и цвет.

В - (void) tableview:(UITableView*) tableView cellForRowAtIndexPath:(NSIndexPath*) indexPath; я передаю tableViewCell attributedString, которую я предварительно сделал при построении моей модели. Я приложил некоторый код, который показывает суть того, что происходит в моем 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 голосов
/ 22 ноября 2011

Да, вы должны иметь возможность хранить его и делить его между ячейками.Я сохранил постоянный CTFramesetterRef для нескольких текстовых блоков внутри одного представления, я не могу понять, почему использование его для нескольких ячеек в табличном представлении было бы иначе.

...