使用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与变音符号绑定的字符框所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)