kCGTextStroke的填充和描边位置不正确

时间:2013-04-05 16:22:26

标签: objective-c cgcontext core-text quartz-core stroke

所以我使用下面的代码将笔画(和填充)应用到UILabel中的文本,它就像下图所示。一侧的笔划比另一侧的笔划更重(与底部相比,字母的顶部和左侧相比。右侧的时间段使得它非常明显,看起来像一个googly眼睛)。我根本没有打开任何阴影,所以我认为这不是干扰中风的阴影。

导致这种情况的原因是什么?

- (void) drawTextInRect: (CGRect) rect
{
    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextSetTextDrawingMode(c, kCGTextFillStroke);
    CGContextSaveGState(c);
    CGContextSetRGBFillColor(c, 1.0, 0.0, 0.0, 1.0);
    CGContextSetRGBStrokeColor(c, 0.0, 1.0, 0.0, 1.0);
    [super drawTextInRect: rect];
    CGContextRestoreGState(c);
}

enter image description here

编辑:所以,对于踢球,我只看了标签,只有中风。关闭笔划会创建一个看起来非常正常的文本,就好像我只是在Interface Builder中将其着色一样。然而,关闭填充仅显示行程,其在任何一侧看起来都不比任何其他行程重。 **这让我相信问题是其中填充位置与笔划有关,并且填充或笔划本身都没有错。还有其他想法吗?如何将填充直接置于笔划中心?

2 个答案:

答案 0 :(得分:4)

你应该只使用kCGTextFillStroke作为绘图模式,只绘制一次(设置单独的笔触和填充颜色)。

CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0);   // any color you want (this is red)
CGContextSetRGBStrokeColor(context, 0.0, 1.0, 0.0, 1.0); // any color you want (this is green)
CGContextSetTextDrawingMode(context, kCGTextFillStroke);
[self.text drawInRect:rect withFont:self.font];

或者你可以随后中风。通常从中心抽出笔划,这意味着宽度的一半向内,一半向外。这意味着如果你在中风后填充,那么一些中风将会被填充所掩盖。

答案 1 :(得分:1)

可能是被覆盖的方法使用CGContextTranslateCTM或类似函数转换CTM。 CTM是上下文状态的一部分,并为所有后续绘制调用指定转换。

您应该在调用重写方法之前尝试保存上下文并在之后恢复它:

CGContextSaveGState(c);
[super drawTextInRect: rect];
CGContextRestoreGState(c);