UIGraphicsGetCurrentContext的等效绘制方法

时间:2017-10-23 13:22:47

标签: ios swift calayer drawrect

我有一个输出饼图的快速类,我想从drawRect方法中取出绘图逻辑,因为UIGraphicsGetCurrentContext在draw方法之外返回nil我需要改变绘制饼图视图的方式,

这样做的适当方法是什么?我的PieChart课程看起来像;

override func draw(_ rect: CGRect) {
        let context: CGContext = UIGraphicsGetCurrentContext()!
        drawLinearGradient(context)
        drawCenterCircle(context)
        let circle: CAShapeLayer = drawStroke()
        let pathAnimation = CABasicAnimation(keyPath: "strokeEnd")
        pathAnimation.duration = percentage
        pathAnimation.toValue = percentage
        pathAnimation.isRemovedOnCompletion = rendered ? false : (percentageLabel > 20 ? false : true)
        pathAnimation.isAdditive = true
        pathAnimation.fillMode = kCAFillModeForwards
        circle.add(pathAnimation, forKey: "strokeEnd")
}

private func drawLinearGradient(_ context: CGContext) {
    let circlePoint: CGRect = CGRect(x: 0, y: 0,
                                     width: bounds.size.width, height: bounds.size.height)
    context.addEllipse(in: circlePoint)
    context.clip()

    let colorSpace: CGColorSpace = CGColorSpaceCreateDeviceRGB()
    let colorArray = [colors.0.cgColor, colors.1.cgColor]
    let colorLocations: [CGFloat] = [0.0, 1.0]
    let gradient = CGGradient(colorsSpace: colorSpace, colors: colorArray as CFArray, locations: colorLocations)

    let startPoint = CGPoint.zero
    let endPoint = CGPoint(x: 0, y: self.bounds.height)
    context.drawLinearGradient(gradient!,
                                start: startPoint,
                                end: endPoint,
                                options: CGGradientDrawingOptions.drawsAfterEndLocation)


}

private func drawCenterCircle(_ context: CGContext) {
    let circlePoint: CGRect = CGRect(x: arcWidth, y: arcWidth,
                                     width: bounds.size.width-arcWidth*2,
                                     height: bounds.size.height-arcWidth*2)

    context.addEllipse(in: circlePoint)
    UIColor.white.setFill()
    context.fillPath()
}

private func drawStroke() -> CAShapeLayer {
    let circle = CAShapeLayer()
    self.layer.addSublayer(circle)
    return circle
}

1 个答案:

答案 0 :(得分:2)

您可以更改代码以生成包含饼图的UIImage,然后将该图像放在图像视图中:

UIGraphicsBeginImageContext(size)
let context = UIGraphicsGetCurrentContext()
// ... here goes your drawing code, just as before
let pieImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
let pieView = UIImageView(image: pieImage)

请注意,如果您需要非常频繁地更新图表(每秒多次),此解决方案可能会带来性能损失,因为图像创建比纯渲染需要更多时间。