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:
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
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 –
Cela a fonctionné avec une petite modification dans votre code. Merci beaucoup Alessandro – Babar