快速越来越奇怪的溺水虚线

问题描述:

我想在UIView中画一些虚线,但我不知道我是否正确地做。第一个破折号与其他破折号相比有一半的宽度。快速越来越奇怪的溺水虚线

代码:

let strokeColor      = UIColor.white.cgColor 
    let path = UIBezierPath() 
    path2.move(to: CGPoint(x: 0, y: 50)) 
    path2.addLine(to: CGPoint(x: 340, y: 50)) 

    //thickHorizontalLayer.frame   = frame 
    thickHorizontalLayer.path   = path.cgPath 
    thickHorizontalLayer.strokeColor  = strokeColor 
    thickHorizontalLayer.lineWidth  = 15 
    thickHorizontalLayer.fillColor  = UIColor.clear.cgColor 
    thickHorizontalLayer.lineDashPattern = [ 0.5, 6 ] 
    thickHorizontalLayer.lineDashPhase = 0.25 

    self.layer.addSublayer(thickHorizontalLayer) 

是什么它吸引:http://imgur.com/a/2NuRE

这是做的最好的方法是什么? 如果你看到,第一个破折号是比其他人... ...

加问题:我怎么能得到的UIView的约束的y值?例如bound = 340,这是上面的情况。

编辑:

我想抽2种破折号模式(一个细小的等厚),但它变得混乱...:

fileprivate let thickHorizontalLayer = CAShapeLayer() 
    fileprivate let thinHorizontalLayer = CAShapeLayer() 

    let strokeColor      = UIColor.white.cgColor 
    let path2 = UIBezierPath() 
    path2.move(to: CGPoint(x: 20, y: 50)) 

    path2.addLine(to: CGPoint(x: 320, y: 50)) 

    //thickHorizontalLayer.frame   = frame 
    thickHorizontalLayer.path   = path2.cgPath 
    thickHorizontalLayer.strokeColor  = strokeColor 
    thickHorizontalLayer.lineWidth  = 20 
    thickHorizontalLayer.fillColor  = UIColor.clear.cgColor 
    thickHorizontalLayer.lineDashPattern = [ 1, 73.5 ] 
    //thickHorizontalLayer.lineDashPhase = 0.25 

    self.layer.addSublayer(thickHorizontalLayer) 

    let path3 = UIBezierPath() 
    path3.move(to: CGPoint(x: 0, y: 52.5)) 
    path3.addLine(to: CGPoint(x: 340.0, y: 52.5)) 


    //thinHorizontalLayer.frame   = frame 
    thinHorizontalLayer.path    = path3.cgPath 
    thinHorizontalLayer.strokeColor  = strokeColor 
    thinHorizontalLayer.lineWidth  = 15.0 
    thinHorizontalLayer.fillColor  = UIColor.clear.cgColor 
    thinHorizontalLayer.lineDashPattern = [ 0.5, 6.25 ] 
    //thinHorizontalLayer.lineDashPhase = 0.25 

    self.layer.addSublayer(thinHorizontalLayer) 

其绘图本:http://imgur.com/NBW1TGQ

如果仔细观察,可以看出它变得很奇怪(看破折号的颜色)::http://imgur.com/YlVJ7mn

我想从x中画出5个破折号: 20到x:320,并且在它们之间(但是在x:0到x:340之间)画出9条更细的破折号。希望有人能帮我解决这个...

+1

你明确要求虚线相位中途开始进入第一个冲刺。 – Ssswift

+0

@Ssswift我不再使用DashPhase,但我仍然很困惑这一切。我试图画出2个短划线,一个很薄,另一个很厚......我将编辑这个问题以显示更多内容。 –

+0

如果你想要的厚度是厚壁蜱的10倍,那么这些破折号应该覆盖距离的1/10,否?但6.75并不是74.5的任何整数倍数。 – Ssswift

我已经解决了这个问题,这一点:How to make universal round draws (with lineDashPattern) with UIbezierPath on Swift

public override func draw(_ rect: CGRect) { 

     let center = CGPoint(x:bounds.width/2, y: bounds.height) 

     var radius: CGFloat = max(bounds.width, bounds.height+50) 

     // Define the thickness of the arc. 
     let arcWidth: CGFloat = 1 

     let startAngle: CGFloat = CGFloat(M_PI) // π 
     let endAngle: CGFloat = CGFloat(2 * M_PI) // π 

     let counterColor = UIColor.red 

     var path = UIBezierPath(arcCenter: center, 
           radius: radius/2 - arcWidth/2, 
           startAngle: startAngle, 
           endAngle: endAngle, 
           clockwise: true) 

     path.lineWidth = arcWidth 
     counterColor.setStroke() 
     path.stroke() 


     // init vars for later use 
     var nTicks = 0 
     var tickWidth = 0.0 
     var gapWidth = 0.0 


     radius += 20 

     path = UIBezierPath(arcCenter: center, 
          radius: radius/2 - arcWidth/2, 
          startAngle: startAngle, 
          endAngle: endAngle, 
          clockwise: true) 

     let strokeColor   = UIColor.black.cgColor 

     let roundThinLayer = CAShapeLayer() 

     // number of short ticks to draw 
     nTicks = 150 

     // thickness of short ticks 
     tickWidth = 0.5 

     // calculate the gap between ticks 
     gapWidth = ((M_PI * Double(radius)/2) - (tickWidth * Double(nTicks)))/Double(nTicks - 1) 

     roundThinLayer.path    = path.cgPath 
     roundThinLayer.strokeColor  = strokeColor 
     roundThinLayer.lineWidth  = 20.0 
     roundThinLayer.fillColor  = UIColor.clear.cgColor 
     roundThinLayer.lineDashPattern = [ tickWidth as NSNumber, gapWidth as NSNumber ] 
     roundThinLayer.lineDashPhase = CGFloat(tickWidth/Double(2)) 


     self.layer.addSublayer(roundThinLayer) 


     radius += 20 

     path = UIBezierPath(arcCenter: center, 
          radius: radius/2 - arcWidth/2, 
          startAngle: startAngle, 
          endAngle: endAngle, 
          clockwise: true) 

     let roundThickLayer = CAShapeLayer() 


     // number of tall ticks to draw 
     nTicks = 7 

     // thickness of tall ticks 
     tickWidth = 1.5 

     // calculate the gap between ticks 
     gapWidth = ((M_PI * Double(radius)/2) - (tickWidth * Double(nTicks)))/Double(nTicks - 1) 

     roundThickLayer.path   = path.cgPath 
     roundThickLayer.strokeColor  = strokeColor 
     roundThickLayer.lineWidth  = 40 
     roundThickLayer.fillColor  = UIColor.clear.cgColor 
     roundThickLayer.lineDashPattern = [ tickWidth as NSNumber, gapWidth as NSNumber ] 
     roundThickLayer.lineDashPhase = CGFloat(tickWidth/Double(2)) 
     self.layer.addSublayer(roundThickLayer) 

     self.clipsToBounds = true 


    }