iOS рисует прямоугольники для определенных шрифтов текста при использовании CGcontextshowtextatpoint - PullRequest
0 голосов
/ 08 сентября 2011

x и y являются целыми числами.

Следующий код отлично работает, когда я отправляю пользовательский созданный контекст, используя CGBitmapCreateContext, а затем использую его с общими шрифтами, такими как ArialMT:

int theSize = [caption.text length];
CGContextShowTextAtPoint(context, x, y, [caption.text UTF8String], theSize);

Но когдаЯ использую определенные шрифты, буквы отображаются в виде прямоугольников.Поэтому я попытался сделать то, что предложил другой ответ о переполнении стека, то есть использовать CoreText:

 // supposedly a solution to glyphs problem
CGContextSaveGState(context);
CGContextSetRGBFillColor(context, 0, 0, 0, .5);
[caption.text drawAtPoint:CGPointMake(x, y) withFont:caption.font];
CGContextRestoreGState(context);

Но это просто выдает мне ошибку: 7 сентября 13:33:31 ...: CGContextShowGlyphsWithAdvances: неверный контекст 0x0

1 Ответ

0 голосов
/ 08 сентября 2011

Прямоугольник означает, что глиф не доступен в этом шрифте.Использование -drawAtPoint:withFont: будет использовать резервные шрифты для рисования глифов с использованием других шрифтов, но учтите, что не Core Text, это просто UIStringDrawing.В любом случае это не удается, поскольку вызов -drawAtPoint:withFont: основан на текущем стеке графического контекста пользовательского интерфейса, но вы используете пользовательский контекст, которого нет в стеке.Либо используйте UIGraphicsBeginImageContext[WithOptions]() и UIGraphicsEndImageContext() для создания и уничтожения вашего CGContext, либо используйте UIGraphicsPushContext() и UIGraphicsPopContext(), чтобы добавить свой контекст в стек и затем удалить его снова.

В качестве альтернативы вы можете начать использоватьCoreText, который использует явные контексты (точно так же как CoreGraphics), но это будет больше строк кода.

...