2017-09-01 84 views
0

我知道用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() 

     } 
    } 

结果是:

enter image description here

什么不对?

回答

1

想一想...

线宽为10 线端是圆的。 所以线帽的半径是5.

N.B.该线在线帽的中心点结束(不在帽的末端)。

每一划线的长度是3和线之间的间隙是2

因此,帽的半径大于所述线之间的间隙太大大得多。所以每条线都与下一条线重叠。

尝试使线路长度等...

[3, 12]

这应该使3点长为5的帽半径,然后2的帽的端部之间的间隙的线(12 - 5 - 5)。

+1

正确!谢谢!但是我认为当线宽为10时线帽的半径是5,对吗?如果差距为2应该是'''[3,12]''' –

+1

@WilliamHu啊你发现我的*咳嗽*故意*咳嗽*错误。哈哈!是的,你是对的,半径将是5而不是10.现在更新:D – Fogmeister

+0

我可以问另一个问题吗?我想先画出虚线然后再画实线。但'''context.setLineDash'''后我无法清理这个虚线设置,我怎么能做到这一点? –