簡體   English   中英

圓形貝塞爾曲線路徑不正確

[英]Circular bezier path not in correct path

我需要在視圖中繪制餅圖。 我已正確繪制了背景路徑。 但是當我添加進度圖層時,路徑繪制不正確。

這是我用來創建圖層並將它們添加到視圖中的代碼。

我也創造了一個要點。 你也可以看到那里的完整代碼。 MultiColoredPie Gist

private lazy var pathLayers: [PieLayer] = {

        guard let data = self.data else { return [] }

        var previousPercentage: CGFloat = 0
        let sorted = data.sorted(by: { (data1, data2) -> Bool in
            return data1.percentage < data2.percentage
        })

        var layers: [PieLayer] = []
        for (index, item) in sorted.enumerated() {
            previousPercentage += item.percentage
            let layer = PieLayer()
            layer.index = index
            layer.lineCap = CAShapeLayerLineCap.square
            layer.fillColor = nil
            layer.strokeColor = item.color.cgColor
            layer.strokeEnd = previousPercentage //item.percentage
            layer.percentage = previousPercentage //item.percentage
            layers.append(layer)
        }
        return layers
}()

override func layoutSubviews() {
        super.layoutSubviews()
        self.addShapes()
}

func addShapes() {
        shapeLayer.path = commonPath.cgPath
        shapeLayer.lineWidth = lineWidth
        self.layer.addSublayer(shapeLayer)

        for layer in pathLayers.reversed() {
            print("\(layer.index) - \(layer.percentage)")
            layer.lineWidth = lineWidth
            layer.path = commonPath.cgPath
            self.layer.addSublayer(layer)
        }

}

我用這段代碼創建路徑,

private var commonPath: UIBezierPath {
        get {
            let x = self.frame.width/2
            let y = self.frame.height/2
            let center = CGPoint(x: x, y: y)
            let path = UIBezierPath(arcCenter: center, radius: CGFloat(x - lineWidth/2), startAngle: -90.degreesToRadians, endAngle: 270.degreesToRadians, clockwise: true)
            path.close()
            return path
        }
}

有誰知道為什么會這樣? (似乎它不是從-90開始)

在此輸入圖像描述

在此輸入圖像描述

你應該設置適當的CGLineCap 你有CGLineCap.square ,但你需要CGLineCap.butt

以下是有關它的更多信息: CGLineCap

改變線

 layer.lineCap = CAShapeLayerLineCap.square

至:

 layer.lineCap = CAShapeLayerLineCap.butt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM