2

所以我使用下面的代码对 a 中的文本应用描边(和填充),UILabel结果如下图所示。笔画的一侧比另一侧重(看字母的顶部与底部相比,右侧与左侧相比。末尾的句点也使它非常明显,看起来像一只粘糊糊的眼睛)。我根本没有打开任何阴影,所以我不认为是阴影干扰了笔画。

这可能是什么原因造成的?

- (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);
}

在此处输入图像描述

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

4

2 回答 2

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];

或者,您可以事后抚摸。笔画通常从中心开始,这意味着一半宽度向内,一半向外。这意味着如果你在描边后填充,一些描边会被填充覆盖。

于 2013-04-08T10:40:50.997 回答
1

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

您应该尝试在调用被覆盖的方法之前保存上下文并在之后恢复它:

CGContextSaveGState(c);
[super drawTextInRect: rect];
CGContextRestoreGState(c);
于 2013-04-08T08:42:43.183 回答