【问题标题】:Circular bezier path not in correct path圆形贝塞尔路径不在正确路径中
【发布时间】:2018-10-29 11:36:25
【问题描述】:

我需要在视图中绘制饼图。我已经正确绘制了背景路径。但是当我添加进度层时,路径没有正确绘制。

这是我用来创建图层并将它们添加到视图中的代码。

我也创建了一个要点。你也可以从那里看到完整的代码。 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 开始的)

【问题讨论】:

    标签: ios swift pie-chart uibezierpath


    【解决方案1】:

    你应该设置正确的CGLineCap。你有CGLineCap.square,但你需要CGLineCap.butt

    这里有更多信息:CGLineCap

    换行

     layer.lineCap = CAShapeLayerLineCap.square
    

    到:

     layer.lineCap = CAShapeLayerLineCap.butt
    

    【讨论】:

    • 非常感谢。 :)
    猜你喜欢
    • 2015-02-23
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 2011-02-26
    • 2017-05-18
    相关资源
    最近更新 更多