我想用NSBezierPath画一个正方形。正方形的边框必须不连续,所以我使用dashStyle,但我对创建的线段数没有任何控制。

在Apple文档中,解释有些含糊。他们说:“设置虚线样式时,您可以指定每个连续的实心或透明色板的宽度(以磅为单位)”。
  所以我认为,我需要一种方法来获取弯曲贝塞尔曲线的长度。

有谁知道我该如何实现?

最佳答案

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

关于xcode - NSBezierPath:如何使用LineDashStyle控制分段数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36857239/

10-11 14:52