Текст выводится в CGContextRef Не всегда завершен - PullRequest
1 голос
/ 07 июля 2010

Я новичок в мире 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));   

Я обнаружил, что если я поставлю '[NSThread sleepForTimeInterval: 0.25]' перед CGContextShowTextAtPoint, текст будет всегда отображаться правильно, но это то, что я хотел бырассмотрим взлом.

Мой вопрос к тем, кто умнее меня: что вызывает проблему, и есть ли что-то другое, что я должен сделать, чтобы попытаться решить ее?

TIA,

JT

1 Ответ

1 голос
/ 07 июля 2010

Чтобы создать простое полноэкранное приложение, не получает CGDisplay и связанный CGContextRef и непосредственно рисует на нем.Я предполагаю, что вы рисуете в контексте, не будучи уведомленным системой, чтобы сделать это вообще.Это не то, что вы должны делать.

Если это не является абсолютно необходимым, создайте большой вид, охватывающий весь экран (т.е. оставляя позади окна других приложений), и нарисуйте его так же, как при обычном просмотре.Т.е. никогда не получай контекст вручную и не пиши его активно.Скорее, реализуйте подкласс NSView, реализуйте drawRect и выполните рисование внутри.Наконец, используйте enterFullScreenMode: withOptions: , чтобы сделать просмотр полноэкранным.

...