如何移动 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?的主要内容,如果未能解决你的问题,请参考以下文章
通过 CGMutablePathRef 为 drawRect 中绘制的框设置动画
在我的自定义 UIView 中,设置子视图的 backgroundColor 会导致它覆盖我的 drawRect 绘图(CGContextRef、CGMutablePathRef 等)。怎么修?