我在一个快速的应用程序中有这种代码,我得到一条额外的灰色线到达弧的起点。
弧线本身按预期绘制,但似乎CGContextMoveToPoint
在到达起点之前留下一些痕迹。
override func drawRect(rect: CGRect) {
var context:CGContextRef = UIGraphicsGetCurrentContext();
var centerX,centerY,startAngle,endAngle,radius:CGFloat
startAngle = CGFloat(M_PI_4)
endAngle = -startAngle
radius = (rect.height/2) / sin(startAngle)
centerX = rect.width/2 + (radius*cos(startAngle))
centerY = rect.height/2
CGContextMoveToPoint(context, rect.width/2, rect.height)
CGContextAddArc(context,centerX,centerY,radius,startAngle,endAngle,0);
CGContextSetLineWidth(context, 3.0)
CGContextSetStrokeColorWithColor(context, UIColor.lightGrayColor().CGColor)
CGContextStrokePath(context)
}
有什么可能出错的想法吗?
答案 0 :(得分:0)
这是CGContextAddArc
的一项功能。来自文档:
如果当前路径已包含子路径,Quartz会添加一行 将当前点连接到弧的起始点。如果 当前路径为空,Quartz创建一个新的新子路径 起点设置为弧的起点。
通过移动到某一点,您已经建立了路径的起点。如果您移除CGContextMoveToPoint()
,您的弧线将在没有额外线条的情况下进行绘制。
或者,您可以移动到弧的起点:
CGContextMoveToPoint(context, centerX + radius*cos(startAngle), centerY + radius*sin(startAngle))
<强>更新强>
(编者注:我在@Michel发现问题之后添加了这一点。这可能是我在评论中进行一些讨论后应该给出的答案。这里提供的可能是为了将来帮助其他人。) / p>
您的整个圆弧看起来像字母c,但只有部分圆弧在视图中可见(给定上面的代码)。额外的线条从视图底部的中间绘制到屏幕外的c曲线的较低起点。
如果您只想要视图中弧线的一部分,那么您的起始角度应为3 * M_PI_4
,而您的centerX
计算需要使用-
代替{{ 1}}:
+
然后,您的起点将出现在视图中,不会出现额外的行。