Я хочу визуализировать текст на большом количестве 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);
}