5

我有一个UIView使用它的-[drawRect:]方法绘制的自定义。

问题是抗锯齿的行为非常奇怪,因为水平或垂直线的黑线绘制得非常模糊。

如果我用 禁用抗锯齿CGContextSetAllowsAntialiasing,一切都会按预期绘制。

抗锯齿:
替代文字 http://dustlab.com/stuff/antialias.png

无抗锯齿(看起来像 AA 的预期结果):
替代文本 http://dustlab.com/stuff/no_antialias.png

线宽正好是 1,所有坐标都是整数值。

如果我使用 绘制一个矩形也会发生同样的情况CGContextStrokeRect,但如果我使用 绘制完全相同则CGRect不会UIRectStroke

4

2 回答 2

10

由于描边向两侧扩展的量相等,因此不能将一个像素宽度的线放置在整数坐标上,而是偏移 0.5 个像素。

计算描边线的正确坐标,如下所示:

CGPoint pos = CGPointMake(floorf(pos.x) + 0.5f, floorf(pos.y) + 0.5f);

顺便说一句:不要将您的值转换为 int 并返回到 float 以摆脱小数部分。在 C 中有一个用于此的函数,称为floor.

于 2009-09-21T14:21:26.410 回答
0

在您的视图框架中,您可能有不是整数的浮点值。虽然帧足够精确,可以处理像素的一小部分(浮点数),但除非您转换为 int,否则您会变得模糊

CGRect frame = CGRectMake((int)self.frame.bounds..., (int)...., (int)...., (int)....);
于 2009-09-21T14:10:48.547 回答