如何移动 CGMutablePathRef?

Posted

技术标签:

【中文标题】如何移动 CGMutablePathRef?【英文标题】:How to move CGMutablePathRef? 【发布时间】:2012-03-14 13:32:19 【问题描述】:

我在下面有一段代码,它使用CoreText 将字符串绘制到UIView

- (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?如果我释放它会被删除吗?

任何关于我可以解决这个问题的有效方法的提示都会很棒,谢谢。

【问题讨论】:

最后,我必须创建一个 frameRef 来确定高度,然后我必须重新创建 frameRef 并根据我计算的高度将其重新定位在中心 【参考方案1】:

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

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

CGContextTranslateCTM(x, y);

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于如何移动 CGMutablePathRef?的主要内容,如果未能解决你的问题,请参考以下文章

CGPathRef 与 CGmutablePathRef

释放 CGMutablePathRef 是有问题的

通过 CGMutablePathRef 为 drawRect 中绘制的框设置动画

在我的自定义 UIView 中,设置子视图的 backgroundColor 会导致它覆盖我的 drawRect 绘图(CGContextRef、CGMutablePathRef 等)。怎么修?

CGContextRef&CGMutablePathRef&UIBezierPath简单学习

当我需要返回它时如何释放这个 CGPath