CGContextShowTextAtPoint отображает вверх ногами - PullRequest
1 голос
/ 10 июля 2011

Я пытаюсь нарисовать текст через Quartz на NSView через CGContextShowTextAtPoint().Это работало хорошо, пока я не переопределил (BOOL)isFlipped, чтобы вернуть YES в моем подклассе NSView, чтобы расположить начало координат в верхнем левом углу для рисования.Текст рисуется в ожидаемой области, но все буквы перевернуты.Я также попробовал (теоретически, по крайней мере) эквивалент перевернуть мой CGContext и выполнить перевод по высоте контекста.

ex

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

Это дает тот же результат.

Многие предложения по аналогичным проблемам указывают на изменение текстовой матрицы.Я установил текстовую матрицу в единичную матрицу, выполнил дополнительную инверсию и сделал оба, соответственно.Все эти решения привели к еще более странному отображению текста (часто появляется только фрагмент.)

Другое предложение, которое я видел, состояло в том, чтобы просто избегать этой функции в пользу других средств рисования текста (например, NSString методы рисования.) Однако это делается в основном на C ++ / C, и я хотел бы остаться на этих уровнях, если это возможно.

Любые предложения очень ценятся, и я был бы радотправьте больше кода, если это необходимо.

Спасибо, Сэм

Ответы [ 3 ]

2 голосов
/ 13 ноября 2012

На этот вопрос дан ответ здесь .

По сути, это потому, что система координат на основной графике 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 голос
/ 10 июля 2011

Вам нужно использовать границы представления, а не dirtyRect и выполнить перевод до масштабирования:

CGContextTranslateCTM(theContext, 0, -NSHeight(self.bounds));
CGContextScaleCTM(theContext, 1, -1);
0 голосов
/ 13 июля 2011

Оказывается, ответ был изменить текстовую матрицу. Странные «фрагменты», которые показывались вместо текста, были из-за того, что размер шрифта (установленный через CGContextSelectFont ()) был слишком мал при замене текстовой матрицы «по умолчанию». По какой-то причине исходная матрица имела крупномасштабное преобразование, поэтому меньшие размеры текста выглядели хорошо, когда матрица не изменялась; однако при замене на обратную шкалу (1, -1) или единичную матрицу они станут нечитаемо маленькими.

...