2017-06-05 211 views
0

我使用Charts库创建图表,在我的应用程序中绘制组合图表。如何呈现不同xAxis标签的自定义标签颜色?

我成功绘制了图形。现在我想更改xAxis特定标签的标签文字颜色。图中显示了这个例子。 enter image description here

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

回答

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

结果: enter image description here

2

图表库的XAxisRendererHorizo​​ntalBarChart.swift文件中有以下方法。它将设置xAxis的文本。你可以根据你的用例来定制它。

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

你能给我一个如何做到这一点的例子吗? –