Как переместить CGMutablePathRef? - PullRequest
0 голосов
/ 14 марта 2012

У меня есть фрагмент кода ниже, который рисует строку в UIView, используя CoreText:

- (void) drawRect:(CGRect)rect
{
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)self.text);
    CGMutablePathRef mutablePathRef = CGPathCreateMutable();
    CGPathAddRect(mutablePathRef, NULL, self.bounds);
    CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), mutablePathRef, NULL);

    CGFloat frameHeight = [self calculateHeightForFrame: frameRef];

    //what do I do here to resposition the mutablePathRef?

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    CGContextTranslateCTM(context, 0, self.bounds.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    CTFrameDraw(frameRef, context); 

    CFRelease(frameRef);
    CGPathRelease(mutablePathRef);
    CFRelease(framesetter);
}

Я инициализирую фрейм и установщик фреймов и прикрепляю их к CGMutablePath. Затем я использую CTLine начала координат из рамки, чтобы вычислить высоту текста, чтобы я мог центрировать его по вертикали.

После этого я немного озадачен. Есть ли способ переместить положение CGMutablePath в новое начало, чтобы оно было отцентрировано по вертикали? Я попытался CGPathMoveToPoint, и это не сработало.

Или мне нужно создать совершенно новую CGMutablePath и совершенно новую программу установки кадров? Если так, как я могу удалить CGMutablePath? Будет ли он удален, если я его отпущу?

Любые намеки на эффективный способ, которым я мог бы решить это, было бы замечательно, спасибо.

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Как только ваш CGMutablePathRef был использован для создания рамки, изменение пути не влияет на рамку.Более того, CGPathMoveToPoint не перемещает сам путь, а является текущей точкой, позволяя добавлять новые подпути.

Вы можете изменить положение текста, применив перевод к контексту перед рисованием.

CGContextTranslateCTM(x, y);
0 голосов
/ 14 марта 2012

Этот вопрос показывает, как центрировать текст по вертикали с помощью Core Text.

По сути, вам нужно определить высоту текста и изменить путь перед вызовом CGPathAddRect ().

...