2016-04-26 1 views
0

Je veux dessiner un carré, avec NSBezierPath. La bordure de carré doit être interrompue, donc j'utilise dashStyle, mais je n'ai aucun contrôle sur le nombre de segments créés.NSBezierPath: Comment contrôler les nombres de segments avec LineDashStyle?

Dans la documentation Apple, l'explication est un peu vague. Ils ont dit que "Lors de la définition d'un motif de ligne, vous spécifiez la largeur (en points) de chaque échantillon solide ou transparent successif". Donc je pense, j'ai besoin d'un moyen d'obtenir la longueur d'un bezier courbé.

Est-ce que quelqu'un a une idée de comment je peux réaliser cela?

+0

Est-il courbé, ou est-ce un carré? – jtbandes

+0

est un carré, mais a un rayon de coin. –

Répondre

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

Avec cette extension, j'obtiens la longueur "approximative" d'un bezier. Après cela, tout est simple:

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