我在快速的应用程序中使用了此类代码,并且得到了一条额外的灰色线条,到达了弧线的起点。
圆弧本身已按预期绘制,但似乎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/

10-10 22:25