Iphone 核心文本:在后台线程中计算页面数
假设我正在使用核心文本为iPhone编写文本查看器。每次用户更改基本字体大小时,我都需要计算使用给定字体大小显示整个NSAttributed字符串所需的页面数(固定大小的CGRECT) 我想在单独的NSO操作中这样做,这样用户就不会体验到不必要的UI延迟 不幸的是,要计数页面,我需要使用不可见文本绘制模式绘制帧(CTFrameDraw),然后使用CTFrameGetVisibleStringRange计数字符。但是要画一个文本,我需要一个上下文。问题就从这里开始 我可以通过调用UIGraphicsGetCurrentContext在drawRect中获取CGContext,但在这种情况下:Iphone 核心文本:在后台线程中计算页面数,iphone,multithreading,cgcontext,core-text,Iphone,Multithreading,Cgcontext,Core Text,假设我正在使用核心文本为iPhone编写文本查看器。每次用户更改基本字体大小时,我都需要计算使用给定字体大小显示整个NSAttributed字符串所需的页面数(固定大小的CGRECT) 我想在单独的NSO操作中这样做,这样用户就不会体验到不必要的UI延迟 不幸的是,要计数页面,我需要使用不可见文本绘制模式绘制帧(CTFrameDraw),然后使用CTFrameGetVisibleStringRange计数字符。但是要画一个文本,我需要一个上下文。问题就从这里开始 我可以通过调用UIGraphic
还有其他解决办法吗?在工作线程中创建单独的CGContext?怎么用?CGBitmapContext?如何确保所有条件(我不知道,分辨率?等)与drawRect的CGContext中的相同,以便正确计算页面数?您可以使用CTFramesetterSuggestFrameSizeWithConstraints
请参见此处的问题:在从CTFrameGetVisibleStringRange获取结果之前,无需CTFrameDraw使用CTFramesetterSuggestFrameSizeWithConstraints,如果指定fitRange的参数,它将返回字符串的实际范围
+ (NSArray*) pagesWithString:(NSString*)string size:(CGSize)size font:(UIFont*)font;
{
NSMutableArray* result = [[NSMutableArray alloc] initWithCapacity:32];
CTFontRef fnt = CTFontCreateWithName((CFStringRef)font.fontName, font.pointSize,NULL);
CFAttributedStringRef str = CFAttributedStringCreate(kCFAllocatorDefault,
(CFStringRef)string,
(CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys:(id)fnt,kCTFontAttributeName,nil]);
CTFramesetterRef fs = CTFramesetterCreateWithAttributedString(str);
CFRange r = {0,0};
CFRange res = {0,0};
NSInteger str_len = [string length];
do {
CTFramesetterSuggestFrameSizeWithConstraints(fs,r, NULL, size, &res);
r.location += res.length;
[result addObject:[NSNumber numberWithInt:res.length]];
} while(r.location < str_len);
CFRelease(fs);
CFRelease(str);
CFRelease(fnt);
return result;
}
+(NSArray*)页面swithstring:(NSString*)字符串大小:(CGSize)大小字体:(UIFont*)字体;
{
NSMutableArray*结果=[[NSMutableArray alloc]initWithCapacity:32];
CTFontRef fnt=CTFontCreateWithName((CFStringRef)font.fontName,font.pointSize,NULL);
CFAttributedStringRef str=CFAttributedStringCreate(kCFAllocatorDefault,
(CFStringRef)字符串,
(CFDictionaryRef)[NSDictionary DictionaryWithObjectsSandKeys:(id)fnt,kCTFontAttributeName,nil]);
CTFramesetterRef fs=CTFramesetterCreateWithAttributedString(str);
cfr={0,0};
CFRange res={0,0};
NSInteger str_len=[字符串长度];
做{
CTFramesetterSuggestFrameSizeWithConstraints(fs、r、NULL、size和res);
r、 位置+=分辨率长度;
[结果添加对象:[NSNumber numberWithInt:res.length]];
}而(r.location
Hmm,在核心文本(不像石英)中,您不必绘制不可见的文本来测量它。因此,只需调用CTFramesetterCreateFrame,然后调用CTFrameGetVisibleStringRange,而不必使用CGContext!任何人都可以确认吗?不要相信CTFramesetterSuggestFrameSizeWithConstraints!看这里:据我所知,这只是CGSize的问题。在我的代码中,我忽略了返回的大小,我使用了我用作约束的原始大小,到目前为止它似乎工作得很好。不过,我还没有对它进行广泛的测试。我想我不需要返回的大小,因为当你有适合约束的范围时,还有其他方法来测量文本。