3

Core-text を使用してカスタム TTF フォント (scheherazade) を使用して iOS アプリでアラビア語のテキストをレンダリングしようとしていますが、これはほとんどの場合機能しますが、CTFrame の端にある特定のグリフが削除されます。

フレームサイズを調整してドロップグリフがフレームの内部に表示されるようにすると、正しく表示されるため、CTFrameDraw 内で何か問題が発生していると思われます。以下は、アラビア語のテキストをレンダリングするために使用しているコードです。

CGContextRef context = UIGraphicsGetCurrentContext();

// Flip the coordinate system
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
 CGContextTranslateCTM(context, 0, v.textFrame.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

CGMutablePathRef path = CGPathCreateMutable(); //1
 CGPathAddRect(path, NULL, v.textFrame );

CGFloat minLineHeight = 60.0;
CGFloat maxLineHeight = 60.0;

CTTextAlignment paragraphAlignment = kCTRightTextAlignment;
CTLineBreakMode lineBrkMode = kCTLineBreakByWordWrapping;

CTParagraphStyleSetting setting[4] = {
{kCTParagraphStyleSpecifierAlignment, sizeof(CTTextAlignment), &paragraphAlignment},
{kCTParagraphStyleSpecifierMinimumLineHeight, sizeof(CGFloat), &minLineHeight},
{kCTParagraphStyleSpecifierMaximumLineHeight, sizeof(CGFloat), &maxLineHeight},
{kCTParagraphStyleSpecifierLineBreakMode, sizeof(CTLineBreakMode), &lineBrkMode}
};


CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(setting, 4);
NSDictionary *attr        = [NSDictionary dictionaryWithObjectsAndKeys:
(id)v.arabicFont, (id)kCTFontAttributeName,
paragraphStyle, (id)kCTParagraphStyleAttributeName,
nil];

CFRelease(paragraphStyle);

NSAttributedString* attString = [[[NSAttributedString alloc]
initWithString:v.verseText attributes:attr] autorelease]; //2

CTFramesetterRef framesetter =
CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attString); //3
CTFrameRef frame =
CTFramesetterCreateFrame(framesetter,
CFRangeMake(0, [attString length]), path, NULL);

CTFrameDraw(frame, context); //4

CFRelease(frame); //5
CFRelease(path);
CFRelease(framesetter);

私が直面している問題を示すスクリーンショットも添付されています。どんな助けでも大歓迎です。ありがとう。

無効: http://stellarbeacon.com.au/invalid.png 有効: http://stellarbeacon.com.au/valid.png

4

1 に答える 1

2

正しいフレームサイズの決定に関連するCoreTextにはいくつかのバグがあります。これらの一部はiOS6で修正されています。たとえば、 http: //www.cocoanetics.com/2012/02/radar-coretext-line-spacing-bug/

それでも問題が解決しない場合は、詳細をレーダーに記録する必要があります。また、Apple DTSで電話をかける必要があります。これにより、おそらく回避策が提供されます。多くの場合、問題が実際にバグである場合は、DTSコールがクレジットバックされます。

PS:手動のレイアウトと表示を行うDTCoreTextビューを使用してテキストを表示し、問題がそこで再現できるかどうかを確認してください。そうでない場合は、回避策があります。

于 2012-12-09T09:42:47.947 に答える