2017-08-01 4 views
2

J'utilise le framework Charts de Daniel Cohen Gindi. Je défilement horizontal graphique en augmentant la valeur scaleX et faites glisser activé comme décrit dans la réponse de cette questionComment ajouter un marqueur à la position centrale dans les graphiques ios tout en faisant défiler horizontalement avec l'augmentation de scaleX et en activant le glissement

Set an horizontal scroll to my Barchart in swift

Je veux ajouter au marqueur position centrale lorsque l'utilisateur fait défiler horizontalement. Je sais que le délégué "chartTranslated" est appelé chaque fois que l'utilisateur fait glisser le graphique mais qu'il ne contient pas la valeur de "ChartDataEntry" et "Highlighted" comme dans la méthode déléguée "chartValueSelected".

Répondre

3

Malheureusement ChartViewBase.swift est rempli de fonctions privées et de variables internes et vous ne pouvez pas étendre une méthode ou obtenir du var pour obtenir les valeurs que vous recherchez.

Quoi qu'il en soit, vous pouvez toujours améliorer les sources en ajoutant une autre méthode que vous voulez utiliser à l'intérieur du public protocol ChartViewDelegate:

ChartViewBase.swift

sous la ligne:

@objc optional func chartTranslated(_ chartView: ChartViewBase, dX: CGFloat, dY: CGFloat) 

ajouter ceci:

@objc optional func chartTranslated(_ chartView: ChartViewBase, dX: CGFloat, dY: CGFloat, entry: ChartDataEntry?, highlight: Highlight?, centerIndices:Highlight?) 

Ensuite, vous pouvez facilement appeler cette nouvelle méthode déléguée à la seule partie de la source du code où chartTranslated est appelé:

BarLineChartViewBase.swift

recherche dans la partie du code où vous voyez ces lignes:

if delegate !== nil 
     { 
      delegate?.chartTranslated?(self, dX: translation.x, dY: translation.y) 
     } 

changer avec:

if delegate !== nil 
     { 
      delegate?.chartTranslated?(self, dX: translation.x, dY: translation.y) 
      var entry: ChartDataEntry? 
      var h = self.lastHighlighted 

      if h == nil 
      { 
       _indicesToHighlight.removeAll(keepingCapacity: false) 
      } 
      else 
      { 
       // set the indices to highlight 
       entry = _data?.entryForHighlight(h!) 
       if entry == nil 
       { 
        h = nil 
        _indicesToHighlight.removeAll(keepingCapacity: false) 
       } 
       else 
       { 
        _indicesToHighlight = [h!] 
       } 
      } 
      let centerH = getHighlightByTouchPoint(self.center) 
      if centerH === nil || centerH!.isEqual(self.lastHighlighted) 
      { 
       //self.highlightValue(nil, callDelegate: true) 
       //self.lastHighlighted = nil 
      } 
      else 
      { 
       print("\n in center we have: \(centerH!)") 
       self.highlightValue(centerH, callDelegate: true) 
       self.lastHighlighted = centerH 
       // please comment these lines if you don't want to automatic highlight the center indices.. 
      } 
      delegate?.chartTranslated?(self, dX: translation.x, dY: translation.y, entry: entry, highlight: h, centerIndices:centerH) 
    } 

Utilisation:

import Foundation 
import UIKit 
import Charts 

class test: UIViewController, ChartViewDelegate { 

    func chartTranslated(_ chartView: ChartViewBase, dX: CGFloat, dY: CGFloat, entry: ChartDataEntry?, highlight: Highlight?, centerIndices:Highlight?) { 
     if let entry = entry, let highlight = highlight { 
      print("chartTranslated info:\n\(self)\ndX and dY:\(dX)-\(dY)\nentry:\(entry)\nhightlight:\(highlight)") 
     if let centerIndices = centerIndices { 
      print("\n center indices is:\n\(centerIndices)") 
     } 
    } 
} 

Maintenant, avec cette nouvelle méthode déléguée vous pouvez faire votre marqueur aux indices du centre.

Un gif pour montrer une petite démonstration:

enter image description here

+0

Merci pour la réponse, mais self.lastHighlighted donnera la dernière position en surbrillance. Comment puis-je créer une position en surbrillance au centre de l'écran visible pendant le défilement? – Babar

+1

Si je comprends bien que vous voulez aussi savoir pendant le défilement/zoom des index du centre actuel, j'ai mis à jour ma réponse pour obtenir aussi ces indices, donc vous pouvez lui ajouter un marqueur si vous le souhaitez. Dans mon code j'ai ajouté aussi la possibilité d'avoir les index du centre auto-mis en évidence, si vous ne le voulez pas commenter les lignes relatives –

+0

Cela a fonctionné avec une petite modification dans votre code. Merci beaucoup Alessandro – Babar