【问题标题】:Weird anti-aliasing in custom view自定义视图中奇怪的抗锯齿
【发布时间】:2009-09-21 13:28:37
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: iphone uiview drawing antialiasing drawrect


    【解决方案1】:

    由于笔画向两侧扩展的量相等,一个像素宽度的线不得放置在整数坐标上,而是偏移 0.5 个像素。

    像这样计算描边线的正确坐标:

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

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      相关资源
      最近更新 更多