How to add marker to center position in ios charts while scrolling horizontally with increasing scaleX and enabling drag

后端 未结 1 1195
夕颜
夕颜 2021-01-01 06:32

I am using the Charts framework from Daniel Cohen Gindi. I am scrolling chart horizontally by increasing scaleX value and enabled drag as described in answer of this questio

相关标签:
1条回答
  • 2021-01-01 07:27

    Unfortunately ChartViewBase.swift is full of private function and internal vars and you can't extend some method or obtain some var to get the values you searching for.

    Anyway, you can always improve sources adding some other method you want to use inside the public protocol ChartViewDelegate:

    ChartViewBase.swift

    under the line:

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

    add this:

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

    Then , you can easily call this new delegate method to the only source part of the code where chartTranslated is called:

    BarLineChartViewBase.swift

    search the part of the code where you see these lines:

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

    and change it with:

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

    Usage:

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

    Now, with this new delegate method you can make your marker to the center indices.

    A gif to show a little demonstration:

    0 讨论(0)
提交回复
热议问题