AAChartModel / AAChartKit-Swift

📈📊📱💻🖥️An elegant modern declarative data visualization chart framework for iOS, iPadOS and macOS. Extremely powerful, supports line, spline, area, areaspline, column, bar, pie, scatter, angular gauges, arearange, areasplinerange, columnrange, bubble, box plot, error bars, funnel, waterfall and polar chart types. 极其精美而又强大的现代化声明式数据可视化图表框架,支持柱状图、条形图、折线图、曲线图、折线填充图、曲线填充图、气泡图、扇形图、环形图、散点图、雷达图、混合图等各种类型的多达几十种的信息图图表,完全满足工作所需.
https://cocoapods.org/pods/AAInfographics
MIT License
2.42k stars 258 forks source link

Any way it could work with SwiftUI? #212

Open Lyro1 opened 4 years ago

Lyro1 commented 4 years ago

I really love the look of those charts, and since SwiftUI does not have any options to display properly graphs, I tried to integrate this to SwiftUI like so :

import SwiftUI
import AAInfographics

struct Chart: UIViewControllerRepresentable {
    var controllers: [UIViewController]

    func makeUIViewController(context: Context) -> UIPageViewController {
        let chartViewWidth  = self.view.frame.size.width
        let chartViewHeight = self.view.frame.size.height
        let aaChartView = AAChartView()
        aaChartView?.frame = CGRect(x:0,y:0,width:chartViewWidth,height:chartViewHeight)
        // set the content height of aachartView
        // aaChartView?.contentHeight = self.view.frame.size.heigh

        let aaChartModel = AAChartModel()
        .chartType(.column)//Can be any of the chart types listed under `AAChartType`.
        .animationType(.bounce)
        .title("TITLE")//The chart title
        .subtitle("subtitle")//The chart subtitle
        .dataLabelsEnabled(false) //Enable or disable the data labels. Defaults to false
        .tooltipValueSuffix("USD")//the value suffix of the chart tooltip
        .categories(["Jan", "Feb", "Mar", "Apr", "May", "Jun",
                     "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"])
        .colorsTheme(["#fe117c","#ffc069","#06caf4","#7dffc0"])
        .series([
            AASeriesElement()
                .name("Tokyo")
                .data([7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]),
            AASeriesElement()
                .name("New York")
                .data([0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5]),
            AASeriesElement()
                .name("Berlin")
                .data([0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]),
            AASeriesElement()
                .name("London")
                .data([3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8]),
                ])

        return aaChartView.aa_drawChartWithChartModel(aaChartModel)
    }

    func updateUIViewController(_ pageViewController: UIPageViewController, context: Context) {
        pageViewController.setViewControllers(
            [controllers[0]], direction: .forward, animated: true)
    }
}

But I get several issues :

Any idea how I could do it properly?

CPiersigilli commented 4 years ago

This is the correct swiftui file, but work only if you compile the app:

import SwiftUI
import AAInfographics

struct ChartSwiftUIView: UIViewRepresentable {
    func updateUIView(_ uiView: AAChartView, context: Context) {

    }

    func makeUIView(context: Context) -> AAChartView {
        let aaChartView = AAChartView()

        let aaChartModel = AAChartModel()
        .chartType(.column)//Can be any of the chart types listed under `AAChartType`.
        .animationType(.bounce)
        .title("TITLE")//The chart title
        .subtitle("subtitle")//The chart subtitle
        .dataLabelsEnabled(false) //Enable or disable the data labels. Defaults to false
        .tooltipValueSuffix("USD")//the value suffix of the chart tooltip
        .categories(["Jan", "Feb", "Mar", "Apr", "May", "Jun",
                     "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"])
        .colorsTheme(["#fe117c","#ffc069","#06caf4","#7dffc0"])
        .series([
            AASeriesElement()
                .name("Tokyo")
                .data([7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]),
            AASeriesElement()
                .name("New York")
                .data([0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5]),
            AASeriesElement()
                .name("Berlin")
                .data([0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]),
            AASeriesElement()
                .name("London")
                .data([3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8]),
                ])
        aaChartView.aa_drawChartWithChartModel(aaChartModel)
        return aaChartView
    }
}

struct ContentView: View {
    var body: some View {
        ChartSwiftUIView()
    }
}

and this the result:

Schermata 2020-06-20 alle 15 59 33
crenelle commented 4 years ago

AAChartKit-Swift appears to be built for Mac using Catalyst. My macOS app uses SwiftUI, and isn't configured to use Catalyst. I'm not yet sure how to incorporate AAChartKit-Swift as a Swift package without converting my SwiftUI macOS app into using Mac Catalyst.

crenelle commented 4 years ago

I converted the project to iOS, generated a Mac Catalyst build, added the AAChartKit-Swift package, and picked the above demo chart. It did not work immediately, I had to create a new Xcode project file, add the AAChartKit-Swift package first. Once that was working I added the rest of the project back in. For some reason the executable had trouble finding AAJSFIles.bundle so I made sure that it was part of the Copy Bundle Resources group under Xcode tab Build Phases.

YaseenMallick25 commented 3 years ago

How to refresh data automatically with SwiftUI?