2017-12-01 5 views
0

현재 Charts cocoapod을 사용하고 있는데 다음 기능을 구현하는 방법을 알 수 없습니다. DataEntryHorizontalBarChartDatSet에서 선택하면 바의 borderColor을 변경하여 강조하고 싶습니다. 포드의 현재 버전에서이 기능을 사용할 수 있습니까? 그렇지 않은 경우이 기능을 무시하기 위해 살펴볼 위치와 관련된 정보를 제게 알려주십시오. 순간 HorizontalBarChart 값 강조 표시

나는이 같은 DataEntry을 강조 할 수 있어요 :

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

그러나, 나는 단지 색상을 변경하지 선택한 DataEntry 주위에 테두리를 만들고 싶어.

몇 가지 특정 기능에 대해 이미 라이브러리를 재정의했지만이 기능을 파악할 수없는 것처럼 보입니다.

미리 감사드립니다.

+0

? 항목을 클릭하면 강조 표시됩니까? – 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() 
    } 
} 

새로운 렌더러의 사용 :

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

그리고 결과 :

지금까지해야합니까 무엇

enter image description here

+0

정확히 내가 무엇을 찾고 있었습니까! 좋은 답변 주셔서 감사합니다! –