2016-04-26 11 views
0

Ich möchte ein Quadrat zeichnen, mit NSBezierPath. Der Rand des Quadrats muss nicht mehr gesetzt werden, daher verwende ich den Strichstil, aber ich habe keine Kontrolle über die Anzahl der erstellten Segmente.NSBezierPath: Wie Steuern von Nummern von Segmenten mit LineDashStyle?

Auf Apple-Dokumentation ist die Erklärung ein wenig vage. Sie sagten, dass "Wenn Sie ein Linienstrichmuster festlegen, geben Sie die Breite (in Punkten) jedes aufeinanderfolgenden soliden oder transparenten Farbfelds an". Also ich denke, ich brauche einen Weg, um die Länge einer gebogenen Bezier zu bekommen.

Hat jemand eine Idee, wie ich das erreichen kann?

+0

Ist es gekrümmt, oder ist es ein Quadrat? – jtbandes

+0

ist ein Quadrat, hat aber Eckenradius. –

Antwort

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 
     } 
    } 
} 

Mit dieser Erweiterung bekomme ich die "approximative" Länge eines Bezier. Danach ist alles einfach:

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()