ios - 如何为不同的 xAxis 标签呈现自定义标签颜色?

标签 ios swift ios-charts swiftcharts

我正在使用 Charts 创建图表在我的应用程序中绘制组合图表的库。

我成功绘制了图形。现在我想更改特定标签的 xAxis 标签文本颜色。该示例如图所示。 enter image description here

如图所示,我想更改特定值的颜色,例如 03/0606/06。当我在 github 上引用该库时,他们告诉我要覆盖 drawValues() 函数来实现此目的。由于我是快速编程的新手,我不知道如何实现这一点。请指导我如何完成这项任务。提前致谢。

最佳答案

在 XAxisRenderer.swift 中(不是 XAxisRendererHorizo​​ntalBarChart,就像建议的其他答案一样)在 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)
        }
    }
}

结果: enter image description here

关于ios - 如何为不同的 xAxis 标签呈现自定义标签颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44362034/

相关文章:

javascript - 错误 : No Firebase App '[DEFAULT]' has been created - call Firebase App. 初始化应用程序()

inheritance - Swift 中带有实例变量的 Swift 计算属性?

objective-c - NSTableCellView 没有获得第一个焦点

iOS 图表缩放属性

iphone - MapView 以用户坐标为中心缩放

ios - "Cocoa Touch Static Library"内的自定义字体

ios - 为什么 xCode 要求 Android Studio Gradle 文件?

ios - WatchKit super.awakeWithContext() 和 super.willActivate()

c# - 如何在 Xamarin.iOS 中使用 danielgindi 的 iOS 图表库?

swift - 如何在 ios-charts 中更改 PieChart 中的 CenterText 字体?