我正在尝试使用自定义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), ¶graphAlignment},
{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
答案 0 :(得分:2)
CoreText中存在一些与确定正确帧大小相关的错误。其中一些在iOS 6中已修复,例如http://www.cocoanetics.com/2012/02/radar-coretext-line-spacing-bug/
如果您的问题仍然存在,那么您应该提交具有详细信息的雷达。此外,您应该使用Apple DTS打开一个电话,它可能会为您提供一种解决方法。经常 - 如果你的问题确实是一个错误 - 那么你就会把你的DTS通话归还。
PS:尝试使用我的DTCoreText视图显示您的文本,这些视图会进行手动布局和显示,并查看问题是否可以在那里重现。如果没有,那么你有你的解决方法。