是否有可能绘制虚线,而无需使用UIBezierPath
问题描述:
我知道用UIBezierPath()来绘制一个虚线状:是否有可能绘制虚线,而无需使用UIBezierPath
let path = UIBezierPath()
path.setLineDash([CGFloat(4), CGFloat(4)], count: 2, phase: 0)
path.lineCapStyle = CGLineCap.round
path.move(to: startPoint)
path.addLine(to: endPoint)
path.stroke()
它工作正常。但我怎么能在上下文中画一条虚线?就像下面的代码可以得出一个实线,无论我是否添加
context.setLineDash(phase: 3, lengths: [3,2])
整个代码:
override func draw(_ rect: CGRect) {
if let context = UIGraphicsGetCurrentContext() {
let startPoint = CGPoint(x: 50, y: 10)
let endPoint = CGPoint(x: rect.width-100, y: 10)
context.setLineDash(phase: 3, lengths: [3,2])
context.setLineWidth(10)
context.move(to: startPoint)
context.addLine(to: endPoint)
context.setStrokeColor(UIColor.red.cgColor)
context.setLineCap(.round)
context.strokePath()
}
}
结果是:
什么不对?
答
想一想...
线宽为10 线端是圆的。 所以线帽的半径是5.
N.B.该线在线帽的中心点结束(不在帽的末端)。
每一划线的长度是3和线之间的间隙是2
因此,帽的半径大于所述线之间的间隙太大大得多。所以每条线都与下一条线重叠。
尝试使线路长度等...
[3, 12]
这应该使3点长为5的帽半径,然后2的帽的端部之间的间隙的线(12 - 5 - 5)。
正确!谢谢!但是我认为当线宽为10时线帽的半径是5,对吗?如果差距为2应该是'''[3,12]''' –
@WilliamHu啊你发现我的*咳嗽*故意*咳嗽*错误。哈哈!是的,你是对的,半径将是5而不是10.现在更新:D – Fogmeister
我可以问另一个问题吗?我想先画出虚线然后再画实线。但'''context.setLineDash'''后我无法清理这个虚线设置,我怎么能做到这一点? –