Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 核心文本:在后台线程中计算页面数_Iphone_Multithreading_Cgcontext_Core Text - Fatal编程技术网

Iphone 核心文本:在后台线程中计算页面数

Iphone 核心文本:在后台线程中计算页面数,iphone,multithreading,cgcontext,core-text,Iphone,Multithreading,Cgcontext,Core Text,假设我正在使用核心文本为iPhone编写文本查看器。每次用户更改基本字体大小时,我都需要计算使用给定字体大小显示整个NSAttributed字符串所需的页面数(固定大小的CGRECT) 我想在单独的NSO操作中这样做,这样用户就不会体验到不必要的UI延迟 不幸的是,要计数页面,我需要使用不可见文本绘制模式绘制帧(CTFrameDraw),然后使用CTFrameGetVisibleStringRange计数字符。但是要画一个文本,我需要一个上下文。问题就从这里开始 我可以通过调用UIGraphic

假设我正在使用核心文本为iPhone编写文本查看器。每次用户更改基本字体大小时,我都需要计算使用给定字体大小显示整个NSAttributed字符串所需的页面数(固定大小的CGRECT)

我想在单独的NSO操作中这样做,这样用户就不会体验到不必要的UI延迟

不幸的是,要计数页面,我需要使用不可见文本绘制模式绘制帧(CTFrameDraw),然后使用CTFrameGetVisibleStringRange计数字符。但是要画一个文本,我需要一个上下文。问题就从这里开始

我可以通过调用UIGraphicsGetCurrentContext在drawRect中获取CGContext,但在这种情况下:
  • 我必须使用performSelectorOnMainThread调用在CGContext上运行的任何方法,对吗
  • 另一个线程应该保留这个上下文。在drawRect方法之外使用drawRect的CGContext是否可以接受

  • 还有其他解决办法吗?在工作线程中创建单独的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的问题。在我的代码中,我忽略了返回的大小,我使用了我用作约束的原始大小,到目前为止它似乎工作得很好。不过,我还没有对它进行广泛的测试。我想我不需要返回的大小,因为当你有适合约束的范围时,还有其他方法来测量文本。