2017-12-01 7 views
0

私は現在Charts cocoapodを使用していますが、次の機能を実装する方法がわかりません:からDataEntryを選択すると、バーのborderColorを変更するだけでハイライトします。これは現在のバージョンのポッドで可能ですか?そうでない場合は、少なくともこの機能を無効にするための参照先に関する情報を教えてください。Horizo​​ntalBarChart値ハイライト

私はこのようなDataEntryを強調することができる午前瞬間:

dataSet.highlightColor = UIColor.lightGray 
dataSet.highlightAlpha = 1 

しかし、私は唯一の選択DataEntryその色を変更しないで周囲に境界線を作りたいです。

私はすでにいくつかの特定の機能のためにライブラリをオーバーライドしていますが、これを理解することはできないようです。

ありがとうございます!

+0

myBarChartView.renderer = MyBarChartRenderer( dataProvider: self.barChartView, animator: self.barChartView.chartAnimator, viewPortHandler: self.barChartView.viewPortHandler) 

そしてその結果は?エントリをクリックすると、強調表示されますか? – DevB2F

+0

はい、強調表示の色とアルファを変更できますが、これは達成したいものではありません。強調表示されたバーの周りに境界線を作成したいだけです。 –

答えて

2

私が知っているように、チャートライブラリの現在のバージョンには、選択したバーの周りのハイライトボーダーのプロパティはありません。しかし、BarChartRendererクラスから独自のクラスを継承し、関数drawHighlighted(context: indices:)をオーバーライドし、新しいレンダラークラスのインスタンスをグラフのカスタムレンダラーとして使用できます。

カスタムレンダラークラス:新しいレンダラを使用して

class MyBarChartRenderer: BarChartRenderer { 

    // New properties for the border 
    var highlightBorderColor: UIColor = .red 
    var highlightBorderWidth: CGFloat = 2 

    open override func drawHighlighted(context: CGContext, indices: [Highlight]) 
    { 
     guard 
      let dataProvider = dataProvider, 
      let barData = dataProvider.barData 
      else { return } 

     context.saveGState() 

     var barRect = CGRect() 

     for high in indices 
     { 
      guard 
       let set = barData.getDataSetByIndex(high.dataSetIndex) as? IBarChartDataSet, 
       set.isHighlightEnabled 
       else { continue } 

      if let e = set.entryForXValue(high.x, closestToY: high.y) as? BarChartDataEntry 
      { 
       let trans = dataProvider.getTransformer(forAxis: set.axisDependency) 

       // Setting color and width for the border 
       context.setStrokeColor(highlightBorderColor.cgColor) 
       context.setLineWidth(highlightBorderWidth) 

       let isStack = high.stackIndex >= 0 && e.isStacked 

       let y1: Double 
       let y2: Double 

       if isStack 
       { 
        if dataProvider.isHighlightFullBarEnabled 
        { 
         y1 = e.positiveSum 
         y2 = -e.negativeSum 
        } 
        else 
        { 
         let range = e.ranges?[high.stackIndex] 

         y1 = range?.from ?? 0.0 
         y2 = range?.to ?? 0.0 
        } 
       } 
       else 
       { 
        y1 = e.y 
        y2 = 0.0 
       } 

       prepareBarHighlight(x: e.x, y1: y1, y2: y2, barWidthHalf: barData.barWidth/2.0, trans: trans, rect: &barRect) 
       // Drawing the border 
       context.stroke(barRect) 
      } 
     } 

     context.restoreGState() 
    } 
} 

:あなたがこれまで持っていないものを

enter image description here

+0

まさに私が探していたもの!素晴らしい答えをありがとう! –

関連する問題