cocoa – 使用CoreText与变音符号绑定的字符框

cocoa – 使用CoreText与变音符号绑定的字符框,第1张

概述我试图使用各种技术在MacOS X / iOS中获取角色的边界框.我现在正在展示我的所有尝试.到目前为止,如果我想获得像“Ä”这样的变音字符的大小,代码就会失败. 使用CTFontGetBoundingRectsForGlyphs -(void) resizeLayer1:(CATextLayer *)l toString:(NSString *)string{ // need to s 我试图使用各种技术在MacOS X / iOS中获取角色的边界框.我现在正在展示我的所有尝试.到目前为止,如果我想获得像“Ä”这样的变音字符的大小,代码就会失败.

使用CTFontGetBoundingRectsForGlyphs

-(voID) resizeLayer1:(CATextLayer *)l toString:(Nsstring *)string{    // need to set CGFont explicitly to convert Font property to a CGFontRef    CGFontRef layerFont = CGFontCreateWithFontname((CFStringRef)@"Helvetica");    l.Font = layerFont;    string = l.string;    NSUInteger len = [string length];    // get characters from Nsstring    UniChar *characters = (UniChar *)malloc(sizeof(UniChar)*len);    CFStringGetCharacters((__brIDge CFStringRef)l.string,CFRangeMake(0,[l.string length]),characters);    // Get CTFontRef from CGFontRef    CTFontRef coreTextFont = CTFontCreateWithGraphicsFont(layerFont,l.FontSize,NulL,NulL);    // allocate glyphs and bounding Box arrays for holding the result    // assuming that each character is only one glyph,which is wrong    CGGlyph *glyphs = (CGGlyph *)malloc(sizeof(CGGlyph)*len);    CTFontGetGlyphsForCharacters(coreTextFont,characters,glyphs,len);    // get bounding Boxes for glyphs    CGRect *bb = (CGRect *)malloc(sizeof(CGRect)*len);    CTFontGetBoundingRectsForGlyphs(coreTextFont,kCTFontDefaultOrIEntation,bb,len);    CFRelease(coreTextFont);    l.position = CGPointMake(200.f,100.f);    l.bounds = bb[0];    l.backgroundcolor = CGcolorCreateGenericRGB(0.f,.5f,.9f,1.f);    free(characters);    free(glyphs);    free(bb);}

结果它有点工作,但有一些填充正在进行,因为字形由CATextLayer呈现

使用CTFramesetterSuggestFrameSizeWithConstraints

-(voID) resizeLayer2:(CATextLayer *)l toString:(Nsstring *)string{    // need to set CGFont explicitly to convert Font property to a CGFontRef    CGFontRef layerFont = CGFontCreateWithFontname((CFStringRef)@"Helvetica");    l.Font = layerFont;    string = l.string;    NSUInteger len = [string length];    // get characters from Nsstring    UniChar *characters = (UniChar *)malloc(sizeof(UniChar)*len);    CFStringGetCharacters((__brIDge CFStringRef)l.string,NulL);    CFMutableAttributedStringRef attrStr = CFAttributedStringCreateMutable(kcfAllocatorDefault,0);    CFAttributedStringReplaceString(attrStr,0),(__brIDge CFStringRef)string);    CTTextAlignment alignment = kCTJustifIEdTextAlignment;    CTParagraphStyleSetting _settings[] = { {kCTParagraphStyleSpecifIErAlignment,sizeof(alignment),&alignment} };    CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(_settings,sizeof(_settings) / sizeof(_settings[0]));    CFAttributedStringSetAttribute(attrStr,CFAttributedStringGetLength(attrStr)),kCTParagraphStyleAttributename,paragraphStyle);    CFAttributedStringSetAttribute(attrStr,kCTFontAttributename,coreTextFont);    CFRelease(paragraphStyle);    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrStr);    CFRelease(attrStr);    CFRange range;    CGfloat maxWIDth  = CGfloat_MAX;    CGfloat maxHeight = 10000.f;    CGSize constraint = CGSizeMake(maxWIDth,maxHeight);    //  checking frame sizes    CGSize coreTextSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter,len),nil,constraint,&range);     // allocate glyphs and bounding Box arrays for holding the result    // assuming that each character is only one glyph,len);    CFRelease(coreTextFont);    bb[0].origin = l.bounds.origin;    coreTextSize.wIDth = ceilf(coreTextSize.wIDth);    coreTextSize.height = ceilf(coreTextSize.height);    bb[0].size = coreTextSize;    l.position = CGPointMake(200.f,100.f);    // after setting the bounds the layer gets transparent    l.bounds = bb[0];    l.opaque = YES;    return;        l.backgroundcolor = CGcolorCreateGenericRGB(0.f,1.f);    free(characters);    free(glyphs);    free(bb);}

结果字符串的边界框是正确的.变音符号存在问题:Ä缺少其点,因为边界框不够高.

使用CTlineGetTypographicBounds

-(voID) resizeLayer3:(CATextLayer *)l toString:(Nsstring *)string{    // need to set CGFont explicitly to convert Font property to a CGFontRef    CGFontRef layerFont = CGFontCreateWithFontname((CFStringRef)@"Helvetica");    l.Font = layerFont;    string = l.string;    NSUInteger len = [string length];    // get characters from Nsstring    UniChar *characters = (UniChar *)malloc(sizeof(UniChar)*len);    CFStringGetCharacters((__brIDge CFStringRef)l.string,(__brIDge CFStringRef)string);    CFAttributedStringSetAttribute(attrStr,coreTextFont);    CTlineRef line = CTlineCreateWithAttributedString(attrStr);    CGfloat ascent;    CGfloat descent;    CGfloat wIDth = CTlineGetTypographicBounds(line,&ascent,&descent,NulL);    CGfloat height = ascent+descent;    CGSize coreTextSize = CGSizeMake(wIDth,height);    // get bounding Boxes for glyphs    CGRect *bb = (CGRect *)malloc(sizeof(CGRect)*len);    CFRelease(coreTextFont);    bb[0].origin = CGPointZero;    coreTextSize.wIDth = ceilf(coreTextSize.wIDth);    coreTextSize.height = ceilf(coreTextSize.height);    bb[0].size = coreTextSize;    l.position = CGPointMake(200.f,1.f);    free(characters);    free(bb);}

结果字符串的边界框是正确的.变音符号存在问题:Ä缺少其点,因为边界框不够高.

使用CTFontGetBoundingRectsForGlyphs

-(voID) resizeLayer4:(CATextLayer *)l toString:(Nsstring *)string{    // need to set CGFont explicitly to convert Font property to a CGFontRef    CGFontRef layerFont = CGFontCreateWithFontname((CFStringRef)@"Helvetica");    l.Font = layerFont;    string = l.string;    NSUInteger len = [string length];    // get characters from Nsstring    UniChar *characters = (UniChar *)malloc(sizeof(UniChar)*len);    CFStringGetCharacters((__brIDge CFStringRef)l.string,len);    CGPathref glyPHPath = CTFontCreatePathForGlyph(coreTextFont,glyphs[1],NulL);    CGRect rect = CGPathGetBoundingBox(glyPHPath);    // get bounding Boxes for glyphs    CGRect *bb = (CGRect *)malloc(sizeof(CGRect)*len);    CTFontGetBoundingRectsForGlyphs(coreTextFont,100.f);    l.bounds = rect;    l.backgroundcolor = CGcolorCreateGenericRGB(0.f,1.f);    free(characters);    free(glyphs);    free(bb);}

结果字符串的边界框是正确的.由于变音符号本身是一个字形,而字符是另一个字形意味着Ä由两个字形组成,因此变音符号存在问题.怎么可以使用它?

还有其他可能性我忽略了并值得尝试吗?

编辑

CTlineGetTypographicBounds的第三个选项似乎有效.然而,我正在运行一个不同的问题,即CATextLayer中的第一行缺少其变音符号.第一行不知何故不够高.这意味着我在这里咆哮错误的树.

解决方法 在第一个示例中,您似乎忽略了这样一个事实,即字形的边界矩形很可能是负y源.返回的rect通常将y = 0视为文本的基线.因此,您可以在bounds rect中设置偏移量,这也可能是图层在文本中具有偏移量的原因. (没试过但是这么认为)

如果您对特定文本的边界不感兴趣,但选择包含各种文本的高度,您可能还想使用CTFontGetBoundingBox.

总结

以上是内存溢出为你收集整理的cocoa – 使用CoreText与变音符号绑定的字符框全部内容,希望文章能够帮你解决cocoa – 使用CoreText与变音符号绑定的字符框所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1104495.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存