Skip to content

Commit 4590e43

Browse files
authored
Merge pull request #528 from AAChartModel/dev
Dev
2 parents 41db111 + 14c4a2f commit 4590e43

File tree

70 files changed

+7271
-2121
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+7271
-2121
lines changed

AAInfographics.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'AAInfographics'
3-
s.version = '9.1.0'
3+
s.version = '9.2.0'
44
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. 极其精美而又强大的跨平台数据可视化图表框架,支持柱状图、条形图、折线图、曲线图、折线填充图、曲线填充图、气泡图、扇形图、环形图、散点图、雷达图、混合图等各种类型的多达几十种的信息图图表,完全满足工作所需.'
55
s.homepage = 'https://github.com/AAChartModel/AAChartKit-Swift'
66
s.license = 'MIT'

AAInfographics/AAChartCreator/AAChartModel.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ public class AAChartModel: AAObject {
156156
public var animationType: AAChartAnimationType? //The type of chart animation
157157
public var animationDuration: Int? //The chart rendering animation duration
158158
public var title: String? //The chart title
159+
public var titleAlign: AAChartAlignType?//The chart title text align style
159160
public var titleStyle: AAStyle? //The chart title style
160161
public var subtitle: String? //The chart subtitle
161162
public var subtitleAlign: AAChartAlignType?//The chart subtitle text align style
@@ -194,6 +195,7 @@ public class AAChartModel: AAObject {
194195
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",]
195196
public var series: [Any]? //An array of all the chart's series
196197
public var legendEnabled: Bool? //Enable or disable the legend. Defaults to true
198+
public var legendItemStyle: AAStyle? //The item style of the legend
197199
public var backgroundColor: Any? //The background color or gradient for the outer chart area. Defaults to #FFFFFF
198200
public var borderRadius: Any? //The corner radius of the outer chart border. Defaults to 0
199201
public var markerRadius: Float? //The radius of the point marker. Defaults to 4
@@ -218,6 +220,12 @@ public class AAChartModel: AAObject {
218220
return self
219221
}
220222

223+
@discardableResult
224+
public func titleAlign(_ prop: AAChartAlignType) -> AAChartModel {
225+
titleAlign = prop
226+
return self
227+
}
228+
221229
@discardableResult
222230
public func titleStyle(_ prop: AAStyle) -> AAChartModel {
223231
titleStyle = prop
@@ -468,6 +476,12 @@ public class AAChartModel: AAObject {
468476
return self
469477
}
470478

479+
@discardableResult
480+
public func legendItemStyle(_ prop: AAStyle) -> AAChartModel {
481+
legendItemStyle = prop
482+
return self
483+
}
484+
471485
@discardableResult
472486
public func backgroundColor(_ prop: Any) -> AAChartModel {
473487
backgroundColor = prop

AAInfographics/AAChartCreator/AAChartView.swift

Lines changed: 93 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ public class AAChartView: WKWebView {
8989

9090
private var clickEventEnabled: Bool?
9191
private var touchEventEnabled: Bool?
92+
private var beforeDrawChartJavaScript: String?
93+
private var afterDrawChartJavaScript: String?
9294

9395
private weak var _delegate: AAChartViewDelegate?
9496
public weak var delegate: AAChartViewDelegate? {
@@ -174,6 +176,10 @@ public class AAChartView: WKWebView {
174176

175177
private var optionsJson: String?
176178

179+
#if DEBUG
180+
public var shouldPrintOptionsJSON: Bool = true
181+
#endif
182+
177183
// MARK: - Initialization
178184
override private init(frame: CGRect, configuration: WKWebViewConfiguration) {
179185
super.init(frame: frame, configuration: configuration)
@@ -194,9 +200,25 @@ public class AAChartView: WKWebView {
194200

195201

196202
private func drawChart() {
203+
if beforeDrawChartJavaScript != nil {
204+
#if DEBUG
205+
print("📝 \(beforeDrawChartJavaScript ?? "")")
206+
#endif
207+
safeEvaluateJavaScriptString(beforeDrawChartJavaScript!)
208+
beforeDrawChartJavaScript = nil
209+
}
210+
197211
//Add `frame.size.height` to solve the problem that the height of the new version of Highcharts chart will not adapt to the container
198-
let jsStr = "loadTheHighChartView('\(optionsJson ?? "")','\(contentWidth ?? 0)','\(contentHeight ?? frame.size.height)')"
212+
let jsStr = "loadTheHighChartView('\(optionsJson ?? "")','\(contentWidth ?? 0)','\(contentHeight ?? 0)');"
199213
safeEvaluateJavaScriptString(jsStr)
214+
215+
if afterDrawChartJavaScript != nil {
216+
#if DEBUG
217+
print("📝 \(afterDrawChartJavaScript ?? "")")
218+
#endif
219+
safeEvaluateJavaScriptString(afterDrawChartJavaScript!)
220+
afterDrawChartJavaScript = nil
221+
}
200222
}
201223

202224
private func safeEvaluateJavaScriptString (_ jsString: String) {
@@ -221,9 +243,9 @@ public class AAChartView: WKWebView {
221243
code = \(objcError.code);
222244
domain = \(objcError.domain);
223245
userInfo = {
224-
NSLocalizedDescription = "A JavaScript exception occurred";
246+
NSLocalizedDescription = "\(errorUserInfo["NSLocalizedDescription"] ?? "")";
225247
WKJavaScriptExceptionColumnNumber = \(errorUserInfo["WKJavaScriptExceptionColumnNumber"] ?? "");
226-
WKJavaScriptExceptionLineNumber = \(errorUserInfo["WKJavaScriptExceptionLineNumber"] ?? "");
248+
WKJavaScriptExceptionLineNumber = \(errorUserInfo["WKJavaScriptExceptionLineNumber"] ?? "");
227249
WKJavaScriptExceptionMessage = \(errorUserInfo["WKJavaScriptExceptionMessage"] ?? "");
228250
WKJavaScriptExceptionSourceURL = \(errorUserInfo["WKJavaScriptExceptionSourceURL"] ?? "");
229251
}
@@ -252,32 +274,43 @@ public class AAChartView: WKWebView {
252274
}
253275

254276
private func configureOptionsJsonStringWithAAOptions(_ aaOptions: AAOptions) {
277+
if aaOptions.beforeDrawChartJavaScript != nil {
278+
beforeDrawChartJavaScript = aaOptions.beforeDrawChartJavaScript
279+
aaOptions.beforeDrawChartJavaScript = nil
280+
}
281+
282+
if aaOptions.afterDrawChartJavaScript != nil {
283+
afterDrawChartJavaScript = aaOptions.afterDrawChartJavaScript
284+
aaOptions.afterDrawChartJavaScript = nil
285+
}
286+
255287
if isClearBackgroundColor == true {
256288
aaOptions.chart?.backgroundColor = AAColor.clear
257289
}
258290

259291
if clickEventEnabled == true {
260292
aaOptions.clickEventEnabled = true
261-
configurePlotOptionsSeriesPointEvents(aaOptions)
262293
}
263294
if touchEventEnabled == true {
264295
aaOptions.touchEventEnabled = true
265-
if clickEventEnabled != true { //Avoid duplicate invocation of configuration method
266-
configurePlotOptionsSeriesPointEvents(aaOptions)
267-
}
296+
}
297+
if clickEventEnabled == true || touchEventEnabled == true {
298+
configurePlotOptionsSeriesPointEvents(aaOptions)
268299
}
269300

270301
#if DEBUG
271-
let modelJsonDic = aaOptions.toDic()
272-
let data = try? JSONSerialization.data(withJSONObject: modelJsonDic, options: .prettyPrinted)
273-
if data != nil {
274-
let prettyPrintedModelJson = String(data: data!, encoding: String.Encoding.utf8)
275-
print("""
302+
if shouldPrintOptionsJSON {
303+
let modelJsonDic = aaOptions.toDic()
304+
let data = try? JSONSerialization.data(withJSONObject: modelJsonDic, options: .prettyPrinted)
305+
if data != nil {
306+
let prettyPrintedModelJson = String(data: data!, encoding: String.Encoding.utf8)
307+
print("""
276308
277309
-----------🖨🖨🖨 console log AAOptions JSON information of AAChartView 🖨🖨🖨-----------:
278310
\(prettyPrintedModelJson!)
279311
280312
""")
313+
}
281314
}
282315
#endif
283316

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

615-
private func handleDeviceOrientationChangeEventWithAnimation(_ animation: AAAnimation) {
648+
public func aa_resizeChart(animation: AAAnimation) {
616649
let animationJsonStr = animation.toJSON()
617650
let jsFuncStr = "changeChartSize('\(frame.size.width)','\(frame.size.height)','\(animationJsonStr)')"
618651
safeEvaluateJavaScriptString(jsFuncStr)
@@ -735,43 +768,69 @@ extension AAChartView {
735768
extension AAChartView {
736769

737770
func getJSONStringFromDictionary(dictionary: [String: Any]) -> String {
738-
if !JSONSerialization.isValidJSONObject(dictionary) {
739-
print("String object is not valid Dictionary JSON String")
771+
guard JSONSerialization.isValidJSONObject(dictionary) else {
772+
print("Dictionary object is not valid JSON")
740773
return ""
741774
}
742775

743-
let data: Data = try! JSONSerialization.data(withJSONObject: dictionary, options: [])
744-
let JSONString = String(data: data, encoding: .utf8)
745-
return JSONString! as String
776+
do {
777+
let data = try JSONSerialization.data(withJSONObject: dictionary, options: [])
778+
if let jsonString = String(data: data, encoding: .utf8) {
779+
return jsonString
780+
}
781+
} catch {
782+
print("❌ Error serializing dictionary to JSON: \(error.localizedDescription)")
783+
}
784+
return ""
746785
}
747786

748787
func getJSONStringFromArray(array: [Any]) -> String {
749-
if !JSONSerialization.isValidJSONObject(array) {
750-
print("String object is not valid Array JSON String")
788+
guard JSONSerialization.isValidJSONObject(array) else {
789+
print("Array object is not valid JSON")
751790
return ""
752791
}
753792

754-
let data: Data = try! JSONSerialization.data(withJSONObject: array, options: [])
755-
let JSONString = String(data: data, encoding: .utf8)
756-
return JSONString! as String
793+
do {
794+
let data = try JSONSerialization.data(withJSONObject: array, options: [])
795+
if let jsonString = String(data: data, encoding: .utf8) {
796+
return jsonString
797+
}
798+
} catch {
799+
print("❌ Error serializing array to JSON: \(error.localizedDescription)")
800+
}
801+
return ""
757802
}
758803

759804
func getDictionaryFromJSONString(jsonString: String) -> [String: Any] {
760-
let jsonData: Data = jsonString.data(using: .utf8)!
761-
let dict = try? JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers)
762-
if dict != nil {
763-
return dict as! [String: Any]
805+
guard let jsonData = jsonString.data(using: .utf8) else {
806+
print("❌ Failed to convert string to data")
807+
return [:]
808+
}
809+
810+
do {
811+
if let dict = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) as? [String: Any] {
812+
return dict
813+
}
814+
} catch {
815+
print("❌ Error parsing JSON string to dictionary: \(error.localizedDescription)")
764816
}
765-
return [String: Any]()
817+
return [:]
766818
}
767819

768820
func getArrayFromJSONString(jsonString: String) -> [Any] {
769-
let jsonData: Data = jsonString.data(using: .utf8)!
770-
let array = try? JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers)
771-
if array != nil {
772-
return array as! [Any]
821+
guard let jsonData = jsonString.data(using: .utf8) else {
822+
print("❌ Failed to convert string to data")
823+
return []
824+
}
825+
826+
do {
827+
if let array = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) as? [Any] {
828+
return array
829+
}
830+
} catch {
831+
print("❌ Error parsing JSON string to array: \(error.localizedDescription)")
773832
}
774-
return [Any]()
833+
return []
775834
}
776835
}
777836

AAInfographics/AAChartCreator/AAOptions.swift

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ public class AAOptions: AAObject {
5252
internal var clickEventEnabled: Bool? //Please DO NOT use this property
5353
internal var touchEventEnabled: Bool? //Please DO NOT use this property
5454

55+
//beforeDrawChartJavaScript
56+
public var beforeDrawChartJavaScript: String?
57+
//afterDrawChartJavaScript
58+
public var afterDrawChartJavaScript: String?
59+
60+
5561
@discardableResult
5662
public func chart(_ prop: AAChart?) -> AAOptions {
5763
chart = prop
@@ -142,6 +148,18 @@ public class AAOptions: AAObject {
142148
return self
143149
}
144150

151+
@discardableResult
152+
public func beforeDrawChartJavaScript(_ prop: String?) -> AAOptions {
153+
beforeDrawChartJavaScript = prop
154+
return self
155+
}
156+
157+
@discardableResult
158+
public func afterDrawChartJavaScript(_ prop: String?) -> AAOptions {
159+
afterDrawChartJavaScript = prop
160+
return self
161+
}
162+
145163
public override init() {
146164
let aaCredits = AACredits()
147165
aaCredits.enabled = false
@@ -169,7 +187,9 @@ public class AAOptionsConstructor {
169187
.text(aaChartModel.title) //Title text content
170188

171189
if aaChartModel.title != "" {
172-
aaTitle.style(aaChartModel.titleStyle)
190+
aaTitle
191+
.align(aaChartModel.titleAlign) //Title horizontal alignment
192+
.style(aaChartModel.titleStyle)
173193
}
174194

175195
var aaSubtitle: AASubtitle?
@@ -200,6 +220,7 @@ public class AAOptionsConstructor {
200220

201221
let aaLegend = AALegend()
202222
.enabled(aaChartModel.legendEnabled)
223+
.itemStyle(aaChartModel.legendItemStyle)
203224

204225
let aaOptions = AAOptions()
205226
.chart(aaChart)

0 commit comments

Comments
 (0)