Skip to content

Dev #528

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 108 commits into from
Apr 10, 2025
Merged

Dev #528

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
d1cf320
Add TripleChartsLinkedWorkVC
AAChartModel Nov 22, 2024
e6c3620
Update TripleChartsLinkedWorkVC.swift
AAChartModel Nov 22, 2024
cb42539
Update JSFunctionBeforeAndAfterRenderingComposer3.swift
AAChartModel Nov 22, 2024
fda059e
Update TripleChartsLinkedWorkVC.swift
AAChartModel Nov 22, 2024
d2d81cc
Update AABaseChartVC.swift
AAChartModel Nov 22, 2024
cee8479
Test synchronizedChart successfully 🎉
AAChartModel Nov 22, 2024
e59fc14
Complete synchronizedChart totally 🎉🎉
AAChartModel Nov 22, 2024
6179a04
Update AAAxis.swift
AAChartModel Nov 22, 2024
8105976
Update JSFunctionBeforeAndAfterRenderingComposer3.swift
AAChartModel Nov 22, 2024
bd3ad44
Update JSFunctionBeforeAndAfterRenderingComposer3.swift
AAChartModel Nov 22, 2024
0dadde0
Update JSFunctionBeforeAndAfterRenderingComposer3.swift
AAChartModel Nov 22, 2024
21acdfa
Update JSFunctionBeforeAndAfterRenderingComposer3.swift
AAChartModel Nov 22, 2024
b813924
Update JSFunctionBeforeAndAfterRenderingComposer3.swift
AAChartModel Nov 22, 2024
4541fd4
Update JSFunctionBeforeAndAfterRenderingComposer3.swift
AAChartModel Nov 22, 2024
43657d0
Add TripleChartsLinkedWorkVC2
AAChartModel Nov 22, 2024
ae775df
Update JSFunctionBeforeAndAfterRenderingComposer3.swift
AAChartModel Nov 22, 2024
cf67d32
Update JSFunctionBeforeAndAfterRenderingComposer3.swift
AAChartModel Nov 25, 2024
a4b5267
Update JSFunctionForAAChartEventsVC2.swift
AAChartModel Nov 25, 2024
7014e18
Add MixedChartComposer2
AAChartModel Nov 25, 2024
72683e1
Update JSFunctionBeforeAndAfterRenderingComposer3.swift
AAChartModel Nov 25, 2024
b40fdd1
Update MixedChartComposer2.swift
AAChartModel Nov 25, 2024
c024868
Optimize pieMixedLineMixedColumnChart
AAChartModel Nov 25, 2024
6fdb33d
Update MixedChartComposer2.swift
AAChartModel Nov 25, 2024
0d3d46c
Add spark lines charts successfully 🎉
AAChartModel Nov 25, 2024
63aa81a
Add sparklines.css
AAChartModel Nov 25, 2024
d1acaf2
Inject sparklines CSS to HTML successfully! 🎉
AAChartModel Nov 25, 2024
20d6243
Update AAChartView.swift
AAChartModel Nov 25, 2024
6a51d15
Update AAColumn.swift
AAChartModel Nov 25, 2024
f226c20
Update AASeries.swift
AAChartModel Nov 25, 2024
36c185d
Update JSFunctionBeforeAndAfterRenderingComposer4.swift
AAChartModel Nov 25, 2024
35488e0
Add XAxisYAxisTypeOptionsComposer
AAChartModel Nov 25, 2024
d766690
Optimize JSFunctionBeforeAndAfterRenderingComposer4 sample
AAChartModel Nov 25, 2024
2cc5428
Add legendItemStyle for AAChartModel
AAChartModel Nov 25, 2024
ece0a44
Update AALegend.swift
AAChartModel Nov 25, 2024
6d1f411
Add OfficialChartSampleVC
AAChartModel Dec 6, 2024
4db5576
Add more samples for OfficialChartSampleVC
AAChartModel Dec 6, 2024
2ce82c8
Update OfficialChartSample.swift
AAChartModel Dec 6, 2024
a4a76c5
Add more samples for OfficialChartSample
AAChartModel Dec 10, 2024
08ac8cf
Update AAChartView.html
AAChartModel Dec 10, 2024
484e529
Update DrawChartWithAAOptionsVC.swift
AAChartModel Dec 10, 2024
3eddf24
Update OfficialChartSample.swift
AAChartModel Dec 10, 2024
cfd8438
Update AAChartView.swift
AAChartModel Dec 23, 2024
9f5d4dc
Update AAChartView.html
AAChartModel Dec 23, 2024
8977f6e
Update OfficialChartSample.swift
AAChartModel Dec 23, 2024
64ea321
Merge branch 'dev' of https://github.com/AAChartModel/AAChartKit-Swif…
AAChartModel Dec 23, 2024
4df567e
Reorder files
AAChartModel Jan 11, 2025
b7ae0c9
Remove useless Excluded Architectures values
AAChartModel Jan 11, 2025
3cd11c7
Fix #517 => Add animation property for AATooltip
AAChartModel Jan 11, 2025
d4fe905
Fix #518 => Optimize XIB test sample
AAChartModel Jan 15, 2025
612202a
Fix https://github.com/AAChartModel/AAChartCore-Kotlin/issues/239
AAChartModel Jan 23, 2025
62a1a32
Update AdvancedFeaturesListVC.swift
AAChartModel Jan 23, 2025
11603be
Update AdvancedFeaturesListVC.swift
AAChartModel Jan 23, 2025
08c3724
Auto layout for AAChartView instance of custom event call back sample
AAChartModel Jan 23, 2025
c1fedbb
Add auto layout animation for AAChartView of AABaseChartVC
AAChartModel Jan 23, 2025
b84a542
Rename `aa_resizeChart` method for AAChartView
AAChartModel Jan 23, 2025
b211ff1
Rename `aa_resizeChart` method for AAChartView
AAChartModel Jan 23, 2025
aa6b726
Update AABaseChartVC.swift
AAChartModel Jan 23, 2025
8c68251
Update TripleChartsLinkedWorkVC.swift
AAChartModel Jan 23, 2025
d56748b
Update JSFunctionBeforeAndAfterRenderingComposer3.swift
AAChartModel Jan 23, 2025
8877cda
Update TripleChartsLinkedWorkVC.swift
AAChartModel Jan 24, 2025
b896704
Optimize TripleChartsLinkedWorkVC2
AAChartModel Jan 24, 2025
e0a092d
Optimize TripleChartsLinkedWorkVC
AAChartModel Jan 24, 2025
050f60e
Update DoubleChartsLinkedWorkVC.swift
AAChartModel Jan 24, 2025
297fb2a
Update JSFunctionBeforeAndAfterRenderingComposer3.swift
AAChartModel Jan 24, 2025
06241dc
Add isRefreshAnimation for DoubleChartsLinkedWorkVC
AAChartModel Jan 24, 2025
e6fa06e
Update BasicChartVC.swift
AAChartModel Jan 24, 2025
aee3c35
Add SortAlgorithmVC
AAChartModel Feb 5, 2025
127f563
Update LaunchScreen.storyboard
AAChartModel Feb 5, 2025
27646b5
Add AAOptionsItemComposer
AAChartModel Feb 6, 2025
48e4d59
Update AAOptionsItemComposer.swift
AAChartModel Feb 6, 2025
78da9b2
Add more samples for AAOptionsItemComposer
AAChartModel Feb 6, 2025
f5dad65
Add randomValueDataItems for AAOptionsItemComposer
AAChartModel Feb 6, 2025
9d17a25
Add AAOptionsWithJS2 folder
AAChartModel Feb 6, 2025
fde3d03
Optimize AAOptionsItemComposer position
AAChartModel Feb 6, 2025
b21fb13
Add MixedChartVC2
AAChartModel Feb 6, 2025
24448fc
Optimize MixedChartVC and MixedChartVC2
AAChartModel Feb 6, 2025
c7dee44
Update BasicChartVC.swift
AAChartModel Feb 6, 2025
df0c10f
Update BasicChartVC.swift
AAChartModel Feb 6, 2025
bf2eca6
Update BasicChartVC.swift
AAChartModel Feb 6, 2025
79107b0
Optimize BasicChartComposer
AAChartModel Feb 6, 2025
3945f13
Update MixedChartComposer2.swift
AAChartModel Feb 6, 2025
ffb8084
Support dark theme
AAChartModel Feb 6, 2025
d57aecc
Add ChartListVC
AAChartModel Feb 6, 2025
942fb1f
Update AAChartView.swift
AAChartModel Feb 10, 2025
b8d5258
Update AAChartView.swift
AAChartModel Feb 10, 2025
3736136
Add JSFunctionBeforeAndAfterRenderingVC
AAChartModel Feb 10, 2025
314fcc9
Optimize JSFunctionForAAChartEventsVC2
AAChartModel Feb 10, 2025
6f22b45
Correct addEventForLabelClick function name
AAChartModel Feb 10, 2025
ee9587c
Rename JSFunctionForAAChartEventsComposer
AAChartModel Feb 10, 2025
9e2ec87
Add JSFunctionForAAChartEventsVC
AAChartModel Feb 10, 2025
f50a337
Update AAExtension.swift
AAChartModel Feb 17, 2025
069346d
Fix #525
AAChartModel Mar 20, 2025
e54370d
Fix https://github.com/AAChartModel/AAChartCore/issues/208
AAChartModel Mar 28, 2025
c9eb396
Fix https://github.com/AAChartModel/AAChartCore-Kotlin/issues/246
AAChartModel Apr 1, 2025
7398ef4
Fix #526
AAChartModel Apr 1, 2025
c2d1328
Update OfficialChartSample.swift
AAChartModel Apr 2, 2025
a3f3bc2
Fix #526 => Adapted to `Highcharts JS v11.4.8 (2024-08-29)`
AAChartModel Apr 2, 2025
1f1f7f3
Fix #526
AAChartModel Apr 2, 2025
461d17c
Update AARounded-Corners.js
AAChartModel Apr 2, 2025
bb1c427
Add JSFunctionBeforeAndAfterRenderingComposer5
AAChartModel Apr 2, 2025
22f4692
Fix #526
AAChartModel Apr 2, 2025
c23d96a
Update AAChartView.swift
AAChartModel Apr 2, 2025
4c84c97
Fix #526 => Remove outdated property `customData ` for AAOptions
AAChartModel Apr 2, 2025
e14263e
Update AASerializable.swift
AAChartModel Apr 2, 2025
79f2094
Update AASerializable.swift
AAChartModel Apr 2, 2025
0b7e265
Update CustomTableViewCell.swift
AAChartModel Apr 2, 2025
801cdc8
Fix #288 => Add `shouldPrintOptionsJSON` property for AAChartView
AAChartModel Apr 10, 2025
14c4a2f
Update AAInfographics.podspec
AAChartModel Apr 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion AAInfographics.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = 'AAInfographics'
s.version = '9.1.0'
s.version = '9.2.0'
s.summary = '📈📊📱📺💻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. 极其精美而又强大的跨平台数据可视化图表框架,支持柱状图、条形图、折线图、曲线图、折线填充图、曲线填充图、气泡图、扇形图、环形图、散点图、雷达图、混合图等各种类型的多达几十种的信息图图表,完全满足工作所需.'
s.homepage = 'https://github.com/AAChartModel/AAChartKit-Swift'
s.license = 'MIT'
Expand Down
14 changes: 14 additions & 0 deletions AAInfographics/AAChartCreator/AAChartModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ public class AAChartModel: AAObject {
public var animationType: AAChartAnimationType? //The type of chart animation
public var animationDuration: Int? //The chart rendering animation duration
public var title: String? //The chart title
public var titleAlign: AAChartAlignType?//The chart title text align style
public var titleStyle: AAStyle? //The chart title style
public var subtitle: String? //The chart subtitle
public var subtitleAlign: AAChartAlignType?//The chart subtitle text align style
Expand Down Expand Up @@ -194,6 +195,7 @@ public class AAChartModel: AAObject {
public var colorsTheme: [Any]? //An array containing the default colors for the chart's series. When all colors are used, new colors are pulled from the start again. Defaults to: ["#1e90ff", "#ef476f", "#ffd066", "#04d69f", "#25547c",]
public var series: [Any]? //An array of all the chart's series
public var legendEnabled: Bool? //Enable or disable the legend. Defaults to true
public var legendItemStyle: AAStyle? //The item style of the legend
public var backgroundColor: Any? //The background color or gradient for the outer chart area. Defaults to #FFFFFF
public var borderRadius: Any? //The corner radius of the outer chart border. Defaults to 0
public var markerRadius: Float? //The radius of the point marker. Defaults to 4
Expand All @@ -218,6 +220,12 @@ public class AAChartModel: AAObject {
return self
}

@discardableResult
public func titleAlign(_ prop: AAChartAlignType) -> AAChartModel {
titleAlign = prop
return self
}

@discardableResult
public func titleStyle(_ prop: AAStyle) -> AAChartModel {
titleStyle = prop
Expand Down Expand Up @@ -468,6 +476,12 @@ public class AAChartModel: AAObject {
return self
}

@discardableResult
public func legendItemStyle(_ prop: AAStyle) -> AAChartModel {
legendItemStyle = prop
return self
}

@discardableResult
public func backgroundColor(_ prop: Any) -> AAChartModel {
backgroundColor = prop
Expand Down
127 changes: 93 additions & 34 deletions AAInfographics/AAChartCreator/AAChartView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ public class AAChartView: WKWebView {

private var clickEventEnabled: Bool?
private var touchEventEnabled: Bool?
private var beforeDrawChartJavaScript: String?
private var afterDrawChartJavaScript: String?

private weak var _delegate: AAChartViewDelegate?
public weak var delegate: AAChartViewDelegate? {
Expand Down Expand Up @@ -174,6 +176,10 @@ public class AAChartView: WKWebView {

private var optionsJson: String?

#if DEBUG
public var shouldPrintOptionsJSON: Bool = true
#endif

// MARK: - Initialization
override private init(frame: CGRect, configuration: WKWebViewConfiguration) {
super.init(frame: frame, configuration: configuration)
Expand All @@ -194,9 +200,25 @@ public class AAChartView: WKWebView {


private func drawChart() {
if beforeDrawChartJavaScript != nil {
#if DEBUG
print("📝 \(beforeDrawChartJavaScript ?? "")")
#endif
safeEvaluateJavaScriptString(beforeDrawChartJavaScript!)
beforeDrawChartJavaScript = nil
}

//Add `frame.size.height` to solve the problem that the height of the new version of Highcharts chart will not adapt to the container
let jsStr = "loadTheHighChartView('\(optionsJson ?? "")','\(contentWidth ?? 0)','\(contentHeight ?? frame.size.height)')"
let jsStr = "loadTheHighChartView('\(optionsJson ?? "")','\(contentWidth ?? 0)','\(contentHeight ?? 0)');"
safeEvaluateJavaScriptString(jsStr)

if afterDrawChartJavaScript != nil {
#if DEBUG
print("📝 \(afterDrawChartJavaScript ?? "")")
#endif
safeEvaluateJavaScriptString(afterDrawChartJavaScript!)
afterDrawChartJavaScript = nil
}
}

private func safeEvaluateJavaScriptString (_ jsString: String) {
Expand All @@ -221,9 +243,9 @@ public class AAChartView: WKWebView {
code = \(objcError.code);
domain = \(objcError.domain);
userInfo = {
NSLocalizedDescription = "A JavaScript exception occurred";
NSLocalizedDescription = "\(errorUserInfo["NSLocalizedDescription"] ?? "")";
WKJavaScriptExceptionColumnNumber = \(errorUserInfo["WKJavaScriptExceptionColumnNumber"] ?? "");
WKJavaScriptExceptionLineNumber = \(errorUserInfo["WKJavaScriptExceptionLineNumber"] ?? "");
WKJavaScriptExceptionLineNumber = \(errorUserInfo["WKJavaScriptExceptionLineNumber"] ?? "");
WKJavaScriptExceptionMessage = \(errorUserInfo["WKJavaScriptExceptionMessage"] ?? "");
WKJavaScriptExceptionSourceURL = \(errorUserInfo["WKJavaScriptExceptionSourceURL"] ?? "");
}
Expand Down Expand Up @@ -252,32 +274,43 @@ public class AAChartView: WKWebView {
}

private func configureOptionsJsonStringWithAAOptions(_ aaOptions: AAOptions) {
if aaOptions.beforeDrawChartJavaScript != nil {
beforeDrawChartJavaScript = aaOptions.beforeDrawChartJavaScript
aaOptions.beforeDrawChartJavaScript = nil
}

if aaOptions.afterDrawChartJavaScript != nil {
afterDrawChartJavaScript = aaOptions.afterDrawChartJavaScript
aaOptions.afterDrawChartJavaScript = nil
}

if isClearBackgroundColor == true {
aaOptions.chart?.backgroundColor = AAColor.clear
}

if clickEventEnabled == true {
aaOptions.clickEventEnabled = true
configurePlotOptionsSeriesPointEvents(aaOptions)
}
if touchEventEnabled == true {
aaOptions.touchEventEnabled = true
if clickEventEnabled != true { //Avoid duplicate invocation of configuration method
configurePlotOptionsSeriesPointEvents(aaOptions)
}
}
if clickEventEnabled == true || touchEventEnabled == true {
configurePlotOptionsSeriesPointEvents(aaOptions)
}

#if DEBUG
let modelJsonDic = aaOptions.toDic()
let data = try? JSONSerialization.data(withJSONObject: modelJsonDic, options: .prettyPrinted)
if data != nil {
let prettyPrintedModelJson = String(data: data!, encoding: String.Encoding.utf8)
print("""
if shouldPrintOptionsJSON {
let modelJsonDic = aaOptions.toDic()
let data = try? JSONSerialization.data(withJSONObject: modelJsonDic, options: .prettyPrinted)
if data != nil {
let prettyPrintedModelJson = String(data: data!, encoding: String.Encoding.utf8)
print("""

-----------🖨🖨🖨 console log AAOptions JSON information of AAChartView 🖨🖨🖨-----------:
\(prettyPrintedModelJson!)

""")
}
}
#endif

Expand Down Expand Up @@ -607,12 +640,12 @@ extension AAChartView {
queue: nil) { [weak self] _ in
//Delay execution by 0.01 seconds to prevent incorrect screen width and height obtained when the screen is rotated
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
self?.handleDeviceOrientationChangeEventWithAnimation(animation)
self?.aa_resizeChart(animation: animation)
}
}
}

private func handleDeviceOrientationChangeEventWithAnimation(_ animation: AAAnimation) {
public func aa_resizeChart(animation: AAAnimation) {
let animationJsonStr = animation.toJSON()
let jsFuncStr = "changeChartSize('\(frame.size.width)','\(frame.size.height)','\(animationJsonStr)')"
safeEvaluateJavaScriptString(jsFuncStr)
Expand Down Expand Up @@ -735,43 +768,69 @@ extension AAChartView {
extension AAChartView {

func getJSONStringFromDictionary(dictionary: [String: Any]) -> String {
if !JSONSerialization.isValidJSONObject(dictionary) {
print("❌ String object is not valid Dictionary JSON String")
guard JSONSerialization.isValidJSONObject(dictionary) else {
print("❌ Dictionary object is not valid JSON")
return ""
}

let data: Data = try! JSONSerialization.data(withJSONObject: dictionary, options: [])
let JSONString = String(data: data, encoding: .utf8)
return JSONString! as String
do {
let data = try JSONSerialization.data(withJSONObject: dictionary, options: [])
if let jsonString = String(data: data, encoding: .utf8) {
return jsonString
}
} catch {
print("❌ Error serializing dictionary to JSON: \(error.localizedDescription)")
}
return ""
}

func getJSONStringFromArray(array: [Any]) -> String {
if !JSONSerialization.isValidJSONObject(array) {
print("❌ String object is not valid Array JSON String")
guard JSONSerialization.isValidJSONObject(array) else {
print("❌ Array object is not valid JSON")
return ""
}

let data: Data = try! JSONSerialization.data(withJSONObject: array, options: [])
let JSONString = String(data: data, encoding: .utf8)
return JSONString! as String
do {
let data = try JSONSerialization.data(withJSONObject: array, options: [])
if let jsonString = String(data: data, encoding: .utf8) {
return jsonString
}
} catch {
print("❌ Error serializing array to JSON: \(error.localizedDescription)")
}
return ""
}

func getDictionaryFromJSONString(jsonString: String) -> [String: Any] {
let jsonData: Data = jsonString.data(using: .utf8)!
let dict = try? JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers)
if dict != nil {
return dict as! [String: Any]
guard let jsonData = jsonString.data(using: .utf8) else {
print("❌ Failed to convert string to data")
return [:]
}

do {
if let dict = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) as? [String: Any] {
return dict
}
} catch {
print("❌ Error parsing JSON string to dictionary: \(error.localizedDescription)")
}
return [String: Any]()
return [:]
}

func getArrayFromJSONString(jsonString: String) -> [Any] {
let jsonData: Data = jsonString.data(using: .utf8)!
let array = try? JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers)
if array != nil {
return array as! [Any]
guard let jsonData = jsonString.data(using: .utf8) else {
print("❌ Failed to convert string to data")
return []
}

do {
if let array = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) as? [Any] {
return array
}
} catch {
print("❌ Error parsing JSON string to array: \(error.localizedDescription)")
}
return [Any]()
return []
}
}

23 changes: 22 additions & 1 deletion AAInfographics/AAChartCreator/AAOptions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,12 @@ public class AAOptions: AAObject {
internal var clickEventEnabled: Bool? //Please DO NOT use this property
internal var touchEventEnabled: Bool? //Please DO NOT use this property

//beforeDrawChartJavaScript
public var beforeDrawChartJavaScript: String?
//afterDrawChartJavaScript
public var afterDrawChartJavaScript: String?


@discardableResult
public func chart(_ prop: AAChart?) -> AAOptions {
chart = prop
Expand Down Expand Up @@ -142,6 +148,18 @@ public class AAOptions: AAObject {
return self
}

@discardableResult
public func beforeDrawChartJavaScript(_ prop: String?) -> AAOptions {
beforeDrawChartJavaScript = prop
return self
}

@discardableResult
public func afterDrawChartJavaScript(_ prop: String?) -> AAOptions {
afterDrawChartJavaScript = prop
return self
}

public override init() {
let aaCredits = AACredits()
aaCredits.enabled = false
Expand Down Expand Up @@ -169,7 +187,9 @@ public class AAOptionsConstructor {
.text(aaChartModel.title) //Title text content

if aaChartModel.title != "" {
aaTitle.style(aaChartModel.titleStyle)
aaTitle
.align(aaChartModel.titleAlign) //Title horizontal alignment
.style(aaChartModel.titleStyle)
}

var aaSubtitle: AASubtitle?
Expand Down Expand Up @@ -200,6 +220,7 @@ public class AAOptionsConstructor {

let aaLegend = AALegend()
.enabled(aaChartModel.legendEnabled)
.itemStyle(aaChartModel.legendItemStyle)

let aaOptions = AAOptions()
.chart(aaChart)
Expand Down
Loading