我使用 Xcode 4.2 为 Mac OS X (10.7) 编写了一个简单的 Cocoa 应用程序。该应用程序所做的只是创建一个窗口,其中包含一个可滚动的子视图数组,每个子视图代表一个页面,可以在非常低的级别上绘制内容。子View的isFlipped方法传递YES,所以每个子View的原点都是左上角。使用各种 Core Graphics 例程,我能够成功地绘制线条和填充路径以及所有有趣的 PostScripty 东西。
它从给定的字体中绘制字形让我感到困惑。
这是从程序中剪切并粘贴的完整代码,用于子视图的 -drawRect: 方法 --
- (void)drawRect:(NSRect)dirtyRect
{
// Start with background color for any part of this view
[[NSColor whiteColor] set];
NSRectFill( dirtyRect );
// Drop down to Core Graphics world, ensuring there's no side-effects
context = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];
CGContextSaveGState(context);
{
//CGFontRef theFont = CGFontCreateWithFontName(CFSTR("American Typewriter"));
//CGContextSetFont(context, theFont);
CGContextSelectFont(context, "American Typewriter", 200, kCGEncodingMacRoman);
CGContextSetFontSize(context, 200);
// Adjust the text transform so the text doesn't draw upside down
CGContextSetTextMatrix(context, CGAffineTransformScale(CGAffineTransformIdentity, 1, -1));
CGContextSetTextDrawingMode(context, kCGTextFillStroke);
CGContextSetRGBFillColor(context, 0.0, .3, 0.8, 1.0);
// Find the center of view's (not dirtyRect's) bounds
// View is 612 x 792 (nominally 8.5" by 11")
CGPoint centerPoint;
CGRect bds = [self bounds];
centerPoint.x = bds.origin.x + bds.size.width / 2;
centerPoint.y = bds.origin.y + bds.size.height / 2;
// Create arrays to hold glyph IDs and the positions at which to draw them.
#define glyphCount 1 // For now, just one glyph
CGGlyph glyphs[glyphCount];
CGPoint positions[glyphCount];
glyphs[0] = 40; // Glyph ID for '@' character in above font
positions[0] = centerPoint;
// Draw above center. This works.
CGContextShowGlyphsAtPoint(context, centerPoint.x, centerPoint.y - 200.0, glyphs, glyphCount);
// Draw at center. This works.
CGContextShowGlyphsAtPoint(context, positions[0].x, positions[0].y, glyphs, glyphCount);
// Draw below center. This fails (draws nothing). Why?
positions[0].y += 200.0;
CGContextShowGlyphsAtPositions(context, glyphs, positions, glyphCount);
}
CGContextRestoreGState(context);
}
让我大吃一惊的是,使用 CGContextShowGlyphsAtPoint() 的前两个字形绘图调用按预期工作,但使用 CGContextShowGlyphsAtPositions() 的第三次尝试从未绘制任何东西。所以页面上只有两个@符号,而不是三个。这种行为差异并不取决于我之前是否使用过 CGContextSetFont() 或 CGContextSelectFont()。
这两个几乎相同的 Core Graphics 字形绘制例程肯定有一些隐藏的状态变化,或者在引擎盖下有一些非常不同的东西,但到目前为止我所有的实验都没有证明这可能是什么。
叹。我只想在视图中相应的位置数组有效地绘制一组字形。
有什么想法我错了吗?