我需要将居中文本绘制到CGContext。
我开始采用Cocoa方法。我用文本创建了一个NSCell并试图绘制它:
NSGraphicsContext* newCtx = [NSGraphicsContext
graphicsContextWithGraphicsPort:bitmapContext flipped:true];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:newCtx];
[pCell setFont:font];
[pCell drawWithFrame:rect inView:nil];
[NSGraphicsContext restoreGraphicsState];
但是CGBitmapContext似乎没有在其上呈现文本。可能是因为我必须为inView:参数传递nil。
所以我尝试将文本渲染切换到Core Graphics:
最简单的方法似乎是使用CGContextSelectFont使用其postscript名称和点大小来选择字体,但CGContextShowTextAtPoint只接受非unicode字符,并且没有明显的方法将文本适合矩形:或者计算一行文本的范围以手动布置矩形。
然后,可以创建一个CGFont,并设置cia CGContextSetFont。绘制此文本需要CGContextShowGlyphsAtPoint,但CGContext似乎缺少计算生成文本的边界矩形或将文本换行到rect的函数。另外,如何将字符串转换为CGGlyphs数组并不明显。
下一个选项是尝试使用CoreText呈现字符串。但Core Text类非常复杂,虽然有样本显示如何以矩形显示文本,指定字体,但没有示例演示如何计算CoreText字符串的边界矩形。
所以:
答案 0 :(得分:7)
我将继续您的上述方法,但改为使用NSAttributedString。
NSGraphicsContext* newCtx = [NSGraphicsContext graphicsContextWithGraphicsPort:bitmapContext flipped:true];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:newCtx];
NSAttributedString *string = /* make a string with all of the desired attributes */;
[string drawInRect:locationToDraw];
[NSGraphicsContext restoreGraphicsState];
答案 1 :(得分:7)
经过4天的搜索,我终于找到了答案。我真的希望Apple提供更好的文档。所以我们走了
我假设您已经拥有CGFontRef。如果没有让我知道,我会告诉你如何从资源包中加载一个ttf到CgFontRef。
下面是使用任何CGFontref计算任何字符串边界的代码片段
int charCount = [string length];
CGGlyph glyphs[charCount];
CGRect rects[charCount];
CTFontGetGlyphsForCharacters(theCTFont, (const unichar*)[string cStringUsingEncoding:NSUnicodeStringEncoding], glyphs, charCount);
CTFontGetBoundingRectsForGlyphs(theCTFont, kCTFontDefaultOrientation, glyphs, rects, charCount);
int totalwidth = 0, maxheight = 0;
for (int i=0; i < charCount; i++)
{
totalwidth += rects[i].size.width;
maxheight = maxheight < rects[i].size.height ? rects[i].size.height : maxheight;
}
dim = CGSizeMake(totalwidth, maxheight);
重用相同的函数CTFontGetGlyphsForCharacters来获取字形。要从CGFontRef获取CTFontRef,请使用CTFontCreateWithGraphicsFont()函数
另外请记住,NSFont和CGFontRef是免费桥接的,这意味着它们可以相互融合,无需任何额外工作即可无缝工作。
答案 2 :(得分:1)
Swift 5版本!
let targetSize: CGSize = // the space you have available for drawing the text
let origin: CGPoint = // where you want to position the top-left corner
let string: String = // your string
let font: UIFont = // your font
let attrs: [NSAttributedString.Key:Any] = [.font: font]
let boundingRect = string.boundingRect(with: targetSize, options: [.usesLineFragmentOrigin], attributes: attrs, context: nil)
let textRect = CGRect(origin: origin, size: boundingRect.size)
text.draw(with: textRect, options: [.usesLineFragmentOrigin], attributes: attrs, context: nil)