Search code examples
iosswiftios-charts

Can I show all the markers using iOS charts?


Can I show all the markers without clicking on a bar?

currently, I need to tap on any of the bar and it'll only show the one that is clicked. I'm trying to add a marker on each of the green bar and showing all without any bar being clicked. Is it possible?

Edit: Below is my code changed from the github demo code (PillMarker came from this)

import Charts
import UIKit

class BarChartViewController: DemoBaseViewController {

@IBOutlet var chartView: BarChartView!
@IBOutlet var sliderX: UISlider!
@IBOutlet var sliderY: UISlider!
@IBOutlet var sliderTextX: UITextField!
@IBOutlet var sliderTextY: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    self.options = [.animateY]
    self.setup(barLineChartView: chartView)
    
    chartView.delegate = self
    chartView.drawBarShadowEnabled = false
    chartView.drawValueAboveBarEnabled = false
    chartView.maxVisibleCount = 60
    chartView.dragEnabled = false
    chartView.scaleXEnabled = false
    chartView.scaleYEnabled = false
    chartView.leftAxis.drawAxisLineEnabled = false
    chartView.xAxis.drawGridLinesEnabled = false
    chartView.legend.enabled = false
    
    let xAxis = chartView.xAxis
    xAxis.labelPosition = .bottom
    xAxis.labelFont = .systemFont(ofSize: 10)
    xAxis.labelTextColor = .green
    xAxis.granularity = 1
    xAxis.labelCount = 7
    xAxis.valueFormatter = DayAxisValueFormatter(chart: chartView)
    
    let leftAxis = chartView.leftAxis
    leftAxis.labelFont = .systemFont(ofSize: 10)
    leftAxis.labelTextColor = .red
    leftAxis.labelCount = 8
    leftAxis.labelPosition = .outsideChart
    leftAxis.spaceTop = 0.15
    leftAxis.axisMinimum = 0
    
    let l = chartView.legend
    l.horizontalAlignment = .left
    l.verticalAlignment = .bottom
    l.orientation = .horizontal
    l.drawInside = false
    l.form = .square
    l.formSize = 9
    l.font = UIFont(name: "HelveticaNeue-Light", size: 11)!
    l.textColor = .blue
    l.xEntrySpace = 4
    
    //Marker
    let marker = PillMarker(color: .white, font: UIFont.boldSystemFont(ofSize: 14), textColor: .black)
    chartView.marker = marker
    
    sliderX.value = 12
    sliderY.value = 50
    slidersValueChanged(nil)
}

override func updateChartData() {
    if self.shouldHideData {
        chartView.data = nil
        return
    }
    
    self.setDataCount(1, range: UInt32(sliderY.value))
}

func setDataCount(_ count: Int, range: UInt32) {
    let start = 1
    
    let yVals = (start..<start+count+1).map { (i) -> BarChartDataEntry in
        let mult = range + 1
        let val = Double(arc4random_uniform(mult))
        return BarChartDataEntry(x: Double(i), y: val)
    }
    
    var set1: BarChartDataSet! = nil
    if let set = chartView.data?.first as? BarChartDataSet {
        set1 = set
        set1.replaceEntries(yVals)
        chartView.data?.notifyDataChanged()
        chartView.notifyDataSetChanged()
    } else {
        set1 = BarChartDataSet(entries: yVals, label: "The year 2017")
        set1.colors = ChartColorTemplates.material()
        set1.highlightColor = NSUIColor(red: 46/255.0, green: 204/255.0, blue: 113/255.0, alpha: 1.0)
        set1.drawValuesEnabled = false
        set1.drawIconsEnabled = true
        
        let data = BarChartData(dataSet: set1)
        data.setValueFont(UIFont(name: "HelveticaNeue-Light", size: 10)!)
        data.barWidth = 0.3
        chartView.data = data
    }
}

enter image description here


Solution

  • Yes, You can show all marker on bar. put marker code with bar drawing code.