如何移动CGMutablePathRef?

时间:2012-03-14 13:32:19

标签: iphone ios cocoa-touch core-graphics core-text

我在下面有一段代码,使用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 个答案:

答案 0 :(得分:1)

使用CGMutablePathRef创建框架后,修改路径对框架没有影响。此外CGPathMoveToPoint不会移动路径本身,而是当前点,允许追加新的子路径。

您可以在绘制前在上下文中应用翻译来更改文本的位置。

CGContextTranslateCTM(x, y);

答案 1 :(得分:0)

This question显示了如何使用Core Text垂直居中文本。

基本上,您需要在调用CGPathAddRect()之前确定文本的高度并修改路径。