虚线圆圈中行程的计算 属性 '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、x
、y
参数,请考虑你的作业:))。
第二期
如果我没理解错的话,你想知道如何绘制那个虚线弧。
秘密就在一线
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。更改 CGContextSetLineDash
、dashedLargePath.lineWidth
和 UIColor.blackColor().setStroke()
线).
我正在开发一个应用程序。我还没有完成 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、x
、y
参数,请考虑你的作业:))。
第二期
如果我没理解错的话,你想知道如何绘制那个虚线弧。
秘密就在一线
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。更改 CGContextSetLineDash
、dashedLargePath.lineWidth
和 UIColor.blackColor().setStroke()
线).