3

Core Text を使用して iPhone 用のテキスト ビューアを作成しているとします。ユーザーが基本フォント サイズを変更するたびに、特定のフォント サイズで NSAttributedString 全体を表示するために必要なページ数 (固定サイズの CGRects) をカウントする必要があります。

そして、ユーザーが不必要なUIの遅れを経験しないように、これを別のNSOperationで行いたいと思います。

残念ながら、ページをカウントするには、非表示テキスト描画モードを使用してフレーム (CTFrameDraw) を描画し、CTFrameGetVisibleStringRange を使用して文字をカウントする必要があります。しかし、テキストを描画するには CGContext が必要です。そして、ここから問題が始まります...

UIGraphicsGetCurrentContext を呼び出すことで、drawRect で CGContext を取得できますが、この場合は次のようになります。

  1. performSelectorOnMainThread を使用して CGContext で動作するメソッドを呼び出す必要がありますよね?
  2. 他のスレッドは、このコンテキストを CFRetain する必要があります。drawRect メソッドの外で drawRect の CGContext を使用することは許容されますか?

他の解決策はありますか?ワーカー スレッドで別の CGContext を作成しますか? どのように?CGBitmapContext? ページが正しくカウントされるように、すべての条件 (わからない、解像度など) が drawRect の CGContext と同じであることを確認するにはどうすればよいですか?

4

3 に答える 3

0

CTFrameGetVisibleStringRangeから結果を取得する前に、CTFrameDrawを実行する必要はありません。

于 2010-11-17T03:17:52.873 に答える
0

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;
}  
于 2013-02-17T07:58:29.853 に答える
0

CTFramesetterSuggestFrameSizeWithConstraints を使用できます。

ここで私の質問を参照してください:長い NSString をページに分割する方法

于 2010-10-05T20:27:41.160 に答える