gpt4 book ai didi

ios - 等效于 UIGraphicsGetCurrentContext 的绘图方法

转载 作者:搜寻专家 更新时间:2023-11-01 07:08:03 25 4
gpt4 key购买 nike

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

执行此操作的适当方法是什么?我的饼图类看起来像;

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
}

最佳答案

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

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

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

关于ios - 等效于 UIGraphicsGetCurrentContext 的绘图方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46890470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com