Я хочу написать текст по контуру, который может принимать любую форму. Прямо сейчас я могу нарисовать в нем перевернутый текст:
NSArray *coordinates = ...;
CGMutablePathRef pathRef = [self objectPathGivenCoordinates:coordinates];
... // Draw the shapes
// Now draw the text
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
NSAttributedString* attString = [[NSAttributedString alloc] initWithString:@"0,1,2..."];
CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attString);
CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, [attString length]), pathRef, NULL);
CTFrameDraw(frame, context);
Это производит следующее:
Я так понимаю, что в iOS перевернутая система координат. Большинство решений добавляют эти две линии перед рисованием:
CGContextTranslateCTM(context, 0, rect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
Но это дает следующее:
Так почему же эта техника не работает? В каждом примере, который я видел, этот метод используется, когда текст отображается в чем-то симметричном, с отсечением или в OS X. Если мы рисуем текст в симметричной форме, наши вызовы CGContextTranslateCTM()
и CGContextScaleCTM()
имеют смысл. Вызов CGContextTranslateCTM(context, 0, rect.size.height)
перемещает начало первой буквы наверх. Вызов CGContextScaleCTM(context, 1, -1)
меняет направление Y на противоположное. Если мы изменим направление Y на симметричную фигуру, оно не изменится. К сожалению, мои формы не симметричны.
Вот что я рассмотрел, но отказался
- Нарисуйте фигуры и числа в одном масштабе (оба вверх ногами), затем как-нибудь переверните
UIImageView
за ним (1) - Не звоните, чтобы изменить масштаб или перевести CTM. Переверните текстовую матрицу с помощью
CGContextSetTextMatrix()
, чтобы текст отображался слева направо, снизу вверх и справа вверх. Определите, сколько дополнительных символов осталось в фигуре после определения строки для фигуры. Поменяйте местами слова (теперь он будет рисовать сверху вниз, справа налево, правой стороной вверх). Добавьте пробелы для каждого лишнего символа. Теперь для каждогоCTLine
как-нибудь снова поменяйте местами слова (теперь он будет рисовать сверху вниз, слева направо, правой стороной вверх) (2)
Почему я бросил их
(1) Я не могу переворачивать свои изображения. Они всегда должны быть правильными
(2) Это может быть излишним для простого решения, которое знает кто-то другой.
CGContextSetTextMatrix(context, CGAffineTransformMakeScale(1, -1))
вместо CGAffineTransformIdentity - person Emmanuel   schedule 09.12.2013