をしないのですような気がしますここで私はコアグラフィックスにテキストを表示するために使用するコードです:私が表示したい場合ははコアグラフィックステキストがコア・テキストよりも道高速です - 私は何か
int y = MESSAGE_FRAME.origin.y + 8;
if (month) y = y + 27;
int height = [JHomeViewCellContentView heightOfMessage:self.entry.message];
CGRect rect = CGRectMake(MESSAGE_FRAME.origin.x + 8, y, MESSAGE_FRAME.size.width - 16, height);
UIFont *font = [UIFont fontWithName:@"Crimson" size:15.0f];
[[UIColor colorWithWhite:0.2 alpha:1.0] setFill];
[self.entry.message drawInRect:rect withFont:font lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentLeft];
そしてここでは、コードですコアテキスト内の同じテキスト:
CGRect rect2 = CGRectMake(MESSAGE_FRAME.origin.x + 8, self.bounds.size.height - y - height + 2, MESSAGE_FRAME.size.width - 16, height);
UIFont *font = [UIFont fontWithName:@"Crimson" size:15.0f];
CGFloat lineHeight = [font lineHeight];
CTFontRef fontRef = CTFontCreateWithName((CFStringRef)@"Crimson", 15.0f, NULL);
CGFloat lineSpacing = 0;
CTParagraphStyleSetting settings[] = {
{ kCTParagraphStyleSpecifierMinimumLineHeight, sizeof(lineHeight), &lineHeight },
{ kCTParagraphStyleSpecifierMaximumLineSpacing, sizeof(lineSpacing), &lineSpacing },
};
CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(settings, sizeof(settings)/sizeof(settings[0]));
NSMutableDictionary *attDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:
(__bridge_transfer id)fontRef, (NSString *)kCTFontAttributeName,
(id)[[UIColor colorWithWhite:0.2 alpha:1.0] CGColor], (NSString *)kCTForegroundColorAttributeName,
paragraphStyle, kCTParagraphStyleAttributeName,
nil];
NSAttributedString *attString = [[NSAttributedString alloc] initWithString:self.entry.message attributes:attDictionary];
//Flip the coordinate system
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
CGContextTranslateCTM(context, 0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, rect2);
self.framesetter = CTFramesetterCreateWithAttributedString((__bridge_retained CFAttributedStringRef)attString);
CTFrameRef theFrame = CTFramesetterCreateFrame(self.framesetter, CFRangeMake(0, [attString length]), path, NULL);
CFRelease(path);
CTFrameDraw(theFrame, context);
CFRelease(theFrame);
どうやら、よりlongwindedているにもかかわらず、コアテキストが、私はそれを行う方法を学んだ理由であるコアグラフィックス、より速いことを意味しています。しかし、このコードを計測器で実行すると、コアグラフィックは5ms、コアテキストは14msで実行されます。私はここで何かを逃しているように感じる。 drawInRectはほぼ3倍速く、遅くなるはずです。私は方法を知っている限り、コードを洗練しましたが、私は専門家ではなく、何か助けていただければ幸いです。
明確にするために、私はテキストのブロックをビューに描画しています。それが私がしたいことです。そして、すべてのテキストが同じ外観を持っています。
コアテキストの強度はテキストレイアウトであり、その下にある描画コードはコアグラフィックスに実装されていますが、単純なテキスト描画でどのように高速化できるかはわかりません。 – overboming