自定义视图中奇怪的抗锯齿

时间:2009-09-21 13:28:37

标签: iphone uiview drawing antialiasing drawrect

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

问题在于抗锯齿行为非常奇怪,因为黑线水平线或垂直线都非常模糊。

如果我使用CGContextSetAllowsAntialiasing禁用抗锯齿功能,则会按预期绘制所有内容。

抗锯齿:
alt text http://dustlab.com/stuff/antialias.png

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

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

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

2 个答案:

答案 0 :(得分:10)

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

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

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

顺便说一句:不要将值转换为int并返回float以除去小数部分。在C中有一个名为floor的函数。

答案 1 :(得分:0)

在视图框架中,您可能具有非整数的浮点值。虽然框架足够精确以完成像素的一部分(浮动),但除非你转换成int,否则你会变得模糊

CGRect frame = CGRectMake((int)self.frame.bounds..., (int)...., (int)...., (int)....);