2016-04-26 14 views
0

NSBezierPathを使って正方形を描きたい。私はdashStyleを使用するので、四角形の境界線は中止する必要がありますが、私は作成されたセグメントの数を制御していません。NSBezierPath:LineDashStyleでセグメント数を制御する方法は?

アップルのドキュメントで説明が少し曖昧です。彼らは、「ラインダッシュのパターンを設定するときは、連続するソリッドまたはスウォッチの幅(ポイント単位)を指定する」と述べました。 私は、曲がったベジェの長さを得る方法が必要だと思います。

どのように私はそれを達成することができるアイデアはありますか?

+0

曲がっているのですか、それとも正方形ですか? – jtbandes

+0

istは正方形ですが、角の半径があります。 –

答えて

0
extension NSBezierPath { 

    var lenght:Double { 
     get{ 
      let flattenedPath = self.bezierPathByFlatteningPath 
      let segments = flattenedPath.elementCount 
      var lastPoint:NSPoint = NSZeroPoint 
      var point:NSPoint = NSZeroPoint 
      var size :Double = 0 

      for i in 0...segments - 1 { 
       let e:NSBezierPathElement = flattenedPath.elementAtIndex(i, associatedPoints: &point) 
       if e == .MoveToBezierPathElement { 
        lastPoint = point 
       } else { 
        let distance:Double = sqrt(pow(Double(point.x - lastPoint.x) , 2) + pow(Double(point.y - lastPoint.y) , 2)) 
        size += distance 
        lastPoint = point 
       } 
      } 

      return size 
     } 
    } 
} 

この拡張では、ベジェの「近似的な」長さが得られます。それ以降はすべてがシンプルです:

let myPath = NSBezierPath(roundedRect:myRect, xRadius:50, yRadius:50) 
let pattern = myPath.length/(numbersOfSegments * 2) // we divide the length to double of segments we need. 
myPath.setLineDash([CGFloat(pattern),CGFloat(pattern)], countL:2 , phase: 0) 
myPath.stroke() 
関連する問題