Рисование текста вдоль пути в QuartzCore

Скажите, что у меня есть массив точек, которые формируют строку и текст. Как я могу пойти о рисовании текста вдоль этой строки в

 - (void)drawRect:(CGRect)rect 

из UIView?

Я могу потянуть путь без проблемы. Существует ли стандартный метод, который я пропустил или платформа, которая позволит мне рисовать текст вдоль того пути? Идеально я хотел бы сделать это использование только QuartzCore/CoreGraphics.

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

8
задан Peter Hosey 16 January 2010 в 08:23
поделиться

2 ответа

Я считаю, что вы можете сделать это в Mac OS X, но ближайший вы найду на iPhone, является CGContextShowglyphStaDVances, и это даже не вращается.

Не должно быть слишком сложно, чтобы использовать петлю и нарисовать каждый символ, используя что-то вроде следующего. Это адаптировано из документации Apple и не тестировала, поэтому остерегайтесь:

CGContextSelectFont(myContext, "Helvetica", 12, kCGEncodingMacRoman);
CGContextSetCharacterSpacing(myContext, 10);
CGContextSetTextDrawingMode(myContext, kCGTextFillStroke);
CGContextSetRGBFillColor(myContext, 0, 0, 0, 1);
CGContextSetRGBStrokeColor(myContext, 0, 0, 0, 1);

NSUInteger charIndex = 0;
for(NSString *myChar in arrayOfChars) {
    char *cString = [myChar UTF8String];
    CGPoint charOrigin = originForPositionAlongPath(charIndex, myPath);
    CGFloat slope = slopeForPositionAlongPath(charIndex, myPath);

    CGContextSetTextMatrix(myContext, CGAffineTransformMakeRotation(slope));
    CGContextShowTextAtPoint(myContext, charOrigin.x, charOrigin.y, cString, 1);
}

Редактировать: Вот идея функций позиционирования. Опять же, они не тестируются, но должны быть близки. Оригинал ... Возвращает (-1, -1) Если у вас закончится путь.

CGPoint originForPositionAlongPath(int index, NSArray *path) {
    CGFloat charWidth = 12.0;
    CGFloat widthToGo = charWidth * index;

    NSInteger i = 0;
    CGPoint position = [path objectAtIndex:i];

    while(widthToGo >= 0) {
            //out of path, return invalid point
        if(i >= [path count]) {
            return CGPointMake(-1, -1);
        }

        CGPoint next = [path objectAtIndex:i+1];

        CGFloat xDiff = next.x - position.x;
        CGFloat yDiff = next.y - position.y;
        CGFloat distToNext = sqrt(xDiff*xDiff + yDiff*yDiff);

        CGFloat fracToGo = widthToGo/distToNext
            //point is before next point in path, interpolate the answer
        if(fracToGo < 1) {
            return CGPointMake(position.x+(xDiff*fracToGo), position.y+(yDiff*fracToGo));
        }

            //advance to next point on the path
        widthToGo -= distToNext;
        position = next;
        ++i;
    }
}


CGFloat slopeForPositionAlongPath(int index, NSArray *path) {
    CGPoint begin = originForPositionAlongPath(index, path);
    CGPoint end = originForPositionAlongPath(index+1, path);

    CGFloat xDiff = end.x - begin.x;
    CGFloat yDiff = end.y - begin.y;

    return atan(yDiff/xDiff);
}
11
ответ дан 5 December 2019 в 14:03
поделиться
[11385497-

Это, вероятно, не имеет значения, но вы можете текстовые по пути с SVG ( http://www.w3.org/tr/svg/text.html#textonapath ) и iPhoneos поддерживает его.

1
ответ дан 5 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: