代码之家  ›  专栏  ›  技术社区  ›  mrueg

自定义视图中的奇怪消除混叠

  •  5
  • mrueg  · 技术社区  · 16 年前

    我有一个习俗 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 回复  |  直到 16 年前
        1
  •  10
  •   Nikolai Ruhe    16 年前

    由于一个笔画向两边的展开量相等,所以一条像素宽的线 不能 放置在整数坐标上,但偏移量为0.5像素。

    像这样计算行程线的正确坐标:

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

    顺便说一句:不要将值强制转换为int,然后返回float以去掉小数部分。在C中有一个函数 floor .

        2
  •  0
  •   coneybeare    16 年前

    在视图框架中,可能有非整数的浮点值。虽然帧足够精确,可以做一个像素的分数(浮点),但如果不投射到int,就会变得模糊。

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