2016-04-26 1 views
0

Я хочу нарисовать квадрат с NSBezierPath. Граница квадрата должна быть прекращена, поэтому я использую dashStyle, но у меня нет никакого контроля над количеством созданных сегментов.NSBezierPath: Как управлять количеством сегментов с помощью LineDashStyle?

В документации по Apple объяснение немного расплывчато. Они сказали, что «При настройке рисунка штриховки линии вы указываете ширину (в точках) каждого последовательного сплошного или прозрачного образца». Так что я думаю, мне нужен способ получить длину изогнутого безье.

Есть ли у кого-нибудь идеи, как я могу это достичь?

+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() 
Смежные вопросы