绘制到CGContextRef的文本并不总是完整

时间:2010-07-07 12:23:25

标签: objective-c core-graphics

我是Mac世界的新手,我看到一些让我感到困惑的行为。我正在开发一个基本的全屏实用程序,它将捕获Mac的主显示并显示一些文本。我遇到的问题是,如果我多次捕获显示,在第一次写入contextRef的文本在每次写入时开始在行的开头降级。第一次可能是填充没有在第一个字母中绘制,之后该行开头的文本的整个部分消失。我使用的代码如下:

CGDisplayCapture(kCGDirectMainDisplay);
CGDirectDisplayID display = kCGDirectMainDisplay;
CGContextRef ctx = CGDisplayGetDrawingContext (display);

CGContextSelectFont (ctx, "Times-Roman", 48, kCGEncodingMacRoman);
CGContextSetTextDrawingMode (ctx, kCGTextFillStroke);
CGContextSetRGBFillColor (ctx, 1, 1, 1, 0.75);
CGContextSetRGBStrokeColor (ctx, 1, 1, 1, 0.75);
CGContextShowTextAtPoint (ctx, 400, 400, text, strlen(text));   

我发现如果我在CGContextShowTextAtPoint之前放置'[NSThread sleepForTimeInterval:0.25]',文本将始终正确显示,但这就是我认为的黑客攻击。

对于那些比我更聪明的人,我的问题是,是什么导致了这个问题,我是否应该尝试解决它?

TIA,

JT

1 个答案:

答案 0 :(得分:1)

要制作基本的全屏应用,获取CGDisplay及相关CGContextRef并直接在其上绘制。我猜你在没有被系统通知的情况下完全依赖于上下文。这不是你应该做的。

除非绝对必要,否则创建一个覆盖整个屏幕的大视图(即保持其他应用程序的窗口),并像在普通视图上一样绘制它。即永远不要手动获取上下文并主动写入。相反,实现NSView的子类,实现drawRect,并在里面执行绘图。最后,使用enterFullScreenMode:withOptions: 使视图全屏显示。