是否有更好的CGContext替代方案?

时间:2016-07-07 01:17:39

标签: ios swift core-graphics

我正在使用CGContext创建一个漏斗形状,首先绘制一个三角形,然后是一条线。我在我的drawRect子类的UIView中实现了这个,但是想知道是否有另一种绘制方法,因为线条有点模糊。

    override func drawRect(rect: CGRect) {

        let context: CGContextRef = UIGraphicsGetCurrentContext()!
        CGContextClearRect(context, rect);

        let rectWidth: CGFloat = 15

        // Line
        CGContextSetRGBStrokeColor(context, 0, 0, 0, 1)
        CGContextMoveToPoint(context, rectWidth / 2, 5)
        CGContextAddLineToPoint(context, rectWidth / 2, 10)
        CGContextSetStrokeColorWithColor(context, UIColor.blueColor().CGColor)
        CGContextSetLineCap(context, CGLineCap.Round)
        CGContextSetLineWidth(context, 3.0)
        CGContextStrokePath(context)

        // Triangle
        CGContextBeginPath(context);
        CGContextMoveToPoint   (context, CGRectGetMinX(rect), CGRectGetMinY(rect));
        CGContextAddLineToPoint(context, CGRectGetMidX(rect), 8);
        CGContextAddLineToPoint(context, CGRectGetMaxX(rect), CGRectGetMinY(rect));
        CGContextClosePath(context);

        UIColor.blueColor().setFill()
        CGContextFillPath(context);

    }

产生这个: enter image description here

但是当我导入我设计的图像时,图像更清晰(你可以在iPhone上看到): enter image description here

那么,有没有更好的方法来实现这一输出? CGContext行有点模糊,所以我想知道是否有更好的选择,以及这些方法的优缺点是什么。

1 个答案:

答案 0 :(得分:3)

Core Graphics正在绘制模糊的东西,可能是因为你告诉了它。 CG坐标系中每对整数坐标的位置正好在网格线上 - 如果在这些坐标之间绘制一个点宽的笔划,则会得到一个跨越网格线两侧半点的笔划。根据您要绘制的位图上下文的比例,可能会产生两列半阴影像素而不是一列完全阴影像素 - 即模糊线条。

在您的情况下,您之间绘制线条的一些点落在全像素边界上,而某些点落在半像素边界上,因此在1x显示屏上,某些线条会模糊,在2x或3x显示屏上其他人会。阅读关于绘图的Apple文档中的Points versus Pixels,您可能会找到一种方法来偏移坐标,使得线条全部落在您想要的位置。