我在快速的应用程序中使用了此类代码,并且得到了一条额外的灰色线条,到达了弧线的起点。
圆弧本身已按预期绘制,但似乎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)
}
有什么问题的想法吗?
最佳答案
这是CGContextAddArc
的功能。从文档中:
如果当前路径已经包含一个子路径,则Quartz添加一行
将当前点连接到弧的起点。如果
当前路径为空,Quartz使用以下命令创建一个新的新子路径:
起点设置为圆弧的起点。
通过移动到一点,您已经确定了路径的起点。如果删除CGContextMoveToPoint()
,则弧线将绘制而没有多余的线。
或者,您可以移至圆弧的起点:
CGContextMoveToPoint(context, centerX + radius*cos(startAngle), centerY + radius*sin(startAngle))
更新资料
(编者注:我在@Michel找出问题后添加了此位。这也许是我在评论中进行一些讨论后应该给出的答案。此处提供此信息可能是为了将来帮助其他人。)
您的整个弧形看起来像字母c,但在视图中只有一部分可见(鉴于上面的代码)。多余的线是从视图底部的中间到屏幕外c曲线的下端绘制的。
如果只需要视图中弧的一部分,则起始角度应为
3 * M_PI_4
,然后您的centerX
计算需要使用-
而不是+
:override func drawRect(rect: CGRect) {
var context:CGContextRef = UIGraphicsGetCurrentContext();
var centerX,centerY,startAngle,endAngle,radius:CGFloat
startAngle = 3 * 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)
}
然后,您的起点将出现在视图中,并且不会出现多余的线。
关于ios - 快速绘制圆弧时的多余线条,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31489157/