gpt4 book ai didi

ios - 如何自定义条形图值? (图表框架)

转载 作者:行者123 更新时间:2023-11-30 11:19:07 27 4
gpt4 key购买 nike

我正在使用图表框架BarChartView..我想自定义值(1699,2181..)我的应用程序中出现的图形如下。

enter image description here

我想自定义值,如下图所示。

enter image description here

如何在值上添加背景颜色圆角半径边框

部分代码如下

let chartDataSet = BarChartDataSet(values: dataEntries, label: "")
chartDataSet.colors = [UIColor.gray, UIColor.lightGray]
chartDataSet.drawValuesEnabled = true // Values
let myFont: NSUIFont = UIFont(name: "SFProDisplay-Semibold", size: 12.0)!
chartDataSet.valueFont = myFont

chart.xAxis.valueFormatter = IndexAxisValueFormatter(values: avgValue)
chart.xAxis.labelPosition = .bottom

chart.drawGridBackgroundEnabled = false
chart.xAxis.granularity = 1
chart.animate(xAxisDuration: 1.0, yAxisDuration: 1.0)
chart.leftAxis.axisMinimum = 0
chart.rightAxis.enabled = false

chart.extraRightOffset = 20
chart.extraLeftOffset = 20
chart.extraBottomOffset = 10
chart.extraTopOffset = 10

chart.legend.enabled = false

let chartData = BarChartData()
chartData.addDataSet(chartDataSet)
chart.data = chartData

最佳答案

使用 BalloonMarker 获得此类设计。创建名为 BallonMarker 的新类。

open class BalloonMarker: MarkerImage {

open var color: UIColor
open var arrowSize = CGSize(width: 15, height: 11)
open var font: UIFont
open var textColor: UIColor
open var insets: UIEdgeInsets
open var minimumSize = CGSize()
open var chartWidth = CGFloat()

fileprivate var label: String?
fileprivate var _labelSize: CGSize = CGSize()
fileprivate var _paragraphStyle: NSMutableParagraphStyle?
fileprivate var _drawAttributes = [NSAttributedStringKey : AnyObject]()

public init(color: UIColor, font: UIFont, textColor: UIColor, insets: UIEdgeInsets) {
self.color = color
self.font = font
self.textColor = textColor
self.insets = insets

_paragraphStyle = NSParagraphStyle.default.mutableCopy() as? NSMutableParagraphStyle
_paragraphStyle?.alignment = .center
_paragraphStyle?.lineBreakMode = .byWordWrapping
super.init()
}

open override func offsetForDrawing(atPoint point: CGPoint) -> CGPoint {
var offset = self.offset
var size = self.size

if size.width == 0.0 && image != nil {
size.width = image!.size.width
}
if size.height == 0.0 && image != nil {
size.height = image!.size.height
}

let width = size.width
let height = size.height
let padding: CGFloat = 8.0

var origin = point
origin.x -= width / 2
origin.y -= height

if origin.x + offset.x < 0.0 {
offset.x = -origin.x + padding
}
else if let chart = chartView,
origin.x + width + offset.x > chart.bounds.size.width
{
offset.x = chart.bounds.size.width - origin.x - width - padding
}

if origin.y + offset.y < 0 {
offset.y = height + padding;
}
else if let chart = chartView,
origin.y + height + offset.y > chart.bounds.size.height
{
offset.y = chart.bounds.size.height - origin.y - height - padding
}

return offset
}

open override func draw(context: CGContext, point: CGPoint) {
guard let label = label else { return }

let offset = self.offsetForDrawing(atPoint: point)
let size = self.size

var rect = CGRect(
origin: CGPoint(
x: point.x + offset.x,
y: point.y + offset.y),
size: size)
rect.origin.x -= size.width / 2.0
rect.origin.y -= size.height

context.saveGState()

context.setFillColor(color.cgColor)

if offset.y > 0 {
context.beginPath()
context.move(to: CGPoint(
x: rect.origin.x,
y: rect.origin.y + arrowSize.height))
context.addLine(to: CGPoint(
x: rect.origin.x + (rect.size.width - arrowSize.width) / 2.0,
y: rect.origin.y + arrowSize.height))
//arrow vertex
context.addLine(to: CGPoint(
x: point.x,
y: point.y))
context.addLine(to: CGPoint(
x: rect.origin.x + (rect.size.width + arrowSize.width) / 2.0,
y: rect.origin.y + arrowSize.height))
context.addLine(to: CGPoint(
x: rect.origin.x + rect.size.width,
y: rect.origin.y + arrowSize.height))
context.addLine(to: CGPoint(
x: rect.origin.x + rect.size.width,
y: rect.origin.y + rect.size.height))
context.addLine(to: CGPoint(
x: rect.origin.x,
y: rect.origin.y + rect.size.height))
context.addLine(to: CGPoint(
x: rect.origin.x,
y: rect.origin.y + arrowSize.height))
context.fillPath()
}
else
{
context.beginPath()
context.move(to: CGPoint(
x: rect.origin.x,
y: rect.origin.y))
context.addLine(to: CGPoint(
x: rect.origin.x + rect.size.width,
y: rect.origin.y))
context.addLine(to: CGPoint(
x: rect.origin.x + rect.size.width,
y: rect.origin.y + rect.size.height - arrowSize.height))
context.addLine(to: CGPoint(
x: rect.origin.x + (rect.size.width + arrowSize.width) / 2.0,
y: rect.origin.y + rect.size.height - arrowSize.height))
//arrow vertex
context.addLine(to: CGPoint(
x: point.x,
y: point.y))
context.addLine(to: CGPoint(
x: rect.origin.x + (rect.size.width - arrowSize.width) / 2.0,
y: rect.origin.y + rect.size.height - arrowSize.height))
context.addLine(to: CGPoint(
x: rect.origin.x,
y: rect.origin.y + rect.size.height - arrowSize.height))
context.addLine(to: CGPoint(
x: rect.origin.x,
y: rect.origin.y))
context.fillPath()
}

if offset.y > 0 {
rect.origin.y += self.insets.top + arrowSize.height
} else {
rect.origin.y += self.insets.top
}

rect.size.height -= self.insets.top + self.insets.bottom

UIGraphicsPushContext(context)
label.draw(in: rect, withAttributes: drawAttributes)
UIGraphicsPopContext()
context.restoreGState()
}

open override func refreshContent(entry: ChartDataEntry, highlight: Highlight) {
setLabel(String(entry.y))
}

open func setLabel(_ newLabel: String) {
label = newLabel

_drawAttributes.removeAll()
_drawAttributes[.font] = self.font
_drawAttributes[.paragraphStyle] = _paragraphStyle
_drawAttributes[.foregroundColor] = self.textColor

_labelSize = label?.size(withAttributes: _drawAttributes) ?? CGSize.zero

var size = CGSize()
size.width = _labelSize.width + self.insets.left + self.insets.right
size.height = _labelSize.height + self.insets.top + self.insets.bottom
size.width = max(minimumSize.width, size.width)
size.height = max(minimumSize.height, size.height)
self.size = size
}
}

如何将值传递给 BallonMarker。

let marker:BalloonMarker = BalloonMarker(color: UIColor.white, font: UIFont(name: "Helvetica", size: 12)!, textColor: .black, insets: UIEdgeInsets(top: 7.0, left: 7.0, bottom: 7.0, right: 7.0))
marker.minimumSize = CGSize(width: 75.0, height: 50.0)
chart?.marker = marker

关于ios - 如何自定义条形图值? (图表框架),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51473378/

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