我在下面有一段代码,使用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
?如果我发布它会被删除吗?
我能解决这个问题的有效方法的任何提示都会很棒,谢谢。
答案 0 :(得分:1)
使用CGMutablePathRef
创建框架后,修改路径对框架没有影响。此外CGPathMoveToPoint
不会移动路径本身,而是当前点,允许追加新的子路径。
您可以在绘制前在上下文中应用翻译来更改文本的位置。
CGContextTranslateCTM(x, y);
答案 1 :(得分:0)
This question显示了如何使用Core Text垂直居中文本。
基本上,您需要在调用CGPathAddRect()之前确定文本的高度并修改路径。