CGContextShowTextAtPoint呈现颠倒

时间:2011-07-10 08:43:09

标签: objective-c macos cocoa quartz-graphics nsview

我正尝试通过Quartz通过NSView将一些文字绘制到CGContextShowTextAtPoint()上。这很有效,直到我在我的(BOOL)isFlipped子类中覆盖YES返回NSView,以便将原点放在左上角进行绘制。文本在预期区域绘制,但字母全部反转。我也试过(理论上,至少)相当于翻转我的CGContext并按照上下文的高度进行翻译。

e.x。

// drawRect:
CGContextScaleCTM(theContext, 1, -1);
CGContextTranslateCTM(theContext, 0, -dirtyRect.size.height);

这会产生相同的结果。

对类似问题的许多建议都指向修改文本矩阵。我已经将文本矩阵设置为单位矩阵,对其执行了额外的反转,并分别完成了两者。所有这些解决方案都导致文本呈现更奇怪(通常只显示一个片段。)

我看到的另一个建议是简单地避开这个功能,转而采用其他绘图方式(ex NSString的绘图方法。)但是,这主要是在C ++ / C和I'之间完成的。如果可能的话,我希望保持这些水平。

我们非常感谢任何建议,如果需要,我很乐意发布更多代码。

谢谢, 萨姆

3 个答案:

答案 0 :(得分:2)

这个问题已经回答here

基本上是因为iOS核心图形上的坐标系被翻转(左上角为x:0, y:0),与Mac上的坐标系相对(其中x:0, y:0为左下角)。解决方法是设置文本转换矩阵,如下所示:

CGContextSetTextMatrix(context, CGAffineTransformMake(1.0,0.0, 0.0, -1.0, 0.0, 0.0));

答案 1 :(得分:1)

您需要使用视图的边界而不是dirtyRect并在缩放之前执行转换:

CGContextTranslateCTM(theContext, 0, -NSHeight(self.bounds));
CGContextScaleCTM(theContext, 1, -1);

答案 2 :(得分:0)

原来答案是修改文本矩阵。显示而不是文本的奇怪“片段”是因为当替换“默认”文本矩阵时,字体大小(通过CGContextSelectFont()设置)太小。由于某种原因,初始矩阵具有大规模变换,因此当矩阵未经修改时,较小的文本大小看起来很好;然而,当用反比例(1,-1)或单位矩阵替换时,它们将变得难以置信。