【问题标题】:How to render custom label colors for different xAxis labels?如何为不同的 xAxis 标签呈现自定义标签颜色?
【发布时间】:2017-06-05 05:11:07
【问题描述】:

我正在使用Charts 库创建一个图表,以便在我的应用中绘制一个组合图表。

我成功地绘制了图表。现在我想更改特定标签的xAxis 标签文本颜色。示例如图所示。

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

【问题讨论】:

    标签: ios swift ios-charts swiftcharts


    【解决方案1】:

    在 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)
            }
        }
    }
    

    结果:

    【讨论】:

      【解决方案2】:

      在图表库的 XAxisRendererHorizo​​ntalBarChart.swift 文件中有以下方法。它将设置 xAxis 的文本。您可以根据自己的用例对其进行自定义。

      open override func drawLabels(context: CGContext, pos: CGFloat, anchor: CGPoint)
      

      【讨论】:

      • 你能给我举个例子吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 2016-12-16
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      • 2020-05-21
      相关资源
      最近更新 更多