破線

2017-05-08 3 views
2

破線

class DashedLineView: UIView { 

    override func draw(_ rect: CGRect) { 

     let path = UIBezierPath(roundedRect: rect, cornerRadius: 8) 

     UIColor.clear.setFill() 
     path.fill() 

     UIColor.red.setStroke() 
     path.lineWidth = 3 

     let dashPattern : [CGFloat] = [3, 3] 
     path.setLineDash(dashPattern, count: 2, phase: 0) 
     path.stroke() 
    } 
} 

結果は次のとおりです。

enter image description here

あなたがそこにある見ることができるようにコーナーの問題、どのようにそれを修正するための任意のアイデア?

更新日: @ジョン・ローズanswerを使用DashedLineViewは次のようになります。

class DashedLineView: UIView { 

    private let borderLayer = CAShapeLayer() 

    override func awakeFromNib() { 

     super.awakeFromNib() 

     borderLayer.strokeColor = UIColor.red.cgColor 
     borderLayer.lineDashPattern = [3,3] 
     borderLayer.backgroundColor = UIColor.clear.cgColor 
     borderLayer.fillColor = UIColor.clear.cgColor 

     layer.addSublayer(borderLayer) 
    } 

    override func draw(_ rect: CGRect) { 

     borderLayer.path = UIBezierPath(roundedRect: rect, cornerRadius: 8).cgPath 
    } 
} 
+0

drawRectの代わりにCAShaperLayerを使用することを検討してください。私はこれをCAShaperLayerとパスを使って実装しましたが、うまく表示されます。 –

+0

例を投稿できますか? – sash

答えて

3

私はCAShapeLayerを使用して良い経験を持っていました。たとえば:

let rect = CGRect.init(origin: CGPoint.init(x: 20, y: 100), size: CGSize.init(width: 200, height: 100)) 
let layer = CAShapeLayer.init() 
let path = UIBezierPath(roundedRect: rect, cornerRadius: 8) 
layer.path = path.cgPath; 
layer.strokeColor = UIColor.red.cgColor; 
layer.lineDashPattern = [3,3]; 
layer.backgroundColor = UIColor.clear.cgColor; 
layer.fillColor = UIColor.clear.cgColor; 
self.view.layer.addSublayer(layer); 

ボーナスとして、ほぼすべてのCAShapeLayerのプロパティのあなたはダッシュボックスの周りに動いているようにそれが見えるようにすることができますを意味しているlineDashPhaseを含むアニメーション可能です。