我正在使用 Charts 库创建一个图表,以在我的应用程序中绘制组合图表。
我成功绘制了图表。现在我想更改特定标签的
xAxis
标签文本颜色。示例如图所示。
如图所示,我想更改特定值的颜色,例如
03/06
和06/06
。当我在 github 上引用该库时,他们告诉我重写 drawValues()
函数来实现此目的。由于我是快速编程的新手,我不知道如何实现这一点。请指导我如何完成这项任务。预先感谢。
在 XAxisRenderer.swift 内部(不是像建议的其他答案那样的 XAxisRendererHorizontalBarChart),在 drawLabels 函数上方添加带有颜色的列表:
let labelTextColorList = [UIColor.black, UIColor.red, UIColor.blue, UIColor.brown, UIColor.cyan, UIColor.black, UIColor.black, UIColor.black, UIColor.black, UIColor.black, UIColor.black, UIColor.black]
然后用以下代码替换drawLabels函数:
/// draws the x-labels on the specified y-position
open func drawLabels(context: CGContext, pos: CGFloat, anchor: CGPoint)
{
guard
let xAxis = self.axis as? XAxis,
let viewPortHandler = self.viewPortHandler,
let transformer = self.transformer
else { return }
#if os(OSX)
let paraStyle = NSParagraphStyle.default().mutableCopy() as! NSMutableParagraphStyle
#else
let paraStyle = NSParagraphStyle.default.mutableCopy() as! NSMutableParagraphStyle
#endif
paraStyle.alignment = .center
//label attrs moved from here
/* let labelAttrs = [NSFontAttributeName: xAxis.labelFont,
NSForegroundColorAttributeName: xAxis.labelTextColor,
NSParagraphStyleAttributeName: paraStyle] as [String : NSObject]
*/
let labelRotationAngleRadians = xAxis.labelRotationAngle * ChartUtils.Math.FDEG2RAD
let centeringEnabled = xAxis.isCenterAxisLabelsEnabled
let valueToPixelMatrix = transformer.valueToPixelMatrix
var position = CGPoint(x: 0.0, y: 0.0)
var labelMaxSize = CGSize()
if xAxis.isWordWrapEnabled
{
labelMaxSize.width = xAxis.wordWrapWidthPercent * valueToPixelMatrix.a
}
let entries = xAxis.entries
for i in stride(from: 0, to: entries.count, by: 1)
{
//label attrs moved to here
let labelAttrs: [String: NSObject]!
if(i<labelTextColorList.count) {
labelAttrs = [NSFontAttributeName: xAxis.labelFont,
NSForegroundColorAttributeName: labelTextColorList[i],
NSParagraphStyleAttributeName: paraStyle] as [String : NSObject]
}
else {
labelAttrs = [NSFontAttributeName: xAxis.labelFont,
NSForegroundColorAttributeName: xAxis.labelTextColor,
NSParagraphStyleAttributeName: paraStyle] as [String : NSObject]
}
if centeringEnabled
{
position.x = CGFloat(xAxis.centeredEntries[i])
}
else
{
position.x = CGFloat(entries[i])
}
position.y = 0.0
position = position.applying(valueToPixelMatrix)
if viewPortHandler.isInBoundsX(position.x)
{
let label = xAxis.valueFormatter?.stringForValue(xAxis.entries[i], axis: xAxis) ?? ""
let labelns = label as NSString
if xAxis.isAvoidFirstLastClippingEnabled
{
// avoid clipping of the last
if i == xAxis.entryCount - 1 && xAxis.entryCount > 1
{
let width = labelns.boundingRect(with: labelMaxSize, options: .usesLineFragmentOrigin, attributes: labelAttrs, context: nil).size.width
if width > viewPortHandler.offsetRight * 2.0
&& position.x + width > viewPortHandler.chartWidth
{
position.x -= width / 2.0
}
}
else if i == 0
{ // avoid clipping of the first
let width = labelns.boundingRect(with: labelMaxSize, options: .usesLineFragmentOrigin, attributes: labelAttrs, context: nil).size.width
position.x += width / 2.0
}
}
drawLabel(context: context,
formattedLabel: label,
x: position.x,
y: pos,
attributes: labelAttrs,
constrainedToSize: labelMaxSize,
anchor: anchor,
angleRadians: labelRotationAngleRadians)
}
}
}
图表库的 XAxisRendererHorizontalBarChart.swift 文件中有以下方法。它将设置 xAxis 的文本。您可以根据您的用例进行自定义。
open override func drawLabels(context: CGContext, pos: CGFloat, anchor: CGPoint)
我的做法是计算 xAxis 的宽度,然后找到标签之间的距离以添加到标签之间
let dateAr = ["3개월 전","2개월 전","1개월 전","현재","1개월 후"] // array,i want to add
let xAixsLabelView = UIView() // view, it will contain labels beneath
let xAxisLabelList = [UILabel(),UILabel(),UILabel(),UILabel(),UILabel()] // array, I will add
.....
func drawXLabel(){
let color1 = UIColor(red: 0.875, green: 0.875, blue: 0.875, alpha: 1)
let color2 = BaseViewController().hexStringToUIColor(hex: "#3246FA")
xAixsLabelView.backgroundColor = .clear
xAixsLabelView.frame = CGRect(x: lineChartView.frame.minX + 13, y: lineChartView.frame.maxY - 30, width: lineChartView.frame.width , height: 50)
let chartViewWidth = lineChartView.frame.width
let labelWidth = lineChartView.xAxis.labelWidth
let paddingWidth = CGFloat((chartViewWidth - (labelWidth * 5))/6) // 5 is the number of labels, and 6 is the number of padding that wraps labels( you need to add 1 to the number of labels
for i in 0...4{
var padding = paddingWidth * CGFloat(Double(i) + 0.95) + labelWidth * CGFloat(i)
if i == 0 {
xAxisLabelList[i].text = "3개월 전"
xAxisLabelList[i].textColor = color1
padding = paddingWidth * 1
}else if i == 1{
xAxisLabelList[i].text = "2개월 전"
xAxisLabelList[i].textColor = color1
}else if i == 2{
xAxisLabelList[i].text = "1개월 전"
xAxisLabelList[i].textColor = color1
}else if i == 3{
xAxisLabelList[i].text = "현재"
xAxisLabelList[i].textColor = color2
}else if i == 4{
xAxisLabelList[i].text = "1개월 후"
xAxisLabelList[i].textColor = color1
padding = paddingWidth * CGFloat(4.7) + labelWidth * CGFloat(i)
}
xAxisLabelList[i].font = UIFont(name: "PretendardVariable-Medium", size: 10)
xAxisLabelList[i].frame = CGRect(x:padding , y:10 , width: labelWidth, height: 18)
xAixsLabelView.addSubview(xAxisLabelList[i])
}
chartView.addSubview(xAixsLabelView)
chartView.bringSubviewToFront(xAixsLabelView)
}
确保这些