虚线圆圈中行程的计算 属性 'Dash' - Swift

Calculation of stroke property 'Dash' in dashed circle - Swift

我正在开发一个应用程序。我还没有完成 Swift 2.2/3.0 的学徒期,我正在寻找一些答案。

首先: 我正在使用 PaintCode 生成 Swift 代码的开头。我制作了具有以下属性的绘图:

代码Swift:

func drawSpeedView(strokeGap strokeGap: CGFloat = 30, strokeDash: CGFloat = 4, strokePhase: CGFloat = 0, strokeWidth: CGFloat = 31, strokeStartAngle: CGFloat = 225, strokeEndAngle: CGFloat = 315) {
    //// General Declarations
    let context = UIGraphicsGetCurrentContext()

    //// DashedLarge Drawing
    let dashedLargeRect = CGRect(x: 14.5, y: 17.5, width: 291, height: 291)
    let dashedLargePath = UIBezierPath()
    dashedLargePath.addArcWithCenter(CGPoint(x: dashedLargeRect.midX, y: dashedLargeRect.midY), radius: dashedLargeRect.width / 2, startAngle: -strokeStartAngle * CGFloat(M_PI)/180, endAngle: -strokeEndAngle * CGFloat(M_PI)/180, clockwise: true)

    UIColor.blackColor().setStroke()
    dashedLargePath.lineWidth = strokeWidth
    CGContextSaveGState(context)
    CGContextSetLineDash(context, strokePhase, [strokeDash, strokeGap], 2)
    dashedLargePath.stroke()
    CGContextRestoreGState(context)
}

我的问题: 此代码针对 iPhone 5 进行了优化。 对于点数的比例,我需要为 iPhone 6/6s 和 6+/6s+

strokeDash 的值创建一个计算

我需要什么: 我还没有知识库来进行周长计算。

我需要计算以替换行:

CGContextSetLineDash(context, strokePhase, [strokeDash, strokeGap], 2)

用十进制数代替,无论圆的周长如何,都可以在圆周围加上 12/6/15 虚线。

有人能解决我的问题吗?

我从哪里开始?

iPhone 5 期

正如您从行中看到的(从您的代码片段):

let dashedLargeRect = CGRect(x: 14.5, y: 17.5, width: 291, height: 291)

绘图 space 的宽度为 291 点,高度为 291 点。

对这些数字进行硬编码是一个糟糕的想法,因为正如您所注意到的,这意味着代码只能在某些设备上运行良好,而在其他设备上则无法正常运行。

要解决此问题,您只需声明以下函数即可动态获取这些分辨率:

func windowHeight() -> CGFloat {
      return UIScreen.mainScreen().applicationFrame.size.height
}

func windowWidth() -> CGFloat {
    return UIScreen.mainScreen().applicationFrame.size.width
}

然后你可以创建 dashedLargeRect 例如:

let dashedLargeRect = CGRect(x: 14.5, y: 17.5, width: windowWidth()-20, height: windowHeight()-20)

通过这种方式,您可以使代码与设备无关,这始终是一种很好的做法。 (请注意,我没有触及 CGRect“来源”、a.k.a、xy 参数,请考虑你的作业:))。

第二期

如果我没理解错的话,你想知道如何绘制那个虚线弧。

秘密就在一线

dashedLargePath.addArcWithCenter(CGPoint(x: dashedLargeRect.midX, y: dashedLargeRect.midY), radius: dashedLargeRect.width / 2, startAngle: -strokeStartAngle * CGFloat(M_PI)/180, endAngle: -strokeEndAngle * CGFloat(M_PI)/180, clockwise: true)

你可以看addArcWithCenter文档here,我给你简化一下:

let arcCenter = CGPoint(x: dashedLargeRect.midX, y: dashedLargeRect.midY)
let radius = dashedLargeRect.width / 2
let startAngle = -strokeStartAngle * CGFloat(M_PI)/180
let endAngle = -strokeEndAngle * CGFloat(M_PI)/180

dashedLargePath.addArcWithCenter(arcCenter, 
                                 radius: radius, 
                                 startAngle: startAngle, 
                                 endAngle: endAngle, 
                                 clockwise: true)

现在应该更清楚这段代码的作用了,如果你想在这段代码上画另一条线(例如显示车速、风速、气压等),你只需要要做的是调用具有 smaller/bigger 半径的类似函数,可能还有不同的线型(a.k.a。更改 CGContextSetLineDashdashedLargePath.lineWidthUIColor.blackColor().setStroke() 线).