我正在使用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);
}
但是当我导入我设计的图像时,图像更清晰(你可以在iPhone上看到):
那么,有没有更好的方法来实现这一输出? CGContext
行有点模糊,所以我想知道是否有更好的选择,以及这些方法的优缺点是什么。
答案 0 :(得分:3)
Core Graphics正在绘制模糊的东西,可能是因为你告诉了它。 CG坐标系中每对整数坐标的位置正好在网格线上 - 如果在这些坐标之间绘制一个点宽的笔划,则会得到一个跨越网格线两侧半点的笔划。根据您要绘制的位图上下文的比例,可能会产生两列半阴影像素而不是一列完全阴影像素 - 即模糊线条。
在您的情况下,您之间绘制线条的一些点落在全像素边界上,而某些点落在半像素边界上,因此在1x显示屏上,某些线条会模糊,在2x或3x显示屏上其他人会。阅读关于绘图的Apple文档中的Points versus Pixels,您可能会找到一种方法来偏移坐标,使得线条全部落在您想要的位置。