Мне нужно нарисовать центрированный текст в CGContext.
Я начал с подхода какао. Я создал NSCell с текстом и попытался нарисовать его так:
NSGraphicsContext* newCtx = [NSGraphicsContext
graphicsContextWithGraphicsPort:bitmapContext flipped:true];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:newCtx];
[pCell setFont:font];
[pCell drawWithFrame:rect inView:nil];
[NSGraphicsContext restoreGraphicsState];
Но в CGBitmapContext, похоже, не отображается текст. Возможно, потому что мне нужно передать nil для параметра inView :.
Поэтому я попытался переключить рендеринг текста на Core Graphics:
Кажется, что самый простой способ - использовать CGContextSelectFont для выбора шрифта, используя его имя postscript и размер точки, но CGContextShowTextAtPoint принимает только символы, отличные от Unicode, и нет очевидного способа уместить текст в прямоугольник: или вычислить пределы строки текста, чтобы вручную расположить прямоугольник.
Затем можно создать CGFont и установить cia CGContextSetFont. Для рисования этого текста требуется CGContextShowGlyphsAtPoint, но опять же в CGContext, похоже, отсутствуют функции для вычисления ограничивающего прямоугольника сгенерированного текста или для переноса текста в прямоугольник. Плюс неочевидно, как преобразовать строку в массив CGGlyphs.
Следующий вариант - попытаться использовать CoreText для визуализации строки. Но классы Core Text чрезвычайно сложны, и хотя есть образцы, которые показывают, как отображать текст заданным шрифтом в прямоугольнике, нет образцов, демонстрирующих, как вычислить ограничивающий прямоугольник строки CoreText.
So:
- Учитывая CGFont и CGContext, как мне вычислить ограничивающий прямоугольник некоторого текста и как преобразовать текстовую строку в массив CGGlyphs?
- Учитывая строку, CGContext и имя постскрипта и размер точки, какие объекты Core Text мне нужно создать для вычисления ограничивающего прямоугольника строки и / или рисования строки, заключенной в прямоугольник в CGContext.
- Учитывая строку и NSFont - как мне отобразить строку в CGBitmapContext? Я уже знаю, как получить его экстенты.