cocoa - 使用核心图形绘制文本

标签 cocoa core-graphics core-text

我需要将居中文本绘制到 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 使用其后记名称和点大小来选择字体,但 CGContextShowTextAtPoint 只接受非 unicode 字符,并且没有明显的方法将文本适合矩形:或计算一行文本的范围以手动布置矩形。

然后,就有一个可以创建的CGFont,并设置cia CGContextSetFont。绘制此文本需要 CGContextShowGlyphsAtPoint,但 CGContext 似乎再次缺乏计算生成文本的边界矩形或将文本包装到矩形的函数。另外,如何将字符串转换为 CGGlyphs 数组并不明显。

下一个选项是尝试使用 CoreText 呈现字符串。但是 Core Text 类非常复杂,虽然有示例展示如何在矩形中以指定字体显示文本,但没有示例演示如何计算 CoreText 字符串的边界矩形。

所以:

  • 给定一个 CGFont 和 CGContext,如何计算某些文本的边界矩形,以及如何将文本字符串转换为 CGGlyphs 数组?
  • 给定一个字符串、一个 CGContext 以及一个 postscript 名称和点大小,我需要创建哪些 Core Text 对象来计算字符串的边界矩形,和/或绘制包裹到 CGContext 上的矩形的字符串。
  • 给定一个字符串和一个 NSFont - 如何将字符串渲染到 CGBitmapContext 上?我已经知道如何获取它的范围。

最佳答案

经过四天的搜索,我终于找到了答案。我真的希望苹果能做出更好的文档。那么我们开始吧

我假设您已经有了 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 是免费桥接的,这意味着它们可以相互转换,并且无需任何额外工作即可无缝工作。

关于cocoa - 使用核心图形绘制文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4386367/

相关文章:

ios - NSAttributedString 添加文本对齐

cocoa - 我将如何更改对象的 (x,y) 位置

objective-c - 大中央调度 : Queue vs Semaphore for controlling access to a data structure?

cocoa - XCode Cocoa 控制台应用程序导入错误

ios - 如何缩放图形,使用 CGContextRef 创建

iphone - 在 iOS 上,有没有办法直接改变或绘制到 CGImage 而不是绘制到 Graphics Context 然后转换整个东西?

alignment - 垂直对齐核心文字?

objective-c - 使用@synthesize 时如何提供访问器方法的额外自定义实现?

performance - 提高 Quartz2D 绘图性能

ipad - 为什么我无法在应用程序崩溃的情况下释放我的 CTFramesetter?