From 5a0f8ce8546af2779922484a0209960a286f91f6 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Mon, 2 Sep 2019 23:47:08 +0200 Subject: [PATCH 01/13] initialized new menu view --- Stats.xcodeproj/project.pbxproj | 12 ++ Stats/AppDelegate.swift | 35 +++- Stats/MenuBar.swift | 86 --------- Stats/Modules/Battery/Battery.swift | 21 +++ Stats/Modules/CPU/CPU.swift | 22 +++ Stats/Modules/Disk/Disk.swift | 7 + Stats/Modules/Memory/Memory.swift | 21 +++ Stats/Modules/Module.swift | 3 + Stats/Modules/Network/Network.swift | 21 +++ .../Assets.xcassets/icons/Contents.json | 6 + .../Contents.json | 26 +++ .../baseline_build_black_18pt_1x.png | Bin 0 -> 216 bytes .../baseline_build_black_18pt_2x.png | Bin 0 -> 303 bytes .../baseline_build_black_18pt_3x.png | Bin 0 -> 444 bytes .../Base.lproj/Main.storyboard | 51 +++++- Stats/Views/MainViewController.swift | 166 ++++++++++++++++++ 16 files changed, 382 insertions(+), 95 deletions(-) create mode 100644 Stats/Supporting Files/Assets.xcassets/icons/Contents.json create mode 100644 Stats/Supporting Files/Assets.xcassets/icons/baseline_build_black_18pt.imageset/Contents.json create mode 100644 Stats/Supporting Files/Assets.xcassets/icons/baseline_build_black_18pt.imageset/baseline_build_black_18pt_1x.png create mode 100644 Stats/Supporting Files/Assets.xcassets/icons/baseline_build_black_18pt.imageset/baseline_build_black_18pt_2x.png create mode 100644 Stats/Supporting Files/Assets.xcassets/icons/baseline_build_black_18pt.imageset/baseline_build_black_18pt_3x.png create mode 100644 Stats/Views/MainViewController.swift diff --git a/Stats.xcodeproj/project.pbxproj b/Stats.xcodeproj/project.pbxproj index 6821e78249a..411d1bbed88 100755 --- a/Stats.xcodeproj/project.pbxproj +++ b/Stats.xcodeproj/project.pbxproj @@ -38,6 +38,7 @@ 9AF0F32522DA92C400026AE6 /* NetworkText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF0F32422DA92C400026AE6 /* NetworkText.swift */; }; 9AF0F32722DA92DD00026AE6 /* NetworkDotsText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF0F32622DA92DD00026AE6 /* NetworkDotsText.swift */; }; 9AF0F32922DA92E800026AE6 /* NetworkArrowsText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF0F32822DA92E800026AE6 /* NetworkArrowsText.swift */; }; + 9AF6F1FE231D732600B8E1E4 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF6F1FD231D732600B8E1E4 /* MainViewController.swift */; }; 9AFA402522AE49A200FE90BC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9AFA402422AE49A200FE90BC /* Assets.xcassets */; }; 9AFA402822AE49A200FE90BC /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9AFA402622AE49A200FE90BC /* Main.storyboard */; }; 9AFA402F22AE49AE00FE90BC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AFA402E22AE49AE00FE90BC /* AppDelegate.swift */; }; @@ -96,6 +97,7 @@ 9AF0F32422DA92C400026AE6 /* NetworkText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkText.swift; sourceTree = ""; }; 9AF0F32622DA92DD00026AE6 /* NetworkDotsText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkDotsText.swift; sourceTree = ""; }; 9AF0F32822DA92E800026AE6 /* NetworkArrowsText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkArrowsText.swift; sourceTree = ""; }; + 9AF6F1FD231D732600B8E1E4 /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; 9AFA401E22AE49A100FE90BC /* StatsLauncher.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StatsLauncher.app; sourceTree = BUILT_PRODUCTS_DIR; }; 9AFA402422AE49A200FE90BC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 9AFA402722AE49A200FE90BC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; @@ -154,6 +156,7 @@ 9A1410F7229E721100D29793 /* Stats */ = { isa = PBXGroup; children = ( + 9AF6F1FC231D72EC00B8E1E4 /* Views */, 9A74D59522B440D4004FE1FA /* Widgets */, 9A5B1CB3229E72A7008B9D3C /* Supporting Files */, 9A5B1CBA229E7892008B9D3C /* Modules */, @@ -280,6 +283,14 @@ path = Network; sourceTree = ""; }; + 9AF6F1FC231D72EC00B8E1E4 /* Views */ = { + isa = PBXGroup; + children = ( + 9AF6F1FD231D732600B8E1E4 /* MainViewController.swift */, + ); + path = Views; + sourceTree = ""; + }; 9AFA401F22AE49A100FE90BC /* StatsLauncher */ = { isa = PBXGroup; children = ( @@ -423,6 +434,7 @@ 9A7B8F6D22A2C3D600DEB352 /* MemoryReader.swift in Sources */, 9A79B36C22D3BEF000BF1C3A /* Module.swift in Sources */, 9A57A18522A1D26D0033E318 /* MenuBar.swift in Sources */, + 9AF6F1FE231D732600B8E1E4 /* MainViewController.swift in Sources */, 9A57A19D22A1E3270033E318 /* CPU.swift in Sources */, 9A58D1B222C150D700405315 /* NetworkReader.swift in Sources */, 9A09C8A022B3A7E20018426F /* BatteryReader.swift in Sources */, diff --git a/Stats/AppDelegate.swift b/Stats/AppDelegate.swift index 67aafc0de96..d72b124b137 100755 --- a/Stats/AppDelegate.swift +++ b/Stats/AppDelegate.swift @@ -15,6 +15,7 @@ extension Notification.Name { let modules: Observable<[Module]> = Observable([CPU(), Memory(), Disk(), Battery(), Network()]) let updater = macAppUpdater(user: "exelban", repo: "stats") +let menu = NSPopover() let appStoreMode: Bool = false @@ -29,33 +30,37 @@ class AppDelegate: NSObject, NSApplicationDelegate { return } - _ = MenuBar(menuBarItem, menuBarButton: menuBarButton) + menuBarButton.action = #selector(toggleMenu) + menu.contentViewController = MainViewController.Init() + menu.behavior = NSPopover.Behavior.transient + _ = MenuBar(menuBarItem, menuBarButton: menuBarButton) + let launcherAppId = "eu.exelban.StatsLauncher" let runningApps = NSWorkspace.shared.runningApplications let isRunning = !runningApps.filter { $0.bundleIdentifier == launcherAppId }.isEmpty - + if defaults.object(forKey: "runAtLogin") == nil { SMLoginItemSetEnabled(launcherAppId as CFString, true) self.defaults.set(true, forKey: "runAtLogin") } - + if defaults.object(forKey: "dockIcon") != nil { let dockIconStatus = defaults.bool(forKey: "dockIcon") ? NSApplication.ActivationPolicy.regular : NSApplication.ActivationPolicy.accessory NSApp.setActivationPolicy(dockIconStatus) } - + if !appStoreMode && defaults.object(forKey: "checkUpdatesOnLogin") == nil || defaults.bool(forKey: "checkUpdatesOnLogin") { updater.check() { result, error in if error != nil && error as! String == "No internet connection" { return } - + guard error == nil, let version: version = result else { print("Error: \(error ?? "check error")") return } - + if version.newest { DispatchQueue.main.async(execute: { let updatesVC: NSWindowController? = NSStoryboard(name: "Updates", bundle: nil).instantiateController(withIdentifier: "UpdatesVC") as? NSWindowController @@ -66,7 +71,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } } - + if isRunning { DistributedNotificationCenter.default().post(name: .killLauncher, object: Bundle.main.bundleIdentifier!) } @@ -79,6 +84,22 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } } + + @objc func toggleMenu(_ sender: Any?) { + if menu.isShown { + menu.performClose(sender) + } else { + if let button = self.menuBarItem.button { + NSApplication.shared.activate(ignoringOtherApps: true) + menu.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY) + menu.becomeFirstResponder() + } + } + } + + func applicationWillResignActive(_ notification: Notification) { + menu.performClose(self) + } } class AboutVC: NSViewController { diff --git a/Stats/MenuBar.swift b/Stats/MenuBar.swift index c6ed5cdaa9d..0698e0f6bef 100644 --- a/Stats/MenuBar.swift +++ b/Stats/MenuBar.swift @@ -26,105 +26,19 @@ class MenuBar { func generateMenuBar() { buildModulesView() - menuBarItem.menu = buildMenu() for module in modules.value { module.active.subscribe(observer: self) { (value, _) in self.buildModulesView() self.menuBarItem.menu?.removeAllItems() - self.menuBarItem.menu = self.buildMenu() } module.available.subscribe(observer: self) { (value, _) in self.buildModulesView() self.menuBarItem.menu?.removeAllItems() - self.menuBarItem.menu = self.buildMenu() } } } - func buildMenu() -> NSMenu { - let menu = NSMenu() - - for module in modules.value { - if module.available.value { - menu.addItem(module.menu) - } - } - - menu.addItem(NSMenuItem.separator()) - - let preferences = NSMenuItem(title: "Preferences", action: nil, keyEquivalent: "") - let preferencesMenu = NSMenu() - - let checkForUpdates = NSMenuItem(title: "Check for updates on start", action: #selector(toggleMenu), keyEquivalent: "") - checkForUpdates.state = defaults.bool(forKey: "checkUpdatesOnLogin") || defaults.object(forKey: "checkUpdatesOnLogin") == nil ? NSControl.StateValue.on : NSControl.StateValue.off - checkForUpdates.target = self - preferencesMenu.addItem(checkForUpdates) - - let runAtLogin = NSMenuItem(title: "Start at login", action: #selector(toggleMenu), keyEquivalent: "") - runAtLogin.state = defaults.bool(forKey: "runAtLogin") || defaults.object(forKey: "runAtLogin") == nil ? NSControl.StateValue.on : NSControl.StateValue.off - runAtLogin.target = self - preferencesMenu.addItem(runAtLogin) - - let dockIcon = NSMenuItem(title: "Show icon in dock", action: #selector(toggleMenu), keyEquivalent: "") - dockIcon.state = defaults.bool(forKey: "dockIcon") ? NSControl.StateValue.on : NSControl.StateValue.off - dockIcon.target = self - preferencesMenu.addItem(dockIcon) - - preferences.submenu = preferencesMenu - menu.addItem(preferences) - - menu.addItem(NSMenuItem.separator()) - - let updateMenu = NSMenuItem(title: "Check for updates", action: #selector(checkUpdate), keyEquivalent: "") - updateMenu.target = self - - let aboutMenu = NSMenuItem(title: "About Stats", action: #selector(openAbout), keyEquivalent: "") - aboutMenu.target = self - - if !appStoreMode { - menu.addItem(updateMenu) - } - menu.addItem(aboutMenu) - menu.addItem(NSMenuItem(title: "Quit Stats", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "")) - - return menu - } - - @objc func checkUpdate(_ sender : NSMenuItem) { - let updatesVC: NSWindowController? = NSStoryboard(name: "Updates", bundle: nil).instantiateController(withIdentifier: "UpdatesVC") as? NSWindowController - updatesVC?.window?.center() - updatesVC?.window?.level = .floating - updatesVC!.showWindow(self) - } - - @objc func openAbout(_ sender : NSMenuItem) { - let aboutVC: NSWindowController? = NSStoryboard(name: "About", bundle: nil).instantiateController(withIdentifier: "AboutVC") as? NSWindowController - aboutVC?.window?.center() - aboutVC?.window?.level = .floating - aboutVC!.showWindow(self) - } - - @objc func toggleMenu(_ sender : NSMenuItem) { - let launcherId = "eu.exelban.StatsLauncher" - let status = sender.state != NSControl.StateValue.on - sender.state = sender.state == NSControl.StateValue.on ? NSControl.StateValue.off : NSControl.StateValue.on - - switch sender.title { - case "Start at login": - SMLoginItemSetEnabled(launcherId as CFString, status) - self.defaults.set(status, forKey: "runAtLogin") - case "Check for updates on start": - self.defaults.set(status, forKey: "checkUpdatesOnLogin") - case "Show icon in dock": - self.defaults.set(status, forKey: "dockIcon") - let iconStatus = status ? NSApplication.ActivationPolicy.regular : NSApplication.ActivationPolicy.accessory - NSApp.setActivationPolicy(iconStatus) - return - default: break - } - } - func buildModulesView() { for subview in self.menuBarButton.subviews { subview.removeFromSuperview() diff --git a/Stats/Modules/Battery/Battery.swift b/Stats/Modules/Battery/Battery.swift index 73dcdfd0179..a42f0da5498 100644 --- a/Stats/Modules/Battery/Battery.swift +++ b/Stats/Modules/Battery/Battery.swift @@ -17,6 +17,8 @@ class Battery: Module { var active: Observable var available: Observable var reader: Reader = BatteryReader() + var viewAvailable: Bool = true + var tabView: NSTabViewItem = NSTabViewItem() let defaults = UserDefaults.standard var widgetType: WidgetType = Widgets.Mini @@ -29,6 +31,25 @@ class Battery: Module { self.view = BatteryView(frame: NSMakeRect(0, 0, widgetSize.width, widgetSize.height)) initMenu() initWidget() + initTab() + } + + func initTab() { + self.tabView.view?.frame = NSRect(x: 0, y: 0, width: TabWidth, height: TabHeight) + + let text: NSTextField = NSTextField(string: self.name) + text.isEditable = false + text.isSelectable = false + text.isBezeled = false + text.wantsLayer = true + text.textColor = .labelColor + text.canDrawSubviewsIntoLayer = true + text.alignment = .natural + text.font = NSFont.systemFont(ofSize: 13, weight: .regular) + text.frame.origin.x = ((self.tabView.view?.frame.size.width)! - 50) / 2 + text.frame.origin.y = ((self.tabView.view?.frame.size.height)! - 22) / 2 + + self.tabView.view?.addSubview(text) } func start() { diff --git a/Stats/Modules/CPU/CPU.swift b/Stats/Modules/CPU/CPU.swift index 1668b308a89..69046759e38 100644 --- a/Stats/Modules/CPU/CPU.swift +++ b/Stats/Modules/CPU/CPU.swift @@ -18,6 +18,9 @@ class CPU: Module { var available: Observable var hyperthreading: Observable var reader: Reader = CPUReader() + var tabView: NSTabViewItem = NSTabViewItem() + + var viewAvailable: Bool = true let defaults = UserDefaults.standard var widgetType: WidgetType @@ -36,6 +39,25 @@ class CPU: Module { initWidget() initMenu() + initTab() + } + + func initTab() { + self.tabView.view?.frame = NSRect(x: 0, y: 0, width: TabWidth, height: TabHeight) + + let text: NSTextField = NSTextField(string: self.name) + text.isEditable = false + text.isSelectable = false + text.isBezeled = false + text.wantsLayer = true + text.textColor = .labelColor + text.canDrawSubviewsIntoLayer = true + text.alignment = .natural + text.font = NSFont.systemFont(ofSize: 13, weight: .regular) + text.frame.origin.x = ((self.tabView.view?.frame.size.width)! - 30) / 2 + text.frame.origin.y = ((self.tabView.view?.frame.size.height)! - 22) / 2 + + self.tabView.view?.addSubview(text) } func initMenu() { diff --git a/Stats/Modules/Disk/Disk.swift b/Stats/Modules/Disk/Disk.swift index c32a20df331..adb0d9ff81e 100644 --- a/Stats/Modules/Disk/Disk.swift +++ b/Stats/Modules/Disk/Disk.swift @@ -19,6 +19,8 @@ class Disk: Module { var active: Observable var available: Observable + var viewAvailable: Bool = false + var tabView: NSTabViewItem = NSTabViewItem() var reader: Reader = DiskReader() @@ -31,6 +33,11 @@ class Disk: Module { self.initWidget() self.initMenu() + initTab() + } + + func initTab() { + self.tabView.view?.frame = NSRect(x: 0, y: 0, width: TabWidth, height: TabHeight) } func initMenu() { diff --git a/Stats/Modules/Memory/Memory.swift b/Stats/Modules/Memory/Memory.swift index c3f11e873d5..1ba0cf95128 100644 --- a/Stats/Modules/Memory/Memory.swift +++ b/Stats/Modules/Memory/Memory.swift @@ -18,6 +18,8 @@ class Memory: Module { var available: Observable var reader: Reader = MemoryReader() var widgetType: WidgetType + var viewAvailable: Bool = true + var tabView: NSTabViewItem = NSTabViewItem() let defaults = UserDefaults.standard @@ -29,6 +31,25 @@ class Memory: Module { self.widgetType = defaults.object(forKey: "\(name)_widget") != nil ? defaults.float(forKey: "\(name)_widget") : Widgets.Mini initWidget() initMenu() + initTab() + } + + func initTab() { + self.tabView.view?.frame = NSRect(x: 0, y: 0, width: TabWidth, height: TabHeight) + + let text: NSTextField = NSTextField(string: self.name) + text.isEditable = false + text.isSelectable = false + text.isBezeled = false + text.wantsLayer = true + text.textColor = .labelColor + text.canDrawSubviewsIntoLayer = true + text.alignment = .natural + text.font = NSFont.systemFont(ofSize: 13, weight: .regular) + text.frame.origin.x = ((self.tabView.view?.frame.size.width)! - 50) / 2 + text.frame.origin.y = ((self.tabView.view?.frame.size.height)! - 22) / 2 + + self.tabView.view?.addSubview(text) } func initMenu() { diff --git a/Stats/Modules/Module.swift b/Stats/Modules/Module.swift index b13e9ce93f2..11c0bb21774 100644 --- a/Stats/Modules/Module.swift +++ b/Stats/Modules/Module.swift @@ -19,6 +19,9 @@ protocol Module: class { var active: Observable { get } var available: Observable { get } + var viewAvailable: Bool { get } + var tabView: NSTabViewItem { get } + var reader: Reader { get } func start() diff --git a/Stats/Modules/Network/Network.swift b/Stats/Modules/Network/Network.swift index d8503e13882..d5f9c186e33 100644 --- a/Stats/Modules/Network/Network.swift +++ b/Stats/Modules/Network/Network.swift @@ -18,6 +18,8 @@ class Network: Module { var available: Observable var reader: Reader = NetworkReader() var widgetType: WidgetType = 2.0 + var viewAvailable: Bool = true + var tabView: NSTabViewItem = NSTabViewItem() let defaults = UserDefaults.standard @@ -27,6 +29,25 @@ class Network: Module { self.widgetType = defaults.object(forKey: "\(name)_widget") != nil ? defaults.float(forKey: "\(name)_widget") : Widgets.NetworkDots initMenu() initWidget() + initTab() + } + + func initTab() { + self.tabView.view?.frame = NSRect(x: 0, y: 0, width: TabWidth, height: TabHeight) + + let text: NSTextField = NSTextField(string: self.name) + text.isEditable = false + text.isSelectable = false + text.isBezeled = false + text.wantsLayer = true + text.textColor = .labelColor + text.canDrawSubviewsIntoLayer = true + text.alignment = .natural + text.font = NSFont.systemFont(ofSize: 13, weight: .regular) + text.frame.origin.x = ((self.tabView.view?.frame.size.width)! - 50) / 2 + text.frame.origin.y = ((self.tabView.view?.frame.size.height)! - 22) / 2 + + self.tabView.view?.addSubview(text) } func start() { diff --git a/Stats/Supporting Files/Assets.xcassets/icons/Contents.json b/Stats/Supporting Files/Assets.xcassets/icons/Contents.json new file mode 100644 index 00000000000..da4a164c918 --- /dev/null +++ b/Stats/Supporting Files/Assets.xcassets/icons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Stats/Supporting Files/Assets.xcassets/icons/baseline_build_black_18pt.imageset/Contents.json b/Stats/Supporting Files/Assets.xcassets/icons/baseline_build_black_18pt.imageset/Contents.json new file mode 100644 index 00000000000..f9f14e7cde6 --- /dev/null +++ b/Stats/Supporting Files/Assets.xcassets/icons/baseline_build_black_18pt.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "baseline_build_black_18pt_1x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "baseline_build_black_18pt_2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "baseline_build_black_18pt_3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Stats/Supporting Files/Assets.xcassets/icons/baseline_build_black_18pt.imageset/baseline_build_black_18pt_1x.png b/Stats/Supporting Files/Assets.xcassets/icons/baseline_build_black_18pt.imageset/baseline_build_black_18pt_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..792a9c06150a1654585144e5bcfa2263db236f50 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|m=6kw0hEy<4J=4g>lqlf(uvy3{ zKR|%x#sUWJ4k5uH76*=;0R8O@EEk=>Finj8f2;FgLduKX49B0!E5~t|mOo=D(qd8E z_^7?}^t~^IY&9nWV+8NYsXMPQxvYMdHN7XJ?DCO$d(Ud81qF}a!`2(wZZK6q(*u5h_ Pr!siD`njxgN@xNAStw5- literal 0 HcmV?d00001 diff --git a/Stats/Supporting Files/Assets.xcassets/icons/baseline_build_black_18pt.imageset/baseline_build_black_18pt_2x.png b/Stats/Supporting Files/Assets.xcassets/icons/baseline_build_black_18pt.imageset/baseline_build_black_18pt_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e7f71e7771dde9ee0d9ba52fc0aaa6646b7147 GIT binary patch literal 303 zcmV+~0nq-5P)yaxAF{Wc9r8Vn(I2 z^$%J>*2jw(W&YY8vSD8MPi31iFWe#P;N>5c%`q=#TSHd$@8G~9^THysC{B5i>jqsv z8oHqZSv;5Sq6`?_MYZtcE~=6pyQmUmF*LIL_2dCFv~!6$b!krNO2U)_)Q!8Sih!bW z+(iw5JE$viz;)`1B6N~ELo;aVjC@=!l}?gzf3IOZiHvLK^sxW{002ovPDHLkV1lO? BhAsdA literal 0 HcmV?d00001 diff --git a/Stats/Supporting Files/Assets.xcassets/icons/baseline_build_black_18pt.imageset/baseline_build_black_18pt_3x.png b/Stats/Supporting Files/Assets.xcassets/icons/baseline_build_black_18pt.imageset/baseline_build_black_18pt_3x.png new file mode 100644 index 0000000000000000000000000000000000000000..34e6be7afa827c733fff673938bb22878776996c GIT binary patch literal 444 zcmV;t0YmII?+vL`DMbZBfe0lJ>8I`0|MAX!P zwmOlZyz9Ehy41cu0Dd?Zml7>-hRXM<{g zoNz^lPcBElPwtUcpWG3FPi_Wf9fU@1$9TCKR3%6nxiTX+kD>(3o&rE7deS@hlr62%@o2k&g~-xE+mPV#}v+OB9UCoLJ8wI zH-|)U6{HZ$I&rQKiCET3Jrm$u$OEF-Hma6X*flLEYA3JcnozWWsCJ>@Vx)a?&18LY z1H7oY2Au2SR>_@exN_p;{BcmnGWW>0-LcKNmb2H+7_-EQGeH{wja*u}I*OK^JNeVx znNO}BJ6G+KJO1ZfrB5!c=Sq*uSh*^SR;`s=2Y=i?_~Hr-f*-EHD1Z+xub`A%o?!qF moPttwuS!bsL))d7lIa6`({}_$U~0000 - + - + + @@ -20,5 +21,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Stats/Views/MainViewController.swift b/Stats/Views/MainViewController.swift new file mode 100644 index 00000000000..aa5fcf9a4b0 --- /dev/null +++ b/Stats/Views/MainViewController.swift @@ -0,0 +1,166 @@ +// +// MainViewController.swift +// Stats +// +// Created by Serhiy Mytrovtsiy on 02/09/2019. +// Copyright © 2019 Serhiy Mytrovtsiy. All rights reserved. +// + +import Cocoa +import ServiceManagement + +let TabWidth: CGFloat = 300 +let TabHeight: CGFloat = 356 + +class MainViewController: NSViewController { + let defaults = UserDefaults.standard + + @IBOutlet weak var tabView: NSTabView! + @IBOutlet weak var topStackView: NSStackView! + + var segmentsControl: NSSegmentedControl! + var settingsButton: NSButton! + + static func Init() -> MainViewController { + let storyboard = NSStoryboard.init(name: "Main", bundle: nil) + let identifier = NSStoryboard.SceneIdentifier("MainViewController") + + guard let viewcontroller = storyboard.instantiateController(withIdentifier: identifier) as? MainViewController else { + fatalError("Why cant i find MainViewController? - Check Main.storyboard") + } + + return viewcontroller + } + + override func viewDidLoad() { + super.viewDidLoad() + + makeHeader() + } + + func makeHeader() { + var items: [String] = [] + for module in modules.value { + if module.viewAvailable && module.available.value { + items.append(module.name) + + let tab = module.tabView + tab.label = module.name + tab.identifier = module.name + tab.view?.wantsLayer = true + tab.view?.layer?.backgroundColor = NSColor.white.cgColor + + tabView.addTabViewItem(module.tabView) + } + } + + self.segmentsControl = NSSegmentedControl(labels: items, trackingMode: NSSegmentedControl.SwitchTracking.selectOne, target: self, action: #selector(switchTabs)) + self.segmentsControl.setSelected(true, forSegment: 0) + self.segmentsControl.segmentDistribution = .fillEqually + + let button = NSButton(frame: NSRect(x: 0, y: 0, width: 26, height: 20)) + button.title = "" + button.image = NSImage(named: NSImage.Name("NSActionTemplate")) + button.imagePosition = .imageOnly + button.bezelStyle = .texturedSquare + button.setButtonType(.momentaryPushIn) + button.action = #selector(showSettings) + + button.widthAnchor.constraint(equalToConstant: 26).isActive = true + button.heightAnchor.constraint(equalToConstant: 21).isActive = true + + self.topStackView.addView(self.segmentsControl, in: NSStackView.Gravity.center) + self.topStackView.addView(button, in: NSStackView.Gravity.center) + } + + @objc func switchTabs(_ sender: NSSegmentedControl) { + if let selectedLabel = self.segmentsControl.label(forSegment: sender.selectedSegment) { + let tabNumber = self.tabView.indexOfTabViewItem(withIdentifier: selectedLabel) + self.tabView.selectTabViewItem(at: tabNumber) + } + } + + @IBAction func showSettings(_ sender: NSButton) { + let settings = buildSettings() + let p = NSPoint(x: NSEvent.mouseLocation.x + 3, y: NSEvent.mouseLocation.y - 3) + settings.popUp(positioning: settings.item(at: 0), at:p , in: nil) + } + + func buildSettings() -> NSMenu { + let menu = NSMenu() + + for module in modules.value { + if module.available.value { + menu.addItem(module.menu) + } + } + + menu.addItem(NSMenuItem.separator()) + + let checkForUpdates = NSMenuItem(title: "Check for updates on start", action: #selector(toggleMenu), keyEquivalent: "") + checkForUpdates.state = defaults.bool(forKey: "checkUpdatesOnLogin") || defaults.object(forKey: "checkUpdatesOnLogin") == nil ? NSControl.StateValue.on : NSControl.StateValue.off + checkForUpdates.target = self + + let runAtLogin = NSMenuItem(title: "Start at login", action: #selector(toggleMenu), keyEquivalent: "") + runAtLogin.state = defaults.bool(forKey: "runAtLogin") || defaults.object(forKey: "runAtLogin") == nil ? NSControl.StateValue.on : NSControl.StateValue.off + runAtLogin.target = self + + let dockIcon = NSMenuItem(title: "Show icon in dock", action: #selector(toggleMenu), keyEquivalent: "") + dockIcon.state = defaults.bool(forKey: "dockIcon") ? NSControl.StateValue.on : NSControl.StateValue.off + dockIcon.target = self + + menu.addItem(checkForUpdates) + menu.addItem(runAtLogin) + menu.addItem(dockIcon) + + menu.addItem(NSMenuItem.separator()) + + let updateMenu = NSMenuItem(title: "Check for updates", action: #selector(checkUpdate), keyEquivalent: "") + updateMenu.target = self + + let aboutMenu = NSMenuItem(title: "About Stats", action: #selector(openAbout), keyEquivalent: "") + aboutMenu.target = self + + if !appStoreMode { + menu.addItem(updateMenu) + } + menu.addItem(aboutMenu) + menu.addItem(NSMenuItem(title: "Quit Stats", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "")) + + return menu + } + + @objc func checkUpdate(_ sender : NSMenuItem) { + let updatesVC: NSWindowController? = NSStoryboard(name: "Updates", bundle: nil).instantiateController(withIdentifier: "UpdatesVC") as? NSWindowController + updatesVC?.window?.center() + updatesVC?.window?.level = .floating + updatesVC!.showWindow(self) + } + + @objc func openAbout(_ sender : NSMenuItem) { + let aboutVC: NSWindowController? = NSStoryboard(name: "About", bundle: nil).instantiateController(withIdentifier: "AboutVC") as? NSWindowController + aboutVC?.window?.center() + aboutVC?.window?.level = .floating + aboutVC!.showWindow(self) + } + + @objc func toggleMenu(_ sender : NSMenuItem) { + let launcherId = "eu.exelban.StatsLauncher" + let status = sender.state != NSControl.StateValue.on + sender.state = sender.state == NSControl.StateValue.on ? NSControl.StateValue.off : NSControl.StateValue.on + + switch sender.title { + case "Start at login": + SMLoginItemSetEnabled(launcherId as CFString, status) + self.defaults.set(status, forKey: "runAtLogin") + case "Check for updates on start": + self.defaults.set(status, forKey: "checkUpdatesOnLogin") + case "Show icon in dock": + self.defaults.set(status, forKey: "dockIcon") + let iconStatus = status ? NSApplication.ActivationPolicy.regular : NSApplication.ActivationPolicy.accessory + NSApp.setActivationPolicy(iconStatus) + return + default: break + } + } +} From f2571989acdc2a7e3eed0b1cceda2a62fa8005aa Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Wed, 4 Sep 2019 00:38:56 +0200 Subject: [PATCH 02/13] created view for CPU module --- Podfile | 13 + Podfile.lock | 18 ++ Stats.xcodeproj/project.pbxproj | 107 +++++++- .../xcshareddata/xcschemes/Stats.xcscheme | 10 +- Stats.xcworkspace/contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + Stats/Modules/CPU/CPU.swift | 46 +--- Stats/Modules/CPU/CPUReader.swift | 133 ++++++++- Stats/Modules/CPU/CPUView.swift | 258 ++++++++++++++++++ Stats/Modules/Network/Network.swift | 2 +- Stats/Supporting Files/Stats.entitlements | 6 - Stats/Views/MainViewController.swift | 4 +- Stats/libs/ChartMarker.swift | 41 +++ Stats/libs/Extensions.swift | 31 +++ Stats/libs/Observable.swift | 10 - 15 files changed, 630 insertions(+), 67 deletions(-) create mode 100644 Podfile create mode 100644 Podfile.lock mode change 100755 => 100644 Stats.xcodeproj/project.pbxproj create mode 100644 Stats.xcworkspace/contents.xcworkspacedata create mode 100644 Stats.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Stats/Modules/CPU/CPUView.swift create mode 100644 Stats/libs/ChartMarker.swift diff --git a/Podfile b/Podfile new file mode 100644 index 00000000000..b60c7612eef --- /dev/null +++ b/Podfile @@ -0,0 +1,13 @@ +target 'Stats' do + use_frameworks! + + pod 'Charts' + +end + +target 'StatsLauncher' do + use_frameworks! + + # Pods for StatsLauncher + +end diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 00000000000..dc1634309f0 --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,18 @@ +PODS: + - Charts (3.3.0): + - Charts/Core (= 3.3.0) + - Charts/Core (3.3.0) + +DEPENDENCIES: + - Charts + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - Charts + +SPEC CHECKSUMS: + Charts: ec1f57f9340054155691e84d4544a1d239d382c5 + +PODFILE CHECKSUM: 1935eab6769b7093597e74f1286aedc1ea7c755a + +COCOAPODS: 1.7.1 diff --git a/Stats.xcodeproj/project.pbxproj b/Stats.xcodeproj/project.pbxproj old mode 100755 new mode 100644 index 411d1bbed88..5d8721e3af7 --- a/Stats.xcodeproj/project.pbxproj +++ b/Stats.xcodeproj/project.pbxproj @@ -3,10 +3,12 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 51; objects = { /* Begin PBXBuildFile section */ + 556DD3DCB38374D039BECE89 /* Pods_StatsLauncher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B76EECB31DFC37E1EA558662 /* Pods_StatsLauncher.framework */; }; + 628D2DE0AAA753E9F47625B0 /* Pods_Stats.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56B63995EBD3A1D1EBD3AF38 /* Pods_Stats.framework */; }; 9A09C89E22B3A7C90018426F /* Battery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A09C89D22B3A7C90018426F /* Battery.swift */; }; 9A09C8A022B3A7E20018426F /* BatteryReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A09C89F22B3A7E20018426F /* BatteryReader.swift */; }; 9A09C8A222B3D94D0018426F /* BatteryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A09C8A122B3D94D0018426F /* BatteryView.swift */; }; @@ -18,6 +20,8 @@ 9A57A19D22A1E3270033E318 /* CPU.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A57A19C22A1E3270033E318 /* CPU.swift */; }; 9A58D1B022C150C800405315 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A58D1AF22C150C800405315 /* Network.swift */; }; 9A58D1B222C150D700405315 /* NetworkReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A58D1B122C150D700405315 /* NetworkReader.swift */; }; + 9A59AE54231ED1AC007989D6 /* CPUView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A59AE53231ED1AC007989D6 /* CPUView.swift */; }; + 9A59AE56231EE02F007989D6 /* ChartMarker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A59AE55231EE02F007989D6 /* ChartMarker.swift */; }; 9A5B1CBF229E78F0008B9D3C /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A5B1CBE229E78F0008B9D3C /* Observable.swift */; }; 9A5B1CC5229E7B40008B9D3C /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A5B1CC4229E7B40008B9D3C /* Extensions.swift */; }; 9A6CFC0122A1C9F5001E782D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9A6CFC0022A1C9F5001E782D /* Assets.xcassets */; }; @@ -61,6 +65,11 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0BAA6D5F418C0F6999BD18BD /* Pods-StatsLauncher.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StatsLauncher.release.xcconfig"; path = "Target Support Files/Pods-StatsLauncher/Pods-StatsLauncher.release.xcconfig"; sourceTree = ""; }; + 1A1A00B8A6C7702FA7C3FD9A /* Pods-Stats.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Stats.release.xcconfig"; path = "Target Support Files/Pods-Stats/Pods-Stats.release.xcconfig"; sourceTree = ""; }; + 2650ED499D83382C9C938E76 /* Pods-StatsLauncher.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StatsLauncher.debug.xcconfig"; path = "Target Support Files/Pods-StatsLauncher/Pods-StatsLauncher.debug.xcconfig"; sourceTree = ""; }; + 38B7BF640C895BAFBF1A44BE /* Pods-Stats.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Stats.debug.xcconfig"; path = "Target Support Files/Pods-Stats/Pods-Stats.debug.xcconfig"; sourceTree = ""; }; + 56B63995EBD3A1D1EBD3AF38 /* Pods_Stats.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Stats.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9A09C89D22B3A7C90018426F /* Battery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Battery.swift; sourceTree = ""; }; 9A09C89F22B3A7E20018426F /* BatteryReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BatteryReader.swift; sourceTree = ""; }; 9A09C8A122B3D94D0018426F /* BatteryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BatteryView.swift; sourceTree = ""; }; @@ -75,6 +84,8 @@ 9A57A19C22A1E3270033E318 /* CPU.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPU.swift; sourceTree = ""; }; 9A58D1AF22C150C800405315 /* Network.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; 9A58D1B122C150D700405315 /* NetworkReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkReader.swift; sourceTree = ""; }; + 9A59AE53231ED1AC007989D6 /* CPUView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPUView.swift; sourceTree = ""; }; + 9A59AE55231EE02F007989D6 /* ChartMarker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChartMarker.swift; sourceTree = ""; }; 9A5B1CBE229E78F0008B9D3C /* Observable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Observable.swift; sourceTree = ""; }; 9A5B1CC4229E7B40008B9D3C /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; 9A6CFC0022A1C9F5001E782D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -105,6 +116,7 @@ 9AFA402A22AE49A200FE90BC /* StatsLauncher.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = StatsLauncher.entitlements; sourceTree = ""; }; 9AFA402E22AE49AE00FE90BC /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 9AFFCB3A22B3FD0500B0E6D8 /* About.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = About.storyboard; sourceTree = ""; }; + B76EECB31DFC37E1EA558662 /* Pods_StatsLauncher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StatsLauncher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -112,6 +124,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 628D2DE0AAA753E9F47625B0 /* Pods_Stats.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -119,6 +132,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 556DD3DCB38374D039BECE89 /* Pods_StatsLauncher.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -141,6 +155,7 @@ 9AFA401F22AE49A100FE90BC /* StatsLauncher */, 9A1410F6229E721100D29793 /* Products */, 9A998CD622A199920087ADE7 /* Frameworks */, + A159F8578E30ECA1F2F6028E /* Pods */, ); sourceTree = ""; }; @@ -209,6 +224,7 @@ 9A5B1CBE229E78F0008B9D3C /* Observable.swift */, 9A5B1CC4229E7B40008B9D3C /* Extensions.swift */, 9A426DB722C2B5EE00C064C4 /* macAppUpdater.swift */, + 9A59AE55231EE02F007989D6 /* ChartMarker.swift */, ); path = libs; sourceTree = ""; @@ -230,6 +246,7 @@ children = ( 9A57A19C22A1E3270033E318 /* CPU.swift */, 9A7B8F5D22A2A57600DEB352 /* CPUReader.swift */, + 9A59AE53231ED1AC007989D6 /* CPUView.swift */, ); path = CPU; sourceTree = ""; @@ -257,6 +274,8 @@ children = ( 9A998CD922A199970087ADE7 /* ServiceManagement.framework */, 9A998CD722A199920087ADE7 /* Cocoa.framework */, + 56B63995EBD3A1D1EBD3AF38 /* Pods_Stats.framework */, + B76EECB31DFC37E1EA558662 /* Pods_StatsLauncher.framework */, ); name = Frameworks; sourceTree = ""; @@ -303,6 +322,17 @@ path = StatsLauncher; sourceTree = ""; }; + A159F8578E30ECA1F2F6028E /* Pods */ = { + isa = PBXGroup; + children = ( + 38B7BF640C895BAFBF1A44BE /* Pods-Stats.debug.xcconfig */, + 1A1A00B8A6C7702FA7C3FD9A /* Pods-Stats.release.xcconfig */, + 2650ED499D83382C9C938E76 /* Pods-StatsLauncher.debug.xcconfig */, + 0BAA6D5F418C0F6999BD18BD /* Pods-StatsLauncher.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -310,10 +340,12 @@ isa = PBXNativeTarget; buildConfigurationList = 9A141105229E721200D29793 /* Build configuration list for PBXNativeTarget "Stats" */; buildPhases = ( + 813D45DAD934E69BA5C6A78F /* [CP] Check Pods Manifest.lock */, 9A1410F1229E721100D29793 /* Sources */, 9A1410F2229E721100D29793 /* Frameworks */, 9A1410F3229E721100D29793 /* Resources */, 9AB54DAE22A19F96006192E0 /* Copy Files */, + EDB5CB3173CB4B8BADA1278D /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -328,6 +360,7 @@ isa = PBXNativeTarget; buildConfigurationList = 9AFA402B22AE49A200FE90BC /* Build configuration list for PBXNativeTarget "StatsLauncher" */; buildPhases = ( + 3AB22E5D98D11E0384E0FF21 /* [CP] Check Pods Manifest.lock */, 9AFA401A22AE49A100FE90BC /* Sources */, 9AFA401B22AE49A100FE90BC /* Frameworks */, 9AFA401C22AE49A100FE90BC /* Resources */, @@ -359,7 +392,7 @@ enabled = 0; }; com.apple.Sandbox = { - enabled = 1; + enabled = 0; }; }; }; @@ -416,6 +449,70 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 3AB22E5D98D11E0384E0FF21 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-StatsLauncher-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 813D45DAD934E69BA5C6A78F /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Stats-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + EDB5CB3173CB4B8BADA1278D /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Stats/Pods-Stats-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Stats/Pods-Stats-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Stats/Pods-Stats-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 9A1410F1229E721100D29793 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -424,6 +521,7 @@ 9A09C8A222B3D94D0018426F /* BatteryView.swift in Sources */, 9A426DB822C2B5EE00C064C4 /* macAppUpdater.swift in Sources */, 9A79B36E22D3BEF900BF1C3A /* Reader.swift in Sources */, + 9A59AE54231ED1AC007989D6 /* CPUView.swift in Sources */, 9A7B8F6F22A2C57000DEB352 /* DiskReader.swift in Sources */, 9A7B8F6922A2C3A100DEB352 /* Memory.swift in Sources */, 9AF0F32522DA92C400026AE6 /* NetworkText.swift in Sources */, @@ -446,6 +544,7 @@ 9AF0F32922DA92E800026AE6 /* NetworkArrowsText.swift in Sources */, 9AF0F31F22DA925700026AE6 /* BarChart.swift in Sources */, 9AF0F31B22DA924000026AE6 /* LineChart.swift in Sources */, + 9A59AE56231EE02F007989D6 /* ChartMarker.swift in Sources */, 9A74D59722B44498004FE1FA /* Mini.swift in Sources */, 9A5B1CC5229E7B40008B9D3C /* Extensions.swift in Sources */, 9A79B36A22D3BEE600BF1C3A /* Widget.swift in Sources */, @@ -600,6 +699,7 @@ }; 9A141106229E721200D29793 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 38B7BF640C895BAFBF1A44BE /* Pods-Stats.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = "Stats/Supporting Files/Stats.entitlements"; @@ -627,6 +727,7 @@ }; 9A141107229E721200D29793 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1A1A00B8A6C7702FA7C3FD9A /* Pods-Stats.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = "Stats/Supporting Files/Stats.entitlements"; @@ -654,6 +755,7 @@ }; 9AFA402C22AE49A200FE90BC /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 2650ED499D83382C9C938E76 /* Pods-StatsLauncher.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = StatsLauncher/StatsLauncher.entitlements; @@ -676,6 +778,7 @@ }; 9AFA402D22AE49A200FE90BC /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 0BAA6D5F418C0F6999BD18BD /* Pods-StatsLauncher.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = StatsLauncher/StatsLauncher.entitlements; diff --git a/Stats.xcodeproj/xcshareddata/xcschemes/Stats.xcscheme b/Stats.xcodeproj/xcshareddata/xcschemes/Stats.xcscheme index b0eb1edf853..144292f3f8e 100644 --- a/Stats.xcodeproj/xcshareddata/xcschemes/Stats.xcscheme +++ b/Stats.xcodeproj/xcshareddata/xcschemes/Stats.xcscheme @@ -1,6 +1,6 @@ + + - - + + + + + + + + + + diff --git a/Stats.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Stats.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000000..18d981003d6 --- /dev/null +++ b/Stats.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Stats/Modules/CPU/CPU.swift b/Stats/Modules/CPU/CPU.swift index 69046759e38..fbe3f1981ef 100644 --- a/Stats/Modules/CPU/CPU.swift +++ b/Stats/Modules/CPU/CPU.swift @@ -7,23 +7,25 @@ // import Cocoa +import Charts class CPU: Module { - let name: String = "CPU" - let shortName: String = "CPU" - var view: NSView = NSView() - var menu: NSMenuItem = NSMenuItem() - var submenu: NSMenu = NSMenu() - var active: Observable - var available: Observable - var hyperthreading: Observable - var reader: Reader = CPUReader() - var tabView: NSTabViewItem = NSTabViewItem() + public let name: String = "CPU" + public let shortName: String = "CPU" + public var view: NSView = NSView() + public var menu: NSMenuItem = NSMenuItem() + public var active: Observable + public var available: Observable + public var hyperthreading: Observable + public var reader: Reader = CPUReader() + public var tabView: NSTabViewItem = NSTabViewItem() + public var viewAvailable: Bool = true + public var widgetType: WidgetType - var viewAvailable: Bool = true + public var chart: LineChartView = LineChartView() - let defaults = UserDefaults.standard - var widgetType: WidgetType + private let defaults = UserDefaults.standard + private var submenu: NSMenu = NSMenu() init() { self.available = Observable(true) @@ -42,24 +44,6 @@ class CPU: Module { initTab() } - func initTab() { - self.tabView.view?.frame = NSRect(x: 0, y: 0, width: TabWidth, height: TabHeight) - - let text: NSTextField = NSTextField(string: self.name) - text.isEditable = false - text.isSelectable = false - text.isBezeled = false - text.wantsLayer = true - text.textColor = .labelColor - text.canDrawSubviewsIntoLayer = true - text.alignment = .natural - text.font = NSFont.systemFont(ofSize: 13, weight: .regular) - text.frame.origin.x = ((self.tabView.view?.frame.size.width)! - 30) / 2 - text.frame.origin.y = ((self.tabView.view?.frame.size.height)! - 22) / 2 - - self.tabView.view?.addSubview(text) - } - func initMenu() { menu = NSMenuItem(title: name, action: #selector(toggle), keyEquivalent: "") submenu = NSMenu() diff --git a/Stats/Modules/CPU/CPUReader.swift b/Stats/Modules/CPU/CPUReader.swift index ad4e578c432..1bbd3a23e1d 100644 --- a/Stats/Modules/CPU/CPUReader.swift +++ b/Stats/Modules/CPU/CPUReader.swift @@ -8,23 +8,47 @@ import Foundation +struct CPUUsage { + var value: Double = 0 + var system: Double = 0 + var user: Double = 0 + var idle: Double = 0 +} + +struct CPUProcess { + var pid: Int = 0 + var command: String = "" + var usage: Double = 0 +} + class CPUReader: Reader { - var value: Observable<[Double]>! - var available: Bool = true - var cpuInfo: processor_info_array_t! - var prevCpuInfo: processor_info_array_t? - var numCpuInfo: mach_msg_type_number_t = 0 - var numPrevCpuInfo: mach_msg_type_number_t = 0 - var numCPUs: uint = 0 - var updateTimer: Timer! - let CPUUsageLock: NSLock = NSLock() + public var value: Observable<[Double]>! + public var usage: Observable = Observable(CPUUsage()) + public var processes: Observable<[CPUProcess]> = Observable([CPUProcess]()) + public var available: Bool = true + public var updateTimer: Timer! + public var perCoreMode: Bool = false + public var hyperthreading: Bool = true - var perCoreMode: Bool = false - var hyperthreading: Bool = true + private var cpuInfo: processor_info_array_t! + private var prevCpuInfo: processor_info_array_t? + private var numCpuInfo: mach_msg_type_number_t = 0 + private var numPrevCpuInfo: mach_msg_type_number_t = 0 + private var numCPUs: uint = 0 + private let CPUUsageLock: NSLock = NSLock() + private var loadPrevious = host_cpu_load_info() + + private var topProcess: Process = Process() + private var pipe: Pipe = Pipe() init() { let mibKeys: [Int32] = [ CTL_HW, HW_NCPU ] self.value = Observable([]) + + self.topProcess.launchPath = "/usr/bin/top" + self.topProcess.arguments = ["-s", "1", "-o", "cpu", "-n", "5", "-stats", "pid,command,cpu"] + self.topProcess.standardOutput = pipe + mibKeys.withUnsafeBufferPointer() { mib in var sizeOfNumCPUs: size_t = MemoryLayout.size let status = sysctl(processor_info_array_t(mutating: mib.baseAddress), 2, &numCPUs, &sizeOfNumCPUs, nil, 0) @@ -40,6 +64,43 @@ class CPUReader: Reader { return } updateTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(read), userInfo: nil, repeats: true) + + if topProcess.isRunning { + return + } + self.pipe.fileHandleForReading.waitForDataInBackgroundAndNotify() + + NotificationCenter.default.addObserver(forName: NSNotification.Name.NSFileHandleDataAvailable, object: self.pipe.fileHandleForReading , queue: nil) { _ -> Void in + defer { + self.pipe.fileHandleForReading.waitForDataInBackgroundAndNotify() + } + + let output = self.pipe.fileHandleForReading.availableData + if output.isEmpty { + return + } + + let outputString = String(data: output, encoding: String.Encoding.utf8) ?? "" + var processes: [CPUProcess] = [] + outputString.enumerateLines { (line, stop) -> () in + if line.matches("^\\d+ + .+ +\\d+.\\d *$") { + let arr = line.condenseWhitespace().split(separator: " ") + let pid = Int(arr[0]) ?? 0 + let command = String(arr[1]) + let usage = Double(arr[2]) ?? 0 + let process = CPUProcess(pid: pid, command: command, usage: usage) + processes.append(process) + } + } + + self.processes << processes + } + + do { + try topProcess.run() + } catch let error { + print(error) + } } func stop() { @@ -48,11 +109,14 @@ class CPUReader: Reader { } updateTimer.invalidate() updateTimer = nil + NotificationCenter.default.removeObserver(self, name: NSNotification.Name.NSFileHandleDataAvailable, object: nil) } @objc func read() { var numCPUsU: natural_t = 0 let err: kern_return_t = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &numCPUsU, &cpuInfo, &numCpuInfo); + let usage = getUsage() + if err == KERN_SUCCESS { CPUUsageLock.lock() @@ -65,7 +129,7 @@ class CPUReader: Reader { incrementNumber = 2 } - for i in stride(from: 0, to: Int32(numCPUs), by: incrementNumber){ + for i in stride(from: 0, to: Int32(numCPUs), by: incrementNumber) { var inUse: Int32 var total: Int32 if let prevCpuInfo = prevCpuInfo { @@ -96,6 +160,9 @@ class CPUReader: Reader { } else { self.value << [(Double(inUseOnAllCores) / Double(totalOnAllCores))] } + if !usage.system.isNaN && !usage.user.isNaN && !usage.idle.isNaN { + self.usage << CPUUsage(value: Double(inUseOnAllCores) / Double(totalOnAllCores), system: usage.system, user: usage.user, idle: usage.idle) + } CPUUsageLock.unlock() @@ -113,4 +180,46 @@ class CPUReader: Reader { print("Error KERN_SUCCESS!") } } + + func hostCPULoadInfo() -> host_cpu_load_info? { + let HOST_CPU_LOAD_INFO_COUNT = MemoryLayout.stride/MemoryLayout.stride + var size = mach_msg_type_number_t(HOST_CPU_LOAD_INFO_COUNT) + var cpuLoadInfo = host_cpu_load_info() + + let result = withUnsafeMutablePointer(to: &cpuLoadInfo) { + $0.withMemoryRebound(to: integer_t.self, capacity: HOST_CPU_LOAD_INFO_COUNT) { + host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, $0, &size) + } + } + if result != KERN_SUCCESS { + print("Error - \(#file): \(#function) - kern_result_t = \(result)") + return nil + } + return cpuLoadInfo + } + + public func getUsage() -> (system: Double, user: Double, idle : Double) { + let load = hostCPULoadInfo() + + let userDiff = Double(load!.cpu_ticks.0 - loadPrevious.cpu_ticks.0) + let sysDiff = Double(load!.cpu_ticks.1 - loadPrevious.cpu_ticks.1) + let idleDiff = Double(load!.cpu_ticks.2 - loadPrevious.cpu_ticks.2) + let niceDiff = Double(load!.cpu_ticks.3 - loadPrevious.cpu_ticks.3) + + let totalTicks = sysDiff + userDiff + niceDiff + idleDiff + + let sys = sysDiff / totalTicks * 100.0 + let user = userDiff / totalTicks * 100.0 + let idle = idleDiff / totalTicks * 100.0 + + self.loadPrevious = load! + + return (sys, user, idle) + } +} + +extension String { + func matches(_ regex: String) -> Bool { + return self.range(of: regex, options: .regularExpression, range: nil, locale: nil) != nil + } } diff --git a/Stats/Modules/CPU/CPUView.swift b/Stats/Modules/CPU/CPUView.swift new file mode 100644 index 00000000000..1de0cb7aec9 --- /dev/null +++ b/Stats/Modules/CPU/CPUView.swift @@ -0,0 +1,258 @@ +// +// CPUView.swift +// Stats +// +// Created by Serhiy Mytrovtsiy on 03/09/2019. +// Copyright © 2019 Serhiy Mytrovtsiy. All rights reserved. +// + +import Cocoa +import Foundation +import Charts + +extension CPU { + + func initTab() { + self.tabView.view?.frame = NSRect(x: 0, y: 0, width: TabWidth, height: TabHeight) + + makeChart() + makeOverview() + makeProcesses() + + (self.reader as! CPUReader).usage.subscribe(observer: self) { (value, _) in + let v: Double = Double((value.value * 100).roundTo(decimalPlaces: 2))! + self.updateChart(value: v) + } + } + + func makeChart() { + let lineColor: NSColor = NSColor(red: (26/255.0), green: (126/255.0), blue: (252/255.0), alpha: 1.0) + let gradientColor: NSColor = NSColor(red: (26/255.0), green: (126/255.0), blue: (252/255.0), alpha: 0.5) + + self.chart = LineChartView(frame: CGRect(x: 0, y: TabHeight - 108, width: TabWidth, height: 100)) + self.chart.animate(xAxisDuration: 2.0, yAxisDuration: 2.0, easingOption: .easeInCubic) + self.chart.backgroundColor = .white + self.chart.noDataText = "No data about CPU usage" + self.chart.legend.enabled = false + self.chart.scaleXEnabled = false + self.chart.scaleYEnabled = false + self.chart.pinchZoomEnabled = false + self.chart.doubleTapToZoomEnabled = false + self.chart.drawBordersEnabled = false + + self.chart.rightAxis.enabled = false + + self.chart.leftAxis.axisMinimum = 0 + self.chart.leftAxis.axisMaximum = 100 + self.chart.leftAxis.labelCount = 6 + self.chart.leftAxis.drawGridLinesEnabled = false + self.chart.leftAxis.drawAxisLineEnabled = false + + self.chart.leftAxis.gridColor = NSColor(red:220/255, green:220/255, blue:220/255, alpha:1) + self.chart.leftAxis.gridLineWidth = 0.5 + self.chart.leftAxis.drawGridLinesEnabled = true + self.chart.leftAxis.labelTextColor = NSColor(red:150/255, green:150/255, blue:150/255, alpha:1) + + self.chart.xAxis.drawAxisLineEnabled = false + self.chart.xAxis.drawLimitLinesBehindDataEnabled = false + self.chart.xAxis.gridLineWidth = 0.5 + self.chart.xAxis.drawGridLinesEnabled = false + self.chart.xAxis.drawLabelsEnabled = false + + let marker = ChartMarker() + marker.chartView = self.chart + self.chart.marker = marker + + var lineChartEntry = [ChartDataEntry]() + + lineChartEntry.append(ChartDataEntry(x: 0, y: 50)) + lineChartEntry.append(ChartDataEntry(x: 1, y: 25)) + + let chartDataSet = LineChartDataSet(entries: lineChartEntry, label: "CPU Usage") + chartDataSet.drawCirclesEnabled = false + chartDataSet.mode = .cubicBezier + chartDataSet.cubicIntensity = 0.1 + chartDataSet.colors = [lineColor] + chartDataSet.fillColor = gradientColor + chartDataSet.drawFilledEnabled = true + + let data = LineChartData() + data.addDataSet(chartDataSet) + data.setDrawValues(false) + + self.chart.data = LineChartData(dataSet: chartDataSet) + + self.tabView.view?.addSubview(self.chart) + } + + func updateChart(value: Double) { + let index = Double((self.chart.data?.getDataSetByIndex(0)?.entryCount)!) + self.chart.data?.addEntry(ChartDataEntry(x: index, y: value), dataSetIndex: 0) + + if index > 120 { + self.chart.xAxis.axisMinimum = index - 120 + } + self.chart.xAxis.axisMaximum = index + self.chart.notifyDataSetChanged() + self.chart.moveViewToX(index) + } + + func makeOverview() { + let overviewLabel: NSView = NSView(frame: NSRect(x: 0, y: TabHeight - 140, width: TabWidth, height: 25)) + + overviewLabel.wantsLayer = true + overviewLabel.layer?.backgroundColor = NSColor(hexString: "#eeeeee", alpha: 0.5).cgColor + + let overviewText: NSTextField = NSTextField(string: "Overview") + overviewText.frame = NSRect(x: 0, y: 0, width: TabWidth, height: overviewLabel.frame.size.height - 5) + overviewText.isEditable = false + overviewText.isSelectable = false + overviewText.isBezeled = false + overviewText.wantsLayer = true + overviewText.textColor = .labelColor + overviewText.canDrawSubviewsIntoLayer = true + overviewText.alignment = .center + overviewText.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) + overviewText.font = NSFont.systemFont(ofSize: 12, weight: .medium) + + overviewLabel.addSubview(overviewText) + self.tabView.view?.addSubview(overviewLabel) + + let stackHeight: CGFloat = 22 + let vertical: NSStackView = NSStackView(frame: NSRect(x: 0, y: 147, width: TabWidth, height: stackHeight*3)) + vertical.orientation = .vertical + + let system: NSStackView = NSStackView(frame: NSRect(x: 10, y: stackHeight*2, width: TabWidth - 20, height: stackHeight)) + system.orientation = .horizontal + system.distribution = .equalCentering + let systemLabel = labelField(string: "System") + let systemValue = valueField(string: "0 %") + system.addView(systemLabel, in: .center) + system.addView(systemValue, in: .center) + + let user: NSStackView = NSStackView(frame: NSRect(x: 10, y: stackHeight*1, width: TabWidth - 20, height: stackHeight)) + user.orientation = .horizontal + user.distribution = .equalCentering + let userLabel = labelField(string: "User") + let userValue = valueField(string: "0 %") + user.addView(userLabel, in: .center) + user.addView(userValue, in: .center) + + let idle: NSStackView = NSStackView(frame: NSRect(x: 10, y: 0, width: TabWidth - 20, height: stackHeight)) + idle.orientation = .horizontal + idle.distribution = .equalCentering + let idleLabel = labelField(string: "Idle") + let idleValue = valueField(string: "0 %") + idle.addView(idleLabel, in: .center) + idle.addView(idleValue, in: .center) + + vertical.addSubview(system) + vertical.addSubview(user) + vertical.addSubview(idle) + + self.tabView.view?.addSubview(vertical) + + (self.reader as! CPUReader).usage.subscribe(observer: self) { (value, _) in + systemValue.stringValue = "\(value.system.roundTo(decimalPlaces: 2)) %" + userValue.stringValue = "\(value.user.roundTo(decimalPlaces: 2)) %" + idleValue.stringValue = "\(value.idle.roundTo(decimalPlaces: 2)) %" + } + } + + func makeProcesses() { + let label: NSView = NSView(frame: NSRect(x: 0, y: 0, width: TabWidth, height: 25)) + + label.wantsLayer = true + label.layer?.backgroundColor = NSColor(hexString: "#eeeeee", alpha: 0.5).cgColor + + let text: NSTextField = NSTextField(string: "Top Processes") + text.frame = NSRect(x: 0, y: 0, width: TabWidth, height: label.frame.size.height - 5) + text.isEditable = false + text.isSelectable = false + text.isBezeled = false + text.wantsLayer = true + text.textColor = .labelColor + text.canDrawSubviewsIntoLayer = true + text.alignment = .center + text.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) + text.font = NSFont.systemFont(ofSize: 12, weight: .medium) + + label.addSubview(text) + self.tabView.view?.addSubview(label) + + let stackHeight: CGFloat = 22 + let vertical: NSStackView = NSStackView(frame: NSRect(x: 0, y: 4, width: TabWidth, height: stackHeight*5)) + vertical.orientation = .vertical + vertical.distribution = .fill + + var processViewList: [NSStackView] = [] + let process_1 = makeProcessView(num: 4, height: stackHeight, label: "", value: "") + let process_2 = makeProcessView(num: 3, height: stackHeight, label: "", value: "") + let process_3 = makeProcessView(num: 2, height: stackHeight, label: "", value: "") + let process_4 = makeProcessView(num: 1, height: stackHeight, label: "", value: "") + let process_5 = makeProcessView(num: 0, height: stackHeight, label: "", value: "") + + processViewList.append(process_1) + processViewList.append(process_2) + processViewList.append(process_3) + processViewList.append(process_4) + processViewList.append(process_5) + + vertical.addSubview(process_1) + vertical.addSubview(process_2) + vertical.addSubview(process_3) + vertical.addSubview(process_4) + vertical.addSubview(process_5) + self.tabView.view?.addSubview(vertical) + + label.frame = NSRect(x: 0, y: vertical.frame.origin.y + vertical.frame.size.height + 2, width: TabWidth, height: 25) + self.tabView.view?.addSubview(label) + + (self.reader as! CPUReader).processes.subscribe(observer: self) { (processes, _) in + for (i, process) in processes.enumerated() { + let processView = processViewList[i] + + (processView.subviews[0] as! NSTextField).stringValue = process.command + (processView.subviews[1] as! NSTextField).stringValue = "\(process.usage.roundTo(decimalPlaces: 2)) %" + } + } + } + + func makeProcessView(num: Int, height: CGFloat, label: String, value: String) -> NSStackView { + let view: NSStackView = NSStackView(frame: NSRect(x: 10, y: CGFloat(num)*height, width: TabWidth - 20, height: height)) + view.orientation = .horizontal + view.distribution = .equalCentering + let viewLabel = labelField(string: label) + let viewValue = valueField(string: value) + view.addView(viewLabel, in: .center) + view.addView(viewValue, in: .center) + + return view + } + + func labelField(string: String) -> NSTextField { + let label: NSTextField = NSTextField(string: string) + + label.isEditable = false + label.isSelectable = false + label.isBezeled = false + label.textColor = .labelColor + label.alignment = .center + label.font = NSFont.systemFont(ofSize: 12, weight: .regular) + + return label + } + + func valueField(string: String) -> NSTextField { + let label: NSTextField = NSTextField(string: string) + + label.isEditable = false + label.isSelectable = false + label.isBezeled = false + label.textColor = .black + label.alignment = .center + label.font = NSFont.systemFont(ofSize: 13, weight: .regular) + + return label + } +} diff --git a/Stats/Modules/Network/Network.swift b/Stats/Modules/Network/Network.swift index d5f9c186e33..f42b04a184b 100644 --- a/Stats/Modules/Network/Network.swift +++ b/Stats/Modules/Network/Network.swift @@ -18,7 +18,7 @@ class Network: Module { var available: Observable var reader: Reader = NetworkReader() var widgetType: WidgetType = 2.0 - var viewAvailable: Bool = true + var viewAvailable: Bool = false var tabView: NSTabViewItem = NSTabViewItem() let defaults = UserDefaults.standard diff --git a/Stats/Supporting Files/Stats.entitlements b/Stats/Supporting Files/Stats.entitlements index 92624a8a3f1..2eb7e333a6f 100755 --- a/Stats/Supporting Files/Stats.entitlements +++ b/Stats/Supporting Files/Stats.entitlements @@ -2,13 +2,7 @@ - com.apple.security.app-sandbox - com.apple.security.application-groups - com.apple.security.files.user-selected.read-only - - com.apple.security.network.client - diff --git a/Stats/Views/MainViewController.swift b/Stats/Views/MainViewController.swift index aa5fcf9a4b0..4232c0729f6 100644 --- a/Stats/Views/MainViewController.swift +++ b/Stats/Views/MainViewController.swift @@ -9,8 +9,8 @@ import Cocoa import ServiceManagement -let TabWidth: CGFloat = 300 -let TabHeight: CGFloat = 356 +public let TabWidth: CGFloat = 300 +public let TabHeight: CGFloat = 356 class MainViewController: NSViewController { let defaults = UserDefaults.standard diff --git a/Stats/libs/ChartMarker.swift b/Stats/libs/ChartMarker.swift new file mode 100644 index 00000000000..3070293fd72 --- /dev/null +++ b/Stats/libs/ChartMarker.swift @@ -0,0 +1,41 @@ +// +// ChartMarker.swift +// Stats +// +// Created by Serhiy Mytrovtsiy on 03/09/2019. +// Copyright © 2019 Serhiy Mytrovtsiy. All rights reserved. +// + +import Cocoa +import Foundation +import Charts + +class ChartMarker: MarkerView { + var text = "" + + override func refreshContent(entry: ChartDataEntry, highlight: Highlight) { + super.refreshContent(entry: entry, highlight: highlight) + text = String(entry.y) + } + + override func draw(context: CGContext, point: CGPoint) { + super.draw(context: context, point: point) + + var drawAttributes = [NSAttributedString.Key : Any]() + drawAttributes[.font] = NSFont.systemFont(ofSize: 13) + drawAttributes[.foregroundColor] = NSColor.white + drawAttributes[.backgroundColor] = NSColor.darkGray + + self.bounds.size = (" \(text) " as NSString).size(withAttributes: drawAttributes) + self.offset = CGPoint(x: 0, y: self.bounds.size.height) + + let offset = self.offsetForDrawing(atPoint: point) + drawText(text: " \(text) " as NSString, rect: CGRect(origin: CGPoint(x: point.x + offset.x, y: point.y + offset.y), size: self.bounds.size), withAttributes: drawAttributes) + } + + func drawText(text: NSString, rect: CGRect, withAttributes attributes: [NSAttributedString.Key : Any]? = nil) { + let size = text.size(withAttributes: attributes) + let centeredRect = CGRect(x: rect.origin.x + (rect.size.width - size.width) / 2.0, y: rect.origin.y + (rect.size.height - size.height) / 2.0, width: size.width, height: size.height) + text.draw(in: centeredRect, withAttributes: attributes) + } +} diff --git a/Stats/libs/Extensions.swift b/Stats/libs/Extensions.swift index 3b047c10119..7eda9133306 100755 --- a/Stats/libs/Extensions.swift +++ b/Stats/libs/Extensions.swift @@ -141,3 +141,34 @@ extension NSBezierPath { self.line(to: arrowLine2) } } + +extension NSColor { + + convenience init(hexString: String, alpha: CGFloat = 1.0) { + let hexString: String = hexString.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) + let scanner = Scanner(string: hexString) + if (hexString.hasPrefix("#")) { + scanner.scanLocation = 1 + } + var color: UInt32 = 0 + scanner.scanHexInt32(&color) + let mask = 0x000000FF + let r = Int(color >> 16) & mask + let g = Int(color >> 8) & mask + let b = Int(color) & mask + let red = CGFloat(r) / 255.0 + let green = CGFloat(g) / 255.0 + let blue = CGFloat(b) / 255.0 + self.init(red:red, green:green, blue:blue, alpha:alpha) + } + + func toHexString() -> String { + var r:CGFloat = 0 + var g:CGFloat = 0 + var b:CGFloat = 0 + var a:CGFloat = 0 + getRed(&r, green: &g, blue: &b, alpha: &a) + let rgb:Int = (Int)(r*255)<<16 | (Int)(g*255)<<8 | (Int)(b*255)<<0 + return String(format:"#%06x", rgb) + } +} diff --git a/Stats/libs/Observable.swift b/Stats/libs/Observable.swift index 98ccd942edc..aa7f02d2973 100755 --- a/Stats/libs/Observable.swift +++ b/Stats/libs/Observable.swift @@ -13,7 +13,6 @@ protocol ObservableProtocol { var value: T { get set } func subscribe(observer: AnyObject, block: @escaping (_ newValue: T, _ oldValue: T) -> ()) func unsubscribe(observer: AnyObject) - func userDefaults(key: String) } public final class Observable: ObservableProtocol { @@ -34,7 +33,6 @@ public final class Observable: ObservableProtocol { let (_, block) = entry block(value, oldValue) } - updateUserDefaults() } } @@ -51,14 +49,6 @@ public final class Observable: ObservableProtocol { observers = filtered } - - func userDefaults(key: String) { - self.userDefaultsKey = key - } - - func updateUserDefaults() { - self.defaults.set(self.value, forKey: self.userDefaultsKey) - } } func <<(observable: Observable, value: T) { From e9303a5af33f3458ae34094ee12b483e2d6d2798 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Wed, 4 Sep 2019 00:44:17 +0200 Subject: [PATCH 03/13] small color changes --- Stats/Modules/CPU/CPUView.swift | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Stats/Modules/CPU/CPUView.swift b/Stats/Modules/CPU/CPUView.swift index 1de0cb7aec9..ea87fe9a449 100644 --- a/Stats/Modules/CPU/CPUView.swift +++ b/Stats/Modules/CPU/CPUView.swift @@ -29,7 +29,7 @@ extension CPU { let lineColor: NSColor = NSColor(red: (26/255.0), green: (126/255.0), blue: (252/255.0), alpha: 1.0) let gradientColor: NSColor = NSColor(red: (26/255.0), green: (126/255.0), blue: (252/255.0), alpha: 0.5) - self.chart = LineChartView(frame: CGRect(x: 0, y: TabHeight - 108, width: TabWidth, height: 100)) + self.chart = LineChartView(frame: CGRect(x: 0, y: TabHeight - 110, width: TabWidth, height: 102)) self.chart.animate(xAxisDuration: 2.0, yAxisDuration: 2.0, easingOption: .easeInCubic) self.chart.backgroundColor = .white self.chart.noDataText = "No data about CPU usage" @@ -104,12 +104,12 @@ extension CPU { overviewLabel.layer?.backgroundColor = NSColor(hexString: "#eeeeee", alpha: 0.5).cgColor let overviewText: NSTextField = NSTextField(string: "Overview") - overviewText.frame = NSRect(x: 0, y: 0, width: TabWidth, height: overviewLabel.frame.size.height - 5) + overviewText.frame = NSRect(x: 0, y: 0, width: TabWidth, height: overviewLabel.frame.size.height - 4) overviewText.isEditable = false overviewText.isSelectable = false overviewText.isBezeled = false overviewText.wantsLayer = true - overviewText.textColor = .labelColor + overviewText.textColor = .darkGray overviewText.canDrawSubviewsIntoLayer = true overviewText.alignment = .center overviewText.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) @@ -166,12 +166,12 @@ extension CPU { label.layer?.backgroundColor = NSColor(hexString: "#eeeeee", alpha: 0.5).cgColor let text: NSTextField = NSTextField(string: "Top Processes") - text.frame = NSRect(x: 0, y: 0, width: TabWidth, height: label.frame.size.height - 5) + text.frame = NSRect(x: 0, y: 0, width: TabWidth, height: label.frame.size.height - 4) text.isEditable = false text.isSelectable = false text.isBezeled = false text.wantsLayer = true - text.textColor = .labelColor + text.textColor = .darkGray text.canDrawSubviewsIntoLayer = true text.alignment = .center text.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) @@ -236,9 +236,10 @@ extension CPU { label.isEditable = false label.isSelectable = false label.isBezeled = false - label.textColor = .labelColor + label.textColor = .black label.alignment = .center label.font = NSFont.systemFont(ofSize: 12, weight: .regular) + label.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) return label } @@ -252,6 +253,7 @@ extension CPU { label.textColor = .black label.alignment = .center label.font = NSFont.systemFont(ofSize: 13, weight: .regular) + label.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) return label } From e0ddc76f6f0e4c5b3e7c377cbfc9b9e0eadbb152 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Wed, 4 Sep 2019 21:16:39 +0200 Subject: [PATCH 04/13] created view for Memory module --- Stats.xcodeproj/project.pbxproj | 4 + Stats/Modules/CPU/CPUReader.swift | 8 +- Stats/Modules/CPU/CPUView.swift | 20 +- Stats/Modules/Memory/Memory.swift | 46 +--- Stats/Modules/Memory/MemoryReader.swift | 68 ++++- Stats/Modules/Memory/MemoryView.swift | 258 ++++++++++++++++++ Stats/Supporting Files/Info.plist | 2 +- Stats/Widgets/Network/NetworkArrowsText.swift | 4 +- Stats/Widgets/Network/NetworkDotsText.swift | 4 +- Stats/Widgets/Network/NetworkText.swift | 4 +- Stats/libs/Extensions.swift | 10 +- 11 files changed, 363 insertions(+), 65 deletions(-) create mode 100644 Stats/Modules/Memory/MemoryView.swift diff --git a/Stats.xcodeproj/project.pbxproj b/Stats.xcodeproj/project.pbxproj index 5d8721e3af7..81214b0b62a 100644 --- a/Stats.xcodeproj/project.pbxproj +++ b/Stats.xcodeproj/project.pbxproj @@ -16,6 +16,7 @@ 9A141100229E721200D29793 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9A1410FE229E721200D29793 /* Main.storyboard */; }; 9A426DB822C2B5EE00C064C4 /* macAppUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A426DB722C2B5EE00C064C4 /* macAppUpdater.swift */; }; 9A426DBE22C2BE0000C064C4 /* Updates.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9A426DBD22C2BE0000C064C4 /* Updates.storyboard */; }; + 9A493CDF23202B620064570C /* MemoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A493CDE23202B620064570C /* MemoryView.swift */; }; 9A57A18522A1D26D0033E318 /* MenuBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A57A18422A1D26D0033E318 /* MenuBar.swift */; }; 9A57A19D22A1E3270033E318 /* CPU.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A57A19C22A1E3270033E318 /* CPU.swift */; }; 9A58D1B022C150C800405315 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A58D1AF22C150C800405315 /* Network.swift */; }; @@ -80,6 +81,7 @@ 9A141102229E721200D29793 /* Stats.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Stats.entitlements; sourceTree = ""; }; 9A426DB722C2B5EE00C064C4 /* macAppUpdater.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = macAppUpdater.swift; sourceTree = ""; }; 9A426DBD22C2BE0000C064C4 /* Updates.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Updates.storyboard; sourceTree = ""; }; + 9A493CDE23202B620064570C /* MemoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemoryView.swift; sourceTree = ""; }; 9A57A18422A1D26D0033E318 /* MenuBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuBar.swift; sourceTree = ""; }; 9A57A19C22A1E3270033E318 /* CPU.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPU.swift; sourceTree = ""; }; 9A58D1AF22C150C800405315 /* Network.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; @@ -256,6 +258,7 @@ children = ( 9A7B8F6822A2C3A100DEB352 /* Memory.swift */, 9A7B8F6C22A2C3D600DEB352 /* MemoryReader.swift */, + 9A493CDE23202B620064570C /* MemoryView.swift */, ); path = Memory; sourceTree = ""; @@ -549,6 +552,7 @@ 9A5B1CC5229E7B40008B9D3C /* Extensions.swift in Sources */, 9A79B36A22D3BEE600BF1C3A /* Widget.swift in Sources */, 9AF0F32122DA92AD00026AE6 /* NetworkDots.swift in Sources */, + 9A493CDF23202B620064570C /* MemoryView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Stats/Modules/CPU/CPUReader.swift b/Stats/Modules/CPU/CPUReader.swift index 1bbd3a23e1d..11d144b2abe 100644 --- a/Stats/Modules/CPU/CPUReader.swift +++ b/Stats/Modules/CPU/CPUReader.swift @@ -15,7 +15,7 @@ struct CPUUsage { var idle: Double = 0 } -struct CPUProcess { +struct TopProcess { var pid: Int = 0 var command: String = "" var usage: Double = 0 @@ -24,7 +24,7 @@ struct CPUProcess { class CPUReader: Reader { public var value: Observable<[Double]>! public var usage: Observable = Observable(CPUUsage()) - public var processes: Observable<[CPUProcess]> = Observable([CPUProcess]()) + public var processes: Observable<[TopProcess]> = Observable([TopProcess]()) public var available: Bool = true public var updateTimer: Timer! public var perCoreMode: Bool = false @@ -81,14 +81,14 @@ class CPUReader: Reader { } let outputString = String(data: output, encoding: String.Encoding.utf8) ?? "" - var processes: [CPUProcess] = [] + var processes: [TopProcess] = [] outputString.enumerateLines { (line, stop) -> () in if line.matches("^\\d+ + .+ +\\d+.\\d *$") { let arr = line.condenseWhitespace().split(separator: " ") let pid = Int(arr[0]) ?? 0 let command = String(arr[1]) let usage = Double(arr[2]) ?? 0 - let process = CPUProcess(pid: pid, command: command, usage: usage) + let process = TopProcess(pid: pid, command: command, usage: usage) processes.append(process) } } diff --git a/Stats/Modules/CPU/CPUView.swift b/Stats/Modules/CPU/CPUView.swift index ea87fe9a449..28f17251bb3 100644 --- a/Stats/Modules/CPU/CPUView.swift +++ b/Stats/Modules/CPU/CPUView.swift @@ -32,7 +32,7 @@ extension CPU { self.chart = LineChartView(frame: CGRect(x: 0, y: TabHeight - 110, width: TabWidth, height: 102)) self.chart.animate(xAxisDuration: 2.0, yAxisDuration: 2.0, easingOption: .easeInCubic) self.chart.backgroundColor = .white - self.chart.noDataText = "No data about CPU usage" + self.chart.noDataText = "No \(self.name) usage data" self.chart.legend.enabled = false self.chart.scaleXEnabled = false self.chart.scaleYEnabled = false @@ -63,12 +63,8 @@ extension CPU { marker.chartView = self.chart self.chart.marker = marker - var lineChartEntry = [ChartDataEntry]() - - lineChartEntry.append(ChartDataEntry(x: 0, y: 50)) - lineChartEntry.append(ChartDataEntry(x: 1, y: 25)) - - let chartDataSet = LineChartDataSet(entries: lineChartEntry, label: "CPU Usage") + let lineChartEntry = [ChartDataEntry]() + let chartDataSet = LineChartDataSet(entries: lineChartEntry, label: "\(self.name) Usage") chartDataSet.drawCirclesEnabled = false chartDataSet.mode = .cubicBezier chartDataSet.cubicIntensity = 0.1 @@ -210,10 +206,12 @@ extension CPU { (self.reader as! CPUReader).processes.subscribe(observer: self) { (processes, _) in for (i, process) in processes.enumerated() { - let processView = processViewList[i] - - (processView.subviews[0] as! NSTextField).stringValue = process.command - (processView.subviews[1] as! NSTextField).stringValue = "\(process.usage.roundTo(decimalPlaces: 2)) %" + if i < 5 { + let processView = processViewList[i] + + (processView.subviews[0] as! NSTextField).stringValue = process.command + (processView.subviews[1] as! NSTextField).stringValue = "\(process.usage.roundTo(decimalPlaces: 2)) %" + } } } } diff --git a/Stats/Modules/Memory/Memory.swift b/Stats/Modules/Memory/Memory.swift index 1ba0cf95128..78e0947fb24 100644 --- a/Stats/Modules/Memory/Memory.swift +++ b/Stats/Modules/Memory/Memory.swift @@ -7,23 +7,23 @@ // import Cocoa +import Charts class Memory: Module { - let name: String = "Memory" - let shortName: String = "MEM" - var view: NSView = NSView() - var menu: NSMenuItem = NSMenuItem() - var submenu: NSMenu = NSMenu() - var active: Observable - var available: Observable - var reader: Reader = MemoryReader() - var widgetType: WidgetType - var viewAvailable: Bool = true - var tabView: NSTabViewItem = NSTabViewItem() + public let name: String = "Memory" + public let shortName: String = "MEM" + public var view: NSView = NSView() + public var menu: NSMenuItem = NSMenuItem() + public var active: Observable + public var available: Observable + public var reader: Reader = MemoryReader() + public var widgetType: WidgetType + public var viewAvailable: Bool = true + public var tabView: NSTabViewItem = NSTabViewItem() + public var chart: LineChartView = LineChartView() - let defaults = UserDefaults.standard - - @IBOutlet weak var value: NSTextField! + private let defaults = UserDefaults.standard + private var submenu: NSMenu = NSMenu() init() { self.available = Observable(true) @@ -34,24 +34,6 @@ class Memory: Module { initTab() } - func initTab() { - self.tabView.view?.frame = NSRect(x: 0, y: 0, width: TabWidth, height: TabHeight) - - let text: NSTextField = NSTextField(string: self.name) - text.isEditable = false - text.isSelectable = false - text.isBezeled = false - text.wantsLayer = true - text.textColor = .labelColor - text.canDrawSubviewsIntoLayer = true - text.alignment = .natural - text.font = NSFont.systemFont(ofSize: 13, weight: .regular) - text.frame.origin.x = ((self.tabView.view?.frame.size.width)! - 50) / 2 - text.frame.origin.y = ((self.tabView.view?.frame.size.height)! - 22) / 2 - - self.tabView.view?.addSubview(text) - } - func initMenu() { menu = NSMenuItem(title: name, action: #selector(toggle), keyEquivalent: "") submenu = NSMenu() diff --git a/Stats/Modules/Memory/MemoryReader.swift b/Stats/Modules/Memory/MemoryReader.swift index 58101500d5b..7603e66cce6 100644 --- a/Stats/Modules/Memory/MemoryReader.swift +++ b/Stats/Modules/Memory/MemoryReader.swift @@ -8,17 +8,32 @@ import Foundation +struct MemoryUsage { + var total: Double = 0 + var used: Double = 0 + var free: Double = 0 +} + class MemoryReader: Reader { - var value: Observable<[Double]>! - var available: Bool = true - var updateTimer: Timer! - var totalSize: Float + public var value: Observable<[Double]>! + public var usage: Observable = Observable(MemoryUsage()) + public var processes: Observable<[TopProcess]> = Observable([TopProcess]()) + public var available: Bool = true + public var updateTimer: Timer! + public var totalSize: Float + + private var topProcess: Process = Process() + private var pipe: Pipe = Pipe() init() { self.value = Observable([]) var stats = host_basic_info() var count = UInt32(MemoryLayout.size / MemoryLayout.size) + self.topProcess.launchPath = "/usr/bin/top" + self.topProcess.arguments = ["-s", "1", "-o", "mem", "-n", "5", "-stats", "pid,command,mem"] + self.topProcess.standardOutput = pipe + let kerr: kern_return_t = withUnsafeMutablePointer(to: &stats) { $0.withMemoryRebound(to: integer_t.self, capacity: Int(count)) { host_info(mach_host_self(), HOST_BASIC_INFO, $0, &count) @@ -41,6 +56,43 @@ class MemoryReader: Reader { return } updateTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(read), userInfo: nil, repeats: true) + + if topProcess.isRunning { + return + } + self.pipe.fileHandleForReading.waitForDataInBackgroundAndNotify() + + NotificationCenter.default.addObserver(forName: NSNotification.Name.NSFileHandleDataAvailable, object: self.pipe.fileHandleForReading , queue: nil) { _ -> Void in + defer { + self.pipe.fileHandleForReading.waitForDataInBackgroundAndNotify() + } + + let output = self.pipe.fileHandleForReading.availableData + if output.isEmpty { + return + } + + let outputString = String(data: output, encoding: String.Encoding.utf8) ?? "" + var processes: [TopProcess] = [] + outputString.enumerateLines { (line, stop) -> () in + if line.matches("^\\d+ + .+ +\\d+.\\d[M\\+\\-]+ *$") { + let arr = line.condenseWhitespace().split(separator: " ") + let pid = Int(arr[0]) ?? 0 + let command = String(arr[1]) + let usage = Double(arr[2].filter("01234567890.".contains))! * Double(1024 * 1024) + let process = TopProcess(pid: pid, command: command, usage: usage) + processes.append(process) + } + } + + self.processes << processes + } + + do { + try topProcess.run() + } catch let error { + print(error) + } } func stop() { @@ -49,6 +101,7 @@ class MemoryReader: Reader { } updateTimer.invalidate() updateTimer = nil + NotificationCenter.default.removeObserver(self, name: NSNotification.Name.NSFileHandleDataAvailable, object: nil) } @objc func read() { @@ -63,11 +116,14 @@ class MemoryReader: Reader { if kerr == KERN_SUCCESS { let active = Float(stats.active_count) * Float(PAGE_SIZE) - // let inactive = Float(stats.inactive_count) * Float(PAGE_SIZE) +// let inactive = Float(stats.inactive_count) * Float(PAGE_SIZE) let wired = Float(stats.wire_count) * Float(PAGE_SIZE) let compressed = Float(stats.compressor_page_count) * Float(PAGE_SIZE) - let free = totalSize - (active + wired + compressed) + let used = active + wired + compressed + let free = totalSize - used + + self.usage << MemoryUsage(total: Double(totalSize), used: Double(used), free: Double(free)) self.value << [Double((totalSize - free) / totalSize)] } else { diff --git a/Stats/Modules/Memory/MemoryView.swift b/Stats/Modules/Memory/MemoryView.swift new file mode 100644 index 00000000000..ecf1ac20f28 --- /dev/null +++ b/Stats/Modules/Memory/MemoryView.swift @@ -0,0 +1,258 @@ +// +// MemoryView.swift +// Stats +// +// Created by Serhiy Mytrovtsiy on 04/09/2019. +// Copyright © 2019 Serhiy Mytrovtsiy. All rights reserved. +// + +import Cocoa +import Foundation +import Charts + +extension Memory { + + func initTab() { + self.tabView.view?.frame = NSRect(x: 0, y: 0, width: TabWidth, height: TabHeight) + + makeChart() + makeOverview() + makeProcesses() + + (self.reader as! MemoryReader).usage.subscribe(observer: self) { (value, _) in + self.updateChart(value: Units(bytes: Int64(value.used)).getReadableTuple().0) + } + } + + func makeChart() { + let reader = self.reader as! MemoryReader + let lineColor: NSColor = NSColor(red: (26/255.0), green: (126/255.0), blue: (252/255.0), alpha: 1.0) + let gradientColor: NSColor = NSColor(red: (26/255.0), green: (126/255.0), blue: (252/255.0), alpha: 0.5) + + self.chart = LineChartView(frame: CGRect(x: 0, y: TabHeight - 110, width: TabWidth, height: 102)) + self.chart.animate(xAxisDuration: 2.0, yAxisDuration: 2.0, easingOption: .easeInCubic) + self.chart.backgroundColor = .white + self.chart.noDataText = "No \(self.name) usage data" + self.chart.legend.enabled = false + self.chart.scaleXEnabled = false + self.chart.scaleYEnabled = false + self.chart.pinchZoomEnabled = false + self.chart.doubleTapToZoomEnabled = false + self.chart.drawBordersEnabled = false + + self.chart.rightAxis.enabled = false + + self.chart.leftAxis.axisMinimum = 0 + self.chart.leftAxis.axisMaximum = Units(bytes: Int64(reader.totalSize)).gigabytes + self.chart.leftAxis.labelCount = Units(bytes: Int64(reader.totalSize)).gigabytes > 16 ? 6 : 4 + self.chart.leftAxis.drawGridLinesEnabled = false + self.chart.leftAxis.drawAxisLineEnabled = false + + self.chart.leftAxis.gridColor = NSColor(red:220/255, green:220/255, blue:220/255, alpha:1) + self.chart.leftAxis.gridLineWidth = 0.5 + self.chart.leftAxis.drawGridLinesEnabled = true + self.chart.leftAxis.labelTextColor = NSColor(red:150/255, green:150/255, blue:150/255, alpha:1) + + self.chart.xAxis.drawAxisLineEnabled = false + self.chart.xAxis.drawLimitLinesBehindDataEnabled = false + self.chart.xAxis.gridLineWidth = 0.5 + self.chart.xAxis.drawGridLinesEnabled = false + self.chart.xAxis.drawLabelsEnabled = false + + let marker = ChartMarker() + marker.chartView = self.chart + self.chart.marker = marker + + let lineChartEntry = [ChartDataEntry]() + let chartDataSet = LineChartDataSet(entries: lineChartEntry, label: "\(self.name) Usage") + chartDataSet.drawCirclesEnabled = false + chartDataSet.mode = .cubicBezier + chartDataSet.cubicIntensity = 0.1 + chartDataSet.colors = [lineColor] + chartDataSet.fillColor = gradientColor + chartDataSet.drawFilledEnabled = true + + let data = LineChartData() + data.addDataSet(chartDataSet) + data.setDrawValues(false) + + self.chart.data = LineChartData(dataSet: chartDataSet) + + self.tabView.view?.addSubview(self.chart) + } + + func updateChart(value: Double) { + let index = Double((self.chart.data?.getDataSetByIndex(0)?.entryCount)!) + self.chart.data?.addEntry(ChartDataEntry(x: index, y: value), dataSetIndex: 0) + + if index > 120 { + self.chart.xAxis.axisMinimum = index - 120 + } + self.chart.xAxis.axisMaximum = index + self.chart.notifyDataSetChanged() + self.chart.moveViewToX(index) + } + + func makeOverview() { + let overviewLabel: NSView = NSView(frame: NSRect(x: 0, y: TabHeight - 140, width: TabWidth, height: 25)) + + overviewLabel.wantsLayer = true + overviewLabel.layer?.backgroundColor = NSColor(hexString: "#eeeeee", alpha: 0.5).cgColor + + let overviewText: NSTextField = NSTextField(string: "Overview") + overviewText.frame = NSRect(x: 0, y: 0, width: TabWidth, height: overviewLabel.frame.size.height - 4) + overviewText.isEditable = false + overviewText.isSelectable = false + overviewText.isBezeled = false + overviewText.wantsLayer = true + overviewText.textColor = .darkGray + overviewText.canDrawSubviewsIntoLayer = true + overviewText.alignment = .center + overviewText.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) + overviewText.font = NSFont.systemFont(ofSize: 12, weight: .medium) + + overviewLabel.addSubview(overviewText) + self.tabView.view?.addSubview(overviewLabel) + + let stackHeight: CGFloat = 22 + let vertical: NSStackView = NSStackView(frame: NSRect(x: 0, y: 147, width: TabWidth, height: stackHeight*3)) + vertical.orientation = .vertical + + let total: NSStackView = NSStackView(frame: NSRect(x: 10, y: stackHeight*2, width: TabWidth - 20, height: stackHeight)) + total.orientation = .horizontal + total.distribution = .equalCentering + let totalLabel = labelField(string: "Total") + let totalValue = valueField(string: "0 GB") + total.addView(totalLabel, in: .center) + total.addView(totalValue, in: .center) + + let used: NSStackView = NSStackView(frame: NSRect(x: 10, y: stackHeight*1, width: TabWidth - 20, height: stackHeight)) + used.orientation = .horizontal + used.distribution = .equalCentering + let usedLabel = labelField(string: "Used") + let usedValue = valueField(string: "0 GB") + used.addView(usedLabel, in: .center) + used.addView(usedValue, in: .center) + + let free: NSStackView = NSStackView(frame: NSRect(x: 10, y: 0, width: TabWidth - 20, height: stackHeight)) + free.orientation = .horizontal + free.distribution = .equalCentering + let freeLabel = labelField(string: "Free") + let freeValue = valueField(string: "0 GB") + free.addView(freeLabel, in: .center) + free.addView(freeValue, in: .center) + + vertical.addSubview(total) + vertical.addSubview(used) + vertical.addSubview(free) + + self.tabView.view?.addSubview(vertical) + + (self.reader as! MemoryReader).usage.subscribe(observer: self) { (value, _) in + totalValue.stringValue = Units(bytes: Int64(value.total)).getReadableUnit() + usedValue.stringValue = Units(bytes: Int64(value.used)).getReadableUnit() + freeValue.stringValue = Units(bytes: Int64(value.free)).getReadableUnit() + } + } + + func makeProcesses() { + let label: NSView = NSView(frame: NSRect(x: 0, y: 0, width: TabWidth, height: 25)) + + label.wantsLayer = true + label.layer?.backgroundColor = NSColor(hexString: "#eeeeee", alpha: 0.5).cgColor + + let text: NSTextField = NSTextField(string: "Top Processes") + text.frame = NSRect(x: 0, y: 0, width: TabWidth, height: label.frame.size.height - 4) + text.isEditable = false + text.isSelectable = false + text.isBezeled = false + text.wantsLayer = true + text.textColor = .darkGray + text.canDrawSubviewsIntoLayer = true + text.alignment = .center + text.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) + text.font = NSFont.systemFont(ofSize: 12, weight: .medium) + + label.addSubview(text) + self.tabView.view?.addSubview(label) + + let stackHeight: CGFloat = 22 + let vertical: NSStackView = NSStackView(frame: NSRect(x: 0, y: 4, width: TabWidth, height: stackHeight*5)) + vertical.orientation = .vertical + vertical.distribution = .fill + + var processViewList: [NSStackView] = [] + let process_1 = makeProcessView(num: 4, height: stackHeight, label: "", value: "") + let process_2 = makeProcessView(num: 3, height: stackHeight, label: "", value: "") + let process_3 = makeProcessView(num: 2, height: stackHeight, label: "", value: "") + let process_4 = makeProcessView(num: 1, height: stackHeight, label: "", value: "") + let process_5 = makeProcessView(num: 0, height: stackHeight, label: "", value: "") + + processViewList.append(process_1) + processViewList.append(process_2) + processViewList.append(process_3) + processViewList.append(process_4) + processViewList.append(process_5) + + vertical.addSubview(process_1) + vertical.addSubview(process_2) + vertical.addSubview(process_3) + vertical.addSubview(process_4) + vertical.addSubview(process_5) + self.tabView.view?.addSubview(vertical) + + label.frame = NSRect(x: 0, y: vertical.frame.origin.y + vertical.frame.size.height + 2, width: TabWidth, height: 25) + self.tabView.view?.addSubview(label) + + (self.reader as! MemoryReader).processes.subscribe(observer: self) { (processes, _) in + for (i, process) in processes.enumerated() { + if i < 5 { + let processView = processViewList[i] + + (processView.subviews[0] as! NSTextField).stringValue = process.command + (processView.subviews[1] as! NSTextField).stringValue = Units(bytes: Int64(process.usage)).getReadableUnit() + } + } + } + } + + func makeProcessView(num: Int, height: CGFloat, label: String, value: String) -> NSStackView { + let view: NSStackView = NSStackView(frame: NSRect(x: 10, y: CGFloat(num)*height, width: TabWidth - 20, height: height)) + view.orientation = .horizontal + view.distribution = .equalCentering + let viewLabel = labelField(string: label) + let viewValue = valueField(string: value) + view.addView(viewLabel, in: .center) + view.addView(viewValue, in: .center) + + return view + } + + func labelField(string: String) -> NSTextField { + let label: NSTextField = NSTextField(string: string) + + label.isEditable = false + label.isSelectable = false + label.isBezeled = false + label.textColor = .black + label.alignment = .center + label.font = NSFont.systemFont(ofSize: 12, weight: .regular) + label.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) + + return label + } + + func valueField(string: String) -> NSTextField { + let label: NSTextField = NSTextField(string: string) + + label.isEditable = false + label.isSelectable = false + label.isBezeled = false + label.textColor = .black + label.alignment = .center + label.font = NSFont.systemFont(ofSize: 13, weight: .regular) + label.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) + + return label + } +} diff --git a/Stats/Supporting Files/Info.plist b/Stats/Supporting Files/Info.plist index 05e59ac5083..589d68b18d4 100755 --- a/Stats/Supporting Files/Info.plist +++ b/Stats/Supporting Files/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.2.11 + 1.3.0 CFBundleVersion 1 LSApplicationCategoryType diff --git a/Stats/Widgets/Network/NetworkArrowsText.swift b/Stats/Widgets/Network/NetworkArrowsText.swift index 82426c4f060..d6b9adeb1ea 100644 --- a/Stats/Widgets/Network/NetworkArrowsText.swift +++ b/Stats/Widgets/Network/NetworkArrowsText.swift @@ -94,11 +94,11 @@ class NetworkArrowsTextView: NSView, Widget { if self.download != download { self.download = download - downloadValue.stringValue = Units(bytes: self.download).getReadableUnit() + downloadValue.stringValue = "\(Units(bytes: self.download).getReadableUnit())/s" } if self.upload != upload { self.upload = upload - uploadValue.stringValue = Units(bytes: self.upload).getReadableUnit() + uploadValue.stringValue = "\(Units(bytes: self.upload).getReadableUnit())/s" } } diff --git a/Stats/Widgets/Network/NetworkDotsText.swift b/Stats/Widgets/Network/NetworkDotsText.swift index ab57aa7b369..f37e006cf40 100644 --- a/Stats/Widgets/Network/NetworkDotsText.swift +++ b/Stats/Widgets/Network/NetworkDotsText.swift @@ -80,11 +80,11 @@ class NetworkDotsTextView: NSView, Widget { if self.download != download { self.download = download - downloadValue.stringValue = Units(bytes: self.download).getReadableUnit() + downloadValue.stringValue = "\(Units(bytes: self.download).getReadableUnit())/s" } if self.upload != upload { self.upload = upload - uploadValue.stringValue = Units(bytes: self.upload).getReadableUnit() + uploadValue.stringValue = "\(Units(bytes: self.upload).getReadableUnit())/s" } } diff --git a/Stats/Widgets/Network/NetworkText.swift b/Stats/Widgets/Network/NetworkText.swift index 883c7aba394..8f4bf952443 100644 --- a/Stats/Widgets/Network/NetworkText.swift +++ b/Stats/Widgets/Network/NetworkText.swift @@ -44,8 +44,8 @@ class NetworkTextView: NSView, Widget { let download: Int64 = Int64(data[0]) let upload: Int64 = Int64(data[1]) - downloadValue.stringValue = Units(bytes: download).getReadableUnit() - uploadValue.stringValue = Units(bytes: upload).getReadableUnit() + downloadValue.stringValue = "\(Units(bytes: download).getReadableUnit())/s" + uploadValue.stringValue = "\(Units(bytes: upload).getReadableUnit())/s" } func valueView() { diff --git a/Stats/libs/Extensions.swift b/Stats/libs/Extensions.swift index 7eda9133306..5d482afab2d 100755 --- a/Stats/libs/Extensions.swift +++ b/Stats/libs/Extensions.swift @@ -107,15 +107,15 @@ public struct Units { public func getReadableUnit() -> String { switch bytes { case 0..<1_024: - return "0 KB/s" + return "0 KB" case 1_024..<(1_024 * 1_024): - return String(format: "%.0f KB/s", kilobytes) + return String(format: "%.0f KB", kilobytes) case 1_024..<(1_024 * 1_024 * 1_024): - return String(format: "%.2f MB/s", megabytes) + return String(format: "%.2f MB", megabytes) case (1_024 * 1_024 * 1_024)...Int64.max: - return String(format: "%.2f GB/s", gigabytes) + return String(format: "%.2f GB", gigabytes) default: - return String(format: "%.0f KB/s", kilobytes) + return String(format: "%.0f KB", kilobytes) } } } From 019ee41c537786ee6da6fd4dfccb007065e10eb6 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Wed, 4 Sep 2019 21:19:45 +0200 Subject: [PATCH 05/13] removed StatsLauncher --- Stats.xcodeproj/project.pbxproj | 164 ----- StatsLauncher/AppDelegate.swift | 43 -- .../AppIcon.appiconset/1024.png | Bin 225401 -> 0 bytes .../AppIcon.appiconset/128.png | Bin 27309 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/16.png | Bin 16204 -> 0 bytes .../AppIcon.appiconset/256-1.png | Bin 45452 -> 0 bytes .../AppIcon.appiconset/256.png | Bin 45452 -> 0 bytes .../AppIcon.appiconset/32-1.png | Bin 16976 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/32.png | Bin 16976 -> 0 bytes .../AppIcon.appiconset/512-1.png | Bin 52433 -> 0 bytes .../AppIcon.appiconset/512.png | Bin 52433 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/64.png | Bin 19829 -> 0 bytes .../AppIcon.appiconset/Contents.json | 68 -- StatsLauncher/Assets.xcassets/Contents.json | 6 - StatsLauncher/Base.lproj/Main.storyboard | 683 ------------------ StatsLauncher/Info.plist | 34 - StatsLauncher/StatsLauncher.entitlements | 12 - 17 files changed, 1010 deletions(-) delete mode 100644 StatsLauncher/AppDelegate.swift delete mode 100644 StatsLauncher/Assets.xcassets/AppIcon.appiconset/1024.png delete mode 100644 StatsLauncher/Assets.xcassets/AppIcon.appiconset/128.png delete mode 100644 StatsLauncher/Assets.xcassets/AppIcon.appiconset/16.png delete mode 100644 StatsLauncher/Assets.xcassets/AppIcon.appiconset/256-1.png delete mode 100644 StatsLauncher/Assets.xcassets/AppIcon.appiconset/256.png delete mode 100644 StatsLauncher/Assets.xcassets/AppIcon.appiconset/32-1.png delete mode 100644 StatsLauncher/Assets.xcassets/AppIcon.appiconset/32.png delete mode 100644 StatsLauncher/Assets.xcassets/AppIcon.appiconset/512-1.png delete mode 100644 StatsLauncher/Assets.xcassets/AppIcon.appiconset/512.png delete mode 100644 StatsLauncher/Assets.xcassets/AppIcon.appiconset/64.png delete mode 100755 StatsLauncher/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 StatsLauncher/Assets.xcassets/Contents.json delete mode 100644 StatsLauncher/Base.lproj/Main.storyboard delete mode 100644 StatsLauncher/Info.plist delete mode 100644 StatsLauncher/StatsLauncher.entitlements diff --git a/Stats.xcodeproj/project.pbxproj b/Stats.xcodeproj/project.pbxproj index 81214b0b62a..9ed00763954 100644 --- a/Stats.xcodeproj/project.pbxproj +++ b/Stats.xcodeproj/project.pbxproj @@ -7,7 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 556DD3DCB38374D039BECE89 /* Pods_StatsLauncher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B76EECB31DFC37E1EA558662 /* Pods_StatsLauncher.framework */; }; 628D2DE0AAA753E9F47625B0 /* Pods_Stats.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56B63995EBD3A1D1EBD3AF38 /* Pods_Stats.framework */; }; 9A09C89E22B3A7C90018426F /* Battery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A09C89D22B3A7C90018426F /* Battery.swift */; }; 9A09C8A022B3A7E20018426F /* BatteryReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A09C89F22B3A7E20018426F /* BatteryReader.swift */; }; @@ -44,10 +43,6 @@ 9AF0F32722DA92DD00026AE6 /* NetworkDotsText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF0F32622DA92DD00026AE6 /* NetworkDotsText.swift */; }; 9AF0F32922DA92E800026AE6 /* NetworkArrowsText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF0F32822DA92E800026AE6 /* NetworkArrowsText.swift */; }; 9AF6F1FE231D732600B8E1E4 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF6F1FD231D732600B8E1E4 /* MainViewController.swift */; }; - 9AFA402522AE49A200FE90BC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9AFA402422AE49A200FE90BC /* Assets.xcassets */; }; - 9AFA402822AE49A200FE90BC /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9AFA402622AE49A200FE90BC /* Main.storyboard */; }; - 9AFA402F22AE49AE00FE90BC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AFA402E22AE49AE00FE90BC /* AppDelegate.swift */; }; - 9AFA403022AE49DD00FE90BC /* StatsLauncher.app in Copy Files */ = {isa = PBXBuildFile; fileRef = 9AFA401E22AE49A100FE90BC /* StatsLauncher.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 9AFFCB3B22B3FD0500B0E6D8 /* About.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9AFFCB3A22B3FD0500B0E6D8 /* About.storyboard */; }; /* End PBXBuildFile section */ @@ -58,7 +53,6 @@ dstPath = Contents/Library/LoginItems; dstSubfolderSpec = 1; files = ( - 9AFA403022AE49DD00FE90BC /* StatsLauncher.app in Copy Files */, ); name = "Copy Files"; runOnlyForDeploymentPostprocessing = 0; @@ -111,12 +105,6 @@ 9AF0F32622DA92DD00026AE6 /* NetworkDotsText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkDotsText.swift; sourceTree = ""; }; 9AF0F32822DA92E800026AE6 /* NetworkArrowsText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkArrowsText.swift; sourceTree = ""; }; 9AF6F1FD231D732600B8E1E4 /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; - 9AFA401E22AE49A100FE90BC /* StatsLauncher.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StatsLauncher.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 9AFA402422AE49A200FE90BC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 9AFA402722AE49A200FE90BC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 9AFA402922AE49A200FE90BC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9AFA402A22AE49A200FE90BC /* StatsLauncher.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = StatsLauncher.entitlements; sourceTree = ""; }; - 9AFA402E22AE49AE00FE90BC /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 9AFFCB3A22B3FD0500B0E6D8 /* About.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = About.storyboard; sourceTree = ""; }; B76EECB31DFC37E1EA558662 /* Pods_StatsLauncher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StatsLauncher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -130,14 +118,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9AFA401B22AE49A100FE90BC /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 556DD3DCB38374D039BECE89 /* Pods_StatsLauncher.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -154,7 +134,6 @@ isa = PBXGroup; children = ( 9A1410F7229E721100D29793 /* Stats */, - 9AFA401F22AE49A100FE90BC /* StatsLauncher */, 9A1410F6229E721100D29793 /* Products */, 9A998CD622A199920087ADE7 /* Frameworks */, A159F8578E30ECA1F2F6028E /* Pods */, @@ -165,7 +144,6 @@ isa = PBXGroup; children = ( 9A1410F5229E721100D29793 /* Stats.app */, - 9AFA401E22AE49A100FE90BC /* StatsLauncher.app */, ); name = Products; sourceTree = ""; @@ -313,18 +291,6 @@ path = Views; sourceTree = ""; }; - 9AFA401F22AE49A100FE90BC /* StatsLauncher */ = { - isa = PBXGroup; - children = ( - 9AFA402E22AE49AE00FE90BC /* AppDelegate.swift */, - 9AFA402422AE49A200FE90BC /* Assets.xcassets */, - 9AFA402622AE49A200FE90BC /* Main.storyboard */, - 9AFA402922AE49A200FE90BC /* Info.plist */, - 9AFA402A22AE49A200FE90BC /* StatsLauncher.entitlements */, - ); - path = StatsLauncher; - sourceTree = ""; - }; A159F8578E30ECA1F2F6028E /* Pods */ = { isa = PBXGroup; children = ( @@ -359,24 +325,6 @@ productReference = 9A1410F5229E721100D29793 /* Stats.app */; productType = "com.apple.product-type.application"; }; - 9AFA401D22AE49A100FE90BC /* StatsLauncher */ = { - isa = PBXNativeTarget; - buildConfigurationList = 9AFA402B22AE49A200FE90BC /* Build configuration list for PBXNativeTarget "StatsLauncher" */; - buildPhases = ( - 3AB22E5D98D11E0384E0FF21 /* [CP] Check Pods Manifest.lock */, - 9AFA401A22AE49A100FE90BC /* Sources */, - 9AFA401B22AE49A100FE90BC /* Frameworks */, - 9AFA401C22AE49A100FE90BC /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = StatsLauncher; - productName = StatsLauncher; - productReference = 9AFA401E22AE49A100FE90BC /* StatsLauncher.app */; - productType = "com.apple.product-type.application"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -399,15 +347,6 @@ }; }; }; - 9AFA401D22AE49A100FE90BC = { - CreatedOnToolsVersion = 10.2.1; - LastSwiftMigration = 1030; - SystemCapabilities = { - com.apple.ApplicationGroups.Mac = { - enabled = 0; - }; - }; - }; }; }; buildConfigurationList = 9A1410F0229E721100D29793 /* Build configuration list for PBXProject "Stats" */; @@ -424,7 +363,6 @@ projectRoot = ""; targets = ( 9A1410F4229E721100D29793 /* Stats */, - 9AFA401D22AE49A100FE90BC /* StatsLauncher */, ); }; /* End PBXProject section */ @@ -441,40 +379,9 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9AFA401C22AE49A100FE90BC /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9AFA402522AE49A200FE90BC /* Assets.xcassets in Resources */, - 9AFA402822AE49A200FE90BC /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3AB22E5D98D11E0384E0FF21 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-StatsLauncher-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 813D45DAD934E69BA5C6A78F /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -556,14 +463,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9AFA401A22AE49A100FE90BC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9AFA402F22AE49AE00FE90BC /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ @@ -575,14 +474,6 @@ name = Main.storyboard; sourceTree = ""; }; - 9AFA402622AE49A200FE90BC /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 9AFA402722AE49A200FE90BC /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ @@ -757,52 +648,6 @@ }; name = Release; }; - 9AFA402C22AE49A200FE90BC /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2650ED499D83382C9C938E76 /* Pods-StatsLauncher.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = StatsLauncher/StatsLauncher.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = RP2S87B72W; - ENABLE_HARDENED_RUNTIME = YES; - INFOPLIST_FILE = StatsLauncher/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.13; - PRODUCT_BUNDLE_IDENTIFIER = eu.exelban.StatsLauncher; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 9AFA402D22AE49A200FE90BC /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0BAA6D5F418C0F6999BD18BD /* Pods-StatsLauncher.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = StatsLauncher/StatsLauncher.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = RP2S87B72W; - ENABLE_HARDENED_RUNTIME = YES; - INFOPLIST_FILE = StatsLauncher/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.13; - PRODUCT_BUNDLE_IDENTIFIER = eu.exelban.StatsLauncher; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -824,15 +669,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 9AFA402B22AE49A200FE90BC /* Build configuration list for PBXNativeTarget "StatsLauncher" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9AFA402C22AE49A200FE90BC /* Debug */, - 9AFA402D22AE49A200FE90BC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = 9A1410ED229E721100D29793 /* Project object */; diff --git a/StatsLauncher/AppDelegate.swift b/StatsLauncher/AppDelegate.swift deleted file mode 100644 index 4c7353dd503..00000000000 --- a/StatsLauncher/AppDelegate.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// AppDelegate.swift -// StatsLauncher -// -// Created by Serhiy Mytrovtsiy on 10/06/2019. -// Copyright © 2019 Serhiy Mytrovtsiy. All rights reserved. -// - -import Cocoa - -extension Notification.Name { - static let killLauncher = Notification.Name("killLauncher") -} - -@NSApplicationMain -class AppDelegate: NSObject, NSApplicationDelegate { - - func applicationDidFinishLaunching(_ aNotification: Notification) { - let mainAppIdentifier = "eu.exelban.Stats" - let runningApps = NSWorkspace.shared.runningApplications - let isRunning = !runningApps.filter { $0.bundleIdentifier == mainAppIdentifier }.isEmpty - - if !isRunning { - DistributedNotificationCenter.default().addObserver(self, - selector: #selector(self.terminate), - name: .killLauncher, - object: mainAppIdentifier) - var path = Bundle.main.bundlePath as NSString - for _ in 1...4 { - path = path.deletingLastPathComponent as NSString - } - NSWorkspace.shared.launchApplication(path as String) - } - else { - self.terminate() - } - } - - @objc func terminate() { - NSApp.terminate(nil) - } -} - diff --git a/StatsLauncher/Assets.xcassets/AppIcon.appiconset/1024.png b/StatsLauncher/Assets.xcassets/AppIcon.appiconset/1024.png deleted file mode 100644 index a81724941736c0136e1222f4347444555a4d1452..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225401 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�k0kS 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 O#A@#W^8z#XsQ&{?1lleD diff --git a/StatsLauncher/Assets.xcassets/AppIcon.appiconset/128.png b/StatsLauncher/Assets.xcassets/AppIcon.appiconset/128.png deleted file mode 100644 index 4d0f7329b5862d73e97b5f61f2f45b463f65419b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27309 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 diff --git a/StatsLauncher/Assets.xcassets/AppIcon.appiconset/256.png b/StatsLauncher/Assets.xcassets/AppIcon.appiconset/256.png deleted file mode 100644 index e28ffbe4172c379905fcb9ff885540fa70ecbc58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45452 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 diff --git a/StatsLauncher/Assets.xcassets/AppIcon.appiconset/32-1.png b/StatsLauncher/Assets.xcassets/AppIcon.appiconset/32-1.png deleted file mode 100644 index 71b750a80b7e54ea69b8e65e4fbe737c975b06ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16976 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 G%l-qnCGtH0 diff --git a/StatsLauncher/Assets.xcassets/AppIcon.appiconset/32.png b/StatsLauncher/Assets.xcassets/AppIcon.appiconset/32.png deleted file mode 100644 index 71b750a80b7e54ea69b8e65e4fbe737c975b06ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16976 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 G%l-qnCGtH0 diff --git a/StatsLauncher/Assets.xcassets/AppIcon.appiconset/512-1.png b/StatsLauncher/Assets.xcassets/AppIcon.appiconset/512-1.png deleted file mode 100644 index 4d15d71755082a06bb202827224ae3e0cb64ae90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52433 zcmXtg2RxSD|Nmv*_AR>zQITEBo@Hi>%rcUYz4y#YM51KR$R>)iBgqya*%`OJxBusU zzQ2F3dRkBSIoG+)`F!5%h}2Y9Bqupff*=UFveF%G1i^)0;vy(Q_-Wg7@DP5&cac-R zhk|dus7Dd-dtyf=0~Z8&m5u#@(^s+H27k!tDzERVB^h_QWv+r-%9T}QboCRAARZZVwU3~2x(ICL$Tq@>^He>h+gttUh>(_iOoNJ zFdsV=?zK6b@HJC_!H=-{wBb6#uDPiDMK;C12Ys(YG~DW`8B(?dICJy-{s}UW1ri`+ z3Z)jJ``t0A(u-U5)4!=-1gXp7)HAb|311=1PBOzmLgHBE{4e_EhX*>ONU}?D%E<=d z$WR7!Wt!^)IX_iJmQq+)ko)^-+I#+nZ-%M#?P-GgZ%(E65k6p$$84CK5|l% z;hS<1_AZWSDL&1n3cP545>kZW1Q)~eFqFK`S2?~p=E1Cp`lN_@RsT+OnwhqW+kntb zZtIMK!b0`~MUvD?ylWqrO}FV`RTnB#X16bIpLQolWN{J)vu;Z8J2G9ZVD{S-RMQbw z)43Y@B+uH$&d%<9yip26H(8l!U|&9LgKUjB)qH;Ca}J_Dk?2cKOjhk$xa@>Q88SE3 zbbh&+s7-GKQOL-?w+|%1iG|QxDV65$T~^8*tPOxS#IAlusom6f?6u+c3J%8p@EIXB}qt9=;bA z+9>PmwFtk(*=_rw7WPoCu`r$|Xb#fbq@l5kjisvxE2`ir8P0;QZQVTa@py(`k zjHt}F zP0fdeujg^2G+8q=Rdl3Wni=%rFvgwJuk&LhmKv^cKd9hPzRt$M_$)Xh;arP=ahRE> z>cF<9ilo`qScVF+%a<>&W@TM^sGtxwwzgO2CzU=nv+-%%zGiIEwKi2fUop|rW1lT5 z>jq=#-Qk^#!a}>KtSYXkemWHXC~lC9k&lm$k*%$*(cQauZCzYkj>;|CM=35!c$&|5 zr}Ea8DEfqChN54i`_)m_Ga@CgXFlo4qDSN3ie@Af!l?~2+kWiMYRunQfg7EGtwLjE z?nf0nN`v+(Fo#I=H0tqF1^b_okwz0RDa$f#j zp4Zma#!gO7uIA?ErntL0K1Mg?tb!tTr6BQ4bC~mzig;j;SG7b$Ga&SOch^0ae#pWA zM?s|#7g6Xh?;dNZI|-e1ud|ek&_Ux9d0PuVP0o9dshtpr7E&n~cHYfjCPU)~MKj*G z;hmWO#=QfS}_X@JK`G%Q=;+V+Q z`XL8NvX;QY!U=EAC|tFH`W-D@-6zR(I%udOqeDaPv#pWTYVENs(#8)THk@Hf8~!#t z?n=gk$IEw(*3-*)G4qL+~sxUjc2`tgI=$>9z;ta?|zw-nnQwos-T+~CKuXv02n1KdK4cW>bZC07A-Hwpe* zGC_6&*w1|*^t0VsVj9{ns*z05$oIufUh~YdPHq>7F00%#lJ}a(djI~rq~(tU*$^U1 zzRr#gE>#T;en+v?MU(Nt75A3;ttQM)^NPENh*$o=NItW#1~FmC1PRK}$f&QsKX_

99$%`5k>QvuR!AQddWqQwEaX2eSZCqx6 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

6yf=sSibGsQaHDiIh-B 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 diff --git a/StatsLauncher/Assets.xcassets/AppIcon.appiconset/512.png b/StatsLauncher/Assets.xcassets/AppIcon.appiconset/512.png deleted file mode 100644 index 4d15d71755082a06bb202827224ae3e0cb64ae90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52433 zcmXtg2RxSD|Nmv*_AR>zQITEBo@Hi>%rcUYz4y#YM51KR$R>)iBgqya*%`OJxBusU zzQ2F3dRkBSIoG+)`F!5%h}2Y9Bqupff*=UFveF%G1i^)0;vy(Q_-Wg7@DP5&cac-R zhk|dus7Dd-dtyf=0~Z8&m5u#@(^s+H27k!tDzERVB^h_QWv+r-%9T}QboCRAARZZVwU3~2x(ICL$Tq@>^He>h+gttUh>(_iOoNJ zFdsV=?zK6b@HJC_!H=-{wBb6#uDPiDMK;C12Ys(YG~DW`8B(?dICJy-{s}UW1ri`+ z3Z)jJ``t0A(u-U5)4!=-1gXp7)HAb|311=1PBOzmLgHBE{4e_EhX*>ONU}?D%E<=d z$WR7!Wt!^)IX_iJmQq+)ko)^-+I#+nZ-%M#?P-GgZ%(E65k6p$$84CK5|l% z;hS<1_AZWSDL&1n3cP545>kZW1Q)~eFqFK`S2?~p=E1Cp`lN_@RsT+OnwhqW+kntb zZtIMK!b0`~MUvD?ylWqrO}FV`RTnB#X16bIpLQolWN{J)vu;Z8J2G9ZVD{S-RMQbw z)43Y@B+uH$&d%<9yip26H(8l!U|&9LgKUjB)qH;Ca}J_Dk?2cKOjhk$xa@>Q88SE3 zbbh&+s7-GKQOL-?w+|%1iG|QxDV65$T~^8*tPOxS#IAlusom6f?6u+c3J%8p@EIXB}qt9=;bA z+9>PmwFtk(*=_rw7WPoCu`r$|Xb#fbq@l5kjisvxE2`ir8P0;QZQVTa@py(`k zjHt}F zP0fdeujg^2G+8q=Rdl3Wni=%rFvgwJuk&LhmKv^cKd9hPzRt$M_$)Xh;arP=ahRE> z>cF<9ilo`qScVF+%a<>&W@TM^sGtxwwzgO2CzU=nv+-%%zGiIEwKi2fUop|rW1lT5 z>jq=#-Qk^#!a}>KtSYXkemWHXC~lC9k&lm$k*%$*(cQauZCzYkj>;|CM=35!c$&|5 zr}Ea8DEfqChN54i`_)m_Ga@CgXFlo4qDSN3ie@Af!l?~2+kWiMYRunQfg7EGtwLjE z?nf0nN`v+(Fo#I=H0tqF1^b_okwz0RDa$f#j zp4Zma#!gO7uIA?ErntL0K1Mg?tb!tTr6BQ4bC~mzig;j;SG7b$Ga&SOch^0ae#pWA zM?s|#7g6Xh?;dNZI|-e1ud|ek&_Ux9d0PuVP0o9dshtpr7E&n~cHYfjCPU)~MKj*G z;hmWO#=QfS}_X@JK`G%Q=;+V+Q z`XL8NvX;QY!U=EAC|tFH`W-D@-6zR(I%udOqeDaPv#pWTYVENs(#8)THk@Hf8~!#t z?n=gk$IEw(*3-*)G4qL+~sxUjc2`tgI=$>9z;ta?|zw-nnQwos-T+~CKuXv02n1KdK4cW>bZC07A-Hwpe* zGC_6&*w1|*^t0VsVj9{ns*z05$oIufUh~YdPHq>7F00%#lJ}a(djI~rq~(tU*$^U1 zzRr#gE>#T;en+v?MU(Nt75A3;ttQM)^NPENh*$o=NItW#1~FmC1PRK}$f&QsKX_

99$%`5k>QvuR!AQddWqQwEaX2eSZCqx6 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

6yf=sSibGsQaHDiIh-B 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 diff --git a/StatsLauncher/Assets.xcassets/AppIcon.appiconset/64.png b/StatsLauncher/Assets.xcassets/AppIcon.appiconset/64.png deleted file mode 100644 index 59d8a6d3791bc028ed47532a52f4b2632147a116..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19829 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 diff --git a/StatsLauncher/Assets.xcassets/AppIcon.appiconset/Contents.json b/StatsLauncher/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100755 index 501f63e3172..00000000000 --- a/StatsLauncher/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "images" : [ - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "16.png", - "scale" : "1x" - }, - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "32.png", - "scale" : "2x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "32-1.png", - "scale" : "1x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "64.png", - "scale" : "2x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "128.png", - "scale" : "1x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "256.png", - "scale" : "2x" - }, - { - "size" : "256x256", - "idiom" : "mac", - "filename" : "256-1.png", - "scale" : "1x" - }, - { - "size" : "256x256", - "idiom" : "mac", - "filename" : "512-1.png", - "scale" : "2x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "512.png", - "scale" : "1x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "1024.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/StatsLauncher/Assets.xcassets/Contents.json b/StatsLauncher/Assets.xcassets/Contents.json deleted file mode 100644 index da4a164c918..00000000000 --- a/StatsLauncher/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/StatsLauncher/Base.lproj/Main.storyboard b/StatsLauncher/Base.lproj/Main.storyboard deleted file mode 100644 index f26e28151d3..00000000000 --- a/StatsLauncher/Base.lproj/Main.storyboard +++ /dev/null @@ -1,683 +0,0 @@ - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Default - - - - - - - Left to Right - - - - - - - Right to Left - - - - - - - - - - - Default - - - - - - - Left to Right - - - - - - - Right to Left - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/StatsLauncher/Info.plist b/StatsLauncher/Info.plist deleted file mode 100644 index 4fe434c6a68..00000000000 --- a/StatsLauncher/Info.plist +++ /dev/null @@ -1,34 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0.0 - CFBundleVersion - 1 - LSBackgroundOnly - - LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) - NSHumanReadableCopyright - Copyright © 2019 Serhiy Mytrovtsiy. All rights reserved. - NSMainStoryboardFile - Main - NSPrincipalClass - NSApplication - - diff --git a/StatsLauncher/StatsLauncher.entitlements b/StatsLauncher/StatsLauncher.entitlements deleted file mode 100644 index e51d8032372..00000000000 --- a/StatsLauncher/StatsLauncher.entitlements +++ /dev/null @@ -1,12 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.application-groups - - com.apple.security.files.user-selected.read-only - - - From d38a2bf36d5e8c0bab4c31517eea4dfc77e09ec3 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Wed, 4 Sep 2019 21:22:30 +0200 Subject: [PATCH 06/13] cleaned up after remove StatsLauncher --- Stats/AppDelegate.swift | 21 +-------------------- Stats/Supporting Files/Info.plist | 2 +- Stats/Views/MainViewController.swift | 4 +--- 3 files changed, 3 insertions(+), 24 deletions(-) diff --git a/Stats/AppDelegate.swift b/Stats/AppDelegate.swift index d72b124b137..9f904c8246c 100755 --- a/Stats/AppDelegate.swift +++ b/Stats/AppDelegate.swift @@ -9,16 +9,10 @@ import Cocoa import ServiceManagement -extension Notification.Name { - static let killLauncher = Notification.Name("killLauncher") -} - let modules: Observable<[Module]> = Observable([CPU(), Memory(), Disk(), Battery(), Network()]) let updater = macAppUpdater(user: "exelban", repo: "stats") let menu = NSPopover() -let appStoreMode: Bool = false - @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { let defaults = UserDefaults.standard @@ -36,21 +30,12 @@ class AppDelegate: NSObject, NSApplicationDelegate { _ = MenuBar(menuBarItem, menuBarButton: menuBarButton) - let launcherAppId = "eu.exelban.StatsLauncher" - let runningApps = NSWorkspace.shared.runningApplications - let isRunning = !runningApps.filter { $0.bundleIdentifier == launcherAppId }.isEmpty - - if defaults.object(forKey: "runAtLogin") == nil { - SMLoginItemSetEnabled(launcherAppId as CFString, true) - self.defaults.set(true, forKey: "runAtLogin") - } - if defaults.object(forKey: "dockIcon") != nil { let dockIconStatus = defaults.bool(forKey: "dockIcon") ? NSApplication.ActivationPolicy.regular : NSApplication.ActivationPolicy.accessory NSApp.setActivationPolicy(dockIconStatus) } - if !appStoreMode && defaults.object(forKey: "checkUpdatesOnLogin") == nil || defaults.bool(forKey: "checkUpdatesOnLogin") { + if defaults.object(forKey: "checkUpdatesOnLogin") == nil || defaults.bool(forKey: "checkUpdatesOnLogin") { updater.check() { result, error in if error != nil && error as! String == "No internet connection" { return @@ -71,10 +56,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } } - - if isRunning { - DistributedNotificationCenter.default().post(name: .killLauncher, object: Bundle.main.bundleIdentifier!) - } } func applicationWillTerminate(_ aNotification: Notification) { diff --git a/Stats/Supporting Files/Info.plist b/Stats/Supporting Files/Info.plist index 589d68b18d4..77007f0888f 100755 --- a/Stats/Supporting Files/Info.plist +++ b/Stats/Supporting Files/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.3.0 + 1.2.12 CFBundleVersion 1 LSApplicationCategoryType diff --git a/Stats/Views/MainViewController.swift b/Stats/Views/MainViewController.swift index 4232c0729f6..2a9309c9cfa 100644 --- a/Stats/Views/MainViewController.swift +++ b/Stats/Views/MainViewController.swift @@ -121,9 +121,7 @@ class MainViewController: NSViewController { let aboutMenu = NSMenuItem(title: "About Stats", action: #selector(openAbout), keyEquivalent: "") aboutMenu.target = self - if !appStoreMode { - menu.addItem(updateMenu) - } + menu.addItem(updateMenu) menu.addItem(aboutMenu) menu.addItem(NSMenuItem(title: "Quit Stats", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "")) From 73efc7c1b3dbf0f2228d15ec41c45303d0ca2c46 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Wed, 4 Sep 2019 21:37:23 +0200 Subject: [PATCH 07/13] new LaunchAtLogin mechanism (external library) --- Podfile | 10 +++------- Podfile.lock | 6 +++++- Stats.xcodeproj/project.pbxproj | 18 ++++++++++++++++++ Stats/AppDelegate.swift | 5 +++++ Stats/Views/MainViewController.swift | 10 ++++++---- 5 files changed, 37 insertions(+), 12 deletions(-) diff --git a/Podfile b/Podfile index b60c7612eef..7fdfbf86eab 100644 --- a/Podfile +++ b/Podfile @@ -1,13 +1,9 @@ +platform :osx, 10.13 + target 'Stats' do use_frameworks! pod 'Charts' - -end - -target 'StatsLauncher' do - use_frameworks! - - # Pods for StatsLauncher + pod 'LaunchAtLogin' end diff --git a/Podfile.lock b/Podfile.lock index dc1634309f0..2aef7da94d2 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -2,17 +2,21 @@ PODS: - Charts (3.3.0): - Charts/Core (= 3.3.0) - Charts/Core (3.3.0) + - LaunchAtLogin (2.5.0) DEPENDENCIES: - Charts + - LaunchAtLogin SPEC REPOS: https://github.com/cocoapods/specs.git: - Charts + - LaunchAtLogin SPEC CHECKSUMS: Charts: ec1f57f9340054155691e84d4544a1d239d382c5 + LaunchAtLogin: 550b0cbbdaf1b13f87a0fab6a3f8e2fbafe067fe -PODFILE CHECKSUM: 1935eab6769b7093597e74f1286aedc1ea7c755a +PODFILE CHECKSUM: dee05cc24d20d667671a5f594bfbb948dcc3d791 COCOAPODS: 1.7.1 diff --git a/Stats.xcodeproj/project.pbxproj b/Stats.xcodeproj/project.pbxproj index 9ed00763954..d79685b29a0 100644 --- a/Stats.xcodeproj/project.pbxproj +++ b/Stats.xcodeproj/project.pbxproj @@ -315,6 +315,7 @@ 9A1410F3229E721100D29793 /* Resources */, 9AB54DAE22A19F96006192E0 /* Copy Files */, EDB5CB3173CB4B8BADA1278D /* [CP] Embed Pods Frameworks */, + 9A493CE1232047F00064570C /* ShellScript */, ); buildRules = ( ); @@ -404,6 +405,23 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + 9A493CE1232047F00064570C /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PROJECT_DIR}/Pods/LaunchAtLogin/LaunchAtLogin/copy-helper.sh\"\n"; + }; EDB5CB3173CB4B8BADA1278D /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/Stats/AppDelegate.swift b/Stats/AppDelegate.swift index 9f904c8246c..b89775911e3 100755 --- a/Stats/AppDelegate.swift +++ b/Stats/AppDelegate.swift @@ -8,6 +8,7 @@ import Cocoa import ServiceManagement +import LaunchAtLogin let modules: Observable<[Module]> = Observable([CPU(), Memory(), Disk(), Battery(), Network()]) let updater = macAppUpdater(user: "exelban", repo: "stats") @@ -30,6 +31,10 @@ class AppDelegate: NSObject, NSApplicationDelegate { _ = MenuBar(menuBarItem, menuBarButton: menuBarButton) + if self.defaults.object(forKey: "runAtLoginInitialized") == nil { + LaunchAtLogin.isEnabled = true + } + if defaults.object(forKey: "dockIcon") != nil { let dockIconStatus = defaults.bool(forKey: "dockIcon") ? NSApplication.ActivationPolicy.regular : NSApplication.ActivationPolicy.accessory NSApp.setActivationPolicy(dockIconStatus) diff --git a/Stats/Views/MainViewController.swift b/Stats/Views/MainViewController.swift index 2a9309c9cfa..713d06c6279 100644 --- a/Stats/Views/MainViewController.swift +++ b/Stats/Views/MainViewController.swift @@ -8,6 +8,7 @@ import Cocoa import ServiceManagement +import LaunchAtLogin public let TabWidth: CGFloat = 300 public let TabHeight: CGFloat = 356 @@ -102,7 +103,7 @@ class MainViewController: NSViewController { checkForUpdates.target = self let runAtLogin = NSMenuItem(title: "Start at login", action: #selector(toggleMenu), keyEquivalent: "") - runAtLogin.state = defaults.bool(forKey: "runAtLogin") || defaults.object(forKey: "runAtLogin") == nil ? NSControl.StateValue.on : NSControl.StateValue.off + runAtLogin.state = LaunchAtLogin.isEnabled ? NSControl.StateValue.on : NSControl.StateValue.off runAtLogin.target = self let dockIcon = NSMenuItem(title: "Show icon in dock", action: #selector(toggleMenu), keyEquivalent: "") @@ -143,14 +144,15 @@ class MainViewController: NSViewController { } @objc func toggleMenu(_ sender : NSMenuItem) { - let launcherId = "eu.exelban.StatsLauncher" let status = sender.state != NSControl.StateValue.on sender.state = sender.state == NSControl.StateValue.on ? NSControl.StateValue.off : NSControl.StateValue.on switch sender.title { case "Start at login": - SMLoginItemSetEnabled(launcherId as CFString, status) - self.defaults.set(status, forKey: "runAtLogin") + LaunchAtLogin.isEnabled = status + if self.defaults.object(forKey: "runAtLoginInitialized") == nil { + self.defaults.set(true, forKey: "runAtLoginInitialized") + } case "Check for updates on start": self.defaults.set(status, forKey: "checkUpdatesOnLogin") case "Show icon in dock": From 53138f1ceeed81060ed6609193baec7182a30755 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Thu, 5 Sep 2019 15:35:18 +0200 Subject: [PATCH 08/13] created view for Battery module --- Podfile.lock | 4 +- Stats.xcodeproj/project.pbxproj | 12 +- Stats/AppDelegate.swift | 16 +- Stats/Modules/Battery/Battery.swift | 26 +- Stats/Modules/Battery/BatteryReader.swift | 132 ++++++++- Stats/Modules/Battery/BatteryView.swift | 258 ++++++++++++++++++ Stats/Modules/CPU/CPUReader.swift | 2 +- Stats/Modules/CPU/CPUView.swift | 44 +-- Stats/Modules/Memory/MemoryReader.swift | 8 +- Stats/Modules/Memory/MemoryView.swift | 44 +-- Stats/Views/MainViewController.swift | 30 ++ ...{BatteryView.swift => BatteryWidget.swift} | 2 +- Stats/libs/Extensions.swift | 33 +++ 13 files changed, 488 insertions(+), 123 deletions(-) create mode 100644 Stats/Modules/Battery/BatteryView.swift rename Stats/Widgets/{BatteryView.swift => BatteryWidget.swift} (99%) diff --git a/Podfile.lock b/Podfile.lock index 2aef7da94d2..944f6ce6aca 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -17,6 +17,6 @@ SPEC CHECKSUMS: Charts: ec1f57f9340054155691e84d4544a1d239d382c5 LaunchAtLogin: 550b0cbbdaf1b13f87a0fab6a3f8e2fbafe067fe -PODFILE CHECKSUM: dee05cc24d20d667671a5f594bfbb948dcc3d791 +PODFILE CHECKSUM: b73e93f3b5879b0f0bf59fcb6d58288fb63aabc0 -COCOAPODS: 1.7.1 +COCOAPODS: 1.7.5 diff --git a/Stats.xcodeproj/project.pbxproj b/Stats.xcodeproj/project.pbxproj index d79685b29a0..bfeed53d766 100644 --- a/Stats.xcodeproj/project.pbxproj +++ b/Stats.xcodeproj/project.pbxproj @@ -10,7 +10,7 @@ 628D2DE0AAA753E9F47625B0 /* Pods_Stats.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56B63995EBD3A1D1EBD3AF38 /* Pods_Stats.framework */; }; 9A09C89E22B3A7C90018426F /* Battery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A09C89D22B3A7C90018426F /* Battery.swift */; }; 9A09C8A022B3A7E20018426F /* BatteryReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A09C89F22B3A7E20018426F /* BatteryReader.swift */; }; - 9A09C8A222B3D94D0018426F /* BatteryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A09C8A122B3D94D0018426F /* BatteryView.swift */; }; + 9A09C8A222B3D94D0018426F /* BatteryWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A09C8A122B3D94D0018426F /* BatteryWidget.swift */; }; 9A1410F9229E721100D29793 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1410F8229E721100D29793 /* AppDelegate.swift */; }; 9A141100229E721200D29793 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9A1410FE229E721200D29793 /* Main.storyboard */; }; 9A426DB822C2B5EE00C064C4 /* macAppUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A426DB722C2B5EE00C064C4 /* macAppUpdater.swift */; }; @@ -24,6 +24,7 @@ 9A59AE56231EE02F007989D6 /* ChartMarker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A59AE55231EE02F007989D6 /* ChartMarker.swift */; }; 9A5B1CBF229E78F0008B9D3C /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A5B1CBE229E78F0008B9D3C /* Observable.swift */; }; 9A5B1CC5229E7B40008B9D3C /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A5B1CC4229E7B40008B9D3C /* Extensions.swift */; }; + 9A606B482321025C00642F51 /* BatteryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A606B472321025C00642F51 /* BatteryView.swift */; }; 9A6CFC0122A1C9F5001E782D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9A6CFC0022A1C9F5001E782D /* Assets.xcassets */; }; 9A74D59722B44498004FE1FA /* Mini.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A74D59622B44498004FE1FA /* Mini.swift */; }; 9A79B36A22D3BEE600BF1C3A /* Widget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A79B36922D3BEE600BF1C3A /* Widget.swift */; }; @@ -67,7 +68,7 @@ 56B63995EBD3A1D1EBD3AF38 /* Pods_Stats.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Stats.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9A09C89D22B3A7C90018426F /* Battery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Battery.swift; sourceTree = ""; }; 9A09C89F22B3A7E20018426F /* BatteryReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BatteryReader.swift; sourceTree = ""; }; - 9A09C8A122B3D94D0018426F /* BatteryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BatteryView.swift; sourceTree = ""; }; + 9A09C8A122B3D94D0018426F /* BatteryWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BatteryWidget.swift; sourceTree = ""; }; 9A1410F5229E721100D29793 /* Stats.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Stats.app; sourceTree = BUILT_PRODUCTS_DIR; }; 9A1410F8229E721100D29793 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 9A1410FF229E721200D29793 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; @@ -84,6 +85,7 @@ 9A59AE55231EE02F007989D6 /* ChartMarker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChartMarker.swift; sourceTree = ""; }; 9A5B1CBE229E78F0008B9D3C /* Observable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Observable.swift; sourceTree = ""; }; 9A5B1CC4229E7B40008B9D3C /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; + 9A606B472321025C00642F51 /* BatteryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BatteryView.swift; sourceTree = ""; }; 9A6CFC0022A1C9F5001E782D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 9A74D59622B44498004FE1FA /* Mini.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mini.swift; sourceTree = ""; }; 9A79B36922D3BEE600BF1C3A /* Widget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Widget.swift; sourceTree = ""; }; @@ -126,6 +128,7 @@ children = ( 9A09C89D22B3A7C90018426F /* Battery.swift */, 9A09C89F22B3A7E20018426F /* BatteryReader.swift */, + 9A606B472321025C00642F51 /* BatteryView.swift */, ); path = Battery; sourceTree = ""; @@ -214,7 +217,7 @@ children = ( 9AF0F31922DA923100026AE6 /* Network */, 9AF0F31822DA922800026AE6 /* Charts */, - 9A09C8A122B3D94D0018426F /* BatteryView.swift */, + 9A09C8A122B3D94D0018426F /* BatteryWidget.swift */, 9A74D59622B44498004FE1FA /* Mini.swift */, 9A79B36922D3BEE600BF1C3A /* Widget.swift */, ); @@ -446,7 +449,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 9A09C8A222B3D94D0018426F /* BatteryView.swift in Sources */, + 9A09C8A222B3D94D0018426F /* BatteryWidget.swift in Sources */, 9A426DB822C2B5EE00C064C4 /* macAppUpdater.swift in Sources */, 9A79B36E22D3BEF900BF1C3A /* Reader.swift in Sources */, 9A59AE54231ED1AC007989D6 /* CPUView.swift in Sources */, @@ -470,6 +473,7 @@ 9A1410F9229E721100D29793 /* AppDelegate.swift in Sources */, 9AF0F32722DA92DD00026AE6 /* NetworkDotsText.swift in Sources */, 9AF0F32922DA92E800026AE6 /* NetworkArrowsText.swift in Sources */, + 9A606B482321025C00642F51 /* BatteryView.swift in Sources */, 9AF0F31F22DA925700026AE6 /* BarChart.swift in Sources */, 9AF0F31B22DA924000026AE6 /* LineChart.swift in Sources */, 9A59AE56231EE02F007989D6 /* ChartMarker.swift in Sources */, diff --git a/Stats/AppDelegate.swift b/Stats/AppDelegate.swift index b89775911e3..495cdeca7e1 100755 --- a/Stats/AppDelegate.swift +++ b/Stats/AppDelegate.swift @@ -12,7 +12,7 @@ import LaunchAtLogin let modules: Observable<[Module]> = Observable([CPU(), Memory(), Disk(), Battery(), Network()]) let updater = macAppUpdater(user: "exelban", repo: "stats") -let menu = NSPopover() +let popover = NSPopover() @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { @@ -26,8 +26,8 @@ class AppDelegate: NSObject, NSApplicationDelegate { } menuBarButton.action = #selector(toggleMenu) - menu.contentViewController = MainViewController.Init() - menu.behavior = NSPopover.Behavior.transient + popover.contentViewController = MainViewController.Init() + popover.behavior = NSPopover.Behavior.transient _ = MenuBar(menuBarItem, menuBarButton: menuBarButton) @@ -72,19 +72,19 @@ class AppDelegate: NSObject, NSApplicationDelegate { } @objc func toggleMenu(_ sender: Any?) { - if menu.isShown { - menu.performClose(sender) + if popover.isShown { + popover.performClose(sender) } else { if let button = self.menuBarItem.button { NSApplication.shared.activate(ignoringOtherApps: true) - menu.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY) - menu.becomeFirstResponder() + popover.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY) + popover.becomeFirstResponder() } } } func applicationWillResignActive(_ notification: Notification) { - menu.performClose(self) + popover.performClose(self) } } diff --git a/Stats/Modules/Battery/Battery.swift b/Stats/Modules/Battery/Battery.swift index a42f0da5498..e04aaeb03c6 100644 --- a/Stats/Modules/Battery/Battery.swift +++ b/Stats/Modules/Battery/Battery.swift @@ -28,41 +28,23 @@ class Battery: Module { self.available = Observable(self.reader.available) self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true) self.percentageView = Observable(defaults.object(forKey: "\(self.name)_percentage") != nil ? defaults.bool(forKey: "\(self.name)_percentage") : false) - self.view = BatteryView(frame: NSMakeRect(0, 0, widgetSize.width, widgetSize.height)) + self.view = BatteryWidget(frame: NSMakeRect(0, 0, widgetSize.width, widgetSize.height)) initMenu() initWidget() initTab() } - func initTab() { - self.tabView.view?.frame = NSRect(x: 0, y: 0, width: TabWidth, height: TabHeight) - - let text: NSTextField = NSTextField(string: self.name) - text.isEditable = false - text.isSelectable = false - text.isBezeled = false - text.wantsLayer = true - text.textColor = .labelColor - text.canDrawSubviewsIntoLayer = true - text.alignment = .natural - text.font = NSFont.systemFont(ofSize: 13, weight: .regular) - text.frame.origin.x = ((self.tabView.view?.frame.size.width)! - 50) / 2 - text.frame.origin.y = ((self.tabView.view?.frame.size.height)! - 22) / 2 - - self.tabView.view?.addSubview(text) - } - func start() { if !self.reader.value.value.isEmpty { let value = self.reader.value!.value - (self.view as! BatteryView).setCharging(value: value.first! > 0) + (self.view as! BatteryWidget).setCharging(value: value.first! > 0) (self.view as! Widget).setValue(data: [abs(value.first!)]) } self.reader.start() self.reader.value.subscribe(observer: self) { (value, _) in if !value.isEmpty { - (self.view as! BatteryView).setCharging(value: value.first! > 0) + (self.view as! BatteryWidget).setCharging(value: value.first! > 0) (self.view as! Widget).setValue(data: [abs(value.first!)]) } } @@ -70,7 +52,7 @@ class Battery: Module { func initWidget() { self.active << false - (self.view as! BatteryView).setPercentage(value: self.percentageView.value) + (self.view as! BatteryWidget).setPercentage(value: self.percentageView.value) self.active << true } diff --git a/Stats/Modules/Battery/BatteryReader.swift b/Stats/Modules/Battery/BatteryReader.swift index 8b97b1a01ec..fcc4cd35aec 100644 --- a/Stats/Modules/Battery/BatteryReader.swift +++ b/Stats/Modules/Battery/BatteryReader.swift @@ -9,10 +9,45 @@ import Foundation import IOKit.ps +struct BatteryUsage { + var powerSource: String = "" + var state: String = "" + var isCharged: Bool = false + var capacity: Double = 0 + var cycles: Int = 0 + var health: Int = 0 + + var amperage: Int = 0 + var voltage: Double = 0 + var temperature: Double = 0 + + var ACwatts: Int = 0 + var ACstatus: Bool = false + + var timeToEmpty: Int = 0 + var timeToCharge: Int = 0 +} + class BatteryReader: Reader { - var value: Observable<[Double]>! - var available: Bool = false - var updateTimer: Timer! + public var value: Observable<[Double]>! + public var usage: Observable = Observable(BatteryUsage()) + public var updateTimer: Timer! + + private var service: io_connect_t = 0 + private var internalChecked: Bool = false + private var hasInternalBattery: Bool = false + + public var available: Bool { + get { + if !self.internalChecked { + let snapshot = IOPSCopyPowerSourcesInfo().takeRetainedValue() + let sources = IOPSCopyPowerSourcesList(snapshot).takeRetainedValue() as Array + self.hasInternalBattery = sources.count > 0 + self.internalChecked = true + } + return self.hasInternalBattery + } + } init() { self.value = Observable([]) @@ -20,6 +55,7 @@ class BatteryReader: Reader { } func start() { + self.service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleSmartBattery")) if updateTimer != nil { return } @@ -32,25 +68,101 @@ class BatteryReader: Reader { } updateTimer.invalidate() updateTimer = nil + + IOServiceClose(self.service) + IOObjectRelease(self.service) } @objc func read() { let psInfo = IOPSCopyPowerSourcesInfo().takeRetainedValue() let psList = IOPSCopyPowerSourcesList(psInfo).takeRetainedValue() as [CFTypeRef] - self.available = psList.count != 0 for ps in psList { - if let psDesc = IOPSGetPowerSourceDescription(psInfo, ps).takeUnretainedValue() as? [String: Any] { - let powerSourceState = (psDesc[kIOPSPowerSourceStateKey] as? String) - let isCharged = (psDesc[kIOPSIsChargedKey] as? Bool) - var cap: Float = Float(psDesc[kIOPSCurrentCapacityKey] as! Int) / 100 + if let list = IOPSGetPowerSourceDescription(psInfo, ps).takeUnretainedValue() as? Dictionary { + let powerSource = list[kIOPSPowerSourceStateKey] as? String ?? "AC Power" + let state = list[kIOPSBatteryHealthKey] as! String + let isCharged = list[kIOPSIsChargedKey] as? Bool ?? false + var cap = Float(list[kIOPSCurrentCapacityKey] as! Int) / 100 + + let timeToEmpty = Int(list[kIOPSTimeToEmptyKey] as! Int) + let timeToCharged = Int(list[kIOPSTimeToFullChargeKey] as! Int) + + let cycles = self.getIntValue("CycleCount" as CFString) ?? 0 - if isCharged == nil && powerSourceState! == "Battery Power" { - cap = 0 - cap + let maxCapacity = self.getIntValue("MaxCapacity" as CFString) ?? 1 + let designCapacity = self.getIntValue("DesignCapacity" as CFString) ?? 1 + + let amperage = self.getIntValue("Amperage" as CFString) ?? 0 + let voltage = self.getVoltage() ?? 0 + let temperature = self.getTemperature() ?? 0 + + var ACwatts: Int = 0 + if let ACDetails = IOPSCopyExternalPowerAdapterDetails() { + if let ACList = ACDetails.takeUnretainedValue() as? Dictionary { + ACwatts = Int(ACList[kIOPSPowerAdapterWattsKey] as! Int) + } } + let ACstatus = self.getBoolValue("IsCharging" as CFString) ?? false + self.usage << BatteryUsage( + powerSource: powerSource, + state: state, + isCharged: isCharged, + capacity: Double(cap), + cycles: cycles, + health: (100 * maxCapacity) / designCapacity, + + amperage: amperage, + voltage: voltage, + temperature: temperature, + + ACwatts: ACwatts, + ACstatus: ACstatus, + + timeToEmpty: timeToEmpty, + timeToCharge: timeToCharged + ) + + if powerSource == "Battery Power" { + cap = 0 - cap + } self.value << [Double(cap)] } } } + + func getBoolValue(_ forIdentifier: CFString) -> Bool? { + if let value = IORegistryEntryCreateCFProperty(self.service, forIdentifier, kCFAllocatorDefault, 0) { + return value.takeRetainedValue() as? Bool + } + return nil + } + + func getIntValue(_ identifier: CFString) -> Int? { + if let value = IORegistryEntryCreateCFProperty(self.service, identifier, kCFAllocatorDefault, 0) { + return value.takeRetainedValue() as? Int + } + return nil + } + + func getDoubleValue(_ identifier: CFString) -> Double? { + if let value = IORegistryEntryCreateCFProperty(self.service, identifier, kCFAllocatorDefault, 0) { + return value.takeRetainedValue() as? Double + } + return nil + } + + func getVoltage() -> Double? { + if let value = self.getDoubleValue("Voltage" as CFString) { + return value / 1000.0 + } + return nil + } + + func getTemperature() -> Double? { + if let value = IORegistryEntryCreateCFProperty(self.service, "Temperature" as CFString, kCFAllocatorDefault, 0) { + return value.takeRetainedValue() as! Double / 100.0 + } + return nil + } } diff --git a/Stats/Modules/Battery/BatteryView.swift b/Stats/Modules/Battery/BatteryView.swift new file mode 100644 index 00000000000..8037d97cb82 --- /dev/null +++ b/Stats/Modules/Battery/BatteryView.swift @@ -0,0 +1,258 @@ +// +// BatteryView.swift +// Stats +// +// Created by Serhiy Mytrovtsiy on 05/09/2019. +// Copyright © 2019 Serhiy Mytrovtsiy. All rights reserved. +// + +import Foundation +import Cocoa + +extension Battery { + + func initTab() { + self.tabView.view?.frame = NSRect(x: 0, y: 0, width: TabWidth, height: 10) + + makeMain() + makeOverview() + makeBattery() + makePowerAdapter() + } + + func makeMain() { + let stackHeight: CGFloat = 22 + let vertical: NSStackView = NSStackView(frame: NSRect(x: 0, y: TabHeight - stackHeight*3 - 4, width: TabWidth, height: stackHeight*3)) + vertical.orientation = .vertical + + let level: NSStackView = NSStackView(frame: NSRect(x: 10, y: stackHeight*2, width: TabWidth - 20, height: stackHeight)) + level.orientation = .horizontal + level.distribution = .equalCentering + let levelLabel = LabelField(string: "Level") + let levelValue = ValueField(string: "0%") + level.addView(levelLabel, in: .center) + level.addView(levelValue, in: .center) + + let source: NSStackView = NSStackView(frame: NSRect(x: 10, y: stackHeight*1, width: TabWidth - 20, height: stackHeight)) + source.orientation = .horizontal + source.distribution = .equalCentering + let sourceLabel = LabelField(string: "Source") + let sourceValue = ValueField(string: "AC Power") + source.addView(sourceLabel, in: .center) + source.addView(sourceValue, in: .center) + + let time: NSStackView = NSStackView(frame: NSRect(x: 10, y: 0, width: TabWidth - 20, height: stackHeight)) + time.orientation = .horizontal + time.distribution = .equalCentering + let timeLabel = LabelField(string: "Time to charge") + let timeValue = ValueField(string: "Calculating") + time.addView(timeLabel, in: .center) + time.addView(timeValue, in: .center) + + vertical.addSubview(level) + vertical.addSubview(source) + vertical.addSubview(time) + + self.tabView.view?.addSubview(vertical) + + (self.reader as! BatteryReader).usage.subscribe(observer: self) { (value, _) in + levelValue.stringValue = "\(Int(value.capacity * 100))%" + sourceValue.stringValue = value.powerSource + + if value.powerSource == "Battery Power" { + timeLabel.stringValue = "Time to discharge" + if value.timeToEmpty != -1 && value.timeToEmpty != 0 { + timeValue.stringValue = Double(value.timeToEmpty*60).printSecondsToHoursMinutesSeconds() + } + } else { + timeLabel.stringValue = "Time to charge" + if value.timeToCharge != -1 && value.timeToCharge != 0 { + timeValue.stringValue = Double(value.timeToCharge*60).printSecondsToHoursMinutesSeconds() + } + } + + if value.timeToEmpty == -1 || value.timeToEmpty == -1 { + timeValue.stringValue = "Calculating" + } + + if value.isCharged { + timeValue.stringValue = "Fully charged" + } + } + } + + func makeOverview() { + let overviewLabel: NSView = NSView(frame: NSRect(x: 0, y: TabHeight - 102, width: TabWidth, height: 25)) + + overviewLabel.wantsLayer = true + overviewLabel.layer?.backgroundColor = NSColor(hexString: "#eeeeee", alpha: 0.5).cgColor + + let overviewText: NSTextField = NSTextField(string: "Overview") + overviewText.frame = NSRect(x: 0, y: 0, width: TabWidth, height: overviewLabel.frame.size.height - 4) + overviewText.isEditable = false + overviewText.isSelectable = false + overviewText.isBezeled = false + overviewText.wantsLayer = true + overviewText.textColor = .darkGray + overviewText.canDrawSubviewsIntoLayer = true + overviewText.alignment = .center + overviewText.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) + overviewText.font = NSFont.systemFont(ofSize: 12, weight: .medium) + + overviewLabel.addSubview(overviewText) + self.tabView.view?.addSubview(overviewLabel) + + let stackHeight: CGFloat = 22 + let vertical: NSStackView = NSStackView(frame: NSRect(x: 0, y: 184, width: TabWidth, height: stackHeight*3)) + vertical.orientation = .vertical + + let cycles: NSStackView = NSStackView(frame: NSRect(x: 10, y: stackHeight*2, width: TabWidth - 20, height: stackHeight)) + cycles.orientation = .horizontal + cycles.distribution = .equalCentering + let cyclesLabel = LabelField(string: "Cycles") + let cyclesValue = ValueField(string: "0") + cycles.addView(cyclesLabel, in: .center) + cycles.addView(cyclesValue, in: .center) + + let health: NSStackView = NSStackView(frame: NSRect(x: 10, y: stackHeight*1, width: TabWidth - 20, height: stackHeight)) + health.orientation = .horizontal + health.distribution = .equalCentering + let healthLabel = LabelField(string: "Health") + let healthValue = ValueField(string: "Calculating") + health.addView(healthLabel, in: .center) + health.addView(healthValue, in: .center) + + let state: NSStackView = NSStackView(frame: NSRect(x: 10, y: 0, width: TabWidth - 20, height: stackHeight)) + state.orientation = .horizontal + state.distribution = .equalCentering + let stateLabel = LabelField(string: "State") + let stateValue = ValueField(string: "Calculating") + state.addView(stateLabel, in: .center) + state.addView(stateValue, in: .center) + + vertical.addSubview(cycles) + vertical.addSubview(health) + vertical.addSubview(state) + + self.tabView.view?.addSubview(vertical) + + (self.reader as! BatteryReader).usage.subscribe(observer: self) { (value, _) in + cyclesValue.stringValue = "\(value.cycles)" + stateValue.stringValue = value.state + healthValue.stringValue = "\(value.health)%" + } + } + + func makeBattery() { + let batteryLabel: NSView = NSView(frame: NSRect(x: 0, y: TabHeight - 202, width: TabWidth, height: 25)) + + batteryLabel.wantsLayer = true + batteryLabel.layer?.backgroundColor = NSColor(hexString: "#eeeeee", alpha: 0.5).cgColor + + let overviewText: NSTextField = NSTextField(string: "Battery") + overviewText.frame = NSRect(x: 0, y: 0, width: TabWidth, height: batteryLabel.frame.size.height - 4) + overviewText.isEditable = false + overviewText.isSelectable = false + overviewText.isBezeled = false + overviewText.wantsLayer = true + overviewText.textColor = .darkGray + overviewText.canDrawSubviewsIntoLayer = true + overviewText.alignment = .center + overviewText.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) + overviewText.font = NSFont.systemFont(ofSize: 12, weight: .medium) + + batteryLabel.addSubview(overviewText) + self.tabView.view?.addSubview(batteryLabel) + + let stackHeight: CGFloat = 22 + let vertical: NSStackView = NSStackView(frame: NSRect(x: 0, y: TabHeight - 273, width: TabWidth, height: stackHeight*3)) + vertical.orientation = .vertical + + let amperage: NSStackView = NSStackView(frame: NSRect(x: 10, y: stackHeight*2, width: TabWidth - 20, height: stackHeight)) + amperage.orientation = .horizontal + amperage.distribution = .equalCentering + let amperageLabel = LabelField(string: "Amperage") + let amperageValue = ValueField(string: "0 mA") + amperage.addView(amperageLabel, in: .center) + amperage.addView(amperageValue, in: .center) + + let voltage: NSStackView = NSStackView(frame: NSRect(x: 10, y: stackHeight*1, width: TabWidth - 20, height: stackHeight)) + voltage.orientation = .horizontal + voltage.distribution = .equalCentering + let voltageLabel = LabelField(string: "Voltage") + let voltageValue = ValueField(string: "0 V") + voltage.addView(voltageLabel, in: .center) + voltage.addView(voltageValue, in: .center) + + let temperature: NSStackView = NSStackView(frame: NSRect(x: 10, y: 0, width: TabWidth - 20, height: stackHeight)) + temperature.orientation = .horizontal + temperature.distribution = .equalCentering + let temperatureLabel = LabelField(string: "Temperature") + let temperatureValue = ValueField(string: "0 °C") + temperature.addView(temperatureLabel, in: .center) + temperature.addView(temperatureValue, in: .center) + + vertical.addSubview(amperage) + vertical.addSubview(voltage) + vertical.addSubview(temperature) + + self.tabView.view?.addSubview(vertical) + (self.reader as! BatteryReader).usage.subscribe(observer: self) { (value, _) in + amperageValue.stringValue = "\(value.amperage) mA" + voltageValue.stringValue = "\(value.voltage.roundTo(decimalPlaces: 2)) V" + temperatureValue.stringValue = "\(value.temperature) °C" + } + } + + func makePowerAdapter() { + let powerAdapterLabel: NSView = NSView(frame: NSRect(x: 0, y: 52, width: TabWidth, height: 25)) + + powerAdapterLabel.wantsLayer = true + powerAdapterLabel.layer?.backgroundColor = NSColor(hexString: "#eeeeee", alpha: 0.5).cgColor + + let overviewText: NSTextField = NSTextField(string: "Power adapter") + overviewText.frame = NSRect(x: 0, y: 0, width: TabWidth, height: powerAdapterLabel.frame.size.height - 4) + overviewText.isEditable = false + overviewText.isSelectable = false + overviewText.isBezeled = false + overviewText.wantsLayer = true + overviewText.textColor = .darkGray + overviewText.canDrawSubviewsIntoLayer = true + overviewText.alignment = .center + overviewText.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) + overviewText.font = NSFont.systemFont(ofSize: 12, weight: .medium) + + powerAdapterLabel.addSubview(overviewText) + self.tabView.view?.addSubview(powerAdapterLabel) + + let stackHeight: CGFloat = 22 + let vertical: NSStackView = NSStackView(frame: NSRect(x: 0, y: 4, width: TabWidth, height: stackHeight*2)) + vertical.orientation = .vertical + + let power: NSStackView = NSStackView(frame: NSRect(x: 10, y: stackHeight*1, width: TabWidth - 20, height: stackHeight)) + power.orientation = .horizontal + power.distribution = .equalCentering + let powerLabel = LabelField(string: "Power") + let powerValue = ValueField(string: "0 W") + power.addView(powerLabel, in: .center) + power.addView(powerValue, in: .center) + + let charging: NSStackView = NSStackView(frame: NSRect(x: 10, y: 0, width: TabWidth - 20, height: stackHeight)) + charging.orientation = .horizontal + charging.distribution = .equalCentering + let chargingLabel = LabelField(string: "Is charging") + let chargingValue = ValueField(string: "No") + charging.addView(chargingLabel, in: .center) + charging.addView(chargingValue, in: .center) + + vertical.addSubview(power) + vertical.addSubview(charging) + + self.tabView.view?.addSubview(vertical) + + (self.reader as! BatteryReader).usage.subscribe(observer: self) { (value, _) in + powerValue.stringValue = value.powerSource == "Battery Power" ? "Not connected" : "\(value.ACwatts) W" + chargingValue.stringValue = value.ACstatus ? "Yes" : "No" + } + } +} diff --git a/Stats/Modules/CPU/CPUReader.swift b/Stats/Modules/CPU/CPUReader.swift index 11d144b2abe..185f928de54 100644 --- a/Stats/Modules/CPU/CPUReader.swift +++ b/Stats/Modules/CPU/CPUReader.swift @@ -46,7 +46,7 @@ class CPUReader: Reader { self.value = Observable([]) self.topProcess.launchPath = "/usr/bin/top" - self.topProcess.arguments = ["-s", "1", "-o", "cpu", "-n", "5", "-stats", "pid,command,cpu"] + self.topProcess.arguments = ["-s", "3", "-o", "cpu", "-n", "5", "-stats", "pid,command,cpu"] self.topProcess.standardOutput = pipe mibKeys.withUnsafeBufferPointer() { mib in diff --git a/Stats/Modules/CPU/CPUView.swift b/Stats/Modules/CPU/CPUView.swift index 28f17251bb3..b6c03e77eeb 100644 --- a/Stats/Modules/CPU/CPUView.swift +++ b/Stats/Modules/CPU/CPUView.swift @@ -121,24 +121,24 @@ extension CPU { let system: NSStackView = NSStackView(frame: NSRect(x: 10, y: stackHeight*2, width: TabWidth - 20, height: stackHeight)) system.orientation = .horizontal system.distribution = .equalCentering - let systemLabel = labelField(string: "System") - let systemValue = valueField(string: "0 %") + let systemLabel = LabelField(string: "System") + let systemValue = ValueField(string: "0 %") system.addView(systemLabel, in: .center) system.addView(systemValue, in: .center) let user: NSStackView = NSStackView(frame: NSRect(x: 10, y: stackHeight*1, width: TabWidth - 20, height: stackHeight)) user.orientation = .horizontal user.distribution = .equalCentering - let userLabel = labelField(string: "User") - let userValue = valueField(string: "0 %") + let userLabel = LabelField(string: "User") + let userValue = ValueField(string: "0 %") user.addView(userLabel, in: .center) user.addView(userValue, in: .center) let idle: NSStackView = NSStackView(frame: NSRect(x: 10, y: 0, width: TabWidth - 20, height: stackHeight)) idle.orientation = .horizontal idle.distribution = .equalCentering - let idleLabel = labelField(string: "Idle") - let idleValue = valueField(string: "0 %") + let idleLabel = LabelField(string: "Idle") + let idleValue = ValueField(string: "0 %") idle.addView(idleLabel, in: .center) idle.addView(idleValue, in: .center) @@ -220,39 +220,11 @@ extension CPU { let view: NSStackView = NSStackView(frame: NSRect(x: 10, y: CGFloat(num)*height, width: TabWidth - 20, height: height)) view.orientation = .horizontal view.distribution = .equalCentering - let viewLabel = labelField(string: label) - let viewValue = valueField(string: value) + let viewLabel = LabelField(string: label) + let viewValue = ValueField(string: value) view.addView(viewLabel, in: .center) view.addView(viewValue, in: .center) return view } - - func labelField(string: String) -> NSTextField { - let label: NSTextField = NSTextField(string: string) - - label.isEditable = false - label.isSelectable = false - label.isBezeled = false - label.textColor = .black - label.alignment = .center - label.font = NSFont.systemFont(ofSize: 12, weight: .regular) - label.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) - - return label - } - - func valueField(string: String) -> NSTextField { - let label: NSTextField = NSTextField(string: string) - - label.isEditable = false - label.isSelectable = false - label.isBezeled = false - label.textColor = .black - label.alignment = .center - label.font = NSFont.systemFont(ofSize: 13, weight: .regular) - label.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) - - return label - } } diff --git a/Stats/Modules/Memory/MemoryReader.swift b/Stats/Modules/Memory/MemoryReader.swift index 7603e66cce6..2f5d010b3e1 100644 --- a/Stats/Modules/Memory/MemoryReader.swift +++ b/Stats/Modules/Memory/MemoryReader.swift @@ -31,7 +31,7 @@ class MemoryReader: Reader { var count = UInt32(MemoryLayout.size / MemoryLayout.size) self.topProcess.launchPath = "/usr/bin/top" - self.topProcess.arguments = ["-s", "1", "-o", "mem", "-n", "5", "-stats", "pid,command,mem"] + self.topProcess.arguments = ["-s", "3", "-o", "mem", "-n", "5", "-stats", "pid,command,mem"] self.topProcess.standardOutput = pipe let kerr: kern_return_t = withUnsafeMutablePointer(to: &stats) { @@ -79,8 +79,10 @@ class MemoryReader: Reader { let arr = line.condenseWhitespace().split(separator: " ") let pid = Int(arr[0]) ?? 0 let command = String(arr[1]) - let usage = Double(arr[2].filter("01234567890.".contains))! * Double(1024 * 1024) - let process = TopProcess(pid: pid, command: command, usage: usage) + guard let usage = Double(arr[2].filter("01234567890.".contains)) else { + return + } + let process = TopProcess(pid: pid, command: command, usage: usage * Double(1024 * 1024)) processes.append(process) } } diff --git a/Stats/Modules/Memory/MemoryView.swift b/Stats/Modules/Memory/MemoryView.swift index ecf1ac20f28..69bd659eb04 100644 --- a/Stats/Modules/Memory/MemoryView.swift +++ b/Stats/Modules/Memory/MemoryView.swift @@ -121,24 +121,24 @@ extension Memory { let total: NSStackView = NSStackView(frame: NSRect(x: 10, y: stackHeight*2, width: TabWidth - 20, height: stackHeight)) total.orientation = .horizontal total.distribution = .equalCentering - let totalLabel = labelField(string: "Total") - let totalValue = valueField(string: "0 GB") + let totalLabel = LabelField(string: "Total") + let totalValue = ValueField(string: "0 GB") total.addView(totalLabel, in: .center) total.addView(totalValue, in: .center) let used: NSStackView = NSStackView(frame: NSRect(x: 10, y: stackHeight*1, width: TabWidth - 20, height: stackHeight)) used.orientation = .horizontal used.distribution = .equalCentering - let usedLabel = labelField(string: "Used") - let usedValue = valueField(string: "0 GB") + let usedLabel = LabelField(string: "Used") + let usedValue = ValueField(string: "0 GB") used.addView(usedLabel, in: .center) used.addView(usedValue, in: .center) let free: NSStackView = NSStackView(frame: NSRect(x: 10, y: 0, width: TabWidth - 20, height: stackHeight)) free.orientation = .horizontal free.distribution = .equalCentering - let freeLabel = labelField(string: "Free") - let freeValue = valueField(string: "0 GB") + let freeLabel = LabelField(string: "Free") + let freeValue = ValueField(string: "0 GB") free.addView(freeLabel, in: .center) free.addView(freeValue, in: .center) @@ -220,39 +220,11 @@ extension Memory { let view: NSStackView = NSStackView(frame: NSRect(x: 10, y: CGFloat(num)*height, width: TabWidth - 20, height: height)) view.orientation = .horizontal view.distribution = .equalCentering - let viewLabel = labelField(string: label) - let viewValue = valueField(string: value) + let viewLabel = LabelField(string: label) + let viewValue = ValueField(string: value) view.addView(viewLabel, in: .center) view.addView(viewValue, in: .center) return view } - - func labelField(string: String) -> NSTextField { - let label: NSTextField = NSTextField(string: string) - - label.isEditable = false - label.isSelectable = false - label.isBezeled = false - label.textColor = .black - label.alignment = .center - label.font = NSFont.systemFont(ofSize: 12, weight: .regular) - label.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) - - return label - } - - func valueField(string: String) -> NSTextField { - let label: NSTextField = NSTextField(string: string) - - label.isEditable = false - label.isSelectable = false - label.isBezeled = false - label.textColor = .black - label.alignment = .center - label.font = NSFont.systemFont(ofSize: 13, weight: .regular) - label.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) - - return label - } } diff --git a/Stats/Views/MainViewController.swift b/Stats/Views/MainViewController.swift index 713d06c6279..cce6e62dd07 100644 --- a/Stats/Views/MainViewController.swift +++ b/Stats/Views/MainViewController.swift @@ -57,6 +57,7 @@ class MainViewController: NSViewController { self.segmentsControl = NSSegmentedControl(labels: items, trackingMode: NSSegmentedControl.SwitchTracking.selectOne, target: self, action: #selector(switchTabs)) self.segmentsControl.setSelected(true, forSegment: 0) +// self.tabView.selectTabViewItem(at: 2) self.segmentsControl.segmentDistribution = .fillEqually let button = NSButton(frame: NSRect(x: 0, y: 0, width: 26, height: 20)) @@ -164,3 +165,32 @@ class MainViewController: NSViewController { } } } + + +func LabelField(string: String) -> NSTextField { + let label: NSTextField = NSTextField(string: string) + + label.isEditable = false + label.isSelectable = false + label.isBezeled = false + label.textColor = .black + label.alignment = .center + label.font = NSFont.systemFont(ofSize: 12, weight: .regular) + label.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) + + return label +} + +func ValueField(string: String) -> NSTextField { + let label: NSTextField = NSTextField(string: string) + + label.isEditable = false + label.isSelectable = false + label.isBezeled = false + label.textColor = .black + label.alignment = .center + label.font = NSFont.systemFont(ofSize: 13, weight: .regular) + label.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) + + return label +} diff --git a/Stats/Widgets/BatteryView.swift b/Stats/Widgets/BatteryWidget.swift similarity index 99% rename from Stats/Widgets/BatteryView.swift rename to Stats/Widgets/BatteryWidget.swift index 124d9e663cf..a1ccf77354f 100644 --- a/Stats/Widgets/BatteryView.swift +++ b/Stats/Widgets/BatteryWidget.swift @@ -8,7 +8,7 @@ import Cocoa -class BatteryView: NSView, Widget { +class BatteryWidget: NSView, Widget { var activeModule: Observable = Observable(false) var size: CGFloat = widgetSize.width var name: String = "" diff --git a/Stats/libs/Extensions.swift b/Stats/libs/Extensions.swift index 5d482afab2d..558e864b7f6 100755 --- a/Stats/libs/Extensions.swift +++ b/Stats/libs/Extensions.swift @@ -120,6 +120,39 @@ public struct Units { } } +extension Double { + + func secondsToHoursMinutesSeconds () -> (Int?, Int?, Int?) { + let hrs = self / 3600 + let mins = (self.truncatingRemainder(dividingBy: 3600)) / 60 + let seconds = (self.truncatingRemainder(dividingBy:3600)).truncatingRemainder(dividingBy:60) + return (Int(hrs) > 0 ? Int(hrs) : nil , Int(mins) > 0 ? Int(mins) : nil, Int(seconds) > 0 ? Int(seconds) : nil) + } + + func printSecondsToHoursMinutesSeconds () -> String { + let time = self.secondsToHoursMinutesSeconds() + + switch time { + case (nil, let x? , let y?): + return "\(x) min \(y) sec" + case (nil, let x?, nil): + return "\(x) min" + case (let x?, nil, nil): + return "\(x) hr" + case (nil, nil, let x?): + return "\(x) sec" + case (let x?, nil, let z?): + return "\(x) hr \(z) sec" + case (let x?, let y?, nil): + return "\(x) hr \(y) min" + case (let x?, let y?, let z?): + return "\(x) hr \(y) min \(z) sec" + default: + return "n/a" + } + } +} + extension String { func condenseWhitespace() -> String { let components = self.components(separatedBy: .whitespacesAndNewlines) From a29b9e3e87a13eb86fc272dd5facf6147ad901f4 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Thu, 5 Sep 2019 15:56:42 +0200 Subject: [PATCH 09/13] CPU hyperthreading mode disabled by default in bar chart widget --- Stats/Modules/CPU/CPU.swift | 2 +- Stats/Modules/CPU/CPUReader.swift | 2 +- Stats/Supporting Files/Info.plist | 2 +- Stats/Views/MainViewController.swift | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Stats/Modules/CPU/CPU.swift b/Stats/Modules/CPU/CPU.swift index fbe3f1981ef..cceec87bdce 100644 --- a/Stats/Modules/CPU/CPU.swift +++ b/Stats/Modules/CPU/CPU.swift @@ -30,7 +30,7 @@ class CPU: Module { init() { self.available = Observable(true) self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true) - self.hyperthreading = Observable(defaults.object(forKey: "\(name)_hyperthreading") != nil ? defaults.bool(forKey: "\(name)_hyperthreading") : true) + self.hyperthreading = Observable(defaults.object(forKey: "\(name)_hyperthreading") != nil ? defaults.bool(forKey: "\(name)_hyperthreading") : false) self.widgetType = defaults.object(forKey: "\(name)_widget") != nil ? defaults.float(forKey: "\(name)_widget") : Widgets.Mini if self.widgetType == Widgets.BarChart { diff --git a/Stats/Modules/CPU/CPUReader.swift b/Stats/Modules/CPU/CPUReader.swift index 185f928de54..6a20085100f 100644 --- a/Stats/Modules/CPU/CPUReader.swift +++ b/Stats/Modules/CPU/CPUReader.swift @@ -28,7 +28,7 @@ class CPUReader: Reader { public var available: Bool = true public var updateTimer: Timer! public var perCoreMode: Bool = false - public var hyperthreading: Bool = true + public var hyperthreading: Bool = false private var cpuInfo: processor_info_array_t! private var prevCpuInfo: processor_info_array_t? diff --git a/Stats/Supporting Files/Info.plist b/Stats/Supporting Files/Info.plist index 77007f0888f..713fbf7b883 100755 --- a/Stats/Supporting Files/Info.plist +++ b/Stats/Supporting Files/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.2.12 + 1.2.13 CFBundleVersion 1 LSApplicationCategoryType diff --git a/Stats/Views/MainViewController.swift b/Stats/Views/MainViewController.swift index cce6e62dd07..f40e6bc93ed 100644 --- a/Stats/Views/MainViewController.swift +++ b/Stats/Views/MainViewController.swift @@ -173,7 +173,7 @@ func LabelField(string: String) -> NSTextField { label.isEditable = false label.isSelectable = false label.isBezeled = false - label.textColor = .black + label.textColor = .darkGray label.alignment = .center label.font = NSFont.systemFont(ofSize: 12, weight: .regular) label.backgroundColor = NSColor(hexString: "#dddddd", alpha: 0) From 65abcf5eb8533a0679383fbe9921e3e365258ddb Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Thu, 5 Sep 2019 16:54:04 +0200 Subject: [PATCH 10/13] small refactoring; improved widgets draw algorithm --- Stats.xcodeproj/project.pbxproj | 24 +++-- Stats/AppDelegate.swift | 96 +------------------ Stats/MenuBar.swift | 37 +++---- Stats/Modules/Battery/Battery.swift | 27 +++--- Stats/Modules/Battery/BatteryView.swift | 6 +- Stats/Modules/CPU/CPU.swift | 1 - Stats/Modules/Disk/Disk.swift | 25 +++-- Stats/Modules/Network/Network.swift | 24 ++--- Stats/Views/AboutViewController.swift | 35 +++++++ ...roller.swift => PopupViewController.swift} | 6 +- Stats/Views/UpdatesViewController.swift | 77 +++++++++++++++ Stats/Widgets/Mini.swift | 1 + ...acAppUpdater.swift => MacAppUpdater.swift} | 0 13 files changed, 195 insertions(+), 164 deletions(-) create mode 100644 Stats/Views/AboutViewController.swift rename Stats/Views/{MainViewController.swift => PopupViewController.swift} (96%) create mode 100644 Stats/Views/UpdatesViewController.swift rename Stats/libs/{macAppUpdater.swift => MacAppUpdater.swift} (100%) diff --git a/Stats.xcodeproj/project.pbxproj b/Stats.xcodeproj/project.pbxproj index bfeed53d766..0e0182de0bf 100644 --- a/Stats.xcodeproj/project.pbxproj +++ b/Stats.xcodeproj/project.pbxproj @@ -13,7 +13,7 @@ 9A09C8A222B3D94D0018426F /* BatteryWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A09C8A122B3D94D0018426F /* BatteryWidget.swift */; }; 9A1410F9229E721100D29793 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1410F8229E721100D29793 /* AppDelegate.swift */; }; 9A141100229E721200D29793 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9A1410FE229E721200D29793 /* Main.storyboard */; }; - 9A426DB822C2B5EE00C064C4 /* macAppUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A426DB722C2B5EE00C064C4 /* macAppUpdater.swift */; }; + 9A426DB822C2B5EE00C064C4 /* MacAppUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A426DB722C2B5EE00C064C4 /* MacAppUpdater.swift */; }; 9A426DBE22C2BE0000C064C4 /* Updates.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9A426DBD22C2BE0000C064C4 /* Updates.storyboard */; }; 9A493CDF23202B620064570C /* MemoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A493CDE23202B620064570C /* MemoryView.swift */; }; 9A57A18522A1D26D0033E318 /* MenuBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A57A18422A1D26D0033E318 /* MenuBar.swift */; }; @@ -25,6 +25,8 @@ 9A5B1CBF229E78F0008B9D3C /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A5B1CBE229E78F0008B9D3C /* Observable.swift */; }; 9A5B1CC5229E7B40008B9D3C /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A5B1CC4229E7B40008B9D3C /* Extensions.swift */; }; 9A606B482321025C00642F51 /* BatteryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A606B472321025C00642F51 /* BatteryView.swift */; }; + 9A606B4A2321577400642F51 /* UpdatesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A606B492321577400642F51 /* UpdatesViewController.swift */; }; + 9A606B4C232157BA00642F51 /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A606B4B232157BA00642F51 /* AboutViewController.swift */; }; 9A6CFC0122A1C9F5001E782D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9A6CFC0022A1C9F5001E782D /* Assets.xcassets */; }; 9A74D59722B44498004FE1FA /* Mini.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A74D59622B44498004FE1FA /* Mini.swift */; }; 9A79B36A22D3BEE600BF1C3A /* Widget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A79B36922D3BEE600BF1C3A /* Widget.swift */; }; @@ -43,7 +45,7 @@ 9AF0F32522DA92C400026AE6 /* NetworkText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF0F32422DA92C400026AE6 /* NetworkText.swift */; }; 9AF0F32722DA92DD00026AE6 /* NetworkDotsText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF0F32622DA92DD00026AE6 /* NetworkDotsText.swift */; }; 9AF0F32922DA92E800026AE6 /* NetworkArrowsText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF0F32822DA92E800026AE6 /* NetworkArrowsText.swift */; }; - 9AF6F1FE231D732600B8E1E4 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF6F1FD231D732600B8E1E4 /* MainViewController.swift */; }; + 9AF6F1FE231D732600B8E1E4 /* PopupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF6F1FD231D732600B8E1E4 /* PopupViewController.swift */; }; 9AFFCB3B22B3FD0500B0E6D8 /* About.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9AFFCB3A22B3FD0500B0E6D8 /* About.storyboard */; }; /* End PBXBuildFile section */ @@ -74,7 +76,7 @@ 9A1410FF229E721200D29793 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 9A141101229E721200D29793 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9A141102229E721200D29793 /* Stats.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Stats.entitlements; sourceTree = ""; }; - 9A426DB722C2B5EE00C064C4 /* macAppUpdater.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = macAppUpdater.swift; sourceTree = ""; }; + 9A426DB722C2B5EE00C064C4 /* MacAppUpdater.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MacAppUpdater.swift; sourceTree = ""; }; 9A426DBD22C2BE0000C064C4 /* Updates.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Updates.storyboard; sourceTree = ""; }; 9A493CDE23202B620064570C /* MemoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemoryView.swift; sourceTree = ""; }; 9A57A18422A1D26D0033E318 /* MenuBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuBar.swift; sourceTree = ""; }; @@ -86,6 +88,8 @@ 9A5B1CBE229E78F0008B9D3C /* Observable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Observable.swift; sourceTree = ""; }; 9A5B1CC4229E7B40008B9D3C /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; 9A606B472321025C00642F51 /* BatteryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BatteryView.swift; sourceTree = ""; }; + 9A606B492321577400642F51 /* UpdatesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatesViewController.swift; sourceTree = ""; }; + 9A606B4B232157BA00642F51 /* AboutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutViewController.swift; sourceTree = ""; }; 9A6CFC0022A1C9F5001E782D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 9A74D59622B44498004FE1FA /* Mini.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mini.swift; sourceTree = ""; }; 9A79B36922D3BEE600BF1C3A /* Widget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Widget.swift; sourceTree = ""; }; @@ -106,7 +110,7 @@ 9AF0F32422DA92C400026AE6 /* NetworkText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkText.swift; sourceTree = ""; }; 9AF0F32622DA92DD00026AE6 /* NetworkDotsText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkDotsText.swift; sourceTree = ""; }; 9AF0F32822DA92E800026AE6 /* NetworkArrowsText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkArrowsText.swift; sourceTree = ""; }; - 9AF6F1FD231D732600B8E1E4 /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; + 9AF6F1FD231D732600B8E1E4 /* PopupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopupViewController.swift; sourceTree = ""; }; 9AFFCB3A22B3FD0500B0E6D8 /* About.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = About.storyboard; sourceTree = ""; }; B76EECB31DFC37E1EA558662 /* Pods_StatsLauncher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StatsLauncher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -206,7 +210,7 @@ children = ( 9A5B1CBE229E78F0008B9D3C /* Observable.swift */, 9A5B1CC4229E7B40008B9D3C /* Extensions.swift */, - 9A426DB722C2B5EE00C064C4 /* macAppUpdater.swift */, + 9A426DB722C2B5EE00C064C4 /* MacAppUpdater.swift */, 9A59AE55231EE02F007989D6 /* ChartMarker.swift */, ); path = libs; @@ -289,7 +293,9 @@ 9AF6F1FC231D72EC00B8E1E4 /* Views */ = { isa = PBXGroup; children = ( - 9AF6F1FD231D732600B8E1E4 /* MainViewController.swift */, + 9AF6F1FD231D732600B8E1E4 /* PopupViewController.swift */, + 9A606B492321577400642F51 /* UpdatesViewController.swift */, + 9A606B4B232157BA00642F51 /* AboutViewController.swift */, ); path = Views; sourceTree = ""; @@ -450,20 +456,22 @@ buildActionMask = 2147483647; files = ( 9A09C8A222B3D94D0018426F /* BatteryWidget.swift in Sources */, - 9A426DB822C2B5EE00C064C4 /* macAppUpdater.swift in Sources */, + 9A426DB822C2B5EE00C064C4 /* MacAppUpdater.swift in Sources */, 9A79B36E22D3BEF900BF1C3A /* Reader.swift in Sources */, + 9A606B4C232157BA00642F51 /* AboutViewController.swift in Sources */, 9A59AE54231ED1AC007989D6 /* CPUView.swift in Sources */, 9A7B8F6F22A2C57000DEB352 /* DiskReader.swift in Sources */, 9A7B8F6922A2C3A100DEB352 /* Memory.swift in Sources */, 9AF0F32522DA92C400026AE6 /* NetworkText.swift in Sources */, 9A7B8F5E22A2A57600DEB352 /* CPUReader.swift in Sources */, 9AF0F32322DA92B900026AE6 /* NetworkArrows.swift in Sources */, + 9A606B4A2321577400642F51 /* UpdatesViewController.swift in Sources */, 9AF0F31D22DA925000026AE6 /* LineChartWithValue.swift in Sources */, 9A09C89E22B3A7C90018426F /* Battery.swift in Sources */, 9A7B8F6D22A2C3D600DEB352 /* MemoryReader.swift in Sources */, 9A79B36C22D3BEF000BF1C3A /* Module.swift in Sources */, 9A57A18522A1D26D0033E318 /* MenuBar.swift in Sources */, - 9AF6F1FE231D732600B8E1E4 /* MainViewController.swift in Sources */, + 9AF6F1FE231D732600B8E1E4 /* PopupViewController.swift in Sources */, 9A57A19D22A1E3270033E318 /* CPU.swift in Sources */, 9A58D1B222C150D700405315 /* NetworkReader.swift in Sources */, 9A09C8A022B3A7E20018426F /* BatteryReader.swift in Sources */, diff --git a/Stats/AppDelegate.swift b/Stats/AppDelegate.swift index 495cdeca7e1..1eb47d14526 100755 --- a/Stats/AppDelegate.swift +++ b/Stats/AppDelegate.swift @@ -16,8 +16,8 @@ let popover = NSPopover() @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { - let defaults = UserDefaults.standard - var menuBarItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength) + private let defaults = UserDefaults.standard + private var menuBarItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength) func applicationDidFinishLaunching(_ aNotification: Notification) { guard let menuBarButton = self.menuBarItem.button else { @@ -87,95 +87,3 @@ class AppDelegate: NSObject, NSApplicationDelegate { popover.performClose(self) } } - -class AboutVC: NSViewController { - @IBOutlet weak var versionLabel: NSTextField! - - override func viewDidLoad() { - super.viewDidLoad() - self.view.wantsLayer = true - } - - @IBAction func openLink(_ sender: Any) { - NSWorkspace.shared.open(URL(string: "https://github.com/exelban/stats")!) - } - - @IBAction func exit(_ sender: Any) { - self.view.window?.close() - } - - override func awakeFromNib() { - if self.view.layer != nil { - self.view.window?.backgroundColor = .windowBackgroundColor - let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String - versionLabel.stringValue = "Version \(versionNumber)" - } - } -} - -class UpdatesVC: NSViewController { - @IBOutlet weak var mainView: NSStackView! - @IBOutlet weak var spinnerView: NSView! - @IBOutlet weak var noInternetView: NSView! - @IBOutlet weak var mainTextLabel: NSTextFieldCell! - @IBOutlet weak var currentVersionLabel: NSTextField! - @IBOutlet weak var latestVersionLabel: NSTextField! - @IBOutlet weak var downloadButton: NSButton! - @IBOutlet weak var spinner: NSProgressIndicator! - - var url: String? - - override func viewDidLoad() { - super.viewDidLoad() - self.view.wantsLayer = true - - self.spinner.startAnimation(self) - - updater.check() { result, error in - if error != nil && error as! String == "No internet connection" { - DispatchQueue.main.async(execute: { - self.spinnerView.isHidden = true - self.noInternetView.isHidden = false - }) - return - } - - guard error == nil, let version: version = result else { - print("Error: \(error ?? "check error")") - return - } - - DispatchQueue.main.async(execute: { - self.spinner.stopAnimation(self) - self.spinnerView.isHidden = true - self.mainView.isHidden = false - self.currentVersionLabel.stringValue = version.current - self.latestVersionLabel.stringValue = version.latest - self.url = version.url - - if !version.newest { - self.mainTextLabel.stringValue = "No new version available" - self.downloadButton.isEnabled = false - } - }) - } - } - - override func awakeFromNib() { - if self.view.layer != nil { - self.view.window?.backgroundColor = .windowBackgroundColor - } - } - - @IBAction func download(_ sender: Any) { - guard let urlString = self.url, let url = URL(string: urlString) else { - return - } - NSWorkspace.shared.open(url) - self.view.window?.close() - } - - @IBAction func exit(_ sender: Any) { - self.view.window?.close() - } -} diff --git a/Stats/MenuBar.swift b/Stats/MenuBar.swift index 0698e0f6bef..dc07c583e9d 100644 --- a/Stats/MenuBar.swift +++ b/Stats/MenuBar.swift @@ -10,9 +10,10 @@ import Cocoa import ServiceManagement class MenuBar { - let defaults = UserDefaults.standard - let menuBarItem: NSStatusItem - lazy var menuBarButton: NSButton = NSButton() + private let defaults = UserDefaults.standard + private let menuBarItem: NSStatusItem + private var menuBarButton: NSButton = NSButton() + private var view: NSView? = nil init(_ menuBarItem: NSStatusItem, menuBarButton: NSButton) { self.menuBarItem = menuBarItem @@ -24,7 +25,7 @@ class MenuBar { } } - func generateMenuBar() { + private func generateMenuBar() { buildModulesView() for module in modules.value { @@ -39,16 +40,14 @@ class MenuBar { } } - func buildModulesView() { - for subview in self.menuBarButton.subviews { - subview.removeFromSuperview() + private func buildModulesView() { + if self.view == nil { + self.view = NSView(frame: NSMakeRect(0, 0, widgetSize.width, widgetSize.height)) + self.menuBarButton.addSubview(self.view!) } + let view = self.view! - self.menuBarButton.image = NSImage(named:NSImage.Name("tray_icon")) - self.menuBarItem.length = widgetSize.width - var WIDTH = CGFloat(modules.value.count) * widgetSize.width - - WIDTH = 0 + var WIDTH: CGFloat = 0 for module in modules.value { if module.active.value && module.available.value { module.start() @@ -56,7 +55,10 @@ class MenuBar { } } - let view: NSView = NSView(frame: NSMakeRect(0, 0, WIDTH, widgetSize.height)) + self.menuBarButton.image = nil + for v in view.subviews { + v.removeFromSuperview() + } var x: CGFloat = 0 for module in modules.value { @@ -67,11 +69,12 @@ class MenuBar { } } - if view.subviews.count != 0 { - view.frame.size.width = WIDTH - self.menuBarButton.image = nil + if view.subviews.count == 0 { + self.menuBarButton.image = NSImage(named:NSImage.Name("tray_icon")) + self.menuBarItem.length = widgetSize.width + } else { self.menuBarItem.length = WIDTH - self.menuBarButton.addSubview(view) + view.frame.size.width = WIDTH } } } diff --git a/Stats/Modules/Battery/Battery.swift b/Stats/Modules/Battery/Battery.swift index e04aaeb03c6..a03208f3540 100644 --- a/Stats/Modules/Battery/Battery.swift +++ b/Stats/Modules/Battery/Battery.swift @@ -9,20 +9,21 @@ import Cocoa class Battery: Module { - let name: String = "Battery" - let shortName: String = "" - var view: NSView = NSView() - var menu: NSMenuItem = NSMenuItem() - var submenu: NSMenu = NSMenu() - var active: Observable - var available: Observable - var reader: Reader = BatteryReader() - var viewAvailable: Bool = true - var tabView: NSTabViewItem = NSTabViewItem() + public let name: String = "Battery" + public let shortName: String = "" + public var view: NSView = NSView() + public var menu: NSMenuItem = NSMenuItem() + public var active: Observable + public var available: Observable + public var reader: Reader = BatteryReader() + public var viewAvailable: Bool = true + public var tabView: NSTabViewItem = NSTabViewItem() - let defaults = UserDefaults.standard - var widgetType: WidgetType = Widgets.Mini - let percentageView: Observable + public var widgetType: WidgetType = Widgets.Mini + public let percentageView: Observable + + private let defaults = UserDefaults.standard + private var submenu: NSMenu = NSMenu() init() { self.available = Observable(self.reader.available) diff --git a/Stats/Modules/Battery/BatteryView.swift b/Stats/Modules/Battery/BatteryView.swift index 8037d97cb82..7b740ca3c39 100644 --- a/Stats/Modules/Battery/BatteryView.swift +++ b/Stats/Modules/Battery/BatteryView.swift @@ -29,7 +29,7 @@ extension Battery { level.orientation = .horizontal level.distribution = .equalCentering let levelLabel = LabelField(string: "Level") - let levelValue = ValueField(string: "0%") + let levelValue = ValueField(string: "0 %") level.addView(levelLabel, in: .center) level.addView(levelValue, in: .center) @@ -56,7 +56,7 @@ extension Battery { self.tabView.view?.addSubview(vertical) (self.reader as! BatteryReader).usage.subscribe(observer: self) { (value, _) in - levelValue.stringValue = "\(Int(value.capacity * 100))%" + levelValue.stringValue = "\(Int(value.capacity * 100)) %" sourceValue.stringValue = value.powerSource if value.powerSource == "Battery Power" { @@ -139,7 +139,7 @@ extension Battery { (self.reader as! BatteryReader).usage.subscribe(observer: self) { (value, _) in cyclesValue.stringValue = "\(value.cycles)" stateValue.stringValue = value.state - healthValue.stringValue = "\(value.health)%" + healthValue.stringValue = "\(value.health) %" } } diff --git a/Stats/Modules/CPU/CPU.swift b/Stats/Modules/CPU/CPU.swift index cceec87bdce..f440a2e32c3 100644 --- a/Stats/Modules/CPU/CPU.swift +++ b/Stats/Modules/CPU/CPU.swift @@ -21,7 +21,6 @@ class CPU: Module { public var tabView: NSTabViewItem = NSTabViewItem() public var viewAvailable: Bool = true public var widgetType: WidgetType - public var chart: LineChartView = LineChartView() private let defaults = UserDefaults.standard diff --git a/Stats/Modules/Disk/Disk.swift b/Stats/Modules/Disk/Disk.swift index adb0d9ff81e..42339f4ad30 100644 --- a/Stats/Modules/Disk/Disk.swift +++ b/Stats/Modules/Disk/Disk.swift @@ -9,22 +9,21 @@ import Cocoa class Disk: Module { - let name: String = "Disk" - let shortName: String = "SSD" - var view: NSView = NSView() - var menu: NSMenuItem = NSMenuItem() - var submenu: NSMenu = NSMenu() - let defaults = UserDefaults.standard - var widgetType: WidgetType + public let name: String = "Disk" + public let shortName: String = "SSD" + public var view: NSView = NSView() + public var menu: NSMenuItem = NSMenuItem() + public var widgetType: WidgetType - var active: Observable - var available: Observable - var viewAvailable: Bool = false - var tabView: NSTabViewItem = NSTabViewItem() + public var active: Observable + public var available: Observable + public var viewAvailable: Bool = false + public var tabView: NSTabViewItem = NSTabViewItem() - var reader: Reader = DiskReader() + public var reader: Reader = DiskReader() - @IBOutlet weak var value: NSTextField! + private var submenu: NSMenu = NSMenu() + private let defaults = UserDefaults.standard init() { self.available = Observable(true) diff --git a/Stats/Modules/Network/Network.swift b/Stats/Modules/Network/Network.swift index f42b04a184b..cc0e3dd5108 100644 --- a/Stats/Modules/Network/Network.swift +++ b/Stats/Modules/Network/Network.swift @@ -9,19 +9,19 @@ import Cocoa class Network: Module { - var name: String = "Network" - var shortName: String = "NET" - var view: NSView = NSView() - var menu: NSMenuItem = NSMenuItem() - var submenu: NSMenu = NSMenu() - var active: Observable - var available: Observable - var reader: Reader = NetworkReader() - var widgetType: WidgetType = 2.0 - var viewAvailable: Bool = false - var tabView: NSTabViewItem = NSTabViewItem() + public var name: String = "Network" + public var shortName: String = "NET" + public var view: NSView = NSView() + public var menu: NSMenuItem = NSMenuItem() + public var active: Observable + public var available: Observable + public var reader: Reader = NetworkReader() + public var widgetType: WidgetType = 2.0 + public var viewAvailable: Bool = false + public var tabView: NSTabViewItem = NSTabViewItem() - let defaults = UserDefaults.standard + private let defaults = UserDefaults.standard + private var submenu: NSMenu = NSMenu() init() { self.available = Observable(self.reader.available) diff --git a/Stats/Views/AboutViewController.swift b/Stats/Views/AboutViewController.swift new file mode 100644 index 00000000000..52c1320ae77 --- /dev/null +++ b/Stats/Views/AboutViewController.swift @@ -0,0 +1,35 @@ +// +// AboutViewController.swift +// Stats +// +// Created by Serhiy Mytrovtsiy on 05/09/2019. +// Copyright © 2019 Serhiy Mytrovtsiy. All rights reserved. +// + +import Cocoa +import Foundation + +class AboutVC: NSViewController { + @IBOutlet weak var versionLabel: NSTextField! + + override func viewDidLoad() { + super.viewDidLoad() + self.view.wantsLayer = true + } + + @IBAction func openLink(_ sender: Any) { + NSWorkspace.shared.open(URL(string: "https://github.com/exelban/stats")!) + } + + @IBAction func exit(_ sender: Any) { + self.view.window?.close() + } + + override func awakeFromNib() { + if self.view.layer != nil { + self.view.window?.backgroundColor = .windowBackgroundColor + let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String + versionLabel.stringValue = "Version \(versionNumber)" + } + } +} diff --git a/Stats/Views/MainViewController.swift b/Stats/Views/PopupViewController.swift similarity index 96% rename from Stats/Views/MainViewController.swift rename to Stats/Views/PopupViewController.swift index f40e6bc93ed..c385f409108 100644 --- a/Stats/Views/MainViewController.swift +++ b/Stats/Views/PopupViewController.swift @@ -40,10 +40,10 @@ class MainViewController: NSViewController { } func makeHeader() { - var items: [String] = [] + var list: [String] = [] for module in modules.value { if module.viewAvailable && module.available.value { - items.append(module.name) + list.append(module.name) let tab = module.tabView tab.label = module.name @@ -55,7 +55,7 @@ class MainViewController: NSViewController { } } - self.segmentsControl = NSSegmentedControl(labels: items, trackingMode: NSSegmentedControl.SwitchTracking.selectOne, target: self, action: #selector(switchTabs)) + self.segmentsControl = NSSegmentedControl(labels: list, trackingMode: NSSegmentedControl.SwitchTracking.selectOne, target: self, action: #selector(switchTabs)) self.segmentsControl.setSelected(true, forSegment: 0) // self.tabView.selectTabViewItem(at: 2) self.segmentsControl.segmentDistribution = .fillEqually diff --git a/Stats/Views/UpdatesViewController.swift b/Stats/Views/UpdatesViewController.swift new file mode 100644 index 00000000000..98a5a05680b --- /dev/null +++ b/Stats/Views/UpdatesViewController.swift @@ -0,0 +1,77 @@ +// +// UpdatesViewController.swift +// Stats +// +// Created by Serhiy Mytrovtsiy on 05/09/2019. +// Copyright © 2019 Serhiy Mytrovtsiy. All rights reserved. +// + +import Cocoa +import Foundation + +class UpdatesVC: NSViewController { + @IBOutlet weak var mainView: NSStackView! + @IBOutlet weak var spinnerView: NSView! + @IBOutlet weak var noInternetView: NSView! + @IBOutlet weak var mainTextLabel: NSTextFieldCell! + @IBOutlet weak var currentVersionLabel: NSTextField! + @IBOutlet weak var latestVersionLabel: NSTextField! + @IBOutlet weak var downloadButton: NSButton! + @IBOutlet weak var spinner: NSProgressIndicator! + + var url: String? + + override func viewDidLoad() { + super.viewDidLoad() + self.view.wantsLayer = true + + self.spinner.startAnimation(self) + + updater.check() { result, error in + if error != nil && error as! String == "No internet connection" { + DispatchQueue.main.async(execute: { + self.spinnerView.isHidden = true + self.noInternetView.isHidden = false + }) + return + } + + guard error == nil, let version: version = result else { + print("Error: \(error ?? "check error")") + return + } + + DispatchQueue.main.async(execute: { + self.spinner.stopAnimation(self) + self.spinnerView.isHidden = true + self.mainView.isHidden = false + self.currentVersionLabel.stringValue = version.current + self.latestVersionLabel.stringValue = version.latest + self.url = version.url + + if !version.newest { + self.mainTextLabel.stringValue = "No new version available" + self.downloadButton.isEnabled = false + } + }) + } + } + + override func awakeFromNib() { + if self.view.layer != nil { + self.view.window?.backgroundColor = .windowBackgroundColor + } + } + + @IBAction func download(_ sender: Any) { + guard let urlString = self.url, let url = URL(string: urlString) else { + return + } + NSWorkspace.shared.open(url) + self.view.window?.close() + } + + @IBAction func exit(_ sender: Any) { + self.view.window?.close() + } +} diff --git a/Stats/Widgets/Mini.swift b/Stats/Widgets/Mini.swift index 40408b380a6..56fb21e1b5b 100644 --- a/Stats/Widgets/Mini.swift +++ b/Stats/Widgets/Mini.swift @@ -106,5 +106,6 @@ class Mini: NSView, Widget { sender.state = sender.state == NSControl.StateValue.on ? NSControl.StateValue.off : NSControl.StateValue.on self.defaults.set(sender.state == NSControl.StateValue.on, forKey: "\(name)_color") self.color = sender.state == NSControl.StateValue.on + self.redraw() } } diff --git a/Stats/libs/macAppUpdater.swift b/Stats/libs/MacAppUpdater.swift similarity index 100% rename from Stats/libs/macAppUpdater.swift rename to Stats/libs/MacAppUpdater.swift From 923e295af1097459cef6f235f060557afcec819b Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Fri, 6 Sep 2019 21:38:14 +0200 Subject: [PATCH 11/13] v1.3.0 --- Stats/Supporting Files/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Stats/Supporting Files/Info.plist b/Stats/Supporting Files/Info.plist index 713fbf7b883..589d68b18d4 100755 --- a/Stats/Supporting Files/Info.plist +++ b/Stats/Supporting Files/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.2.13 + 1.3.0 CFBundleVersion 1 LSApplicationCategoryType From 4a896dd8d4326db9601ffeeb8cc76eca7ef85867 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Mon, 9 Sep 2019 17:57:18 +0200 Subject: [PATCH 12/13] moved from cocoapods to carthage --- .gitignore | 24 +- Cartfile | 2 + Cartfile.resolved | 2 + .../Charts/.github/ISSUE_TEMPLATE.md | 33 + .../Charts/.github/PULL_REQUEST_TEMPLATE.md | 13 + Carthage/Checkouts/Charts/.gitignore | 74 + Carthage/Checkouts/Charts/.travis.yml | 25 + .../Charts/Assets/feature_graphic.png | Bin 0 -> 28989 bytes .../Charts/Assets/feature_graphic.psd | Bin 0 -> 298724 bytes Carthage/Checkouts/Charts/CHANGELOG.md | 3553 +++++++++++++++++ Carthage/Checkouts/Charts/CONTRIBUTING.md | 49 + Carthage/Checkouts/Charts/Cartfile.private | 1 + Carthage/Checkouts/Charts/Cartfile.resolved | 1 + Carthage/Checkouts/Charts/Charts.podspec | 19 + .../Charts/Charts.xcodeproj/project.pbxproj | 1260 ++++++ .../xcshareddata/xcschemes/Charts.xcscheme | 88 + .../xcschemes/ChartsTests.xcscheme | 89 + .../contents.xcworkspacedata | 13 + .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../ChartsDemo-iOS.xcodeproj/project.pbxproj | 1119 ++++++ .../ChartsDemo-iOS/Objective-C/AppDelegate.h | 20 + .../ChartsDemo-iOS/Objective-C/AppDelegate.m | 56 + .../Components/BalloonMarker.swift | 207 + .../Components/RadarMarkerView.swift | 30 + .../Objective-C/Components/XYMarkerView.swift | 29 + .../Objective-C/DemoBaseViewController.h | 34 + .../Objective-C/DemoBaseViewController.m | 329 ++ .../Objective-C/DemoListViewController.h | 18 + .../Objective-C/DemoListViewController.m | 227 ++ .../Demos/AnotherBarChartViewController.h | 18 + .../Demos/AnotherBarChartViewController.m | 149 + .../Demos/BarChartViewController.h | 18 + .../Demos/BarChartViewController.m | 200 + .../Demos/BubbleChartViewController.h | 18 + .../Demos/BubbleChartViewController.m | 173 + .../Demos/CandleStickChartViewController.h | 18 + .../Demos/CandleStickChartViewController.m | 174 + .../Demos/ColoredLineChartViewController.h | 18 + .../Demos/ColoredLineChartViewController.m | 114 + .../Demos/CombinedChartViewController.h | 18 + .../Demos/CombinedChartViewController.m | 324 ++ .../Demos/CubicLineChartViewController.h | 18 + .../Demos/CubicLineChartViewController.m | 238 ++ .../Demos/HalfPieChartViewController.h | 18 + .../Demos/HalfPieChartViewController.m | 202 + .../Demos/HorizontalBarChartViewController.h | 18 + .../Demos/HorizontalBarChartViewController.m | 178 + .../Demos/LineChart1ViewController.h | 18 + .../Demos/LineChart1ViewController.m | 279 ++ .../Demos/LineChart2ViewController.h | 18 + .../Demos/LineChart2ViewController.m | 296 ++ .../Demos/LineChartFilledViewController.h | 18 + .../Demos/LineChartFilledViewController.m | 178 + .../Demos/LineChartTimeViewController.h | 18 + .../Demos/LineChartTimeViewController.m | 244 ++ .../Demos/MultipleBarChartViewController.h | 18 + .../Demos/MultipleBarChartViewController.m | 241 ++ .../Demos/MultipleLinesChartViewController.h | 18 + .../Demos/MultipleLinesChartViewController.m | 206 + .../NegativeStackedBarChartViewController.h | 18 + .../NegativeStackedBarChartViewController.m | 195 + .../Demos/PieChartViewController.h | 18 + .../Demos/PieChartViewController.m | 217 + .../Demos/PiePolylineChartViewController.h | 13 + .../Demos/PiePolylineChartViewController.m | 205 + .../PositiveNegativeBarChartViewController.h | 18 + .../PositiveNegativeBarChartViewController.m | 194 + .../Demos/RadarChartViewController.h | 18 + .../Demos/RadarChartViewController.m | 274 ++ .../Demos/ScatterChartViewController.h | 18 + .../Demos/ScatterChartViewController.m | 167 + .../Demos/SinusBarChartViewController.h | 18 + .../Demos/SinusBarChartViewController.m | 166 + .../Demos/StackedBarChartViewController.h | 18 + .../Demos/StackedBarChartViewController.m | 180 + .../Formatters/DateValueFormatter.h | 17 + .../Formatters/DateValueFormatter.m | 39 + .../Formatters/DayAxisValueFormatter.h | 14 + .../Formatters/DayAxisValueFormatter.m | 166 + .../Formatters/IntAxisValueFormatter.h | 12 + .../Formatters/IntAxisValueFormatter.m | 19 + .../Formatters/LargeValueFormatter.swift | 68 + .../AppIcon.appiconset/Contents.json | 60 + .../AppIcon.appiconset/Icon-29@2x.png | Bin 0 -> 5677 bytes .../AppIcon.appiconset/Icon-29@3x.png | Bin 0 -> 10210 bytes .../AppIcon.appiconset/Icon-40@2x.png | Bin 0 -> 9266 bytes .../AppIcon.appiconset/Icon-40@3x.png | Bin 0 -> 14343 bytes .../AppIcon.appiconset/Icon-60@2x.png | Bin 0 -> 14343 bytes .../AppIcon.appiconset/Icon-60@3x.png | Bin 0 -> 27502 bytes .../AppIcon.appiconset/iTunesArtwork@2x.png | Bin 0 -> 263612 bytes .../Resources/Images.xcassets/Contents.json | 6 + .../icon.imageset/Contents.json | 23 + .../Images.xcassets/icon.imageset/star-1.png | Bin 0 -> 1221 bytes .../Images.xcassets/icon.imageset/star-2.png | Bin 0 -> 1221 bytes .../Images.xcassets/icon.imageset/star.png | Bin 0 -> 1221 bytes .../Resources/Launch Screen.storyboard | 52 + .../Resources/markers/radar_marker@3x.png | Bin 0 -> 9753 bytes .../ChartsDemo-Bridging-Header.h | 4 + .../Supporting Files/Info.plist | 42 + .../ChartsDemo-iOS/Supporting Files/main.m | 19 + .../ChartsDemo-iOS/Swift/AppDelegate.swift | 54 + .../Swift/Components/BalloonMarker.swift | 206 + .../Swift/Components/RadarMarkerView.swift | 27 + .../Swift/Components/XYMarkerView.swift | 32 + .../Swift/DemoBaseViewController.swift | 364 ++ .../Swift/DemoListViewController.swift | 129 + .../Demos/AnotherBarChartViewController.swift | 100 + .../Swift/Demos/BarChartViewController.swift | 152 + .../Demos/BubbleChartViewController.swift | 127 + .../CandleStickChartViewController.swift | 129 + .../ColoredLineChartViewController.swift | 77 + .../Demos/CombinedChartViewController.swift | 233 ++ .../Demos/CubicLineChartViewController.swift | 155 + .../Demos/HalfPieChartViewController.swift | 142 + .../HorizontalBarChartViewController.swift | 124 + .../Demos/LineChart1ViewController.swift | 187 + .../Demos/LineChart2ViewController.swift | 200 + .../Demos/LineChartFilledViewController.swift | 117 + .../Demos/LineChartTimeViewController.swift | 161 + .../MultipleBarChartViewController.swift | 154 + .../MultipleLinesChartViewController.swift | 138 + ...egativeStackedBarChartViewController.swift | 132 + .../Swift/Demos/PieChartViewController.swift | 153 + .../PiePolylineChartViewController.swift | 145 + ...sitiveNegativeBarChartViewController.swift | 120 + .../Demos/RadarChartViewController.swift | 203 + .../Demos/ScatterChartViewController.swift | 124 + .../Demos/SinusBarChartViewController.swift | 108 + .../Demos/StackedBarChartViewController.swift | 125 + .../Swift/Formatters/DateValueFormatter.swift | 23 + .../Formatters/DayAxisValueFormatter.swift | 109 + .../Formatters/IntAxisValueFormatter.swift | 16 + .../Formatters/LargeValueFormatter.swift | 58 + .../XIBs/DemoListViewController.xib | 42 + .../Demos/AnotherBarChartViewController.xib | 101 + .../XIBs/Demos/BarChartViewController.xib | 101 + .../XIBs/Demos/BubbleChartViewController.xib | 101 + .../Demos/CandleStickChartViewController.xib | 101 + .../Demos/ColoredLineChartViewController.xib | 66 + .../Demos/CombinedChartViewController.xib | 57 + .../Demos/CubicLineChartViewController.xib | 101 + .../XIBs/Demos/HalfPieChartViewController.xib | 57 + .../HorizontalBarChartViewController.xib | 101 + .../XIBs/Demos/LineChart1ViewController.xib | 101 + .../XIBs/Demos/LineChart2ViewController.xib | 101 + .../Demos/LineChartFilledViewController.xib | 88 + .../Demos/LineChartTimeViewController.xib | 79 + .../Demos/MultipleBarChartViewController.xib | 100 + .../MultipleLinesChartViewController.xib | 101 + .../NegativeStackedBarChartViewController.xib | 57 + .../XIBs/Demos/PieChartViewController.xib | 101 + .../Demos/PiePolylineChartViewController.xib | 115 + ...PositiveNegativeBarChartViewController.xib | 57 + .../XIBs/Demos/RadarChartViewController.xib | 67 + .../XIBs/Demos/RealmDemosViewController.xib | 49 + .../XIBs/Demos/ScatterChartViewController.xib | 101 + .../Demos/SinusBarChartViewController.xib | 79 + .../Demos/StackedBarChartViewController.xib | 101 + .../ChartsDemo-iOS/XIBs/RadarMarkerView.xib | 53 + .../project.pbxproj | 428 ++ .../ChartsDemo-macOS/AppDelegate.swift | 7 + .../AppIcon.appiconset/Contents.json | 58 + .../Base.lproj/Main.storyboard | 822 ++++ .../Demos/BarDemoViewController.swift | 76 + .../Demos/LineDemoViewController.swift | 49 + .../Demos/PieDemoViewController.swift | 54 + .../Demos/RadarDemoViewController.swift | 47 + .../ChartsDemo-macOS/Info.plist | 32 + .../PlaygroundChart.playground/Contents.o | Bin 0 -> 1060 bytes .../BarChart.xcplaygroundpage/Contents.swift | 63 + .../Contents.swift | 82 + .../Contents.swift | 96 + .../Contents.swift | 150 + .../Contents.swift | 102 + .../LineChart.xcplaygroundpage/Contents.swift | 157 + .../Menu.xcplaygroundpage/Contents.swift | 40 + .../Resources/feature_graphic.png | Bin 0 -> 28989 bytes .../PieChart.xcplaygroundpage/Contents.swift | 57 + .../Contents.swift | 111 + .../Contents.swift | 104 + .../Contents.swift | 116 + .../contents.xcplayground | 16 + Carthage/Checkouts/Charts/Gemfile | 6 + Carthage/Checkouts/Charts/Gemfile.lock | 107 + Carthage/Checkouts/Charts/LICENSE | 202 + Carthage/Checkouts/Charts/Package.swift | 15 + Carthage/Checkouts/Charts/README.md | 213 + Carthage/Checkouts/Charts/Rakefile | 182 + .../Source/Charts/Animation/Animator.swift | 280 ++ .../Animation/ChartAnimationEasing.swift | 394 ++ .../Source/Charts/Charts/BarChartView.swift | 186 + .../Charts/Charts/BarLineChartViewBase.swift | 1958 +++++++++ .../Charts/Charts/BubbleChartView.swift | 27 + .../Charts/Charts/CandleStickChartView.swift | 34 + .../Source/Charts/Charts/ChartViewBase.swift | 1034 +++++ .../Charts/Charts/CombinedChartView.swift | 246 ++ .../Charts/HorizontalBarChartView.swift | 270 ++ .../Source/Charts/Charts/LineChartView.swift | 28 + .../Source/Charts/Charts/PieChartView.swift | 599 +++ .../Charts/Charts/PieRadarChartViewBase.swift | 837 ++++ .../Source/Charts/Charts/RadarChartView.swift | 220 + .../Charts/Charts/ScatterChartView.swift | 31 + .../Source/Charts/Components/AxisBase.swift | 359 ++ .../Charts/Components/ChartLimitLine.swift | 74 + .../Charts/Components/ComponentBase.swift | 37 + .../Charts/Components/Description.swift | 46 + .../Source/Charts/Components/IMarker.swift | 39 + .../Source/Charts/Components/Legend.swift | 420 ++ .../Charts/Components/LegendEntry.swift | 88 + .../Charts/Components/MarkerImage.swift | 106 + .../Source/Charts/Components/MarkerView.swift | 95 + .../Source/Charts/Components/XAxis.swift | 75 + .../Source/Charts/Components/YAxis.swift | 198 + .../Implementations/ChartBaseDataSet.swift | 435 ++ .../Standard/BarChartData.swift | 107 + .../Standard/BarChartDataEntry.swift | 230 ++ .../Standard/BarChartDataSet.swift | 167 + .../BarLineScatterCandleBubbleChartData.swift | 25 + ...rLineScatterCandleBubbleChartDataSet.swift | 38 + .../Standard/BubbleChartData.swift | 32 + .../Standard/BubbleChartDataEntry.swift | 79 + .../Standard/BubbleChartDataSet.swift | 58 + .../Standard/CandleChartData.swift | 25 + .../Standard/CandleChartDataEntry.swift | 98 + .../Standard/CandleChartDataSet.swift | 136 + .../Implementations/Standard/ChartData.swift | 612 +++ .../Standard/ChartDataEntry.swift | 110 + .../Standard/ChartDataEntryBase.swift | 96 + .../Standard/ChartDataSet.swift | 576 +++ .../Standard/CombinedChartData.swift | 301 ++ .../Standard/LineChartData.swift | 26 + .../Standard/LineChartDataSet.swift | 173 + .../Standard/LineRadarChartDataSet.swift | 85 + .../LineScatterCandleRadarChartDataSet.swift | 51 + .../Standard/PieChartData.swift | 124 + .../Standard/PieChartDataEntry.swift | 119 + .../Standard/PieChartDataSet.swift | 135 + .../Standard/RadarChartData.swift | 46 + .../Standard/RadarChartDataEntry.swift | 54 + .../Standard/RadarChartDataSet.swift | 59 + .../Standard/ScatterChartData.swift | 34 + .../Standard/ScatterChartDataSet.swift | 78 + .../Data/Interfaces/IBarChartDataSet.swift | 42 + ...rLineScatterCandleBubbleChartDataSet.swift | 26 + .../Data/Interfaces/IBubbleChartDataSet.swift | 27 + .../Data/Interfaces/ICandleChartDataSet.swift | 66 + .../Data/Interfaces/IChartDataSet.swift | 270 ++ .../Data/Interfaces/ILineChartDataSet.swift | 80 + .../Interfaces/ILineRadarChartDataSet.swift | 45 + .../ILineScatterCandleRadarChartDataSet.swift | 36 + .../Data/Interfaces/IPieChartDataSet.swift | 64 + .../Data/Interfaces/IRadarChartDataSet.swift | 40 + .../Interfaces/IScatterChartDataSet.swift | 36 + .../Charts/Filters/DataApproximator+N.swift | 152 + .../Charts/Filters/DataApproximator.swift | 115 + .../DefaultAxisValueFormatter.swift | 100 + .../Formatters/DefaultFillFormatter.swift | 58 + .../Formatters/DefaultValueFormatter.swift | 103 + .../Formatters/IAxisValueFormatter.swift | 30 + .../Charts/Formatters/IFillFormatter.swift | 21 + .../Charts/Formatters/IValueFormatter.swift | 36 + .../Formatters/IndexAxisValueFormatter.swift | 59 + .../Charts/Highlight/BarHighlighter.swift | 108 + .../Charts/Highlight/ChartHighlighter.swift | 180 + .../Highlight/CombinedHighlighter.swift | 70 + .../Source/Charts/Highlight/Highlight.swift | 203 + .../Highlight/HorizontalBarHighlighter.swift | 63 + .../Charts/Highlight/IHighlighter.swift | 23 + .../Charts/Highlight/PieHighlighter.swift | 27 + .../Highlight/PieRadarHighlighter.swift | 61 + .../Charts/Highlight/RadarHighlighter.swift | 78 + .../Source/Charts/Highlight/Range.swift | 52 + .../Interfaces/BarChartDataProvider.swift | 23 + ...ScatterCandleBubbleChartDataProvider.swift | 23 + .../Interfaces/BubbleChartDataProvider.swift | 19 + .../Interfaces/CandleChartDataProvider.swift | 19 + .../Charts/Interfaces/ChartDataProvider.swift | 39 + .../CombinedChartDataProvider.swift | 19 + .../Interfaces/LineChartDataProvider.swift | 21 + .../Interfaces/ScatterChartDataProvider.swift | 19 + .../Charts/Jobs/AnimatedMoveViewJob.swift | 33 + .../Charts/Jobs/AnimatedViewPortJob.swift | 126 + .../Charts/Jobs/AnimatedZoomViewJob.swift | 96 + .../Source/Charts/Jobs/MoveViewJob.swift | 34 + .../Source/Charts/Jobs/ViewPortJob.swift | 46 + .../Source/Charts/Jobs/ZoomViewJob.swift | 71 + .../Charts/Renderers/AxisRendererBase.swift | 218 + .../Charts/Renderers/BarChartRenderer.swift | 893 +++++ .../BarLineScatterCandleBubbleRenderer.swift | 119 + .../Renderers/BubbleChartRenderer.swift | 359 ++ .../Renderers/CandleStickChartRenderer.swift | 420 ++ .../Renderers/ChartDataRendererBase.swift | 94 + .../Renderers/CombinedChartRenderer.swift | 209 + .../HorizontalBarChartRenderer.swift | 624 +++ .../Charts/Renderers/LegendRenderer.swift | 575 +++ .../Charts/Renderers/LineChartRenderer.swift | 781 ++++ .../Charts/Renderers/LineRadarRenderer.swift | 54 + .../LineScatterCandleRadarRenderer.swift | 49 + .../Charts/Renderers/PieChartRenderer.swift | 929 +++++ .../Charts/Renderers/RadarChartRenderer.swift | 475 +++ .../Source/Charts/Renderers/Renderer.swift | 26 + .../Scatter/ChevronDownShapeRenderer.swift | 36 + .../Scatter/ChevronUpShapeRenderer.swift | 36 + .../Scatter/CircleShapeRenderer.swift | 63 + .../Scatter/CrossShapeRenderer.swift | 36 + .../Renderers/Scatter/IShapeRenderer.swift | 32 + .../Scatter/SquareShapeRenderer.swift | 63 + .../Scatter/TriangleShapeRenderer.swift | 66 + .../Renderers/Scatter/XShapeRenderer.swift | 36 + .../Renderers/ScatterChartRenderer.swift | 249 ++ .../Charts/Renderers/XAxisRenderer.swift | 440 ++ .../XAxisRendererHorizontalBarChart.swift | 356 ++ .../Renderers/XAxisRendererRadarChart.swift | 91 + .../Charts/Renderers/YAxisRenderer.swift | 386 ++ .../YAxisRendererHorizontalBarChart.swift | 363 ++ .../Renderers/YAxisRendererRadarChart.swift | 273 ++ .../Charts/Utils/ChartColorTemplates.swift | 198 + .../Source/Charts/Utils/ChartUtils.swift | 296 ++ .../Charts/Source/Charts/Utils/Fill.swift | 323 ++ .../Charts/Utils/Platform+Accessibility.swift | 197 + .../Charts/Source/Charts/Utils/Platform.swift | 629 +++ .../Source/Charts/Utils/Transformer.swift | 170 + .../Utils/TransformerHorizontalBarChart.swift | 32 + .../Source/Charts/Utils/ViewPortHandler.swift | 553 +++ .../Charts/Source/Supporting Files/Charts.h | 28 + .../Charts/Source/Supporting Files/Info.plist | 26 + .../Charts/Tests/Charts/BarChartTests.swift | 406 ++ .../Charts/Tests/Charts/ChartUtilsTests.swift | 75 + .../Tests/Charts/CombinedChartTests.swift | 104 + .../Charts/Tests/Charts/EquatableTests.swift | 45 + .../Charts/HorizontalBarChartTests.swift | 147 + .../Charts/Tests/Charts/LineChartTests.swift | 81 + .../Charts/Tests/Charts/PieChartTests.swift | 73 + .../Charts/Tests/Charts/Snapshot.swift | 29 + .../testDefaultValues_iOS_375_0_667_0@2x.png | Bin 0 -> 54015 bytes ...estDefaultValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 20269 bytes .../testDrawIcons_iOS_375_0_667_0@2x.png | Bin 0 -> 95793 bytes .../testDrawIcons_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 54018 bytes ...HorizontalGridlines_iOS_375_0_667_0@2x.png | Bin 0 -> 52236 bytes ...izontalGridlines_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 19228 bytes .../testHideLeftAxis_iOS_375_0_667_0@2x.png | Bin 0 -> 53129 bytes ...testHideLeftAxis_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 19042 bytes .../testHideRightAxis_iOS_375_0_667_0@2x.png | Bin 0 -> 51866 bytes ...estHideRightAxis_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 19315 bytes ...deVerticalGridlines_iOS_375_0_667_0@2x.png | Bin 0 -> 48085 bytes ...erticalGridlines_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 18036 bytes .../testHidesValues_iOS_375_0_667_0@2x.png | Bin 0 -> 45823 bytes .../testHidesValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 17211 bytes ...sWithNegativeValues_iOS_375_0_667_0@2x.png | Bin 0 -> 61211 bytes ...thNegativeValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 22451 bytes ...sWithPositiveValues_iOS_375_0_667_0@2x.png | Bin 0 -> 61498 bytes ...thPositiveValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 22250 bytes ...estInvertedLeftAxis_iOS_375_0_667_0@2x.png | Bin 0 -> 57255 bytes ...InvertedLeftAxis_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 21831 bytes ...sWithNegativeValues_iOS_375_0_667_0@2x.png | Bin 0 -> 61215 bytes ...thNegativeValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 22531 bytes ...sWithPositiveValues_iOS_375_0_667_0@2x.png | Bin 0 -> 61251 bytes ...thPositiveValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 22142 bytes ...stInvertedRightAxis_iOS_375_0_667_0@2x.png | Bin 0 -> 57280 bytes ...nvertedRightAxis_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 21997 bytes ...hCustomAxisMaximum2_iOS_375_0_667_0@2x.png | Bin 0 -> 44213 bytes ...stomAxisMaximum2_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 13862 bytes ...ndCustomAxisMaximum_iOS_375_0_667_0@2x.png | Bin 0 -> 61307 bytes ...ustomAxisMaximum_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 20520 bytes ...thCustomAxisMaximum_iOS_375_0_667_0@2x.png | Bin 0 -> 63390 bytes ...ustomAxisMaximum_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 22955 bytes ...hCustomAxisMinimum2_iOS_375_0_667_0@2x.png | Bin 0 -> 47019 bytes ...stomAxisMinimum2_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 13758 bytes ...thCustomAxisMinimum_iOS_375_0_667_0@2x.png | Bin 0 -> 60865 bytes ...ustomAxisMinimum_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 21059 bytes .../testNegativeValues_iOS_375_0_667_0@2x.png | Bin 0 -> 59946 bytes ...stNegativeValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 21403 bytes ...tDrawValueAboveBars_iOS_375_0_667_0@2x.png | Bin 0 -> 59661 bytes ...awValueAboveBars_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 21863 bytes ...hCustomAxisMaximum2_iOS_375_0_667_0@2x.png | Bin 0 -> 41492 bytes ...stomAxisMaximum2_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 15705 bytes ...ndCustomAxisMaximum_iOS_375_0_667_0@2x.png | Bin 0 -> 60733 bytes ...ustomAxisMaximum_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 21650 bytes ...thCustomAxisMaximum_iOS_375_0_667_0@2x.png | Bin 0 -> 62577 bytes ...ustomAxisMaximum_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 21698 bytes ...hCustomAxisMinimum2_iOS_375_0_667_0@2x.png | Bin 0 -> 48017 bytes ...stomAxisMinimum2_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 15779 bytes ...thCustomAxisMinimum_iOS_375_0_667_0@2x.png | Bin 0 -> 60003 bytes ...ustomAxisMinimum_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 20098 bytes .../testPositiveValues_iOS_375_0_667_0@2x.png | Bin 0 -> 60220 bytes ...stPositiveValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 21010 bytes ...stStackedDrawValues_iOS_375_0_667_0@2x.png | Bin 0 -> 56868 bytes ...tackedDrawValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 19622 bytes ...DrawValuesAboveBars_iOS_375_0_667_0@2x.png | Bin 0 -> 56977 bytes ...wValuesAboveBars_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 19760 bytes ...tackedNotDrawValues_iOS_375_0_667_0@2x.png | Bin 0 -> 46169 bytes ...kedNotDrawValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 14969 bytes .../testZeroValues_iOS_375_0_667_0@2x.png | Bin 0 -> 37832 bytes .../testZeroValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 12798 bytes ...RightAxisDependency_iOS_375_0_667_0@2x.png | Bin 0 -> 101888 bytes ...htAxisDependency_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 37249 bytes ...faultAxisDependency_iOS_375_0_667_0@2x.png | Bin 0 -> 101888 bytes ...ltAxisDependency_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 37249 bytes ...RightAxisDependency_iOS_375_0_667_0@2x.png | Bin 0 -> 100255 bytes ...htAxisDependency_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 37731 bytes .../testDefaultValues_iOS_375_0_667_0@2x.png | Bin 0 -> 48324 bytes ...estDefaultValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 18719 bytes .../testHidesValues_iOS_375_0_667_0@2x.png | Bin 0 -> 39468 bytes .../testHidesValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 15425 bytes ...tDrawValueAboveBars_iOS_375_0_667_0@2x.png | Bin 0 -> 53394 bytes ...awValueAboveBars_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 20294 bytes ...stStackedDrawValues_iOS_375_0_667_0@2x.png | Bin 0 -> 51268 bytes ...tackedDrawValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 19184 bytes ...DrawValuesAboveBars_iOS_375_0_667_0@2x.png | Bin 0 -> 51746 bytes ...wValuesAboveBars_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 19689 bytes ...tackedNotDrawValues_iOS_375_0_667_0@2x.png | Bin 0 -> 38978 bytes ...kedNotDrawValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 14298 bytes .../testDefaultValues_iOS_375_0_667_0@2x.png | Bin 0 -> 116445 bytes ...estDefaultValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 44550 bytes ...oesntDrawCircleHole_iOS_375_0_667_0@2x.png | Bin 0 -> 109302 bytes ...ntDrawCircleHole_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 41527 bytes ...stDoesntDrawCircles_iOS_375_0_667_0@2x.png | Bin 0 -> 103159 bytes ...oesntDrawCircles_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 37954 bytes .../testDrawIcons_iOS_375_0_667_0@2x.png | Bin 0 -> 150694 bytes .../testDrawIcons_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 72793 bytes .../testHidesValues_iOS_375_0_667_0@2x.png | Bin 0 -> 109516 bytes .../testHidesValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 41788 bytes .../testIsCubic_iOS_375_0_667_0@2x.png | Bin 0 -> 118328 bytes .../testIsCubic_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 45341 bytes .../testDefaultValues_iOS_375_0_667_0@2x.png | Bin 0 -> 56066 bytes ...estDefaultValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 23067 bytes .../testDrawIcons_iOS_375_0_667_0@2x.png | Bin 0 -> 65951 bytes .../testDrawIcons_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 31035 bytes ...testHideCenterLabel_iOS_375_0_667_0@2x.png | Bin 0 -> 53100 bytes ...tHideCenterLabel_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 21555 bytes .../testHidesValues_iOS_375_0_667_0@2x.png | Bin 0 -> 48642 bytes .../testHidesValues_tvOS_1920_0_1080_0@1x.png | Bin 0 -> 19959 bytes .../Charts/Tests/Supporting Files/Info.plist | 24 + .../Media.xcassets/Contents.json | 6 + .../icon.imageset/Contents.json | 23 + .../Media.xcassets/icon.imageset/star-1.png | Bin 0 -> 1221 bytes .../Media.xcassets/icon.imageset/star-2.png | Bin 0 -> 1221 bytes .../Media.xcassets/icon.imageset/star.png | Bin 0 -> 1221 bytes .../Charts/scripts/build-dependencies.sh | 26 + .../scripts/copy-carthage-frameworks.sh | 24 + .../Checkouts/LaunchAtLogin/.editorconfig | 8 + .../Checkouts/LaunchAtLogin/.gitattributes | 1 + Carthage/Checkouts/LaunchAtLogin/.gitignore | 2 + .../LaunchAtLogin/LaunchAtLogin.podspec | 14 + .../LaunchAtLogin.xcodeproj/project.pbxproj | 494 +++ .../xcschemes/LaunchAtLogin.xcscheme | 80 + .../xcschemes/LaunchAtLoginHelper.xcscheme | 91 + .../LaunchAtLogin/LaunchAtLogin/Info.plist | 22 + .../LaunchAtLogin/LaunchAtLogin.h | 4 + .../LaunchAtLogin/LaunchAtLogin.swift | 19 + .../LaunchAtLogin/copy-helper.sh | 22 + .../LaunchAtLoginHelper/Info.plist | 28 + .../LaunchAtLoginHelper.entitlements | 8 + .../LaunchAtLoginHelper/main.swift | 25 + .../Checkouts/LaunchAtLogin/before-after.md | 21 + Carthage/Checkouts/LaunchAtLogin/license | 9 + Carthage/Checkouts/LaunchAtLogin/readme.md | 86 + Makefile | 3 +- Podfile | 9 - Podfile.lock | 22 - Stats.xcodeproj/project.pbxproj | 86 +- Stats.xcworkspace/contents.xcworkspacedata | 10 - 462 files changed, 50415 insertions(+), 117 deletions(-) create mode 100644 Cartfile create mode 100644 Cartfile.resolved create mode 100644 Carthage/Checkouts/Charts/.github/ISSUE_TEMPLATE.md create mode 100644 Carthage/Checkouts/Charts/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 Carthage/Checkouts/Charts/.gitignore create mode 100644 Carthage/Checkouts/Charts/.travis.yml create mode 100644 Carthage/Checkouts/Charts/Assets/feature_graphic.png create mode 100644 Carthage/Checkouts/Charts/Assets/feature_graphic.psd create mode 100644 Carthage/Checkouts/Charts/CHANGELOG.md create mode 100644 Carthage/Checkouts/Charts/CONTRIBUTING.md create mode 100644 Carthage/Checkouts/Charts/Cartfile.private create mode 100644 Carthage/Checkouts/Charts/Cartfile.resolved create mode 100644 Carthage/Checkouts/Charts/Charts.podspec create mode 100644 Carthage/Checkouts/Charts/Charts.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/Charts/Charts.xcodeproj/xcshareddata/xcschemes/Charts.xcscheme create mode 100644 Carthage/Checkouts/Charts/Charts.xcodeproj/xcshareddata/xcschemes/ChartsTests.xcscheme create mode 100644 Carthage/Checkouts/Charts/Charts.xcworkspace/contents.xcworkspacedata rename {Stats.xcworkspace => Carthage/Checkouts/Charts/Charts.xcworkspace}/xcshareddata/IDEWorkspaceChecks.plist (100%) create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/ChartsDemo-iOS.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/AppDelegate.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/AppDelegate.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Components/BalloonMarker.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Components/RadarMarkerView.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Components/XYMarkerView.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/DemoBaseViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/DemoBaseViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/DemoListViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/DemoListViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/AnotherBarChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/AnotherBarChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/BarChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/BarChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/BubbleChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/BubbleChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CandleStickChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CandleStickChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/ColoredLineChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/ColoredLineChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CombinedChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CombinedChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CubicLineChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CubicLineChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/HalfPieChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/HalfPieChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/HorizontalBarChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/HorizontalBarChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChart1ViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChart1ViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChart2ViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChart2ViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChartFilledViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChartFilledViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChartTimeViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChartTimeViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/MultipleBarChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/MultipleBarChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/MultipleLinesChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/MultipleLinesChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/NegativeStackedBarChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/NegativeStackedBarChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PieChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PieChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PiePolylineChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PiePolylineChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PositiveNegativeBarChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PositiveNegativeBarChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/RadarChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/RadarChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/ScatterChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/ScatterChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/SinusBarChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/SinusBarChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/StackedBarChartViewController.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/StackedBarChartViewController.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/DateValueFormatter.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/DateValueFormatter.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/DayAxisValueFormatter.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/DayAxisValueFormatter.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/IntAxisValueFormatter.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/IntAxisValueFormatter.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/LargeValueFormatter.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon-29@2x.png create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon-29@3x.png create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/AppIcon.appiconset/iTunesArtwork@2x.png create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/Contents.json create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/icon.imageset/Contents.json create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/icon.imageset/star-1.png create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/icon.imageset/star-2.png create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/icon.imageset/star.png create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Launch Screen.storyboard create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/markers/radar_marker@3x.png create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Supporting Files/ChartsDemo-Bridging-Header.h create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Supporting Files/Info.plist create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Supporting Files/main.m create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/AppDelegate.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Components/BalloonMarker.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Components/RadarMarkerView.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Components/XYMarkerView.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/DemoBaseViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/DemoListViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/AnotherBarChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/BarChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/BubbleChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/CandleStickChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/ColoredLineChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/CombinedChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/CubicLineChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/HalfPieChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/HorizontalBarChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/LineChart1ViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/LineChart2ViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/LineChartFilledViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/LineChartTimeViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/MultipleBarChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/MultipleLinesChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/NegativeStackedBarChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/PieChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/PiePolylineChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/PositiveNegativeBarChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/RadarChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/ScatterChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/SinusBarChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Demos/StackedBarChartViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Formatters/DateValueFormatter.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Formatters/DayAxisValueFormatter.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Formatters/IntAxisValueFormatter.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/Swift/Formatters/LargeValueFormatter.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/DemoListViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/AnotherBarChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/BarChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/BubbleChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/CandleStickChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/ColoredLineChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/CombinedChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/CubicLineChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/HalfPieChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/HorizontalBarChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/LineChart1ViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/LineChart2ViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/LineChartFilledViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/LineChartTimeViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/MultipleBarChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/MultipleLinesChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/NegativeStackedBarChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/PieChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/PiePolylineChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/PositiveNegativeBarChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/RadarChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/RealmDemosViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/ScatterChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/SinusBarChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/Demos/StackedBarChartViewController.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-iOS/XIBs/RadarMarkerView.xib create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/ChartsDemo-macOS.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/ChartsDemo-macOS/AppDelegate.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/ChartsDemo-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/ChartsDemo-macOS/Base.lproj/Main.storyboard create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/ChartsDemo-macOS/Demos/BarDemoViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/ChartsDemo-macOS/Demos/LineDemoViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/ChartsDemo-macOS/Demos/PieDemoViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/ChartsDemo-macOS/Demos/RadarDemoViewController.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/ChartsDemo-macOS/Info.plist create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/PlaygroundChart.playground/Contents.o create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/PlaygroundChart.playground/Pages/BarChart.xcplaygroundpage/Contents.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/PlaygroundChart.playground/Pages/BubbleChart.xcplaygroundpage/Contents.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/PlaygroundChart.playground/Pages/CandleChart.xcplaygroundpage/Contents.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/PlaygroundChart.playground/Pages/CombinedChart.xcplaygroundpage/Contents.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/PlaygroundChart.playground/Pages/HorizontalBarChart.xcplaygroundpage/Contents.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/PlaygroundChart.playground/Pages/LineChart.xcplaygroundpage/Contents.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/PlaygroundChart.playground/Pages/Menu.xcplaygroundpage/Contents.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/PlaygroundChart.playground/Pages/Menu.xcplaygroundpage/Resources/feature_graphic.png create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/PlaygroundChart.playground/Pages/PieChart.xcplaygroundpage/Contents.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/PlaygroundChart.playground/Pages/RadarChart.xcplaygroundpage/Contents.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/PlaygroundChart.playground/Pages/ScatterChart.xcplaygroundpage/Contents.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/PlaygroundChart.playground/Pages/StackedBarChart.xcplaygroundpage/Contents.swift create mode 100644 Carthage/Checkouts/Charts/ChartsDemo-macOS/PlaygroundChart.playground/contents.xcplayground create mode 100644 Carthage/Checkouts/Charts/Gemfile create mode 100644 Carthage/Checkouts/Charts/Gemfile.lock create mode 100644 Carthage/Checkouts/Charts/LICENSE create mode 100644 Carthage/Checkouts/Charts/Package.swift create mode 100644 Carthage/Checkouts/Charts/README.md create mode 100644 Carthage/Checkouts/Charts/Rakefile create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Animation/Animator.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Animation/ChartAnimationEasing.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Charts/BarChartView.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Charts/BarLineChartViewBase.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Charts/BubbleChartView.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Charts/CandleStickChartView.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Charts/ChartViewBase.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Charts/CombinedChartView.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Charts/HorizontalBarChartView.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Charts/LineChartView.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Charts/PieChartView.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Charts/PieRadarChartViewBase.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Charts/RadarChartView.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Charts/ScatterChartView.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Components/AxisBase.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Components/ChartLimitLine.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Components/ComponentBase.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Components/Description.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Components/IMarker.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Components/Legend.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Components/LegendEntry.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Components/MarkerImage.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Components/MarkerView.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Components/XAxis.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Components/YAxis.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/ChartBaseDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/BarChartData.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/BarChartDataEntry.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartData.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/BubbleChartData.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/BubbleChartDataEntry.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/BubbleChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/CandleChartData.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/CandleChartDataEntry.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/CandleChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/ChartData.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/ChartDataEntry.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/ChartDataEntryBase.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/ChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/CombinedChartData.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/LineChartData.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/LineChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/LineRadarChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/LineScatterCandleRadarChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/PieChartData.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/PieChartDataEntry.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/PieChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/RadarChartData.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/RadarChartDataEntry.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/RadarChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/ScatterChartData.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Implementations/Standard/ScatterChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Interfaces/IBarChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Interfaces/IBarLineScatterCandleBubbleChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Interfaces/IBubbleChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Interfaces/ICandleChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Interfaces/IChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Interfaces/ILineChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Interfaces/ILineRadarChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Interfaces/ILineScatterCandleRadarChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Interfaces/IPieChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Interfaces/IRadarChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Data/Interfaces/IScatterChartDataSet.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Filters/DataApproximator+N.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Filters/DataApproximator.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Formatters/DefaultAxisValueFormatter.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Formatters/DefaultFillFormatter.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Formatters/DefaultValueFormatter.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Formatters/IAxisValueFormatter.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Formatters/IFillFormatter.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Formatters/IValueFormatter.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Formatters/IndexAxisValueFormatter.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Highlight/BarHighlighter.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Highlight/ChartHighlighter.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Highlight/CombinedHighlighter.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Highlight/Highlight.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Highlight/HorizontalBarHighlighter.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Highlight/IHighlighter.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Highlight/PieHighlighter.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Highlight/PieRadarHighlighter.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Highlight/RadarHighlighter.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Highlight/Range.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Interfaces/BarChartDataProvider.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Interfaces/BarLineScatterCandleBubbleChartDataProvider.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Interfaces/BubbleChartDataProvider.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Interfaces/CandleChartDataProvider.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Interfaces/ChartDataProvider.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Interfaces/CombinedChartDataProvider.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Interfaces/LineChartDataProvider.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Interfaces/ScatterChartDataProvider.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Jobs/AnimatedMoveViewJob.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Jobs/AnimatedViewPortJob.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Jobs/AnimatedZoomViewJob.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Jobs/MoveViewJob.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Jobs/ViewPortJob.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Jobs/ZoomViewJob.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/AxisRendererBase.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/BarChartRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/BarLineScatterCandleBubbleRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/BubbleChartRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/CandleStickChartRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/ChartDataRendererBase.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/CombinedChartRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/HorizontalBarChartRenderer.swift create mode 100755 Carthage/Checkouts/Charts/Source/Charts/Renderers/LegendRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/LineChartRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/LineRadarRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/LineScatterCandleRadarRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/PieChartRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/RadarChartRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/Renderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/Scatter/ChevronDownShapeRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/Scatter/ChevronUpShapeRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/Scatter/CircleShapeRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/Scatter/CrossShapeRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/Scatter/IShapeRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/Scatter/SquareShapeRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/Scatter/TriangleShapeRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/Scatter/XShapeRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/ScatterChartRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/XAxisRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/XAxisRendererHorizontalBarChart.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/XAxisRendererRadarChart.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/YAxisRenderer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/YAxisRendererHorizontalBarChart.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Renderers/YAxisRendererRadarChart.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Utils/ChartColorTemplates.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Utils/ChartUtils.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Utils/Fill.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Utils/Platform+Accessibility.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Utils/Platform.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Utils/Transformer.swift create mode 100644 Carthage/Checkouts/Charts/Source/Charts/Utils/TransformerHorizontalBarChart.swift create mode 100755 Carthage/Checkouts/Charts/Source/Charts/Utils/ViewPortHandler.swift create mode 100755 Carthage/Checkouts/Charts/Source/Supporting Files/Charts.h create mode 100644 Carthage/Checkouts/Charts/Source/Supporting Files/Info.plist create mode 100644 Carthage/Checkouts/Charts/Tests/Charts/BarChartTests.swift create mode 100644 Carthage/Checkouts/Charts/Tests/Charts/ChartUtilsTests.swift create mode 100644 Carthage/Checkouts/Charts/Tests/Charts/CombinedChartTests.swift create mode 100644 Carthage/Checkouts/Charts/Tests/Charts/EquatableTests.swift create mode 100644 Carthage/Checkouts/Charts/Tests/Charts/HorizontalBarChartTests.swift create mode 100755 Carthage/Checkouts/Charts/Tests/Charts/LineChartTests.swift create mode 100644 Carthage/Checkouts/Charts/Tests/Charts/PieChartTests.swift create mode 100644 Carthage/Checkouts/Charts/Tests/Charts/Snapshot.swift create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testDefaultValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testDefaultValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testDrawIcons_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testDrawIcons_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testHideHorizontalGridlines_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testHideHorizontalGridlines_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testHideLeftAxis_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testHideLeftAxis_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testHideRightAxis_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testHideRightAxis_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testHideVerticalGridlines_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testHideVerticalGridlines_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testHidesValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testHidesValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testInvertedLeftAxisWithNegativeValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testInvertedLeftAxisWithNegativeValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testInvertedLeftAxisWithPositiveValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testInvertedLeftAxisWithPositiveValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testInvertedLeftAxis_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testInvertedLeftAxis_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testInvertedRightAxisWithNegativeValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testInvertedRightAxisWithNegativeValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testInvertedRightAxisWithPositiveValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testInvertedRightAxisWithPositiveValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testInvertedRightAxis_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testInvertedRightAxis_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testNegativeValuesWithCustomAxisMaximum2_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testNegativeValuesWithCustomAxisMaximum2_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testNegativeValuesWithCustomAxisMaximumAndCustomAxisMaximum_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testNegativeValuesWithCustomAxisMaximumAndCustomAxisMaximum_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testNegativeValuesWithCustomAxisMaximum_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testNegativeValuesWithCustomAxisMaximum_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testNegativeValuesWithCustomAxisMinimum2_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testNegativeValuesWithCustomAxisMinimum2_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testNegativeValuesWithCustomAxisMinimum_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testNegativeValuesWithCustomAxisMinimum_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testNegativeValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testNegativeValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testNotDrawValueAboveBars_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testNotDrawValueAboveBars_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testPositiveValuesWithCustomAxisMaximum2_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testPositiveValuesWithCustomAxisMaximum2_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testPositiveValuesWithCustomAxisMaximumAndCustomAxisMaximum_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testPositiveValuesWithCustomAxisMaximumAndCustomAxisMaximum_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testPositiveValuesWithCustomAxisMaximum_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testPositiveValuesWithCustomAxisMaximum_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testPositiveValuesWithCustomAxisMinimum2_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testPositiveValuesWithCustomAxisMinimum2_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testPositiveValuesWithCustomAxisMinimum_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testPositiveValuesWithCustomAxisMinimum_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testPositiveValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testPositiveValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testStackedDrawValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testStackedDrawValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testStackedNotDrawValuesAboveBars_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testStackedNotDrawValuesAboveBars_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testStackedNotDrawValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testStackedNotDrawValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testZeroValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.BarChartTests/testZeroValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.CombinedChartTests/testAllRightAxisDependency_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.CombinedChartTests/testAllRightAxisDependency_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.CombinedChartTests/testDefaultAxisDependency_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.CombinedChartTests/testDefaultAxisDependency_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.CombinedChartTests/testLeftRightAxisDependency_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.CombinedChartTests/testLeftRightAxisDependency_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.HorizontalBarChartTests/testDefaultValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.HorizontalBarChartTests/testDefaultValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.HorizontalBarChartTests/testHidesValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.HorizontalBarChartTests/testHidesValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.HorizontalBarChartTests/testNotDrawValueAboveBars_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.HorizontalBarChartTests/testNotDrawValueAboveBars_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.HorizontalBarChartTests/testStackedDrawValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.HorizontalBarChartTests/testStackedDrawValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.HorizontalBarChartTests/testStackedNotDrawValuesAboveBars_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.HorizontalBarChartTests/testStackedNotDrawValuesAboveBars_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.HorizontalBarChartTests/testStackedNotDrawValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.HorizontalBarChartTests/testStackedNotDrawValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.LineChartTests/testDefaultValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.LineChartTests/testDefaultValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.LineChartTests/testDoesntDrawCircleHole_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.LineChartTests/testDoesntDrawCircleHole_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.LineChartTests/testDoesntDrawCircles_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.LineChartTests/testDoesntDrawCircles_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.LineChartTests/testDrawIcons_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.LineChartTests/testDrawIcons_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.LineChartTests/testHidesValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.LineChartTests/testHidesValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.LineChartTests/testIsCubic_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.LineChartTests/testIsCubic_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.PieChartTests/testDefaultValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.PieChartTests/testDefaultValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.PieChartTests/testDrawIcons_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.PieChartTests/testDrawIcons_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.PieChartTests/testHideCenterLabel_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.PieChartTests/testHideCenterLabel_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.PieChartTests/testHidesValues_iOS_375_0_667_0@2x.png create mode 100644 Carthage/Checkouts/Charts/Tests/ReferenceImages_64/ChartsTests.PieChartTests/testHidesValues_tvOS_1920_0_1080_0@1x.png create mode 100644 Carthage/Checkouts/Charts/Tests/Supporting Files/Info.plist create mode 100644 Carthage/Checkouts/Charts/Tests/Supporting Files/Media.xcassets/Contents.json create mode 100644 Carthage/Checkouts/Charts/Tests/Supporting Files/Media.xcassets/icon.imageset/Contents.json create mode 100644 Carthage/Checkouts/Charts/Tests/Supporting Files/Media.xcassets/icon.imageset/star-1.png create mode 100644 Carthage/Checkouts/Charts/Tests/Supporting Files/Media.xcassets/icon.imageset/star-2.png create mode 100644 Carthage/Checkouts/Charts/Tests/Supporting Files/Media.xcassets/icon.imageset/star.png create mode 100755 Carthage/Checkouts/Charts/scripts/build-dependencies.sh create mode 100755 Carthage/Checkouts/Charts/scripts/copy-carthage-frameworks.sh create mode 100644 Carthage/Checkouts/LaunchAtLogin/.editorconfig create mode 100644 Carthage/Checkouts/LaunchAtLogin/.gitattributes create mode 100644 Carthage/Checkouts/LaunchAtLogin/.gitignore create mode 100644 Carthage/Checkouts/LaunchAtLogin/LaunchAtLogin.podspec create mode 100644 Carthage/Checkouts/LaunchAtLogin/LaunchAtLogin.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/LaunchAtLogin/LaunchAtLogin.xcodeproj/xcshareddata/xcschemes/LaunchAtLogin.xcscheme create mode 100644 Carthage/Checkouts/LaunchAtLogin/LaunchAtLogin.xcodeproj/xcshareddata/xcschemes/LaunchAtLoginHelper.xcscheme create mode 100644 Carthage/Checkouts/LaunchAtLogin/LaunchAtLogin/Info.plist create mode 100644 Carthage/Checkouts/LaunchAtLogin/LaunchAtLogin/LaunchAtLogin.h create mode 100644 Carthage/Checkouts/LaunchAtLogin/LaunchAtLogin/LaunchAtLogin.swift create mode 100755 Carthage/Checkouts/LaunchAtLogin/LaunchAtLogin/copy-helper.sh create mode 100644 Carthage/Checkouts/LaunchAtLogin/LaunchAtLoginHelper/Info.plist create mode 100644 Carthage/Checkouts/LaunchAtLogin/LaunchAtLoginHelper/LaunchAtLoginHelper.entitlements create mode 100644 Carthage/Checkouts/LaunchAtLogin/LaunchAtLoginHelper/main.swift create mode 100644 Carthage/Checkouts/LaunchAtLogin/before-after.md create mode 100644 Carthage/Checkouts/LaunchAtLogin/license create mode 100644 Carthage/Checkouts/LaunchAtLogin/readme.md delete mode 100644 Podfile delete mode 100644 Podfile.lock delete mode 100644 Stats.xcworkspace/contents.xcworkspacedata diff --git a/.gitignore b/.gitignore index 2e85c41c045..c578499374c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,26 +1,10 @@ -Pods .DS_Store -build -DerivedData - -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata/ -*.moved-aside -*.xccheckout -*.xcscmblueprint - -timeline.xctimeline -playground.xcworkspace +Pods +Carthage/Build/ +build +xcuserdata -.build Stats.dmg Stats.app create-dmg \ No newline at end of file diff --git a/Cartfile b/Cartfile new file mode 100644 index 00000000000..ea251114108 --- /dev/null +++ b/Cartfile @@ -0,0 +1,2 @@ +github "sindresorhus/LaunchAtLogin" +github "danielgindi/Charts" ~> 3.3.0 \ No newline at end of file diff --git a/Cartfile.resolved b/Cartfile.resolved new file mode 100644 index 00000000000..c9d31569b6d --- /dev/null +++ b/Cartfile.resolved @@ -0,0 +1,2 @@ +github "danielgindi/Charts" "v3.3.0" +github "sindresorhus/LaunchAtLogin" "v2.5.0" diff --git a/Carthage/Checkouts/Charts/.github/ISSUE_TEMPLATE.md b/Carthage/Checkouts/Charts/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000000..1878f561b18 --- /dev/null +++ b/Carthage/Checkouts/Charts/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ +> ℹ Please fill out this template when filing an issue. +> All lines beginning with an ℹ symbol instruct you with what info we expect. You can delete those lines once you've filled in the info. +> +> Per our [*CONTRIBUTING guidelines](https://github.com/jjatie/Charts/blob/master/CONTRIBUTING.md), we use GitHub for +> bugs and feature requests, not general support. Other issues should be opened on Stack Overflow with the tag [`ios-charts`.](https://stackoverflow.com/questions/tagged/ios-charts) +> +> Please remove this line and everything above it before submitting. + +* [ ] I've read, understood, and done my best to follow the [*CONTRIBUTING guidelines](https://github.com/jjatie/Charts/blob/master/CONTRIBUTING.md). + +## What did you do? + +ℹ Please replace this with what you did. + +## What did you expect to happen? + +ℹ Please replace this with what you expected to happen. + +## What happened instead? + +ℹ Please replace this with of what happened instead. + +## Charts Environment + +**Charts version/Branch/Commit Number:** +**Xcode version:** +**Swift version:** +**Platform(s) running Charts:** +**macOS version running Xcode:** + +## Demo Project + +ℹ Please link to or upload a project we can download that reproduces the issue. diff --git a/Carthage/Checkouts/Charts/.github/PULL_REQUEST_TEMPLATE.md b/Carthage/Checkouts/Charts/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000000..30eee845614 --- /dev/null +++ b/Carthage/Checkouts/Charts/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,13 @@ +### Issue Link :link: + + +### Goals :soccer: + + + +### Implementation Details :construction: + + + +### Testing Details :mag: + \ No newline at end of file diff --git a/Carthage/Checkouts/Charts/.gitignore b/Carthage/Checkouts/Charts/.gitignore new file mode 100644 index 00000000000..8ba8e0ead7b --- /dev/null +++ b/Carthage/Checkouts/Charts/.gitignore @@ -0,0 +1,74 @@ +# OS X +.DS_Store + +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated +build/ +DerivedData/ + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata/ + +## Other +*.xccheckout +*.moved-aside +*.xcuserstate + +## Obj-C/Swift specific +DerivedData +*.hmap +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +.build/ +project.xcworkspace + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +# Pods/ + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +Carthage +Charts.framework.zip +ChartsRealm.framework.zip diff --git a/Carthage/Checkouts/Charts/.travis.yml b/Carthage/Checkouts/Charts/.travis.yml new file mode 100644 index 00000000000..9f8be9f73b6 --- /dev/null +++ b/Carthage/Checkouts/Charts/.travis.yml @@ -0,0 +1,25 @@ +language: objective-c +osx_image: xcode10 +matrix: + include: + - osx_image: xcode10.2 + env: PLATFORM="iOS" + - osx_image: xcode10.2 + env: PLATFORM="tvOS" + - osx_image: xcode10.2 + env: PLATFORM="macOS" +env: + global: + - LANG=en_US.UTF-8 + - secure: HRl5Cg3/LmTJYCSDGtV8Fiqf6OgWXR6C5YkNviOElU9YmcCTvnmE7MCm+gK8hJNIQ2mWCBTlxTC7jJxeYlx0D+JQ6IhRc75B4zXgbtth6HCzlvhWDcBbNU/K+JPDjy2EAoVgvf8Xseq6GqM4WcVg2Pwr9PS3aaH/SKDE6yVoPXRM2wXRAxIdxayqm/RQgG88jAKgg+Ub5DKW/c9NLLbUf/WdY9SgQDJtqeZCMv7G3/IzW34KZgVPsqSrPByzZXbf7KgYkYLQlscH4mcUctk1qxhdCae//zcgUZo/utpXWbPXQqtvDpuqrg9IRvoGxa/D1I7dLSJsVnk4aP7RW18vn4HJ82C2AiEp+lU2TQE9y5lXcGssZVIa5aZNTWL90HVer3Kg6AnHffvdCSZ/UHsMZJFURUXL9fRIlWVGuEDeQOqlV6lUmEtp/BiEdV4D5PuCyT6snsmEwkc51goyqh6uS6XhJyqYEQdxdoybznwp91tVmASsRybppIGHTkcWN5csF4zQt40tEwd8LoqM+bBUo0wxKiKsNsecL4JA+YDYs2saZY9U3s8jAaIon+qDu071fPRaPEvBhYHYDhy4cTvBXibyGUYGHkrgLu0w19wDfHcJKt2In58yOmaCCLNoTGp/ZLNVRyZ8VDlj/NdJ2dWpMsL2Aj7OxU065kCL2FlvuRU= +cache: + - bundler +before_install: + - brew update + - brew upgrade carthage || true + - carthage version + - carthage bootstrap --platform $PLATFORM +script: + - bundle exec rake ci[$PLATFORM] +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/Carthage/Checkouts/Charts/Assets/feature_graphic.png b/Carthage/Checkouts/Charts/Assets/feature_graphic.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0a65998d296acbd881290b15d55c753af40344 GIT binary patch literal 28989 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 literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Charts/Assets/feature_graphic.psd b/Carthage/Checkouts/Charts/Assets/feature_graphic.psd new file mode 100644 index 0000000000000000000000000000000000000000..0ac018dc0697a1ea3522955ecf696e6aed09106e GIT binary patch literal 298724 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

TMJU#v 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 literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Charts/CHANGELOG.md b/Carthage/Checkouts/Charts/CHANGELOG.md new file mode 100644 index 00000000000..e45f888907e --- /dev/null +++ b/Carthage/Checkouts/Charts/CHANGELOG.md @@ -0,0 +1,3553 @@ +# Change Log + +## [v3.3](https://github.com/danielgindi/Charts/tree/v3.3) (2019-04-15) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v3.2.2...v3.3) + +**Implemented enhancements:** + +- Renamed `values` to `entries` to reflect the property's type [\#3847](https://github.com/danielgindi/Charts/pull/3847) ([jjatie](https://github.com/jjatie)) + +**Fixed bugs:** + +- Pie chart with vertical orientation clips last legend entry [\#3860](https://github.com/danielgindi/Charts/issues/3860) + +**Closed issues:** + +- the first point of LineChartView is not displayed, and so is demo [\#3938](https://github.com/danielgindi/Charts/issues/3938) +- How can i get CenterEntry in the View when i setted the MaxVisibleRange? [\#3925](https://github.com/danielgindi/Charts/issues/3925) +- EXC\_BAD\_ACCESS error on PieChart [\#3923](https://github.com/danielgindi/Charts/issues/3923) +- The first dot doesn't show up when I use lineChart [\#3915](https://github.com/danielgindi/Charts/issues/3915) +- Swift 5 Support w/ Cocoapods [\#3913](https://github.com/danielgindi/Charts/issues/3913) +- HOW to create pie chart like below image . https://user-images.githubusercontent.com/20434573/54804603-1d31fa80-4c9a-11e9-9960-00cf7c7d117d.png [\#3908](https://github.com/danielgindi/Charts/issues/3908) +- x Axis grid line origin is wrong ! maybe a bug, anxious!!! [\#3904](https://github.com/danielgindi/Charts/issues/3904) +- why not use CAShapeLayer? [\#3903](https://github.com/danielgindi/Charts/issues/3903) +- Chart legend [\#3896](https://github.com/danielgindi/Charts/issues/3896) +- Wrong values from pixelForValues [\#3895](https://github.com/danielgindi/Charts/issues/3895) +- Cannot set labels for RadarChart [\#3893](https://github.com/danielgindi/Charts/issues/3893) +- I can't migrate the swift files\(combined chart\) in objective c project. Could please share the objective c code fully. Thanks in advance. [\#3890](https://github.com/danielgindi/Charts/issues/3890) +- Draw circle only on last value [\#3887](https://github.com/danielgindi/Charts/issues/3887) +- Mismatch left axis maximum and minimum values [\#3886](https://github.com/danielgindi/Charts/issues/3886) +- How to animate? start poisiton is not from zero. [\#3885](https://github.com/danielgindi/Charts/issues/3885) +- I want to change line chart fill colours [\#3882](https://github.com/danielgindi/Charts/issues/3882) +- Circle view is not showing for first point of line chart [\#3881](https://github.com/danielgindi/Charts/issues/3881) +- support ECG demo? [\#3880](https://github.com/danielgindi/Charts/issues/3880) +- How to remove the values given outside the circle in piechart [\#3878](https://github.com/danielgindi/Charts/issues/3878) +- file was built for x86\_64 which is not the architecture being linked \(arm64\):error: linker command failed with exit code 1 \(use -v to see invocation\) [\#3877](https://github.com/danielgindi/Charts/issues/3877) +- Clipping first and last circle from line chart IOS. [\#3873](https://github.com/danielgindi/Charts/issues/3873) +- Smoothly moving a slowly changing linechart [\#3859](https://github.com/danielgindi/Charts/issues/3859) +- Monthly X-Axis labels \(corresponding values\) in my LineChart are not at the right position [\#3858](https://github.com/danielgindi/Charts/issues/3858) +- CandleChart do not render the first candle in CombineChartView [\#3857](https://github.com/danielgindi/Charts/issues/3857) +- Have 2 or more tresholds for one graph [\#3856](https://github.com/danielgindi/Charts/issues/3856) +- Unexpected crash on 3.2.2 [\#3855](https://github.com/danielgindi/Charts/issues/3855) +- How to change the display of legends? [\#3853](https://github.com/danielgindi/Charts/issues/3853) +- I want to call a method after the chart has been dragged and stopped. How can I detect it and the chart has stopped? [\#3851](https://github.com/danielgindi/Charts/issues/3851) +- HorizontalBarChartView bar negative values position [\#3850](https://github.com/danielgindi/Charts/issues/3850) +- charts 有数据创建图表后,点击按钮将数据置为空则崩溃 [\#3849](https://github.com/danielgindi/Charts/issues/3849) +- No circle is drawn on a line chart when there is only one data. \(version 3.2.2 only\) [\#3848](https://github.com/danielgindi/Charts/issues/3848) +- slice color [\#3844](https://github.com/danielgindi/Charts/issues/3844) +- BarChartView showing consecutive values in xAxis [\#3843](https://github.com/danielgindi/Charts/issues/3843) +- How to hide those icons? [\#3842](https://github.com/danielgindi/Charts/issues/3842) +- Swift 4.2: 'values' is deprecated Warnings [\#3840](https://github.com/danielgindi/Charts/issues/3840) +- Y-axis values draw error [\#3837](https://github.com/danielgindi/Charts/issues/3837) +- Horizontal Bar Chart Value Labels Cut Off [\#3836](https://github.com/danielgindi/Charts/issues/3836) +- The right Y axis displays incorrect values that does not fit the chart [\#3835](https://github.com/danielgindi/Charts/issues/3835) +- How to align labels on left side and put values inside bars on HorizontalBarChartView? \[HELP WANTED\] [\#3833](https://github.com/danielgindi/Charts/issues/3833) +- How to show the tooltip like value when clicked on candle of candleStick chart [\#3832](https://github.com/danielgindi/Charts/issues/3832) +- In line chart, can I make all labels in Chart area even with changing yOffset? [\#3829](https://github.com/danielgindi/Charts/issues/3829) +- Multiline value labels on BarChart. [\#3826](https://github.com/danielgindi/Charts/issues/3826) +- how can I spin the selected slice of piechart to top. [\#3825](https://github.com/danielgindi/Charts/issues/3825) +- Update Cocoapods [\#3773](https://github.com/danielgindi/Charts/issues/3773) +- Select circles on line chart [\#3307](https://github.com/danielgindi/Charts/issues/3307) + +**Merged pull requests:** + +- Fix horizontal bar chart not drawing values and add unit tests [\#3906](https://github.com/danielgindi/Charts/pull/3906) ([liuxuan30](https://github.com/liuxuan30)) +- fix \#3860. maxHeight didn't count the last label [\#3900](https://github.com/danielgindi/Charts/pull/3900) ([liuxuan30](https://github.com/liuxuan30)) +- Migrating to built-in algorithms [\#3892](https://github.com/danielgindi/Charts/pull/3892) ([jjatie](https://github.com/jjatie)) +- Use a stock iterator instead of a custom one. [\#3891](https://github.com/danielgindi/Charts/pull/3891) ([phughes](https://github.com/phughes)) +- Removed unnecessary \#if statements and unified style to align with Xc… [\#3884](https://github.com/danielgindi/Charts/pull/3884) ([jjatie](https://github.com/jjatie)) +- Velocity samples calculation [\#3883](https://github.com/danielgindi/Charts/pull/3883) ([jjatie](https://github.com/jjatie)) +- Minor updates for Swift 5 [\#3874](https://github.com/danielgindi/Charts/pull/3874) ([jjatie](https://github.com/jjatie)) +- Replace AnyObject with Any [\#3864](https://github.com/danielgindi/Charts/pull/3864) ([jjatie](https://github.com/jjatie)) +- Data as any [\#3863](https://github.com/danielgindi/Charts/pull/3863) ([jjatie](https://github.com/jjatie)) +- Reassess convenience initializers [\#3862](https://github.com/danielgindi/Charts/pull/3862) ([jjatie](https://github.com/jjatie)) +- HorizontalBarChar value label offset calculation [\#3854](https://github.com/danielgindi/Charts/pull/3854) ([chaaarly](https://github.com/chaaarly)) +- Create `chartViewDidEndAnimate` in ChartViewDelegate [\#3852](https://github.com/danielgindi/Charts/pull/3852) ([Lcsmarcal](https://github.com/Lcsmarcal)) +- Align `ChartLimit.LabelPosition` naming with `UIRectCorner` [\#3846](https://github.com/danielgindi/Charts/pull/3846) ([jjatie](https://github.com/jjatie)) + +## [v3.2.2](https://github.com/danielgindi/Charts/tree/v3.2.2) (2019-02-13) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v3.2.1...v3.2.2) + +**Implemented enhancements:** + +- 【PieChart】Please support multiple colors for valueline. [\#3480](https://github.com/danielgindi/Charts/issues/3480) + +**Fixed bugs:** + +- CombinedChartView's candleData don't display in v3.2.0 [\#3662](https://github.com/danielgindi/Charts/issues/3662) +- Incorrect behavior for AxisBase.axisMaxLabels [\#3656](https://github.com/danielgindi/Charts/issues/3656) +- Horizontal Bar Chart legend issue [\#3301](https://github.com/danielgindi/Charts/issues/3301) + +**Closed issues:** + +- barchartview draw value in bottom of chart [\#3827](https://github.com/danielgindi/Charts/issues/3827) +- Regarding to label of axis, I think it displays .03 instead of 0.03 [\#3824](https://github.com/danielgindi/Charts/issues/3824) +- Bar Chart Not Showing Colours Correctly [\#3823](https://github.com/danielgindi/Charts/issues/3823) +- Pie Chart on click show value on label. Does anyone know how to do it? [\#3822](https://github.com/danielgindi/Charts/issues/3822) +- chartTranslated in a Pie Chart is not called [\#3821](https://github.com/danielgindi/Charts/issues/3821) +- Issue creating a simple line chart [\#3820](https://github.com/danielgindi/Charts/issues/3820) +- How to save image of scrollable graph [\#3819](https://github.com/danielgindi/Charts/issues/3819) +- Candle charts not showing candles on swift 4.2 [\#3818](https://github.com/danielgindi/Charts/issues/3818) +- How to get a value from line graph if there is more than one lines [\#3817](https://github.com/danielgindi/Charts/issues/3817) +- Multiple colors for the same line [\#3816](https://github.com/danielgindi/Charts/issues/3816) +- Memory Leaks in subclass of LineChartView [\#3813](https://github.com/danielgindi/Charts/issues/3813) +- Distortion When Animating Height of Auto Layout `LineChartView` [\#3811](https://github.com/danielgindi/Charts/issues/3811) +- How to show break in line chart for more than one graph? [\#3810](https://github.com/danielgindi/Charts/issues/3810) +- PIE Chart Colors not properly set [\#3809](https://github.com/danielgindi/Charts/issues/3809) +- A Question to contribution [\#3808](https://github.com/danielgindi/Charts/issues/3808) +- When y value is equal ,HorizontalBarChartView only show integer [\#3806](https://github.com/danielgindi/Charts/issues/3806) +- Highlight per drag not working! [\#3805](https://github.com/danielgindi/Charts/issues/3805) +- chartTranslated is called when no translation happened [\#3803](https://github.com/danielgindi/Charts/issues/3803) +- Xcode10 real machine operation error! [\#3802](https://github.com/danielgindi/Charts/issues/3802) +- Bar Width issue after reset the data [\#3801](https://github.com/danielgindi/Charts/issues/3801) +- Performance issue: drawCircles\(context: CGContext\) in LineChart [\#3798](https://github.com/danielgindi/Charts/issues/3798) +- LineChartView Y-Aixs label'number inaccuracy [\#3794](https://github.com/danielgindi/Charts/issues/3794) +- charts在特定范围内的参考坐标精度问题 [\#3793](https://github.com/danielgindi/Charts/issues/3793) +- Change chart legend show order [\#3791](https://github.com/danielgindi/Charts/issues/3791) +- hello,I don't want to display the pie chart by zero percent. How can I do this [\#3790](https://github.com/danielgindi/Charts/issues/3790) +- how to center legend text of LineChartView? [\#3789](https://github.com/danielgindi/Charts/issues/3789) +- How to Plot only for the available x axis and leave the rest of the x axis blank? [\#3788](https://github.com/danielgindi/Charts/issues/3788) +- Custom chart marker [\#3787](https://github.com/danielgindi/Charts/issues/3787) +- How to shift xAxis values to right? [\#3785](https://github.com/danielgindi/Charts/issues/3785) +- How to disable Accessibility support? [\#3782](https://github.com/danielgindi/Charts/issues/3782) +- Feature: Add option to draw limit lines on top of data [\#3781](https://github.com/danielgindi/Charts/issues/3781) +- Legend spacing issue with LineChart and colors\[\] [\#3780](https://github.com/danielgindi/Charts/issues/3780) +- How to change value line length for each value in pieChartView [\#3776](https://github.com/danielgindi/Charts/issues/3776) +- Crash on the function isDrawingValuesAllowed [\#3772](https://github.com/danielgindi/Charts/issues/3772) +- How to let y axis line show same space when axisMinimum = 0? [\#3771](https://github.com/danielgindi/Charts/issues/3771) +- Xcode 10.1 pod install Charts open project error!!! [\#3769](https://github.com/danielgindi/Charts/issues/3769) +- Is it possible to make some gaps on a same line plot? [\#3765](https://github.com/danielgindi/Charts/issues/3765) +- Is it possible to draw custom shape on chart and handle touch on it [\#3763](https://github.com/danielgindi/Charts/issues/3763) +- Start slice automatically seleted in pie chart [\#3762](https://github.com/danielgindi/Charts/issues/3762) +- How to change color when press down on pie chart? [\#3761](https://github.com/danielgindi/Charts/issues/3761) +- notifyDataSetChanged\(\) crash when datapoint is highlighted in LineChartView [\#3759](https://github.com/danielgindi/Charts/issues/3759) +- BarChartView display half in first bar when change from group bar to bar only [\#3757](https://github.com/danielgindi/Charts/issues/3757) +- Description of Bar doesn't appear in Horizontal BarChartView [\#3756](https://github.com/danielgindi/Charts/issues/3756) +- Chart spacing between xAxis Labels [\#3755](https://github.com/danielgindi/Charts/issues/3755) +- Granularity makes my app crash because require index from zero [\#3753](https://github.com/danielgindi/Charts/issues/3753) +- this counter will make your app being crash in particular case [\#3752](https://github.com/danielgindi/Charts/issues/3752) +- Bar Chart Drawing is wrong without setting axisminimum [\#3751](https://github.com/danielgindi/Charts/issues/3751) +- Help needed - in changing the position for Piechart in SWIFT [\#3749](https://github.com/danielgindi/Charts/issues/3749) +- When using CombinedChartView, CandleChartData cannot be displayed [\#3748](https://github.com/danielgindi/Charts/issues/3748) +- Linear chart line with different thickness of direction [\#3746](https://github.com/danielgindi/Charts/issues/3746) +- I want to try a lot of line charts corresponding to the X axis is different, how can I achieve it. [\#3745](https://github.com/danielgindi/Charts/issues/3745) +- 折线图-具体时间的数据绘制进图表问题 [\#3743](https://github.com/danielgindi/Charts/issues/3743) +- Changing lineCap doesn't work when mode is not linear/stepped [\#3739](https://github.com/danielgindi/Charts/issues/3739) +- Reverse Pie Chart animation [\#3738](https://github.com/danielgindi/Charts/issues/3738) +- How to create y-axis for empty label ? [\#3735](https://github.com/danielgindi/Charts/issues/3735) +- Different colors for above and below 0 when filling a Line Chart [\#3733](https://github.com/danielgindi/Charts/issues/3733) +- How to adding multiple lines to Line Chart for swift 4.0? [\#3732](https://github.com/danielgindi/Charts/issues/3732) +- How to format y-values drawn on bar? [\#3731](https://github.com/danielgindi/Charts/issues/3731) +- how to moveViewToX and not calling setNeedsDisplay\(\) [\#3730](https://github.com/danielgindi/Charts/issues/3730) +- When using CombinedChartView, CandleChartData cannot be displayed [\#3729](https://github.com/danielgindi/Charts/issues/3729) +- Need Help. How to show labels in xAxis for GroupedBarChart? [\#3728](https://github.com/danielgindi/Charts/issues/3728) +- Force axis granularity [\#3727](https://github.com/danielgindi/Charts/issues/3727) +- Y decimal values error [\#3725](https://github.com/danielgindi/Charts/issues/3725) +- if i have 840entrys how can i set the xaxis what i want .e.g i only want to show the 0 and 840 [\#3723](https://github.com/danielgindi/Charts/issues/3723) +- if i have 840entrys how can i set the xaxis what i want .e.g i only want to show the 0 and 840 [\#3722](https://github.com/danielgindi/Charts/issues/3722) +- Align both right and left axis in the same line [\#3720](https://github.com/danielgindi/Charts/issues/3720) +- The `open var noDataTextAlignment: NSTextAlignment = .left` is missing the `@objc` so it's not exposed in Objective C. [\#3719](https://github.com/danielgindi/Charts/issues/3719) +- How to hide bottom colors & label section in Bar Chat [\#3718](https://github.com/danielgindi/Charts/issues/3718) +- Draw Line chart for non linear X-axis [\#3717](https://github.com/danielgindi/Charts/issues/3717) +- Any way to adjust the candle bar width? [\#3716](https://github.com/danielgindi/Charts/issues/3716) +- xAxis grid line in-between bar rather than center of bar [\#3713](https://github.com/danielgindi/Charts/issues/3713) +- Bubble Chart is not rendering [\#3711](https://github.com/danielgindi/Charts/issues/3711) +- Bubble Chart is not rendering [\#3710](https://github.com/danielgindi/Charts/issues/3710) +- \[Feature request\] Continue line chart beyond x-axis limits [\#3708](https://github.com/danielgindi/Charts/issues/3708) +- Use of unresolved identifier 'UIAccessibility' & Type 'UIAccessibilityTraits' \(aka 'UInt64'\) has no member 'header' [\#3707](https://github.com/danielgindi/Charts/issues/3707) +- How to draw a line chart in sections? [\#3706](https://github.com/danielgindi/Charts/issues/3706) +- \[Feature / Help\] Resize Chart based on data visibility [\#3705](https://github.com/danielgindi/Charts/issues/3705) +- \[Request / Help\] Resize Chart based on hidden / shown lines [\#3704](https://github.com/danielgindi/Charts/issues/3704) +- listening for click events in pieChartView [\#3703](https://github.com/danielgindi/Charts/issues/3703) +- How to add Strings on Left Axis in iOS-charts? [\#3702](https://github.com/danielgindi/Charts/issues/3702) +- \[Charts.BarChartDataSet setDrawIconsEnabled:\]: unrecognized selector sent to instance [\#3700](https://github.com/danielgindi/Charts/issues/3700) +- How can I set xAxis to second line? [\#3698](https://github.com/danielgindi/Charts/issues/3698) +- Add to OC project and the api is so big, How to solve this problem [\#3697](https://github.com/danielgindi/Charts/issues/3697) +- How can I call func stringForValue\(\_ value: Double, axis: AxisBase?\) -\> String [\#3696](https://github.com/danielgindi/Charts/issues/3696) +- Line chart, slide left and right to see more data? How to set it up [\#3693](https://github.com/danielgindi/Charts/issues/3693) +- Value for SWIFT\_VERSION cannot be empty. \(in target 'Charts'\) [\#3692](https://github.com/danielgindi/Charts/issues/3692) +- how to make a combine chart \(line chart + bar chart\) with leftAxis taking the top half area of the combined graph and right axis taking the bottom half [\#3690](https://github.com/danielgindi/Charts/issues/3690) +- is there any library for Gantt chart in ios swift ? please suggest me a solution..... [\#3688](https://github.com/danielgindi/Charts/issues/3688) +- Integrated to xcode10 crash [\#3687](https://github.com/danielgindi/Charts/issues/3687) +- XCode 10 app crash. [\#3686](https://github.com/danielgindi/Charts/issues/3686) +- Getting Errors in Xcode 9.2 [\#3684](https://github.com/danielgindi/Charts/issues/3684) +- How to show double vale with string in y-axis [\#3683](https://github.com/danielgindi/Charts/issues/3683) +- When I have a lot of data, how can I slide to the far right by default? [\#3682](https://github.com/danielgindi/Charts/issues/3682) +- Pie Chart - Slices are not drawn and values are overlapping [\#3679](https://github.com/danielgindi/Charts/issues/3679) +- setVisibleXRangeMaximum is behaving unexpectedly [\#3678](https://github.com/danielgindi/Charts/issues/3678) +- Getting issues after pod update. [\#3677](https://github.com/danielgindi/Charts/issues/3677) +- Pie chart and gradient [\#3674](https://github.com/danielgindi/Charts/issues/3674) +- CandleStickChartRenderer drawDataSet method does not work with CombinedChartView [\#3673](https://github.com/danielgindi/Charts/issues/3673) +- How to Hide Text? [\#3672](https://github.com/danielgindi/Charts/issues/3672) +- Memory leaks were detected also in the demo project [\#3671](https://github.com/danielgindi/Charts/issues/3671) +- Can't add two pie charts in a uiviewcontroller at same time [\#3670](https://github.com/danielgindi/Charts/issues/3670) +- ChartData ValueTextColor can not achieve a variety of colors [\#3669](https://github.com/danielgindi/Charts/issues/3669) +- PieChartView settings color is Invalid [\#3668](https://github.com/danielgindi/Charts/issues/3668) +- DrawValuesEnabled variable unreachable \(Swift 4.2\) [\#3665](https://github.com/danielgindi/Charts/issues/3665) +- Failed to verify bitcode in Charts.framework [\#3663](https://github.com/danielgindi/Charts/issues/3663) +- \[3.2.0\] Excessive Memory leaks in Swift 4.2 related to LineChartView, not present in 3.1.1 w/Swift 4 [\#3649](https://github.com/danielgindi/Charts/issues/3649) +- BarChart - xAxis Labels disappear if not a min of 2 on the screen [\#2854](https://github.com/danielgindi/Charts/issues/2854) +- 柱状图一直横向拉伸, 持续差不多 15s 就崩溃了 [\#2642](https://github.com/danielgindi/Charts/issues/2642) +- Any one try to integrate with SpriteKit/SKScene ? [\#2129](https://github.com/danielgindi/Charts/issues/2129) + +**Merged pull requests:** + +- Add Collection conformances to ChartDataSet types [\#3815](https://github.com/danielgindi/Charts/pull/3815) ([jjatie](https://github.com/jjatie)) +- Fix condition that is checked before `chartTranslated` delegate method call [\#3804](https://github.com/danielgindi/Charts/pull/3804) ([anton-filimonov](https://github.com/anton-filimonov)) +- fix \#3719 [\#3778](https://github.com/danielgindi/Charts/pull/3778) ([liuxuan30](https://github.com/liuxuan30)) +- Turned gradient components and locations into constants [\#3775](https://github.com/danielgindi/Charts/pull/3775) ([jjatie](https://github.com/jjatie)) +- add chartScaled\(\) call after double tap in BarLineChartViewBase [\#3770](https://github.com/danielgindi/Charts/pull/3770) ([artemiusmk](https://github.com/artemiusmk)) +- Fixes sharp edges on the line chart [\#3764](https://github.com/danielgindi/Charts/pull/3764) ([stokatyan](https://github.com/stokatyan)) +- Fix applying lineCap value for line chart data sets \(Fixes \#3739\) [\#3740](https://github.com/danielgindi/Charts/pull/3740) ([anton-filimonov](https://github.com/anton-filimonov)) +- Update README.md [\#3737](https://github.com/danielgindi/Charts/pull/3737) ([justinlew](https://github.com/justinlew)) +- Fix legend offset bug for horizontal bar chart \(Fixes \#3301\) [\#3736](https://github.com/danielgindi/Charts/pull/3736) ([SvenMuc](https://github.com/SvenMuc)) +- Fix wrong assignment to axisMaxLabels property [\#3721](https://github.com/danielgindi/Charts/pull/3721) ([ggirotto](https://github.com/ggirotto)) +- Add missing properties to copy\(with:\) methods [\#3715](https://github.com/danielgindi/Charts/pull/3715) ([dstranz](https://github.com/dstranz)) +- Multiple colors for valueline \(Fixes \#3480\) [\#3709](https://github.com/danielgindi/Charts/pull/3709) ([AlexeiGitH](https://github.com/AlexeiGitH)) +- Fix memory leak after rendering [\#3680](https://github.com/danielgindi/Charts/pull/3680) ([YusukeOba](https://github.com/YusukeOba)) +- fix issue \#3662 [\#3664](https://github.com/danielgindi/Charts/pull/3664) ([Michael-Du](https://github.com/Michael-Du)) +- Make NSUIAccessibilityElement initializer public. [\#3654](https://github.com/danielgindi/Charts/pull/3654) ([417-72KI](https://github.com/417-72KI)) +- improvements in barRect height calculation [\#3650](https://github.com/danielgindi/Charts/pull/3650) ([potato04](https://github.com/potato04)) +- Update document to latest format [\#3621](https://github.com/danielgindi/Charts/pull/3621) ([kemchenj](https://github.com/kemchenj)) +- Feature - ChartView Pan Ended Delegate Call [\#3612](https://github.com/danielgindi/Charts/pull/3612) ([AntonTheDev](https://github.com/AntonTheDev)) +- Axis Renderers Cleanup [\#3164](https://github.com/danielgindi/Charts/pull/3164) ([jjatie](https://github.com/jjatie)) + +## [v3.2.1](https://github.com/danielgindi/Charts/tree/v3.2.1) (2018-10-08) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v3.2.0...v3.2.1) + +**Closed issues:** + +- Getting error after updating XCode to 10 from 9.4 [\#3661](https://github.com/danielgindi/Charts/issues/3661) +- Bar Chart with horizondal scroll on clicking button. [\#3660](https://github.com/danielgindi/Charts/issues/3660) +- How to change the piechart' valueLineColor and valueTextColor color individually [\#3658](https://github.com/danielgindi/Charts/issues/3658) +- Update to Swift 4.2 [\#3655](https://github.com/danielgindi/Charts/issues/3655) +- I am trying to use charts. for ios app. I am using cocoa pod for dependency setup. After setup i am trying to build the code it throwing compile errors. [\#3653](https://github.com/danielgindi/Charts/issues/3653) +- Type 'RunLoop' has no member 'Mode' [\#3652](https://github.com/danielgindi/Charts/issues/3652) +- Module compiled with Swift 4.1.2 cannot be imported by the Swift 4.2 [\#3651](https://github.com/danielgindi/Charts/issues/3651) +- Type 'RunLoop' has no member 'Mode' [\#3648](https://github.com/danielgindi/Charts/issues/3648) +- As of todays update, I am running into this issue. 'common' renamed RunLoopMode.commonModes [\#3647](https://github.com/danielgindi/Charts/issues/3647) +- Change circleHoleColor for one point [\#3646](https://github.com/danielgindi/Charts/issues/3646) +- This API is not working with Swift 4.1.. even after taking V3.2 of Charts API also.. I fixed it myself :\( [\#3645](https://github.com/danielgindi/Charts/issues/3645) +- Help building Charts Demo [\#3643](https://github.com/danielgindi/Charts/issues/3643) +- Limit line label orientation [\#3641](https://github.com/danielgindi/Charts/issues/3641) +- Is it possible to zoom into a range of values? [\#3639](https://github.com/danielgindi/Charts/issues/3639) +- Not working with SDK-Swift 4.2 [\#3635](https://github.com/danielgindi/Charts/issues/3635) +- getting the error that let is implicitly final please change from open to public in Xcode10 GM Seed [\#3634](https://github.com/danielgindi/Charts/issues/3634) +- How to optimize when the amount of data is large [\#3633](https://github.com/danielgindi/Charts/issues/3633) +- Adding mathematical function plotting [\#3632](https://github.com/danielgindi/Charts/issues/3632) +- Color shadow inside piechart [\#3631](https://github.com/danielgindi/Charts/issues/3631) +- I can not set one label on y axis. [\#3630](https://github.com/danielgindi/Charts/issues/3630) +- where is the code for draw the xAxis and yAxis indicateLine [\#3628](https://github.com/danielgindi/Charts/issues/3628) +- Is it possible to add a vertical label for Y-Axis? Or anyone working on it? [\#3627](https://github.com/danielgindi/Charts/issues/3627) +- Adding dashed lines in between bars in bar graph [\#3626](https://github.com/danielgindi/Charts/issues/3626) +- Create Line chart and/or Bar chart from String Array [\#3625](https://github.com/danielgindi/Charts/issues/3625) +- Change data if button press [\#3624](https://github.com/danielgindi/Charts/issues/3624) +- Pie Chart and Legend [\#3622](https://github.com/danielgindi/Charts/issues/3622) +- Add labels to marker or create custom marker view [\#3620](https://github.com/danielgindi/Charts/issues/3620) +- is there any way we can change the values font size for ipad in the same code? [\#3618](https://github.com/danielgindi/Charts/issues/3618) +- Reg: Display Min and Max Point in a PopUp [\#3617](https://github.com/danielgindi/Charts/issues/3617) +- Charts ScaleX problem [\#3616](https://github.com/danielgindi/Charts/issues/3616) +- CombinedChartView - EXC\_BAD\_ACCESS with doubleTapToZoomEnabled [\#3614](https://github.com/danielgindi/Charts/issues/3614) +- BarChartView How to set the fixed width and spacing? [\#3609](https://github.com/danielgindi/Charts/issues/3609) +- How can I combine two lineCharts? [\#3607](https://github.com/danielgindi/Charts/issues/3607) +- 'Charts/Charts-Swift.h' file not found [\#3603](https://github.com/danielgindi/Charts/issues/3603) +- Combined Chart with Horizontal Bar chart and a Line chart [\#3600](https://github.com/danielgindi/Charts/issues/3600) +- Design customization [\#3597](https://github.com/danielgindi/Charts/issues/3597) +- Move pie chart to specific location in the view [\#3595](https://github.com/danielgindi/Charts/issues/3595) +- Adding text data points to axis [\#3592](https://github.com/danielgindi/Charts/issues/3592) +- Performance hit [\#3585](https://github.com/danielgindi/Charts/issues/3585) +- Multiple colours for setValueTextColor and xAxis label with NSAttributedString [\#3566](https://github.com/danielgindi/Charts/issues/3566) +- Can't set a fixed width for YAxis with outside style. [\#3565](https://github.com/danielgindi/Charts/issues/3565) +- Switch from Grouped Bar chart back to normal [\#3551](https://github.com/danielgindi/Charts/issues/3551) +- X or Y axis interval of the labels [\#3547](https://github.com/danielgindi/Charts/issues/3547) +- How can I plot all Axis Value? [\#3540](https://github.com/danielgindi/Charts/issues/3540) +- When the number of numeric numbers on the Y axis does not agree, the right of the multiple charts will not be aligned. [\#3347](https://github.com/danielgindi/Charts/issues/3347) + +## [v3.2.0](https://github.com/danielgindi/Charts/tree/v3.2.0) (2018-09-17) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v3.1.1...v3.2.0) + +**Fixed bugs:** + +- Remove noDataText [\#3396](https://github.com/danielgindi/Charts/issues/3396) + +**Closed issues:** + +- Xcode 10 beta & Swift 4.2 support [\#3623](https://github.com/danielgindi/Charts/issues/3623) +- CombinedChartView not population correctly [\#3619](https://github.com/danielgindi/Charts/issues/3619) +- How to remove Cubic Line chart value? [\#3615](https://github.com/danielgindi/Charts/issues/3615) +- How to set Y axis to display different colors of label [\#3611](https://github.com/danielgindi/Charts/issues/3611) +- Installation with carthage error!!! [\#3610](https://github.com/danielgindi/Charts/issues/3610) +- xcodebuild archive error [\#3606](https://github.com/danielgindi/Charts/issues/3606) +- swift library added successfully, but can't reach any of the interfaces [\#3605](https://github.com/danielgindi/Charts/issues/3605) +- BarChart draw sum of values above bar [\#3604](https://github.com/danielgindi/Charts/issues/3604) +- iOS 12 [\#3601](https://github.com/danielgindi/Charts/issues/3601) +- v [\#3598](https://github.com/danielgindi/Charts/issues/3598) +- Compilation errors with Swift 4.1 [\#3596](https://github.com/danielgindi/Charts/issues/3596) +- Bar Chart highlights last clicked bar [\#3594](https://github.com/danielgindi/Charts/issues/3594) +- Remove hightlight, when swipe ends. Or just catch event when swipe ends [\#3588](https://github.com/danielgindi/Charts/issues/3588) +- bars did not displayed as expect [\#3586](https://github.com/danielgindi/Charts/issues/3586) +- what about the property 'gradientPositions' on branch 4.0.0, and how to use [\#3584](https://github.com/danielgindi/Charts/issues/3584) +- Creating markers for Radar Charts [\#3582](https://github.com/danielgindi/Charts/issues/3582) +- How to display value on touch? [\#3581](https://github.com/danielgindi/Charts/issues/3581) +- LineChart \(gradient fill\) is not working in Swift 4 [\#3580](https://github.com/danielgindi/Charts/issues/3580) +- Is there a way to use Line Chart with custom xAxis? [\#3579](https://github.com/danielgindi/Charts/issues/3579) +- Xaxis MutliLine and Value Multiline [\#3575](https://github.com/danielgindi/Charts/issues/3575) +- REACT NATIVE CHART ISSUE [\#3574](https://github.com/danielgindi/Charts/issues/3574) +- Data labels not shown when mutable array of entries used. [\#3573](https://github.com/danielgindi/Charts/issues/3573) +- Grid background color extends beyond data sets [\#3572](https://github.com/danielgindi/Charts/issues/3572) +- real time plot [\#3571](https://github.com/danielgindi/Charts/issues/3571) +- Add shadow effect for pie chart [\#3570](https://github.com/danielgindi/Charts/issues/3570) +- The target “Charts” contains source code developed with Swift 2.x. Xcode 9 does not support building or migrating Swift 2.x targets. [\#3569](https://github.com/danielgindi/Charts/issues/3569) +- What is the best way to show around 100'000 values? [\#3568](https://github.com/danielgindi/Charts/issues/3568) +- CandleChart In CombinedChartView not work [\#3567](https://github.com/danielgindi/Charts/issues/3567) +- the x axis label is not in the right position when I used groupBarChart [\#3564](https://github.com/danielgindi/Charts/issues/3564) +- Bar Charts with only top outline like line chart [\#3562](https://github.com/danielgindi/Charts/issues/3562) +- How to fill the area between two lines on LineChart [\#3561](https://github.com/danielgindi/Charts/issues/3561) +- How to support rose chart? [\#3560](https://github.com/danielgindi/Charts/issues/3560) +- How I can get unselected entry [\#3559](https://github.com/danielgindi/Charts/issues/3559) +- Custom x-axis labels won't show without backing data [\#3557](https://github.com/danielgindi/Charts/issues/3557) +- Cannot build Charts project using Carthage [\#3555](https://github.com/danielgindi/Charts/issues/3555) +- Customizing bar chart [\#3554](https://github.com/danielgindi/Charts/issues/3554) +- Line Chart: Can't display icons unless data labels are also displayed [\#3553](https://github.com/danielgindi/Charts/issues/3553) +- How to enable highlight to some datapoints only when chart is zoomed [\#3552](https://github.com/danielgindi/Charts/issues/3552) +- 关于OC项目引入Charts IPA体积过大的问题 [\#3549](https://github.com/danielgindi/Charts/issues/3549) +- X or Y unit?How to do? [\#3545](https://github.com/danielgindi/Charts/issues/3545) +- Why my chart have line on zero on yAXis [\#3544](https://github.com/danielgindi/Charts/issues/3544) +- Value of type 'EnumeratedSequence\<\[CGPoint\]\>' has no member 'compactMap' [\#3543](https://github.com/danielgindi/Charts/issues/3543) +- Show Axis unit in last label [\#3542](https://github.com/danielgindi/Charts/issues/3542) +- In iOS-Charts how to hide one of Y axis grid lines. [\#3541](https://github.com/danielgindi/Charts/issues/3541) +- Highlighting on a scrollable line graph [\#3539](https://github.com/danielgindi/Charts/issues/3539) +- disable gradient fill Linechart [\#3537](https://github.com/danielgindi/Charts/issues/3537) +- Undefined symbols for architecture - import issues [\#3536](https://github.com/danielgindi/Charts/issues/3536) +- Horizontal Bar Chart Bar Collapsing [\#3535](https://github.com/danielgindi/Charts/issues/3535) +- How to remove space between line chart and top legend [\#3534](https://github.com/danielgindi/Charts/issues/3534) +- Scrolling of bar chart is not working initially. [\#3532](https://github.com/danielgindi/Charts/issues/3532) +- Remove DataSet label [\#3531](https://github.com/danielgindi/Charts/issues/3531) +- HorizontalBarChartView 横向柱状图Y轴问题 [\#3530](https://github.com/danielgindi/Charts/issues/3530) +- 怎么设置柱状图的宽度不变 [\#3529](https://github.com/danielgindi/Charts/issues/3529) +- Is it possible to show the values of a horizontal stacked bar chart centered? [\#3526](https://github.com/danielgindi/Charts/issues/3526) +- how to change LineChartDataSet without strange redraw issues? [\#3525](https://github.com/danielgindi/Charts/issues/3525) +- I want to add image in left side of line graph when we scroll the image is also scroll [\#3521](https://github.com/danielgindi/Charts/issues/3521) +- Fixed label at axis origin [\#3519](https://github.com/danielgindi/Charts/issues/3519) +- Horizontal bar charts labels max out too early [\#3517](https://github.com/danielgindi/Charts/issues/3517) +- multiple PieCharts in on Screen [\#3516](https://github.com/danielgindi/Charts/issues/3516) +- First and Last Bars are not displaying full bars in CombinedChartView [\#3515](https://github.com/danielgindi/Charts/issues/3515) +- Line chart does not render correctly [\#3514](https://github.com/danielgindi/Charts/issues/3514) +- Line chart with LineChartView the line is lower than the minimum values [\#3513](https://github.com/danielgindi/Charts/issues/3513) +- Bar chart is plotting for empty value and Line chart is not appeared in CombinedChartView [\#3511](https://github.com/danielgindi/Charts/issues/3511) +- The shape of graph becomes smaller and smaller in RadarChartGraph [\#3510](https://github.com/danielgindi/Charts/issues/3510) +- not able to display x-axis labels like \(jun, july\) in line chart [\#3509](https://github.com/danielgindi/Charts/issues/3509) +- Move points on LineChart with Pan Gesture [\#3508](https://github.com/danielgindi/Charts/issues/3508) +- 32 bit Device not handling high x-values [\#3507](https://github.com/danielgindi/Charts/issues/3507) +- How do you override the getFormattedValue\(\) method when it doesn't exist? [\#3506](https://github.com/danielgindi/Charts/issues/3506) +- drawBarShadowEnabled is crashing in swift 4 [\#3505](https://github.com/danielgindi/Charts/issues/3505) +- x,y axis and guidelines hide on grah reload [\#3503](https://github.com/danielgindi/Charts/issues/3503) +- 显示float问题 [\#3501](https://github.com/danielgindi/Charts/issues/3501) +- App Crash in release mode not in debug mode [\#3499](https://github.com/danielgindi/Charts/issues/3499) +- Arrow on axis end [\#3498](https://github.com/danielgindi/Charts/issues/3498) +- LineChartView setup "set.mode = LineChartModeCubicBezier",The wave-peak trough of the smooth chart shows no value and deviates from these points [\#3497](https://github.com/danielgindi/Charts/issues/3497) +- Errors when trying to compile a project using Charts [\#3496](https://github.com/danielgindi/Charts/issues/3496) +- Need Help I want to Make 2 lines of X axis label and x axis label background color [\#3495](https://github.com/danielgindi/Charts/issues/3495) +- Getting current xAxis value [\#3494](https://github.com/danielgindi/Charts/issues/3494) +- where to catch the function about marker disappears or appears with dataEntrance [\#3493](https://github.com/danielgindi/Charts/issues/3493) +- Get chart image without rendering chart [\#3492](https://github.com/danielgindi/Charts/issues/3492) +- Cant able to set XAxis Range for custom DateTime formatter [\#3491](https://github.com/danielgindi/Charts/issues/3491) +- How to set the accuracy of data, such as two decimal places, e.g 2.32, 3.21. [\#3490](https://github.com/danielgindi/Charts/issues/3490) +- FFT graphs? [\#3489](https://github.com/danielgindi/Charts/issues/3489) +- Is there a better way to easily add highest and lowest value in candlestick chart [\#3488](https://github.com/danielgindi/Charts/issues/3488) +- Remove piechart center white area [\#3487](https://github.com/danielgindi/Charts/issues/3487) +- xAxis label is croped when using custom valueFormatter [\#3485](https://github.com/danielgindi/Charts/issues/3485) +- Change location of left axis labels [\#3484](https://github.com/danielgindi/Charts/issues/3484) +- How to plot multiple yValue but display selected xValue in xAxis Label? [\#3483](https://github.com/danielgindi/Charts/issues/3483) +- Bubble Charts Choose not jump into the method “chartValueSelected...”? [\#3482](https://github.com/danielgindi/Charts/issues/3482) +- How to plot time value format on x-axis in real time graph [\#3481](https://github.com/danielgindi/Charts/issues/3481) +- How to remove Right side vertical line and values in LineChartView [\#3478](https://github.com/danielgindi/Charts/issues/3478) +- Bar Chart View acting weird \(zooming\) [\#3477](https://github.com/danielgindi/Charts/issues/3477) +- Is their anyway to show legend in rows and columns format? [\#3476](https://github.com/danielgindi/Charts/issues/3476) +- Duplicate Y-axis values while pitching the graph moving up [\#3475](https://github.com/danielgindi/Charts/issues/3475) +- getValuesByTouchPoint / UIView coords to graph coords [\#3474](https://github.com/danielgindi/Charts/issues/3474) +- Pie Chart label not show if its value 0 [\#3473](https://github.com/danielgindi/Charts/issues/3473) +- Build failed [\#3472](https://github.com/danielgindi/Charts/issues/3472) +- What will be the version of pod if I am running on swift 2.3 ? [\#3471](https://github.com/danielgindi/Charts/issues/3471) +- Using SPM results in a "dependency graph is unresolvable" error. [\#3470](https://github.com/danielgindi/Charts/issues/3470) +- Demo is not compiling [\#3469](https://github.com/danielgindi/Charts/issues/3469) +- Question [\#3466](https://github.com/danielgindi/Charts/issues/3466) +- need help [\#3464](https://github.com/danielgindi/Charts/issues/3464) +- bar Chart legend always show one label [\#3462](https://github.com/danielgindi/Charts/issues/3462) +- Monitor rotation angle [\#3461](https://github.com/danielgindi/Charts/issues/3461) +- when clicking chartView,How to prompt multiple markerView [\#3460](https://github.com/danielgindi/Charts/issues/3460) +- The chart will draw incorrectly if LineChart leftAxis.axisMinimum does not start at zero [\#3458](https://github.com/danielgindi/Charts/issues/3458) +- Grouped bar chart plotting wrong !! [\#3457](https://github.com/danielgindi/Charts/issues/3457) +- 为什么我设置X轴不显示 [\#3456](https://github.com/danielgindi/Charts/issues/3456) +- how to set string values on x axis in bar chart? please help [\#3455](https://github.com/danielgindi/Charts/issues/3455) +- Left axis and right axis not same zero line [\#3454](https://github.com/danielgindi/Charts/issues/3454) +- How can make HorizontalBarChart dont start at zero? [\#3453](https://github.com/danielgindi/Charts/issues/3453) +- Can't customise X-axis grid line labels in time value line chart. [\#3452](https://github.com/danielgindi/Charts/issues/3452) +- xAxis gridlines are missing [\#3451](https://github.com/danielgindi/Charts/issues/3451) +- How to add attributed string in Xaxis labels [\#3450](https://github.com/danielgindi/Charts/issues/3450) +- 点击0这一列,所有的柱状图都高亮,可以吗 [\#3449](https://github.com/danielgindi/Charts/issues/3449) +- how to use 'LineChartView' to draw a line between nonzero values? [\#3448](https://github.com/danielgindi/Charts/issues/3448) +- The maximum value of the histogram is not shown. [\#3447](https://github.com/danielgindi/Charts/issues/3447) +- The Y-axis numerical display problem. [\#3446](https://github.com/danielgindi/Charts/issues/3446) +- Is it possible to show x-Axis gridlines when there's only one ChartDataEntry? [\#3444](https://github.com/danielgindi/Charts/issues/3444) +- Chart callback events [\#3443](https://github.com/danielgindi/Charts/issues/3443) +- Help needed with Grouped Horizontal Bar Chart [\#3442](https://github.com/danielgindi/Charts/issues/3442) +- Candlestick doesn't work when x does not start at 0 [\#3441](https://github.com/danielgindi/Charts/issues/3441) +- Is there a callback method? [\#3439](https://github.com/danielgindi/Charts/issues/3439) +- oc项目集成Charts,上架打包失败,提示ERROR ITMS-90171: "Invalid Bundle Structure - The binary file '时间炼.app/Frameworks/Charts.framework/Charts' is not permitted. Your app can’t contain standalone executables or libraries, other than a valid CFBundleExecutable of supported bundles. Refer to the Bundle Programming Guide at https://developer.apple.com/go/?id=bundle-structure for information on the iOS app bundle structure."。新手,求解答!Thanks [\#3438](https://github.com/danielgindi/Charts/issues/3438) +- Axis label alignment with labelRotationAngle [\#3437](https://github.com/danielgindi/Charts/issues/3437) +- Show grid with axis deactivated [\#3436](https://github.com/danielgindi/Charts/issues/3436) +- Error: cannot use instance member '\_viewPortHandler' within property initializer; property initializers run before 'self' is available [\#3434](https://github.com/danielgindi/Charts/issues/3434) +- remove labels [\#3433](https://github.com/danielgindi/Charts/issues/3433) +- How to set the number of lines for the label of xAxis of HorizontalBarChartView ? [\#3431](https://github.com/danielgindi/Charts/issues/3431) +- xAxis labelText too long, it can not draw complete. [\#3430](https://github.com/danielgindi/Charts/issues/3430) +- Weird crash [\#3427](https://github.com/danielgindi/Charts/issues/3427) +- Why does the default value of the Y label take the decimal point? [\#3426](https://github.com/danielgindi/Charts/issues/3426) +- Why won't the viewport move to the last X value of my line chart? [\#3425](https://github.com/danielgindi/Charts/issues/3425) +- How to disable highlight for some specific values [\#3423](https://github.com/danielgindi/Charts/issues/3423) +- IAxisValueFormatter Error: Index out of range [\#3422](https://github.com/danielgindi/Charts/issues/3422) +- can we animate SelectionShift when selecting a segment of pie chart? [\#3420](https://github.com/danielgindi/Charts/issues/3420) +- Y-axis minimum scale deviation problem. [\#3419](https://github.com/danielgindi/Charts/issues/3419) +- How do you set the scale of the Y-axis? [\#3418](https://github.com/danielgindi/Charts/issues/3418) +- BarLineChartViewBase doubleTapGestureRecognized [\#3417](https://github.com/danielgindi/Charts/issues/3417) +- Remove the box from the pie chart. [\#3416](https://github.com/danielgindi/Charts/issues/3416) +- Unable to set transparent color or clear color to the graphs background. [\#3414](https://github.com/danielgindi/Charts/issues/3414) +- BarChartView has no TouchUpInside event, only TouchDown event. [\#3411](https://github.com/danielgindi/Charts/issues/3411) +- YAxis,the integer bit is missing, showing.0 or.00 [\#3410](https://github.com/danielgindi/Charts/issues/3410) +- touchesEnded can't be called in chart view? [\#3409](https://github.com/danielgindi/Charts/issues/3409) +- Is it possible to show date values in the Stacked BarChart? [\#3408](https://github.com/danielgindi/Charts/issues/3408) +- Passing STRING values to X-Axis currently the SetDataCount is accepting only INT and Double data types [\#3407](https://github.com/danielgindi/Charts/issues/3407) +- compactMap build error [\#3405](https://github.com/danielgindi/Charts/issues/3405) +- Marker in CombinedChart is displayed incorrectly. [\#3404](https://github.com/danielgindi/Charts/issues/3404) +- I need to customize the column chart [\#3401](https://github.com/danielgindi/Charts/issues/3401) +- YAxis show the value .0 or .00 [\#3400](https://github.com/danielgindi/Charts/issues/3400) +- How to do BarChart \(grouped DataSets\)\(OC\)? [\#3399](https://github.com/danielgindi/Charts/issues/3399) +- Can't build success with xcode toolchains swift 4.0.3 release [\#3398](https://github.com/danielgindi/Charts/issues/3398) +- pod not install in xcode 9.3 version [\#3397](https://github.com/danielgindi/Charts/issues/3397) +- Lag during scroll [\#3395](https://github.com/danielgindi/Charts/issues/3395) +- Hide percents on PieChartDiagram when it's so small [\#3394](https://github.com/danielgindi/Charts/issues/3394) +- Value of type 'BarChartDataEntries' has no member 'unit' [\#3393](https://github.com/danielgindi/Charts/issues/3393) +- BarChart 1st bar offset [\#3392](https://github.com/danielgindi/Charts/issues/3392) +- Open up Access Modifiers? [\#3391](https://github.com/danielgindi/Charts/issues/3391) +- ld: warning: directory not found for option '-F/Users/hansenpen/Library/Developer/Xcode/DerivedData/CS\_PROJECT\_-\_ALPHA-hglwyidqwcstjvejzxikmednefgv/Build/Products/Debug-iphonesimulator/Charts' ld: framework not found Charts clang: error: linker command failed with exit code 1 \(use -v to see invocation\) [\#3390](https://github.com/danielgindi/Charts/issues/3390) +- How to install charts Framework using Xcode 9.1 [\#3388](https://github.com/danielgindi/Charts/issues/3388) +- Unable to compile swift 3.2 code from xcode 9.3. I am using 3.1.1 version of charts. [\#3387](https://github.com/danielgindi/Charts/issues/3387) +- why there is flexible space between the BarChatView and the xAxis ? sometimes the space are nil but sometimes the space exist . when it happens the xAxis will draw rect inside the PilaView . it doesn't connected with the XAxisLabelPosition attribute . i cann't figured it out [\#3386](https://github.com/danielgindi/Charts/issues/3386) +- Error building project [\#3385](https://github.com/danielgindi/Charts/issues/3385) +- missing property in latest LineChartView [\#3383](https://github.com/danielgindi/Charts/issues/3383) +- minOffset not working [\#3382](https://github.com/danielgindi/Charts/issues/3382) +- Display Real time data like pulseRate. [\#3381](https://github.com/danielgindi/Charts/issues/3381) +- Grouped bar chart shows up as stacked bar chart after migration. [\#3380](https://github.com/danielgindi/Charts/issues/3380) +- Candle stick chart cds.setBarSpace\(\) not working [\#3379](https://github.com/danielgindi/Charts/issues/3379) +- Line chart fill color goes above/below zeroline [\#3377](https://github.com/danielgindi/Charts/issues/3377) +- Charts Pod not working with Xcode 9.3 \(Swift 4.1\) [\#3376](https://github.com/danielgindi/Charts/issues/3376) +- Can any one know how to draw this charts [\#3375](https://github.com/danielgindi/Charts/issues/3375) +- Compile error on newest ChartsDemo-iOS project [\#3373](https://github.com/danielgindi/Charts/issues/3373) +- ChartIndexAxisValueFormatter Not working in line charts [\#3371](https://github.com/danielgindi/Charts/issues/3371) +- Line Graph xValue [\#3367](https://github.com/danielgindi/Charts/issues/3367) +- xAxis labels are not aligned with grouped bar, when data is more [\#3364](https://github.com/danielgindi/Charts/issues/3364) +- Select the data point programmatically and the highLight is NAN [\#3363](https://github.com/danielgindi/Charts/issues/3363) +- Layout issue with chart legend [\#3359](https://github.com/danielgindi/Charts/issues/3359) +- Is it possible to draw the line on top of a custom XAxisRenderer? [\#3348](https://github.com/danielgindi/Charts/issues/3348) +- How to set x-axis labels with selected round with color. [\#3345](https://github.com/danielgindi/Charts/issues/3345) +- How to hide the grid background on some bar [\#3342](https://github.com/danielgindi/Charts/issues/3342) +- Space between axis line and axis label [\#3336](https://github.com/danielgindi/Charts/issues/3336) +- Can't manage to align plots with x axis values [\#3332](https://github.com/danielgindi/Charts/issues/3332) +- Show the last x axis label on bar chart [\#3324](https://github.com/danielgindi/Charts/issues/3324) +- HorizontalBarChartView display partial data [\#3320](https://github.com/danielgindi/Charts/issues/3320) +- 如何在滑动代理中获取当前中心位置所对应的数据源的索引 [\#3318](https://github.com/danielgindi/Charts/issues/3318) +- Visible max and min Y Values [\#2600](https://github.com/danielgindi/Charts/issues/2600) +- Invert xAxis label [\#2504](https://github.com/danielgindi/Charts/issues/2504) +- @junito1209 please explain what are you doing on Charts wiki page [\#2261](https://github.com/danielgindi/Charts/issues/2261) +- Crash Observed when AxisRenderer interval is becoming NaN [\#2168](https://github.com/danielgindi/Charts/issues/2168) +- Problem selecting bubbles on the same xIndex [\#2060](https://github.com/danielgindi/Charts/issues/2060) + +**Merged pull requests:** + +- Add Swift version 4.1 to podspec [\#3608](https://github.com/danielgindi/Charts/pull/3608) ([larryonoff](https://github.com/larryonoff)) +- update barRect.size.height calculation [\#3587](https://github.com/danielgindi/Charts/pull/3587) ([potato04](https://github.com/potato04)) +- Add label colors to legend entries [\#3558](https://github.com/danielgindi/Charts/pull/3558) ([petester42](https://github.com/petester42)) +- Support inlune bubble viz selection [\#3548](https://github.com/danielgindi/Charts/pull/3548) ([chuynadamas](https://github.com/chuynadamas)) +- fix the error title for demo [\#3528](https://github.com/danielgindi/Charts/pull/3528) ([yangasahi](https://github.com/yangasahi)) +- Changes for Swift 4.2, Xcode 10 and iOS 12 [\#3522](https://github.com/danielgindi/Charts/pull/3522) ([jlcanale](https://github.com/jlcanale)) +- Accessibility Support for \(most\) Chart types [\#3520](https://github.com/danielgindi/Charts/pull/3520) ([mathewa6](https://github.com/mathewa6)) +- Changed comment that referenced getFormattedValue\(\) method in IValueFormatter [\#3518](https://github.com/danielgindi/Charts/pull/3518) ([JCMcLovin](https://github.com/JCMcLovin)) +- Fix merge conflicts in \#3218 [\#3500](https://github.com/danielgindi/Charts/pull/3500) ([petester42](https://github.com/petester42)) +- Make legendRenderer property public in order to be externally customizable [\#3445](https://github.com/danielgindi/Charts/pull/3445) ([nagykatalin](https://github.com/nagykatalin)) +- Fix broken demo link in readme [\#3440](https://github.com/danielgindi/Charts/pull/3440) ([robert-cronin](https://github.com/robert-cronin)) +- Added clamping function for `Comparable` [\#3435](https://github.com/danielgindi/Charts/pull/3435) ([jjatie](https://github.com/jjatie)) +- Fix CocoaPods compilation [\#3432](https://github.com/danielgindi/Charts/pull/3432) ([larryonoff](https://github.com/larryonoff)) +- update candle chart view options in demo project [\#3424](https://github.com/danielgindi/Charts/pull/3424) ([cuong1112035](https://github.com/cuong1112035)) +- Add Objective-c compatible for turning off drag in X and Y Axis separately [\#3421](https://github.com/danielgindi/Charts/pull/3421) ([lennonhe](https://github.com/lennonhe)) +- Added gradient line drawing to LineChartRenderer. based on PR \#3142 [\#3415](https://github.com/danielgindi/Charts/pull/3415) ([larryonoff](https://github.com/larryonoff)) +- Add more render options for y axis labels [\#3406](https://github.com/danielgindi/Charts/pull/3406) ([alexrepty](https://github.com/alexrepty)) +- Refactored ChartData [\#3169](https://github.com/danielgindi/Charts/pull/3169) ([jjatie](https://github.com/jjatie)) +- Dataset logic cleanup [\#3001](https://github.com/danielgindi/Charts/pull/3001) ([jjatie](https://github.com/jjatie)) +- Added value text rotation [\#2200](https://github.com/danielgindi/Charts/pull/2200) ([chinh-tran](https://github.com/chinh-tran)) + +## [v3.1.1](https://github.com/danielgindi/Charts/tree/v3.1.1) (2018-04-02) +[Full Changelog](https://github.com/danielgindi/Charts/compare/3.1.1...v3.1.1) + +## [3.1.1](https://github.com/danielgindi/Charts/tree/3.1.1) (2018-04-02) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v3.1.0...3.1.1) + +**Fixed bugs:** + +- ChartsDemo-Swift crashes [\#3327](https://github.com/danielgindi/Charts/issues/3327) + +**Closed issues:** + +- Why does yVals start with a negative number when the data is empty? [\#3374](https://github.com/danielgindi/Charts/issues/3374) +- Compile Error [\#3372](https://github.com/danielgindi/Charts/issues/3372) +- Y Axis need to add Time slots for current day [\#3368](https://github.com/danielgindi/Charts/issues/3368) +- inconsistent include of UIKit vs AppKit [\#3362](https://github.com/danielgindi/Charts/issues/3362) +- Crash Issue in BarChartData [\#3361](https://github.com/danielgindi/Charts/issues/3361) +- How can we format the LABEL used for values? [\#3354](https://github.com/danielgindi/Charts/issues/3354) +- Remove value labels padding [\#3350](https://github.com/danielgindi/Charts/issues/3350) +- Does Charts support real-time drawing [\#3344](https://github.com/danielgindi/Charts/issues/3344) +- Constant for Bar width and space [\#3343](https://github.com/danielgindi/Charts/issues/3343) +- Bar Graph groupBars function issue [\#1966](https://github.com/danielgindi/Charts/issues/1966) +- bar chart from dates [\#1963](https://github.com/danielgindi/Charts/issues/1963) +- A crash of CombinedChartView,when touch on the chart view\(chas\) [\#1957](https://github.com/danielgindi/Charts/issues/1957) +- Graph doesn't display on older iPads [\#1954](https://github.com/danielgindi/Charts/issues/1954) +- Regarding deprecated xValues [\#1947](https://github.com/danielgindi/Charts/issues/1947) +- Charts being overlaid inside UICollectionView using dequeueReusableCell [\#1943](https://github.com/danielgindi/Charts/issues/1943) +- We are unable to split the label in two lines. [\#1941](https://github.com/danielgindi/Charts/issues/1941) +- Make releases so they follow the Semantic Versioning \(SemVer\) [\#1930](https://github.com/danielgindi/Charts/issues/1930) +- Marker Position [\#1876](https://github.com/danielgindi/Charts/issues/1876) +- Charts 3.0 unable to draw discontinuous line chart [\#1866](https://github.com/danielgindi/Charts/issues/1866) +- Radar charts custom labels [\#1840](https://github.com/danielgindi/Charts/issues/1840) +- Unable to subclass [\#1838](https://github.com/danielgindi/Charts/issues/1838) +- offset goes wrong when using mutiple bar chart in combined chart [\#1813](https://github.com/danielgindi/Charts/issues/1813) +- Histogram Example? [\#1792](https://github.com/danielgindi/Charts/issues/1792) +- Sunburst Chart [\#1715](https://github.com/danielgindi/Charts/issues/1715) +- Line chart with preview [\#1520](https://github.com/danielgindi/Charts/issues/1520) +- Get scroll position of dragable line chart [\#1272](https://github.com/danielgindi/Charts/issues/1272) +- Trend line in scatter chart? [\#1263](https://github.com/danielgindi/Charts/issues/1263) +- Can we use custom image instead of Circle in line chart? [\#1206](https://github.com/danielgindi/Charts/issues/1206) +- Legend with NSAttributedString and multiple lines on Vertical [\#1193](https://github.com/danielgindi/Charts/issues/1193) +- Trim the legend view [\#1192](https://github.com/danielgindi/Charts/issues/1192) +- Chart auto min/max does not take into account second line [\#1136](https://github.com/danielgindi/Charts/issues/1136) +- Add different colorHoleColor for different datapoints in a LineChart iOS Charts [\#1104](https://github.com/danielgindi/Charts/issues/1104) +- How to remove marker programatically [\#1097](https://github.com/danielgindi/Charts/issues/1097) +- Overlapping issues in x and y axis values [\#1048](https://github.com/danielgindi/Charts/issues/1048) +- Enhancement: Horizontal Combined Chart [\#1041](https://github.com/danielgindi/Charts/issues/1041) +- Enhancement: Linked x-axis or stacked y-axis. [\#1022](https://github.com/danielgindi/Charts/issues/1022) +- Scale or zoom to particular axis or point in Combined chart view [\#993](https://github.com/danielgindi/Charts/issues/993) +- Max Value Y - Axis = 1 , How to set Y-Axis increment Y- Value ? [\#989](https://github.com/danielgindi/Charts/issues/989) +- Drawing value for the WholeStack only [\#926](https://github.com/danielgindi/Charts/issues/926) +- Pie chart Y values overlap [\#779](https://github.com/danielgindi/Charts/issues/779) +- Swift Package Manager [\#753](https://github.com/danielgindi/Charts/issues/753) +- Stacked bar chart with different number of rects [\#744](https://github.com/danielgindi/Charts/issues/744) +- The label value position with the same yAxis and different value. [\#724](https://github.com/danielgindi/Charts/issues/724) +- Minimum / maximum scale causes the chart to slide sideways when trying to pinch zoom further [\#437](https://github.com/danielgindi/Charts/issues/437) +- Top and bottom grid line diverging widths [\#411](https://github.com/danielgindi/Charts/issues/411) + +**Merged pull requests:** + +- Swift 4.1 [\#3370](https://github.com/danielgindi/Charts/pull/3370) ([jjatie](https://github.com/jjatie)) +- Update ILineRadarChartDataSet.swift [\#3366](https://github.com/danielgindi/Charts/pull/3366) ([Ewg777](https://github.com/Ewg777)) +- Add option to disable clipping data to contentRect [\#3360](https://github.com/danielgindi/Charts/pull/3360) ([wtmoose](https://github.com/wtmoose)) + +## [v3.1.0](https://github.com/danielgindi/Charts/tree/v3.1.0) (2018-03-22) +[Full Changelog](https://github.com/danielgindi/Charts/compare/3.1.0...v3.1.0) + +## [3.1.0](https://github.com/danielgindi/Charts/tree/3.1.0) (2018-03-22) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v3.0.5...3.1.0) + +**Fixed bugs:** + +- Bug in ZoomViewJob? [\#3299](https://github.com/danielgindi/Charts/issues/3299) +- BarChartView bug if set barWidth was 1.0? [\#3213](https://github.com/danielgindi/Charts/issues/3213) +- Scatter circle disappear when chart scaled [\#3185](https://github.com/danielgindi/Charts/issues/3185) +- PieChart `highlightValue\(x:y:dataSetIndex:\)` should provide error for dataSetIndex \> 1 [\#3146](https://github.com/danielgindi/Charts/issues/3146) +- PieChart size is extremely small in a UITableViewCell [\#3108](https://github.com/danielgindi/Charts/issues/3108) +- Handling critical Y values with autoScaleMinMaxEnabled [\#2053](https://github.com/danielgindi/Charts/issues/2053) +- Charts 3.0 - Error: this application, or a library it uses, has passed an invalid numeric value \(NaN, or not-a-number\) to CoreGraphics API and this value is being ignored [\#1626](https://github.com/danielgindi/Charts/issues/1626) + +**Closed issues:** + +- Programatically passed renderer is corrupting animations [\#3349](https://github.com/danielgindi/Charts/issues/3349) +- How to show Integer value [\#3346](https://github.com/danielgindi/Charts/issues/3346) +- Does not build on Xcode 8.3.3 & Swift 3 [\#3341](https://github.com/danielgindi/Charts/issues/3341) +- how to use pod 'Charts' into objective c project , i create header file to use swift , but what should i do after create header file ? [\#3338](https://github.com/danielgindi/Charts/issues/3338) +- How to show all labels in xAxis ? [\#3337](https://github.com/danielgindi/Charts/issues/3337) +- How to set the interval in X axis label [\#3335](https://github.com/danielgindi/Charts/issues/3335) +- Line chart with solid and dashed line [\#3334](https://github.com/danielgindi/Charts/issues/3334) +- Code signing is required for product type 'Application' in SDK 'iOS 11.2' [\#3333](https://github.com/danielgindi/Charts/issues/3333) +- My project within framework target and pod Charts into my framework target can't load Charts framework [\#3328](https://github.com/danielgindi/Charts/issues/3328) +- Swift 4.1 compilation warnings [\#3323](https://github.com/danielgindi/Charts/issues/3323) +- Two Horizontal grid lines always appear above Base Axis line [\#3322](https://github.com/danielgindi/Charts/issues/3322) +- BalloonMarker support swift 3 ? [\#3321](https://github.com/danielgindi/Charts/issues/3321) +- Unable to get horizontal scrolling in bar chart [\#3319](https://github.com/danielgindi/Charts/issues/3319) +- Horizontal Bar Chart xAxis formatted label textColor [\#3317](https://github.com/danielgindi/Charts/issues/3317) +- Wrong dataSetIndex in stringForValue delegate method [\#3314](https://github.com/danielgindi/Charts/issues/3314) +- Limit line in the left and right drag or zoom can be fixed [\#3313](https://github.com/danielgindi/Charts/issues/3313) +- Save picture crash in demos on iOS 11+ [\#3311](https://github.com/danielgindi/Charts/issues/3311) +- How to display reload text in iOS-Charts? [\#3310](https://github.com/danielgindi/Charts/issues/3310) +- Can't show Label text in XAxis [\#3308](https://github.com/danielgindi/Charts/issues/3308) +- Straight lines [\#3306](https://github.com/danielgindi/Charts/issues/3306) +- Values on X axis issue [\#3304](https://github.com/danielgindi/Charts/issues/3304) +- when setInverted\(true\) in the leftAxis of CombinedChart, the candleStickData doesnot show ? [\#3303](https://github.com/danielgindi/Charts/issues/3303) +- HorizontalBarChart X axe labels duplicated [\#3300](https://github.com/danielgindi/Charts/issues/3300) +- how can i change label color? [\#3298](https://github.com/danielgindi/Charts/issues/3298) +- value granularity [\#3296](https://github.com/danielgindi/Charts/issues/3296) +- Better way to manage Stacked Bar Chart Value labels? [\#3295](https://github.com/danielgindi/Charts/issues/3295) +- Remove Y axis border line in Line Graph [\#3294](https://github.com/danielgindi/Charts/issues/3294) +- XAxisRenderer not called [\#3293](https://github.com/danielgindi/Charts/issues/3293) +- How to display string value on xAxis label in line chart [\#3292](https://github.com/danielgindi/Charts/issues/3292) +- how to change the color of text that displayed below the chart ios swift 3 [\#3288](https://github.com/danielgindi/Charts/issues/3288) +- color in BalloonMarker is never used [\#3287](https://github.com/danielgindi/Charts/issues/3287) +- Question: LineChart variable line thickness? [\#3285](https://github.com/danielgindi/Charts/issues/3285) +- Modify selected slice [\#3284](https://github.com/danielgindi/Charts/issues/3284) +- Put shadow under slice [\#3283](https://github.com/danielgindi/Charts/issues/3283) +- How can I take selected value index in Pie Chart [\#3282](https://github.com/danielgindi/Charts/issues/3282) +- hide other label when one slice of pie chart was selected [\#3281](https://github.com/danielgindi/Charts/issues/3281) +- How to show custom x and y axis details in LineChart in objective c ??? [\#3280](https://github.com/danielgindi/Charts/issues/3280) +- I need to put dates from an array on xAxis [\#3277](https://github.com/danielgindi/Charts/issues/3277) +- Is there a way to round the corners of the BalloonMarker? [\#3276](https://github.com/danielgindi/Charts/issues/3276) +- Set values not showing until chart is zoomed [\#3275](https://github.com/danielgindi/Charts/issues/3275) +- How to add gap between chart and legend? [\#3274](https://github.com/danielgindi/Charts/issues/3274) +- LineChart : How to show the grid in right axis [\#3271](https://github.com/danielgindi/Charts/issues/3271) +- How to custom axis' label in horizontal bar chart [\#3270](https://github.com/danielgindi/Charts/issues/3270) +- LineChart: How to fix space between point on xAxis [\#3269](https://github.com/danielgindi/Charts/issues/3269) +- Line Chart Issue in CombinedChartView [\#3268](https://github.com/danielgindi/Charts/issues/3268) +- LineChartRenderer - drawHighlighted:context:indices: [\#3267](https://github.com/danielgindi/Charts/issues/3267) +- Scatter Bar Char - Plots on axis \(0,0\) partially visible [\#3266](https://github.com/danielgindi/Charts/issues/3266) +- is it support the ios 7??? [\#3263](https://github.com/danielgindi/Charts/issues/3263) +- Combined chart for candlestick + bar [\#3262](https://github.com/danielgindi/Charts/issues/3262) +- setScatterShape applied to Legend also [\#3261](https://github.com/danielgindi/Charts/issues/3261) +- ChartDataSet min and max values not recalculated when calling clear\(\) [\#3260](https://github.com/danielgindi/Charts/issues/3260) +- How to realize the Line and the bar Chart in the same one Chart? [\#3259](https://github.com/danielgindi/Charts/issues/3259) +- '\_xBounds' and other variables inaccessible due to 'internal' protection level workaround [\#3258](https://github.com/danielgindi/Charts/issues/3258) +- //view\_line\_graph.centerViewTo\(xValue: Double\(dataEntries\[pos\].x\) , yValue: Double\(dataEntries\[pos\].y\), axis: YAxis.AxisDependency.right\) [\#3257](https://github.com/danielgindi/Charts/issues/3257) +- dyld: Library not loaded: @rpath/Charts.framework/Charts [\#3250](https://github.com/danielgindi/Charts/issues/3250) +- X Axis disapeared [\#3249](https://github.com/danielgindi/Charts/issues/3249) +- Save zoom state [\#3248](https://github.com/danielgindi/Charts/issues/3248) +- leftAxis label bug? [\#3246](https://github.com/danielgindi/Charts/issues/3246) +- x-axis label jumps when zoomed in and side scrolling. [\#3245](https://github.com/danielgindi/Charts/issues/3245) +- avoidFirstLastClippingEnabled not working and set last circleColor a different value [\#3244](https://github.com/danielgindi/Charts/issues/3244) +- Got totally 50 errors after install CocoaPods ..! I am using Swift 4.0 [\#3243](https://github.com/danielgindi/Charts/issues/3243) +- Error in Library When added pod file [\#3242](https://github.com/danielgindi/Charts/issues/3242) +- How to do multiple data on x axis? [\#3241](https://github.com/danielgindi/Charts/issues/3241) +- Missing entries in PieChartDataEntry legends. [\#3240](https://github.com/danielgindi/Charts/issues/3240) +- Candle Stick does not show [\#3239](https://github.com/danielgindi/Charts/issues/3239) +- How i give LineChart Entry using x index and y value in Charts '3.0.4'? help wanted [\#3238](https://github.com/danielgindi/Charts/issues/3238) +- ChartDataEntry with icons shows scatter shape at same time [\#3237](https://github.com/danielgindi/Charts/issues/3237) +- HorizontalBarChart - Right axis label starts with the highest value up to the same value [\#3235](https://github.com/danielgindi/Charts/issues/3235) +- Carthage Charts [\#3234](https://github.com/danielgindi/Charts/issues/3234) +- 3.0.5 Bar chart xAxis valueFormatter regression - no data points shown. [\#3233](https://github.com/danielgindi/Charts/issues/3233) +- Pin the graph on one side while zooming [\#3232](https://github.com/danielgindi/Charts/issues/3232) +- yAxisMaximum auto-increment RadarChartView [\#3231](https://github.com/danielgindi/Charts/issues/3231) +- Compile issue after install pod 'Chart' [\#3230](https://github.com/danielgindi/Charts/issues/3230) +- corner line chart [\#3227](https://github.com/danielgindi/Charts/issues/3227) +- Make specific pieChart segment stick out and go back to normal size, animated [\#3224](https://github.com/danielgindi/Charts/issues/3224) +- Dash line and highlighted top value [\#3221](https://github.com/danielgindi/Charts/issues/3221) +- Why is the xAxis Value Formater so often called? [\#3220](https://github.com/danielgindi/Charts/issues/3220) +- How easy is to add some technical indicators? [\#3219](https://github.com/danielgindi/Charts/issues/3219) +- How to set X-Axis data to bottom of chart with strings data? [\#3212](https://github.com/danielgindi/Charts/issues/3212) +- how to drag the LineChartView [\#3211](https://github.com/danielgindi/Charts/issues/3211) +- Release 3.0.5 contains version number inconsistencies [\#3210](https://github.com/danielgindi/Charts/issues/3210) +- Unable to Hide PieChart Legends. [\#3209](https://github.com/danielgindi/Charts/issues/3209) +- Recent release with my Swift3 project [\#3208](https://github.com/danielgindi/Charts/issues/3208) +- Cannot set double value in Combined chart line chart. [\#3205](https://github.com/danielgindi/Charts/issues/3205) +- Bar charts with different column widths [\#3204](https://github.com/danielgindi/Charts/issues/3204) +- Labels on x-axes not linked to chart data points [\#3203](https://github.com/danielgindi/Charts/issues/3203) +- Remark: The AppCoda tutorial is outdated [\#3196](https://github.com/danielgindi/Charts/issues/3196) +- Unable to set strings as values in x axis of linechart [\#3195](https://github.com/danielgindi/Charts/issues/3195) +- drag event issie [\#3194](https://github.com/danielgindi/Charts/issues/3194) +- Custom XAxisRenderer labels are shifting around when scrolling [\#3193](https://github.com/danielgindi/Charts/issues/3193) +- How to asynchronous drawings LineChart? [\#3192](https://github.com/danielgindi/Charts/issues/3192) +- How do I listen to the left or right to the end of the event when I zoom in on the lineCharts? [\#3184](https://github.com/danielgindi/Charts/issues/3184) +- Want to delete color set beside legend label [\#3180](https://github.com/danielgindi/Charts/issues/3180) +- How to show/hide Stacked Bar Chart yValue? [\#3175](https://github.com/danielgindi/Charts/issues/3175) +- Readme needs to be updated for 3.0.5 [\#3170](https://github.com/danielgindi/Charts/issues/3170) +- Add Axis description to Charts Framework [\#3168](https://github.com/danielgindi/Charts/issues/3168) +- ChartViewDelegate not called when barChart is out of screen [\#3165](https://github.com/danielgindi/Charts/issues/3165) +- dash line \(separators\) in between in bars. [\#3163](https://github.com/danielgindi/Charts/issues/3163) +- StackedBarChart Value on middle of each stacked bar chart [\#3162](https://github.com/danielgindi/Charts/issues/3162) +- ChartLimitLine Label Position [\#3161](https://github.com/danielgindi/Charts/issues/3161) +- bar chat [\#3158](https://github.com/danielgindi/Charts/issues/3158) +- Bar coloring [\#3157](https://github.com/danielgindi/Charts/issues/3157) +- HorizontalBarChart doesn't display bar draw values when bar is partially off ViewPort [\#3155](https://github.com/danielgindi/Charts/issues/3155) +- X-Axis Labels not showing [\#3154](https://github.com/danielgindi/Charts/issues/3154) +- How to make highlight scrolling on chart not trigger parent scrollView? \[help\] [\#3153](https://github.com/danielgindi/Charts/issues/3153) +- How to fill the color like the marked part of this following picture? Thanks a lot! [\#3144](https://github.com/danielgindi/Charts/issues/3144) +- finger leaves the chart area [\#3128](https://github.com/danielgindi/Charts/issues/3128) +- Technical Support in Github [\#3126](https://github.com/danielgindi/Charts/issues/3126) +- Plotting the bar from top to bottom \(in reverse manner\) [\#3125](https://github.com/danielgindi/Charts/issues/3125) +- pieChart Data name overlap [\#3109](https://github.com/danielgindi/Charts/issues/3109) +- LineChart with different colors based on values. [\#3107](https://github.com/danielgindi/Charts/issues/3107) +- AxisBase Value Formatter [\#3105](https://github.com/danielgindi/Charts/issues/3105) +- Multiple charts in same view [\#3103](https://github.com/danielgindi/Charts/issues/3103) +- Draw dotted x-axis timeline [\#3102](https://github.com/danielgindi/Charts/issues/3102) +- PieChart value labels are overlaping when values are between 0 to 9 [\#2948](https://github.com/danielgindi/Charts/issues/2948) +- xValues on X-Axis for non-continuous dates [\#2398](https://github.com/danielgindi/Charts/issues/2398) +- y-labels position is wrong,when i set autoScaleMinMaxEnabled = YES [\#2379](https://github.com/danielgindi/Charts/issues/2379) +- Distance between chart legend and the horizontal bar chart is to big in case of rotated labels [\#2138](https://github.com/danielgindi/Charts/issues/2138) +- How to set LabelCount bigger than 25 in HorizatalBarView [\#2085](https://github.com/danielgindi/Charts/issues/2085) + +**Merged pull requests:** + +- bump to 3.1 release [\#3357](https://github.com/danielgindi/Charts/pull/3357) ([liuxuan30](https://github.com/liuxuan30)) +- Refactors -\[tableView:cellForRowAtIndexPath:\] [\#3326](https://github.com/danielgindi/Charts/pull/3326) ([valeriyvan](https://github.com/valeriyvan)) +- minor bug fix in favor of 3.1 release [\#3312](https://github.com/danielgindi/Charts/pull/3312) ([liuxuan30](https://github.com/liuxuan30)) +- add pie chart unit tests [\#3297](https://github.com/danielgindi/Charts/pull/3297) ([liuxuan30](https://github.com/liuxuan30)) +- Align Objc and Swift demos balloon marker [\#3291](https://github.com/danielgindi/Charts/pull/3291) ([liuxuan30](https://github.com/liuxuan30)) +- for \#3146. add a warning message if pie chart has more than one data set [\#3286](https://github.com/danielgindi/Charts/pull/3286) ([liuxuan30](https://github.com/liuxuan30)) +- Issue templates [\#3278](https://github.com/danielgindi/Charts/pull/3278) ([jjatie](https://github.com/jjatie)) +- Min and Max reset when clearing ChartDataSet \(Fixes \#3260\) [\#3265](https://github.com/danielgindi/Charts/pull/3265) ([carlo-](https://github.com/carlo-)) +- Restored old performance in ChartDataSet [\#3216](https://github.com/danielgindi/Charts/pull/3216) ([jjatie](https://github.com/jjatie)) +- Support other bundle than main MarkerView.viewFromXib\(\) [\#3215](https://github.com/danielgindi/Charts/pull/3215) ([charlymr](https://github.com/charlymr)) +- BubbleChart uses correct colour for index now. [\#3202](https://github.com/danielgindi/Charts/pull/3202) ([jjatie](https://github.com/jjatie)) +- Added custom text alignment for noData [\#3199](https://github.com/danielgindi/Charts/pull/3199) ([jjatie](https://github.com/jjatie)) +- Call setNeedsDisplay\(\) to trigger render noDataText [\#3198](https://github.com/danielgindi/Charts/pull/3198) ([liuxuan30](https://github.com/liuxuan30)) +- Updated README for 3.0.5 [\#3183](https://github.com/danielgindi/Charts/pull/3183) ([jjatie](https://github.com/jjatie)) +- Balloon Marker indicates position of data [\#3181](https://github.com/danielgindi/Charts/pull/3181) ([jjatie](https://github.com/jjatie)) +- Fixed a duplicated assignment compared with obj-c code. [\#3179](https://github.com/danielgindi/Charts/pull/3179) ([canapio](https://github.com/canapio)) +- Fixed X-Axis Labels Not Showing \(\#3154\) [\#3174](https://github.com/danielgindi/Charts/pull/3174) ([leedsalex](https://github.com/leedsalex)) +- fix programatical unhighlighting for BarCharView [\#3159](https://github.com/danielgindi/Charts/pull/3159) ([jekahy](https://github.com/jekahy)) +- Removed optionality from valueFormatter where appropriate [\#3106](https://github.com/danielgindi/Charts/pull/3106) ([jjatie](https://github.com/jjatie)) +- Moved the default value formatter [\#3088](https://github.com/danielgindi/Charts/pull/3088) ([jjatie](https://github.com/jjatie)) +- Utils Cleanup [\#3054](https://github.com/danielgindi/Charts/pull/3054) ([jjatie](https://github.com/jjatie)) +- weak -\> unowned [\#3039](https://github.com/danielgindi/Charts/pull/3039) ([jjatie](https://github.com/jjatie)) +- Fix BalloonMarker's text position calculation, consider insets [\#3035](https://github.com/danielgindi/Charts/pull/3035) ([yangcaimu](https://github.com/yangcaimu)) +- Chartdata collection refactor [\#3024](https://github.com/danielgindi/Charts/pull/3024) ([jjatie](https://github.com/jjatie)) +- Chartdata collection conformance [\#3023](https://github.com/danielgindi/Charts/pull/3023) ([jjatie](https://github.com/jjatie)) +- Give the users customizable axis label limits \(Fixes \#2085\) [\#2894](https://github.com/danielgindi/Charts/pull/2894) ([igzrobertoestrada](https://github.com/igzrobertoestrada)) +- For \#2840. add dataIndex parameter in `highlightValue\(\)` calls [\#2852](https://github.com/danielgindi/Charts/pull/2852) ([liuxuan30](https://github.com/liuxuan30)) +- fix \#2356 crash if floor\(10.0 \* intervalMagnitude\) is 0.0 [\#2377](https://github.com/danielgindi/Charts/pull/2377) ([liuxuan30](https://github.com/liuxuan30)) +- Fixes the distance issue between the legend and the horizontal bar chart \(Fixes \#2138\) [\#2214](https://github.com/danielgindi/Charts/pull/2214) ([SvenMuc](https://github.com/SvenMuc)) + +## [v3.0.5](https://github.com/danielgindi/Charts/tree/v3.0.5) (2018-01-08) +[Full Changelog](https://github.com/danielgindi/Charts/compare/3.0.5...v3.0.5) + +## [3.0.5](https://github.com/danielgindi/Charts/tree/3.0.5) (2018-01-08) +[Full Changelog](https://github.com/danielgindi/Charts/compare/3.0.4...3.0.5) + +**Implemented enhancements:** + +- range, and therefore interval, is NaN in computeAxisValues [\#2845](https://github.com/danielgindi/Charts/issues/2845) +- Crash when calling `func highlightValue\(x: Double, dataSetIndex: Int, callDelegate: Bool\)` [\#2840](https://github.com/danielgindi/Charts/issues/2840) + +**Fixed bugs:** + +- Combined Chart, when highlight is active, bars hides line [\#3091](https://github.com/danielgindi/Charts/issues/3091) +- A problem of CombinedChartView's YAxis [\#1830](https://github.com/danielgindi/Charts/issues/1830) + +**Closed issues:** + +- Command /bin/sh failed with exit code 1 [\#3156](https://github.com/danielgindi/Charts/issues/3156) +- Xcode 9 / Swift 4 issue with current master [\#3152](https://github.com/danielgindi/Charts/issues/3152) +- Is it possible to show value on touch next to highlight position? [\#3151](https://github.com/danielgindi/Charts/issues/3151) +- Remove legend [\#3150](https://github.com/danielgindi/Charts/issues/3150) +- Add a shadow to the line chart [\#3148](https://github.com/danielgindi/Charts/issues/3148) +- Missing alternate x-axis labels on line chart [\#3139](https://github.com/danielgindi/Charts/issues/3139) +- Can the histogram set the corner? [\#3138](https://github.com/danielgindi/Charts/issues/3138) +- Charts demo ipa file request [\#3137](https://github.com/danielgindi/Charts/issues/3137) +- Main Thread Checker: UI API called on background thread. [\#3129](https://github.com/danielgindi/Charts/issues/3129) +- How to get X\_axis touch points coordinates in radar graph [\#3127](https://github.com/danielgindi/Charts/issues/3127) +- Division by zero crash in AxisRendererBase [\#3124](https://github.com/danielgindi/Charts/issues/3124) +- why bar chart non start at zero [\#3123](https://github.com/danielgindi/Charts/issues/3123) +- BarChart - Show X-Axis with Step as 1 [\#3122](https://github.com/danielgindi/Charts/issues/3122) +- Have Line Graph Value Labels Above/Below Independently [\#3120](https://github.com/danielgindi/Charts/issues/3120) +- Corner Radius on Grid Background [\#3119](https://github.com/danielgindi/Charts/issues/3119) +- ChartsDemo doesn't compile [\#3116](https://github.com/danielgindi/Charts/issues/3116) +- Rounded line chart [\#3115](https://github.com/danielgindi/Charts/issues/3115) +- value of barChart covered by title [\#3113](https://github.com/danielgindi/Charts/issues/3113) +- PieChartView Can not highlight which i want to highlighted [\#3110](https://github.com/danielgindi/Charts/issues/3110) +- How to scroll bar chart if max values to show? [\#3101](https://github.com/danielgindi/Charts/issues/3101) +- Is it possible to draw a chart like this? [\#3097](https://github.com/danielgindi/Charts/issues/3097) +- How to disable the rotation option of pie charts in iOS charts? [\#3096](https://github.com/danielgindi/Charts/issues/3096) +- How to disable the rotation option of pie charts in iOS charts? [\#3095](https://github.com/danielgindi/Charts/issues/3095) +- 数据空值处理问题 [\#3094](https://github.com/danielgindi/Charts/issues/3094) +- how to display the integer values on pie chart instead of float? [\#3093](https://github.com/danielgindi/Charts/issues/3093) +- Line Chart point colours depend on value at each point [\#3090](https://github.com/danielgindi/Charts/issues/3090) +- how to cancel highlights when the drag gesture ends [\#3089](https://github.com/danielgindi/Charts/issues/3089) +- why my value is .50 ?Why not 0.5? How to do? [\#3083](https://github.com/danielgindi/Charts/issues/3083) +- how to use String in YAxis, rather than Double? [\#3082](https://github.com/danielgindi/Charts/issues/3082) +- Scrolling axis [\#3081](https://github.com/danielgindi/Charts/issues/3081) +- Clipping of values in line graph [\#3077](https://github.com/danielgindi/Charts/issues/3077) +- \[LineChart\] Ignore / don't plot first or end value [\#3075](https://github.com/danielgindi/Charts/issues/3075) +- Which attribute control the yellow line,like the picture? [\#3074](https://github.com/danielgindi/Charts/issues/3074) +- Archive error using swift 4.0 [\#3072](https://github.com/danielgindi/Charts/issues/3072) +- How can I have a chart like this one? [\#3070](https://github.com/danielgindi/Charts/issues/3070) +- Module compiled with Swift 4.0 cannot be imported in Swift 3.2.3 [\#3068](https://github.com/danielgindi/Charts/issues/3068) +- Unable to make chart look like IOS Stock App after trying every mode \(LineChartModeLinear = 0, LineChartModeStepped = 1, LineChartModeCubicBezier = 2, LineChartModeHorizontalBezier = 3\) of LineChartDataSet [\#3066](https://github.com/danielgindi/Charts/issues/3066) +- Cannot Select barChar column [\#3065](https://github.com/danielgindi/Charts/issues/3065) +- Updating data in LineChart takes up to 30 seconds [\#3064](https://github.com/danielgindi/Charts/issues/3064) +- How to sync the scrolling of 2 charts [\#3063](https://github.com/danielgindi/Charts/issues/3063) +- Line chart with bottom spacing and custom position y-labels at min and max values [\#3059](https://github.com/danielgindi/Charts/issues/3059) +- 'characters' is deprecated: Please use String or Substring directly [\#3057](https://github.com/danielgindi/Charts/issues/3057) +- Pod to OC error [\#3053](https://github.com/danielgindi/Charts/issues/3053) +- How to represent a null value,It's like the picture? not 0 [\#3052](https://github.com/danielgindi/Charts/issues/3052) +- dyld library not loaded @rpath/charts.framework/charts reason : image not found XCode 9.1 MacOS version 10.12.6 [\#3050](https://github.com/danielgindi/Charts/issues/3050) +- Can't change the border width of circle point in line chart. [\#3049](https://github.com/danielgindi/Charts/issues/3049) +- Charts library is not working in Swift 4 Xcode 9 [\#3048](https://github.com/danielgindi/Charts/issues/3048) +- Create an image of the entire chart [\#3037](https://github.com/danielgindi/Charts/issues/3037) +- lineChartView only enables one data set to be with icons [\#3036](https://github.com/danielgindi/Charts/issues/3036) +- Add charts to UIView programatically [\#3033](https://github.com/danielgindi/Charts/issues/3033) +- Only disable animation for adding values [\#3031](https://github.com/danielgindi/Charts/issues/3031) +- BarChartDataSet with only negative values doesn't call stringForValue on formatter [\#3030](https://github.com/danielgindi/Charts/issues/3030) +- Please provide an example for pieradarchart [\#3029](https://github.com/danielgindi/Charts/issues/3029) +- Multiple charts in a collection view [\#3028](https://github.com/danielgindi/Charts/issues/3028) +- Bubbles chart [\#3027](https://github.com/danielgindi/Charts/issues/3027) +- delete [\#3025](https://github.com/danielgindi/Charts/issues/3025) +- How to change position xAxis Label on the Top Bar Chart ? [\#3022](https://github.com/danielgindi/Charts/issues/3022) +- How to decrease space between chartData ? Is there any parameter ? [\#3021](https://github.com/danielgindi/Charts/issues/3021) +- 已解决 [\#3020](https://github.com/danielgindi/Charts/issues/3020) +- Drawing min mix median lines [\#3017](https://github.com/danielgindi/Charts/issues/3017) +- Installation error through cocapods [\#3016](https://github.com/danielgindi/Charts/issues/3016) +- Swift 4.0.2 not compatible [\#3015](https://github.com/danielgindi/Charts/issues/3015) +- Error NSAttributedStringKey.font on Xcode 9.1 Swift 4 with Charts \(3.0.4\) [\#3014](https://github.com/danielgindi/Charts/issues/3014) +- Double Bar Lines [\#3013](https://github.com/danielgindi/Charts/issues/3013) +- Same zero line for left and right axis [\#3011](https://github.com/danielgindi/Charts/issues/3011) +- How to get version 3.0.2 ? [\#3009](https://github.com/danielgindi/Charts/issues/3009) +- How can I scroll to previous data? [\#3006](https://github.com/danielgindi/Charts/issues/3006) +- Crashing in X-axis render method. [\#3004](https://github.com/danielgindi/Charts/issues/3004) +- How to align yAxis at zero point? [\#2989](https://github.com/danielgindi/Charts/issues/2989) +- Line Chart View not drawn because Date values in xAxis \(not sorted Ascending/Descending\) ? [\#2988](https://github.com/danielgindi/Charts/issues/2988) +- Showing .0, .00 accoding the the decimal places insted of 0 in graphs [\#2987](https://github.com/danielgindi/Charts/issues/2987) +- How to select one of them in the first time。 [\#2985](https://github.com/danielgindi/Charts/issues/2985) +- 当饼状图的数据为0%的时候,左下角有个多余的字母N,问题已解决,有遇到这个问题的请私聊我 [\#2984](https://github.com/danielgindi/Charts/issues/2984) +- Scale to particular x-axis range in line chart [\#2979](https://github.com/danielgindi/Charts/issues/2979) +- ChartViewDelegate [\#2978](https://github.com/danielgindi/Charts/issues/2978) +- What is the compatible version with Xcode 8.3.3 ? [\#2977](https://github.com/danielgindi/Charts/issues/2977) +- ScatterChartDataSet troubles with alignments. [\#2976](https://github.com/danielgindi/Charts/issues/2976) +- Uneven X-Axis values for a line chart [\#2975](https://github.com/danielgindi/Charts/issues/2975) +- Stacked bar chart value label clipped [\#2974](https://github.com/danielgindi/Charts/issues/2974) +- Pie chart monochrome or gradient fill not support [\#2973](https://github.com/danielgindi/Charts/issues/2973) +- PieChart:- PieChart not completely show. [\#2972](https://github.com/danielgindi/Charts/issues/2972) +- Error after updating to Xcode 9.1 [\#2970](https://github.com/danielgindi/Charts/issues/2970) +- Add cornerRadius to vertical highlighter line and draw circle only on highlight [\#2969](https://github.com/danielgindi/Charts/issues/2969) +- How can I don't draw lines when data absent at some point? [\#2968](https://github.com/danielgindi/Charts/issues/2968) +- How to use your file directly to my project without pod installation? [\#2964](https://github.com/danielgindi/Charts/issues/2964) +- Line chart lines are clipped [\#2963](https://github.com/danielgindi/Charts/issues/2963) +- Marker with multiple datasets [\#2962](https://github.com/danielgindi/Charts/issues/2962) +- how do i run it in xcode 9?? [\#2958](https://github.com/danielgindi/Charts/issues/2958) +- Regarding Xcode version [\#2957](https://github.com/danielgindi/Charts/issues/2957) +- Cannot align chart description on left instead of right [\#2956](https://github.com/danielgindi/Charts/issues/2956) +- change color of bar chart programmatically ? [\#2954](https://github.com/danielgindi/Charts/issues/2954) +- Remove or change line color in chart [\#2953](https://github.com/danielgindi/Charts/issues/2953) +- Show line bar position per seconds [\#2952](https://github.com/danielgindi/Charts/issues/2952) +- Add Two Custom Marker views on linechart graph [\#2951](https://github.com/danielgindi/Charts/issues/2951) +- Display high and low value in chart but Displayed one only [\#2947](https://github.com/danielgindi/Charts/issues/2947) +- Change LineChartDataSet label color not value color. [\#2944](https://github.com/danielgindi/Charts/issues/2944) +- when dataset value is increases then the graph value is misplace . and i am showing three bar in one group. and also show the integer value in particular bar above. [\#2938](https://github.com/danielgindi/Charts/issues/2938) +- Errors after conversion to Swift4 NSAttributedStringKey [\#2937](https://github.com/danielgindi/Charts/issues/2937) +- xAxis setLabelsToSkip and valuesObjc want to have replace api [\#2936](https://github.com/danielgindi/Charts/issues/2936) +- xAxis value is started with 0 but it not coordinate with y axis 0 value [\#2935](https://github.com/danielgindi/Charts/issues/2935) +- line charts with many gradients according the value [\#2934](https://github.com/danielgindi/Charts/issues/2934) +- Xcode 9.1 - Characters is deprecated [\#2933](https://github.com/danielgindi/Charts/issues/2933) +- How to add corner radius to balloonmarker [\#2932](https://github.com/danielgindi/Charts/issues/2932) +- leftAxis and rightAxis didn't show up [\#2931](https://github.com/danielgindi/Charts/issues/2931) +- Errors when importing BalloonMarker [\#2928](https://github.com/danielgindi/Charts/issues/2928) +- Bar chart does not start at zero. [\#2927](https://github.com/danielgindi/Charts/issues/2927) +- The following binaries use incompatible versions of Swift [\#2926](https://github.com/danielgindi/Charts/issues/2926) +- Change the color of a specific X-Axis label and the corresponding data value in a line chart using Charts framework [\#2925](https://github.com/danielgindi/Charts/issues/2925) +- Adding corner radius on top of Bar [\#2924](https://github.com/danielgindi/Charts/issues/2924) +- I want to change colour of the label text on the x-axis where it's highlighted. [\#2923](https://github.com/danielgindi/Charts/issues/2923) +- How to give Gradient colour for limit line in linechartviewDataSet [\#2922](https://github.com/danielgindi/Charts/issues/2922) +- Gradient colour for stroke line horizantally .It is possible in android [\#2921](https://github.com/danielgindi/Charts/issues/2921) +- y axis range not automatically recalculated when adding entry to data set [\#2920](https://github.com/danielgindi/Charts/issues/2920) +- Build framework from project [\#2919](https://github.com/danielgindi/Charts/issues/2919) +- How to draw a diagram above the axis labels? [\#2918](https://github.com/danielgindi/Charts/issues/2918) +- - [\#2917](https://github.com/danielgindi/Charts/issues/2917) +- How to use IValueFormatter in stacked bar chart [\#2916](https://github.com/danielgindi/Charts/issues/2916) +- Use of unresolved identifier NSAttributedStringKey in Xcode 8.3.2 for swift 3 [\#2915](https://github.com/danielgindi/Charts/issues/2915) +- Barchart with rounded bar style [\#2912](https://github.com/danielgindi/Charts/issues/2912) +- Animate adding single point [\#2911](https://github.com/danielgindi/Charts/issues/2911) +- Crash [\#2910](https://github.com/danielgindi/Charts/issues/2910) +- Multi Window [\#2909](https://github.com/danielgindi/Charts/issues/2909) +- how can I unhighlight any slice selected before in PieChart ? [\#2908](https://github.com/danielgindi/Charts/issues/2908) +- Barchart DefaultValueFormatter dataSetIndex always 0 [\#2907](https://github.com/danielgindi/Charts/issues/2907) +- LineChartDataSet Multi color [\#2906](https://github.com/danielgindi/Charts/issues/2906) +- How to disconnect data points? [\#2905](https://github.com/danielgindi/Charts/issues/2905) +- Licensing question [\#2904](https://github.com/danielgindi/Charts/issues/2904) +- A way to add values to labels on x axis? [\#2903](https://github.com/danielgindi/Charts/issues/2903) +- Update cocoapods.org version [\#2902](https://github.com/danielgindi/Charts/issues/2902) +- noDataText for PieChartView isn't working. [\#2901](https://github.com/danielgindi/Charts/issues/2901) +- xcode9 alert swift question [\#2900](https://github.com/danielgindi/Charts/issues/2900) +- Dynamically set the bar width [\#2898](https://github.com/danielgindi/Charts/issues/2898) +- Marker action [\#2897](https://github.com/danielgindi/Charts/issues/2897) +- Filler line for acceptable range of values in LineChart [\#2896](https://github.com/danielgindi/Charts/issues/2896) +- Pie chart full view [\#2895](https://github.com/danielgindi/Charts/issues/2895) +- Problem with BalloonMarker in lineChart [\#2892](https://github.com/danielgindi/Charts/issues/2892) +- OS X Bar chart Demo highlight and stacked color are inconsistent [\#2890](https://github.com/danielgindi/Charts/issues/2890) +- Problem with charts in UITableView cells [\#2888](https://github.com/danielgindi/Charts/issues/2888) +- drawing xAxis ratio values [\#2885](https://github.com/danielgindi/Charts/issues/2885) +- Xcode 9 compatibility [\#2883](https://github.com/danielgindi/Charts/issues/2883) +- Large Whitespace Between X-Axis Labels and Legend [\#2882](https://github.com/danielgindi/Charts/issues/2882) +- help about performance issues about line charts [\#2881](https://github.com/danielgindi/Charts/issues/2881) +- Animation on PieChartView [\#2880](https://github.com/danielgindi/Charts/issues/2880) +- Scrolling chart after setting lineChart.xAxis.axisMaximum = someValue [\#2879](https://github.com/danielgindi/Charts/issues/2879) +- "chartValueSelected" is not getting called in customView [\#2878](https://github.com/danielgindi/Charts/issues/2878) +- curve line [\#2877](https://github.com/danielgindi/Charts/issues/2877) +- Swift 4 issue [\#2876](https://github.com/danielgindi/Charts/issues/2876) +- 不显示百分号了 [\#2873](https://github.com/danielgindi/Charts/issues/2873) +- LineChartView: Using two different colors in one dataset [\#2871](https://github.com/danielgindi/Charts/issues/2871) +- xcode 9.0 errors after installing pod 'Charts' [\#2869](https://github.com/danielgindi/Charts/issues/2869) +- Change scroll direction HorizontalBarChartView x-axis from top to bottom chart [\#2868](https://github.com/danielgindi/Charts/issues/2868) +- Set names of X-axis and Y-axis itself \(not their labels\) [\#2867](https://github.com/danielgindi/Charts/issues/2867) +- 'characters' is deprecated: Please use String or Substring directly [\#2866](https://github.com/danielgindi/Charts/issues/2866) +- Syntax error in pod [\#2865](https://github.com/danielgindi/Charts/issues/2865) +- Filled Line Chart [\#2863](https://github.com/danielgindi/Charts/issues/2863) +- How can I highlight a specific slice of the PieChart? [\#2862](https://github.com/danielgindi/Charts/issues/2862) +- How can I make the chart rotate completely, 360, 720 on a button click ? [\#2861](https://github.com/danielgindi/Charts/issues/2861) +- How can I make the chart rotate completely, 360, 720 on a button click ? [\#2860](https://github.com/danielgindi/Charts/issues/2860) +- xcode9 pod install have a problem [\#2856](https://github.com/danielgindi/Charts/issues/2856) +- can I implement stacked bar with rounded corners ? [\#2855](https://github.com/danielgindi/Charts/issues/2855) +- Updating Charts to 3.0.4 and Swift 4 doesn't work [\#2851](https://github.com/danielgindi/Charts/issues/2851) +- How to add string labels to XAxis horizontal bar in Charts framework\(swift 3\) [\#2850](https://github.com/danielgindi/Charts/issues/2850) +- How to show off numbers in HorizontalBar [\#2849](https://github.com/danielgindi/Charts/issues/2849) +- In Multiple bar chart Unable to set Values more than 4 bar in under given year.. [\#2847](https://github.com/danielgindi/Charts/issues/2847) +- Type 'NSAttributedStringKey' \(aka 'NSString'\) has no member 'font' [\#2844](https://github.com/danielgindi/Charts/issues/2844) +- Install charts via cocapods pulls back old version 3.0.2 [\#2843](https://github.com/danielgindi/Charts/issues/2843) +- xcode 9.0 compile ERROR: "static var 'defaultFormatter' is not public" [\#2842](https://github.com/danielgindi/Charts/issues/2842) +- Pass String to LineChartData [\#2841](https://github.com/danielgindi/Charts/issues/2841) +- Customised graph with ranges\(Normal-blue and Warning-yellow\) also with it's legend [\#2838](https://github.com/danielgindi/Charts/issues/2838) +- using UIGraphicsGetCurrentContext in MarkerImage subclass [\#2835](https://github.com/danielgindi/Charts/issues/2835) +- How to show BarChartDataSet with descending x values? [\#2834](https://github.com/danielgindi/Charts/issues/2834) +- getTransformer function doesn't work properly when AxisDependency is set to right [\#2833](https://github.com/danielgindi/Charts/issues/2833) +- Grouped Bar chart X-axis and Bar Alignment [\#2832](https://github.com/danielgindi/Charts/issues/2832) +- How to create a custom Marker from Xib - Swift [\#2831](https://github.com/danielgindi/Charts/issues/2831) +- does not support new Objective-C project with Xcode 9 [\#2830](https://github.com/danielgindi/Charts/issues/2830) +- radarChart default labelCount [\#2829](https://github.com/danielgindi/Charts/issues/2829) +- NSDecimalNumber instead of Double [\#2828](https://github.com/danielgindi/Charts/issues/2828) +- LineChart 填充 [\#2825](https://github.com/danielgindi/Charts/issues/2825) +- Swift: Different colours for circles in one LineChartDataSet [\#2824](https://github.com/danielgindi/Charts/issues/2824) +- Unable to update Chart library [\#2823](https://github.com/danielgindi/Charts/issues/2823) +- xMin, xMax, yMin, yMax not recalculated to zero on .clear\(\) [\#2822](https://github.com/danielgindi/Charts/issues/2822) +- OS X errors with swift 4 [\#2819](https://github.com/danielgindi/Charts/issues/2819) +- I want to add marker image from line chart in swift 4.0 [\#2818](https://github.com/danielgindi/Charts/issues/2818) +- ChartMarkerView not able to subclass of swift class [\#2817](https://github.com/danielgindi/Charts/issues/2817) +- Type 'NSAttributedStringKey' \(aka 'NSString'\) has no member 'font' [\#2816](https://github.com/danielgindi/Charts/issues/2816) +- StackedBarChart isn't stacking bars [\#2815](https://github.com/danielgindi/Charts/issues/2815) +- Cocoapod 3.0.4 [\#2814](https://github.com/danielgindi/Charts/issues/2814) +- Error aplication Thread in ios 11 with version 3.0.4 [\#2812](https://github.com/danielgindi/Charts/issues/2812) +- Cannot compile with version 3.0.3 and Xcode 9 due to incompatible Swift version [\#2810](https://github.com/danielgindi/Charts/issues/2810) +- I have the version 3.0.4 but when compile project I has an error [\#2809](https://github.com/danielgindi/Charts/issues/2809) +- 拖动的时候 会强烈抖动 [\#2808](https://github.com/danielgindi/Charts/issues/2808) +- Version 3.0.4 doesn't appear via Cocoapods [\#2807](https://github.com/danielgindi/Charts/issues/2807) +- Bump Pod Version [\#2805](https://github.com/danielgindi/Charts/issues/2805) +- module 'Charts' not found when dray it into target [\#2803](https://github.com/danielgindi/Charts/issues/2803) +- How to get y-axis values "Int" to "Double" [\#2799](https://github.com/danielgindi/Charts/issues/2799) +- The line chart enlarged is crash [\#2797](https://github.com/danielgindi/Charts/issues/2797) +- How to change the entrylabel\(i.e, 90%\) color in PieChart [\#2794](https://github.com/danielgindi/Charts/issues/2794) +- Chart Grid Lines Don't Always Draw [\#2791](https://github.com/danielgindi/Charts/issues/2791) +- Charts.framework: No such file or directory [\#2789](https://github.com/danielgindi/Charts/issues/2789) +- Memory Leak in Horizontal Bar Chart [\#2745](https://github.com/danielgindi/Charts/issues/2745) +- axisDependency does not work [\#2258](https://github.com/danielgindi/Charts/issues/2258) +- HorizontalBarChart does not update labels correctly [\#2257](https://github.com/danielgindi/Charts/issues/2257) + +**Merged pull requests:** + +- Syncing 4.0.0 with master [\#3160](https://github.com/danielgindi/Charts/pull/3160) ([jjatie](https://github.com/jjatie)) +- Subclassing of LegendRenderer didn't take any effect [\#3149](https://github.com/danielgindi/Charts/pull/3149) ([l-lemesev](https://github.com/l-lemesev)) +- Update ViewPortHandler.swift [\#3143](https://github.com/danielgindi/Charts/pull/3143) ([ParkinWu](https://github.com/ParkinWu)) +- Renderer protocols [\#3136](https://github.com/danielgindi/Charts/pull/3136) ([jjatie](https://github.com/jjatie)) +- Update 4.0.0 with master [\#3135](https://github.com/danielgindi/Charts/pull/3135) ([jjatie](https://github.com/jjatie)) +- Fix axis label disappear when zooming in deep enough [\#3132](https://github.com/danielgindi/Charts/pull/3132) ([liuxuan30](https://github.com/liuxuan30)) +- Updating 4.0.0 with latest changes in master [\#3130](https://github.com/danielgindi/Charts/pull/3130) ([jjatie](https://github.com/jjatie)) +- add option to build demo projects unit tests on iOS [\#3121](https://github.com/danielgindi/Charts/pull/3121) ([liuxuan30](https://github.com/liuxuan30)) +- Makes ChartsDemo compiling again [\#3117](https://github.com/danielgindi/Charts/pull/3117) ([valeriyvan](https://github.com/valeriyvan)) +- Fixed using wrong axis \(Issue \#2257\) [\#3114](https://github.com/danielgindi/Charts/pull/3114) ([defranke](https://github.com/defranke)) +- for \#3061 fix animation crash [\#3098](https://github.com/danielgindi/Charts/pull/3098) ([liuxuan30](https://github.com/liuxuan30)) +- Refactored ChartUtils method into CGPoint extension [\#3087](https://github.com/danielgindi/Charts/pull/3087) ([jjatie](https://github.com/jjatie)) +- Moved ChartUtils drawing methods into CGContext extension [\#3086](https://github.com/danielgindi/Charts/pull/3086) ([jjatie](https://github.com/jjatie)) +- for \#2745. chart should be weak. [\#3078](https://github.com/danielgindi/Charts/pull/3078) ([liuxuan30](https://github.com/liuxuan30)) +- Fix a bug may cause infinite loop. [\#3073](https://github.com/danielgindi/Charts/pull/3073) ([JyHu](https://github.com/JyHu)) +- Chartviewbase redundant ivar [\#3045](https://github.com/danielgindi/Charts/pull/3045) ([jjatie](https://github.com/jjatie)) +- Removed `isKind\(of:\)` [\#3044](https://github.com/danielgindi/Charts/pull/3044) ([jjatie](https://github.com/jjatie)) +- Removed redundant ivars in BarLineChartViewBase [\#3043](https://github.com/danielgindi/Charts/pull/3043) ([jjatie](https://github.com/jjatie)) +- fileprivate -\> private [\#3042](https://github.com/danielgindi/Charts/pull/3042) ([jjatie](https://github.com/jjatie)) +- Viewportjob minor cleanup [\#3041](https://github.com/danielgindi/Charts/pull/3041) ([jjatie](https://github.com/jjatie)) +- Removed @objc from internal properties [\#3038](https://github.com/danielgindi/Charts/pull/3038) ([jjatie](https://github.com/jjatie)) +- Minor changes to BubbleChartRenderer logic [\#3010](https://github.com/danielgindi/Charts/pull/3010) ([jjatie](https://github.com/jjatie)) +- BarChartRenderer Logic cleanup [\#3008](https://github.com/danielgindi/Charts/pull/3008) ([jjatie](https://github.com/jjatie)) +- Minor changes to Animator [\#3005](https://github.com/danielgindi/Charts/pull/3005) ([jjatie](https://github.com/jjatie)) +- Minor cleanup to Highlighter types [\#3003](https://github.com/danielgindi/Charts/pull/3003) ([jjatie](https://github.com/jjatie)) +- Resubmit of \#2730 [\#3002](https://github.com/danielgindi/Charts/pull/3002) ([jjatie](https://github.com/jjatie)) +- The backing var is not necessary. [\#3000](https://github.com/danielgindi/Charts/pull/3000) ([jjatie](https://github.com/jjatie)) +- Minor refactoring of Formatter logic [\#2998](https://github.com/danielgindi/Charts/pull/2998) ([jjatie](https://github.com/jjatie)) +- Remove java interface convention [\#2997](https://github.com/danielgindi/Charts/pull/2997) ([jjatie](https://github.com/jjatie)) +- Removed methods and properties deprecated in 1.0 [\#2996](https://github.com/danielgindi/Charts/pull/2996) ([jjatie](https://github.com/jjatie)) +- Replaced `ChartUtils` methods with `CGSize` extensions [\#2995](https://github.com/danielgindi/Charts/pull/2995) ([jjatie](https://github.com/jjatie)) +- Replaced relevant `ChartUtils` methods with `Double` extensions [\#2994](https://github.com/danielgindi/Charts/pull/2994) ([jjatie](https://github.com/jjatie)) +- Replaced `ChartUtils.Math` in favour of an extension on `FloatingPoint` [\#2993](https://github.com/danielgindi/Charts/pull/2993) ([jjatie](https://github.com/jjatie)) +- Minor changes to logic in `ViewPortJob` subclasses. [\#2992](https://github.com/danielgindi/Charts/pull/2992) ([jjatie](https://github.com/jjatie)) +- `ChartRenderer`'s must be initialized with a chart [\#2982](https://github.com/danielgindi/Charts/pull/2982) ([jjatie](https://github.com/jjatie)) +- Animator non nil [\#2981](https://github.com/danielgindi/Charts/pull/2981) ([jjatie](https://github.com/jjatie)) +- View port handler nonnil [\#2980](https://github.com/danielgindi/Charts/pull/2980) ([jjatie](https://github.com/jjatie)) +- Add support for iPhone X [\#2967](https://github.com/danielgindi/Charts/pull/2967) ([liuxuan30](https://github.com/liuxuan30)) +- added highlightColor parameter for pie charts [\#2961](https://github.com/danielgindi/Charts/pull/2961) ([pascalherrmann](https://github.com/pascalherrmann)) +- Add Swift Package Manager support. [\#2950](https://github.com/danielgindi/Charts/pull/2950) ([BrianDoig](https://github.com/BrianDoig)) +- Fix turning off drag in X and Y axes separately. [\#2949](https://github.com/danielgindi/Charts/pull/2949) ([maciejtrybilo](https://github.com/maciejtrybilo)) +- modify for Character Alert: characters is deprecated [\#2942](https://github.com/danielgindi/Charts/pull/2942) ([suzuhiroruri](https://github.com/suzuhiroruri)) +- fix \#2890. Turned out it's multiple bar chart but not grouped [\#2891](https://github.com/danielgindi/Charts/pull/2891) ([liuxuan30](https://github.com/liuxuan30)) +- Update LICENSE [\#2887](https://github.com/danielgindi/Charts/pull/2887) ([sDaniel](https://github.com/sDaniel)) +- fix \#1830. credit from https://github.com/danielgindi/Charts/pull/2049 [\#2874](https://github.com/danielgindi/Charts/pull/2874) ([liuxuan30](https://github.com/liuxuan30)) +- duplicated code for set1 in set2 section [\#2872](https://github.com/danielgindi/Charts/pull/2872) ([liuxuan30](https://github.com/liuxuan30)) +- added DataApproximator+N extension [\#2848](https://github.com/danielgindi/Charts/pull/2848) ([666tos](https://github.com/666tos)) +- Bumped pod version [\#2806](https://github.com/danielgindi/Charts/pull/2806) ([mohpor](https://github.com/mohpor)) +- unwrap optionals [\#2698](https://github.com/danielgindi/Charts/pull/2698) ([russellbstephens](https://github.com/russellbstephens)) +- Replaced unnecessary NSObjectProtocol [\#2629](https://github.com/danielgindi/Charts/pull/2629) ([jjatie](https://github.com/jjatie)) +- Swift iOS Demos [\#2628](https://github.com/danielgindi/Charts/pull/2628) ([jjatie](https://github.com/jjatie)) +- add example playground [\#2364](https://github.com/danielgindi/Charts/pull/2364) ([thierryH91200](https://github.com/thierryH91200)) +- Compatibility with swift playgrounds [\#2335](https://github.com/danielgindi/Charts/pull/2335) ([macteo](https://github.com/macteo)) + +## [3.0.4](https://github.com/danielgindi/Charts/tree/3.0.4) (2017-09-21) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v3.0.4...3.0.4) + +## [v3.0.4](https://github.com/danielgindi/Charts/tree/v3.0.4) (2017-09-21) +[Full Changelog](https://github.com/danielgindi/Charts/compare/3.0.3...v3.0.4) + +**Closed issues:** + +- cocoaPod can not install branch of swift4 [\#2802](https://github.com/danielgindi/Charts/issues/2802) +- Swift 4 [\#2801](https://github.com/danielgindi/Charts/issues/2801) +- how tomake leftAxis.inverted and LineChartDataSet.fillColor not inverted [\#2798](https://github.com/danielgindi/Charts/issues/2798) +- Bar Chart Demo One Label One Color [\#2792](https://github.com/danielgindi/Charts/issues/2792) +- BarChart draw vertical dotted lines on specific bars [\#2788](https://github.com/danielgindi/Charts/issues/2788) +- How can I control the number of decimals? [\#2787](https://github.com/danielgindi/Charts/issues/2787) +- Charts “3.0.2” cannot find "BalloonMarker" [\#2786](https://github.com/danielgindi/Charts/issues/2786) +- Graphs gets cut from both ends [\#2785](https://github.com/danielgindi/Charts/issues/2785) +- Is it possible to draw multiple lineCharts with different starting points on same view? [\#2783](https://github.com/danielgindi/Charts/issues/2783) +- getFormattedLabel Index Out of Range [\#2782](https://github.com/danielgindi/Charts/issues/2782) +- Line chart right axis inset [\#2781](https://github.com/danielgindi/Charts/issues/2781) +- No type or protocol named 'IChartAxisValueFormatter' [\#2780](https://github.com/danielgindi/Charts/issues/2780) +- Zero Value is under BarChart [\#2779](https://github.com/danielgindi/Charts/issues/2779) +- App crashes while using Charts swift library in Objective C Project [\#2778](https://github.com/danielgindi/Charts/issues/2778) +- Cannot subscript a value of type '\[String : AnyObject\]' with an index of type 'NSAttributedStringKey' [\#2777](https://github.com/danielgindi/Charts/issues/2777) +- How to drag data entries to change their y value in real time. [\#2776](https://github.com/danielgindi/Charts/issues/2776) +- How to break line the legends ? [\#2775](https://github.com/danielgindi/Charts/issues/2775) +- How can I get current viewport shown x range and scale value [\#2770](https://github.com/danielgindi/Charts/issues/2770) +- How to disable scale of left YAxis? [\#2748](https://github.com/danielgindi/Charts/issues/2748) +- Bar Chart remove x if y is 0 [\#2747](https://github.com/danielgindi/Charts/issues/2747) +- How to display Negative X-Axis on LineChart [\#797](https://github.com/danielgindi/Charts/issues/797) + +**Merged pull requests:** + +- Changes for Swift 4 [\#2507](https://github.com/danielgindi/Charts/pull/2507) ([liuxuan30](https://github.com/liuxuan30)) + +## [3.0.3](https://github.com/danielgindi/Charts/tree/3.0.3) (2017-09-08) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v3.0.3...3.0.3) + +## [v3.0.3](https://github.com/danielgindi/Charts/tree/v3.0.3) (2017-09-08) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v3.0.2...v3.0.3) + +**Implemented enhancements:** + +- fatal error: Index out of range [\#2109](https://github.com/danielgindi/Charts/issues/2109) + +**Fixed bugs:** + +- Crash in YAxisRendererRadarChart [\#2356](https://github.com/danielgindi/Charts/issues/2356) +- Fatal error when providing multiple data sets in PieChartData [\#2099](https://github.com/danielgindi/Charts/issues/2099) + +**Closed issues:** + +- X Values Hidden On Bar Graph [\#2774](https://github.com/danielgindi/Charts/issues/2774) +- How to add new real-time data to lineChart ? [\#2773](https://github.com/danielgindi/Charts/issues/2773) +- Avoid xAxis limit-labels display in a one-bar BarChart. [\#2771](https://github.com/danielgindi/Charts/issues/2771) +- zoom at particular position via code [\#2769](https://github.com/danielgindi/Charts/issues/2769) +- how to use HorizontalBarChart with decimal number as xAxis [\#2768](https://github.com/danielgindi/Charts/issues/2768) +- Cannot rescale Y-axis even if changing axisMinimum and axisMaximum [\#2766](https://github.com/danielgindi/Charts/issues/2766) +- I want to change ValueFormat of BarChartDataSet. I can't change it. [\#2764](https://github.com/danielgindi/Charts/issues/2764) +- Changing x-label formats from one line to word-wrapped is awkward [\#2763](https://github.com/danielgindi/Charts/issues/2763) +- chartValueSelected not getting value from Max Value [\#2762](https://github.com/danielgindi/Charts/issues/2762) +- Dual YAxis [\#2761](https://github.com/danielgindi/Charts/issues/2761) +- How to set the position of the values top on BarChartView? [\#2759](https://github.com/danielgindi/Charts/issues/2759) +- Line chart xAxis cut left or right in iphone 5 [\#2758](https://github.com/danielgindi/Charts/issues/2758) +- TableView does not scroll vertically after graph is rendered to cells [\#2757](https://github.com/danielgindi/Charts/issues/2757) +- Fill the color between two line charts using IFillFormatter [\#2756](https://github.com/danielgindi/Charts/issues/2756) +- How to use custom view for labels of xAxis? [\#2755](https://github.com/danielgindi/Charts/issues/2755) +- Chart not consistently showing data [\#2753](https://github.com/danielgindi/Charts/issues/2753) +- Obtaining current number of points being rendered in zoomed viewing window [\#2752](https://github.com/danielgindi/Charts/issues/2752) +- Barchart starting above X-Axis [\#2751](https://github.com/danielgindi/Charts/issues/2751) +- Getting the position of Data array of entry: ChartDataEntry via chartValueSelected\(args\) method [\#2750](https://github.com/danielgindi/Charts/issues/2750) +- Create Simple Bar Chart [\#2749](https://github.com/danielgindi/Charts/issues/2749) +- iOS8 simulator crashed iOS 8模拟器崩溃在画Y轴线的地方 [\#2746](https://github.com/danielgindi/Charts/issues/2746) +- Chart displays values, but no bars [\#2744](https://github.com/danielgindi/Charts/issues/2744) +- Can not inherit Charts to subclass some cutomize charts [\#2743](https://github.com/danielgindi/Charts/issues/2743) +- CandleStick fill colors not showing [\#2742](https://github.com/danielgindi/Charts/issues/2742) +- Bar chart click on outside of bar calling delegate [\#2741](https://github.com/danielgindi/Charts/issues/2741) +- Resize chart after adding limit line [\#2739](https://github.com/danielgindi/Charts/issues/2739) +- Pie chart entry icon get cut [\#2738](https://github.com/danielgindi/Charts/issues/2738) +- How can I set ValuePosition for individual slices? [\#2736](https://github.com/danielgindi/Charts/issues/2736) +- You can't slide along the X-axis [\#2735](https://github.com/danielgindi/Charts/issues/2735) +- Candlechart zooming disable interaction with viewcontroller [\#2734](https://github.com/danielgindi/Charts/issues/2734) +- 2 datasets, one should only display one label at the top [\#2733](https://github.com/danielgindi/Charts/issues/2733) +- How do I change the color of the text on top of the bars? [\#2732](https://github.com/danielgindi/Charts/issues/2732) +- Can't subclass BarChartRenderer due to 'fileprivate' status of many properties [\#2731](https://github.com/danielgindi/Charts/issues/2731) +- Left axis axisMinimum inside a TableviewCell does not work [\#2729](https://github.com/danielgindi/Charts/issues/2729) +- How to set minimum displayed Y axis value [\#2728](https://github.com/danielgindi/Charts/issues/2728) +- Custom Text Axis X Horizontal Bar Chart [\#2726](https://github.com/danielgindi/Charts/issues/2726) +- Crash when use in Notification Content Extension [\#2725](https://github.com/danielgindi/Charts/issues/2725) +- Problems encountered with charts [\#2724](https://github.com/danielgindi/Charts/issues/2724) +- Can I use Charts in Swift 4? [\#2723](https://github.com/danielgindi/Charts/issues/2723) +- Add gradient to bar chart [\#2722](https://github.com/danielgindi/Charts/issues/2722) +- Draw bar chart from axisMinimum instead of 0 [\#2721](https://github.com/danielgindi/Charts/issues/2721) +- Different Charts-Swifg.h when simulator and iphone [\#2720](https://github.com/danielgindi/Charts/issues/2720) +- Viewport transX jumping when zooming Y scale \(dynamic/realtime data\) [\#2719](https://github.com/danielgindi/Charts/issues/2719) +- Align X labels with Charts [\#2718](https://github.com/danielgindi/Charts/issues/2718) +- iOS swift3 Chart xaxis duplicate value issue for linechartview [\#2715](https://github.com/danielgindi/Charts/issues/2715) +- Label Position xAxis Radar Chart [\#2714](https://github.com/danielgindi/Charts/issues/2714) +- Showing actual value IN ADDITION to percentage, in a pie slice? [\#2713](https://github.com/danielgindi/Charts/issues/2713) +- Fail to display any thing in line chart. [\#2712](https://github.com/danielgindi/Charts/issues/2712) +- How to decrees column width size in LineChart [\#2710](https://github.com/danielgindi/Charts/issues/2710) +- Runtime EXC\_BAD\_ACCESS with barchart whiles zoom in [\#2709](https://github.com/danielgindi/Charts/issues/2709) +- How to format values on barchart [\#2708](https://github.com/danielgindi/Charts/issues/2708) +- where do I find ioscharts.framework? [\#2707](https://github.com/danielgindi/Charts/issues/2707) +- Add horizontal line at certain value on Y-Axis? [\#2706](https://github.com/danielgindi/Charts/issues/2706) +- BarChart does not render with multiple data sets [\#2705](https://github.com/danielgindi/Charts/issues/2705) +- Balloon Marker: making it work in line chart inside combined view [\#2703](https://github.com/danielgindi/Charts/issues/2703) +- IValueFormatter text showing More than one Time [\#2700](https://github.com/danielgindi/Charts/issues/2700) +- Disable bar selection or highlight? [\#2699](https://github.com/danielgindi/Charts/issues/2699) +- Increase Yaxis Labes According to the max values. [\#2696](https://github.com/danielgindi/Charts/issues/2696) +- xAxis scrolling in combineChartView [\#2695](https://github.com/danielgindi/Charts/issues/2695) +- How to highlight at specific entry ? [\#2693](https://github.com/danielgindi/Charts/issues/2693) +- Horizontal bar charts 'Y' values are getting overlapped with '0' [\#2691](https://github.com/danielgindi/Charts/issues/2691) +- Two ChartViews own the same Xaxis [\#2690](https://github.com/danielgindi/Charts/issues/2690) +- issues about BarChartView [\#2689](https://github.com/danielgindi/Charts/issues/2689) +- Tap Gesture Handler callback method [\#2686](https://github.com/danielgindi/Charts/issues/2686) +- How to draw dashed circles for values? [\#2685](https://github.com/danielgindi/Charts/issues/2685) +- How to Redraw the charts? [\#2684](https://github.com/danielgindi/Charts/issues/2684) +- BarChartView top border not showing [\#2682](https://github.com/danielgindi/Charts/issues/2682) +- Drawing horizontal dashed lines except on x-axis line? [\#2681](https://github.com/danielgindi/Charts/issues/2681) +- X-Axis Date values not displaying properly? [\#2680](https://github.com/danielgindi/Charts/issues/2680) +- Dashed border on highlighted bar - BarChart [\#2675](https://github.com/danielgindi/Charts/issues/2675) +- ChartFill - I would like to fill above the line [\#2674](https://github.com/danielgindi/Charts/issues/2674) +- Anyone have iOS charts working with Xcode 9 Beta? [\#2673](https://github.com/danielgindi/Charts/issues/2673) +- Change Scale on Y Axis for CombinedChart [\#2672](https://github.com/danielgindi/Charts/issues/2672) +- Y-axis with text [\#2671](https://github.com/danielgindi/Charts/issues/2671) +- Show only 2 labels on xAxis in CombinedChartView [\#2670](https://github.com/danielgindi/Charts/issues/2670) +- Graphing just a part of the data [\#2669](https://github.com/danielgindi/Charts/issues/2669) +- How to add texts/image into a chart? [\#2667](https://github.com/danielgindi/Charts/issues/2667) +- Is it possible to scroll without Zooming/ Scaling ? [\#2666](https://github.com/danielgindi/Charts/issues/2666) +- Use Charts in Swift3,Error [\#2664](https://github.com/danielgindi/Charts/issues/2664) +- Custom highlighter/marker [\#2663](https://github.com/danielgindi/Charts/issues/2663) +- Display programatically a marker on a chart [\#2662](https://github.com/danielgindi/Charts/issues/2662) +- Scrollview inside Marker [\#2661](https://github.com/danielgindi/Charts/issues/2661) +- Bitcode Problem [\#2660](https://github.com/danielgindi/Charts/issues/2660) +- Fix Marker on center even when chart is scaled or dragged [\#2659](https://github.com/danielgindi/Charts/issues/2659) +- How to add marker to center position in ios charts while scrolling horizontally with increasing scaleX and enabling drag [\#2658](https://github.com/danielgindi/Charts/issues/2658) +- Y Axis scales display format [\#2657](https://github.com/danielgindi/Charts/issues/2657) +- Marker and long press gesture... [\#2656](https://github.com/danielgindi/Charts/issues/2656) +- Pie chart Crash [\#2655](https://github.com/danielgindi/Charts/issues/2655) +- YAxisValues:"Zero" of the integer part is not displayed when the YAxis coordinate is zero [\#2653](https://github.com/danielgindi/Charts/issues/2653) +- Memory leak when valueFormatter is set [\#2652](https://github.com/danielgindi/Charts/issues/2652) +- autoScaleMinMaxEnabled, axisMaximum and axisMinimum [\#2651](https://github.com/danielgindi/Charts/issues/2651) +- Draw X-Axis labels with dates keeping index of x-axis independent like before [\#2648](https://github.com/danielgindi/Charts/issues/2648) +- About ChartHighLight [\#2647](https://github.com/danielgindi/Charts/issues/2647) +- Start value from X-Axis [\#2646](https://github.com/danielgindi/Charts/issues/2646) +- Combined chart with horizontal bar and bubble [\#2644](https://github.com/danielgindi/Charts/issues/2644) +- I have a problem with compiling [\#2643](https://github.com/danielgindi/Charts/issues/2643) +- How to implement custom dataset in objective-c? [\#2639](https://github.com/danielgindi/Charts/issues/2639) +- I am not able to set values on the bar in simple bar chart. [\#2638](https://github.com/danielgindi/Charts/issues/2638) +- Swift based Charts library increased application size when used for objective c based project [\#2637](https://github.com/danielgindi/Charts/issues/2637) +- 使用CombinedChartView绘制柱形图,如何只让当前bar视图显示灰色背影。 [\#2636](https://github.com/danielgindi/Charts/issues/2636) +- OHLC charts... [\#2635](https://github.com/danielgindi/Charts/issues/2635) +- unable to set string values on x-axis in grouped bar chart . [\#2632](https://github.com/danielgindi/Charts/issues/2632) +- How to set group width in multiple bar chart? [\#2631](https://github.com/danielgindi/Charts/issues/2631) +- override renderLegend\(context: CGContext\) [\#2630](https://github.com/danielgindi/Charts/issues/2630) +- Changing chart's type without creating a new object... [\#2627](https://github.com/danielgindi/Charts/issues/2627) +- Using Charts in NSStackView [\#2626](https://github.com/danielgindi/Charts/issues/2626) +- Does PieChart support multiple columns of vertical legend? [\#2625](https://github.com/danielgindi/Charts/issues/2625) +- I need this method: setShowOnlyMinMax [\#2624](https://github.com/danielgindi/Charts/issues/2624) +- Unable to use this library in Objective-c . [\#2623](https://github.com/danielgindi/Charts/issues/2623) +- 计算柱形图的宽度和设定间隙 [\#2622](https://github.com/danielgindi/Charts/issues/2622) +- How to adjust RadarChartView text from the bottom of the height? [\#2621](https://github.com/danielgindi/Charts/issues/2621) +- How to give all pie-slices a rounded edge? [\#2620](https://github.com/danielgindi/Charts/issues/2620) +- Alternative color to fill in radar chart [\#2617](https://github.com/danielgindi/Charts/issues/2617) +- About gradient color for lineChartView [\#2615](https://github.com/danielgindi/Charts/issues/2615) +- Invalid bundle [\#2614](https://github.com/danielgindi/Charts/issues/2614) +- Want to display circles at data points on a line graph only if the data has changed or is about to change [\#2613](https://github.com/danielgindi/Charts/issues/2613) +- Swift language Version. [\#2612](https://github.com/danielgindi/Charts/issues/2612) +- Linker Command Fail error [\#2611](https://github.com/danielgindi/Charts/issues/2611) +- xAxis's first lable always on the left [\#2610](https://github.com/danielgindi/Charts/issues/2610) +- when i Creat one LineChartData objc. it's draws Three points [\#2609](https://github.com/danielgindi/Charts/issues/2609) +- i wanna display Char form with no data. but with Y Values. [\#2608](https://github.com/danielgindi/Charts/issues/2608) +- Is there any way to get the xaxis value when chart scroll end specific area? [\#2607](https://github.com/danielgindi/Charts/issues/2607) +- Memory Leak in Legend and ArrayBufferProtocol [\#2606](https://github.com/danielgindi/Charts/issues/2606) +- fatal error due to call to computeAxisValues during call to notifyDataSetChanged [\#2605](https://github.com/danielgindi/Charts/issues/2605) +- Bar Chart & label displayed wrongly when dataset count changes [\#2603](https://github.com/danielgindi/Charts/issues/2603) +- BarChart.Axis label change starting index when .rightAxix is enabled [\#2602](https://github.com/danielgindi/Charts/issues/2602) +- Spacing between left axis labels [\#2601](https://github.com/danielgindi/Charts/issues/2601) +- React Native support [\#2598](https://github.com/danielgindi/Charts/issues/2598) +- Not able to see yAxis label while changing position of that label [\#2596](https://github.com/danielgindi/Charts/issues/2596) +- About stacked bar value label postion [\#2595](https://github.com/danielgindi/Charts/issues/2595) +- Invalid Bundle - Xcode 9 Beta 2 [\#2593](https://github.com/danielgindi/Charts/issues/2593) +- Stacked bar always show last value [\#2592](https://github.com/danielgindi/Charts/issues/2592) +- Use Charts in App Extension [\#2590](https://github.com/danielgindi/Charts/issues/2590) +- About bar and line combined [\#2589](https://github.com/danielgindi/Charts/issues/2589) +- Draw graph of a function [\#2588](https://github.com/danielgindi/Charts/issues/2588) +- Scrolling chart [\#2587](https://github.com/danielgindi/Charts/issues/2587) +- How change value double to value int format? [\#2586](https://github.com/danielgindi/Charts/issues/2586) +- stringForValue value [\#2585](https://github.com/danielgindi/Charts/issues/2585) +- Invalid architecture... support arm64. [\#2584](https://github.com/danielgindi/Charts/issues/2584) +- Line chart with blank data show Y axis label incorrect on iPhone 5 [\#2583](https://github.com/danielgindi/Charts/issues/2583) +- 'M\_PI' is deprecated: Please use 'Double.pi' or '.pi' to get the value of correct type and avoid casting. [\#2580](https://github.com/danielgindi/Charts/issues/2580) +- 0 lost when the value less than 1.0,why? [\#2579](https://github.com/danielgindi/Charts/issues/2579) +- Error Library not loaded: @rpath/libswiftAppKit.dylib [\#2578](https://github.com/danielgindi/Charts/issues/2578) +- CenterText/Description Text overruns onto PieChart [\#2577](https://github.com/danielgindi/Charts/issues/2577) +- Hide specific legend not all [\#2576](https://github.com/danielgindi/Charts/issues/2576) +- horizontal barchart each bar have different maximum value [\#2575](https://github.com/danielgindi/Charts/issues/2575) +- Barchart fixed interval in left axis [\#2574](https://github.com/danielgindi/Charts/issues/2574) +- Change color of Bar chart data label [\#2573](https://github.com/danielgindi/Charts/issues/2573) +- Visible ChartDataEntry when zoomed in? [\#2572](https://github.com/danielgindi/Charts/issues/2572) +- Changing color of the bar graph [\#2571](https://github.com/danielgindi/Charts/issues/2571) +- Custom bar chart highlight style [\#2570](https://github.com/danielgindi/Charts/issues/2570) +- How to show LineChart with icon [\#2566](https://github.com/danielgindi/Charts/issues/2566) +- how to do Paging [\#2565](https://github.com/danielgindi/Charts/issues/2565) +- Range float bars [\#2564](https://github.com/danielgindi/Charts/issues/2564) +- Cropping left axis labels and missing some values [\#2563](https://github.com/danielgindi/Charts/issues/2563) +- How to create a custom marker view in line chart for showing x values as well [\#2562](https://github.com/danielgindi/Charts/issues/2562) +- HorizontalBarChartView:when i set Xvalue = 0,1,2,3..... HorizontalBarChartView some X dont show [\#2559](https://github.com/danielgindi/Charts/issues/2559) +- But I hope also have the valueFonts property set for each font size, like valueColors [\#2558](https://github.com/danielgindi/Charts/issues/2558) +- charts uses iphone show "No architectures to compile for \(ONLY\_ACTIVE\_ARCH=YES, active arch=arm64, VALID\_ARCHS=i386 x86\_64 \)". [\#2557](https://github.com/danielgindi/Charts/issues/2557) +- Caching charts [\#2555](https://github.com/danielgindi/Charts/issues/2555) +- How to add X axis values in the balloon marker view in IOS Charts? [\#2554](https://github.com/danielgindi/Charts/issues/2554) +- One label for each data point - Line Chart - SOLUTION FOUND [\#2553](https://github.com/danielgindi/Charts/issues/2553) +- PieChart legend.yOffset bug [\#2552](https://github.com/danielgindi/Charts/issues/2552) +- PieChart legend.yOffset bug [\#2551](https://github.com/danielgindi/Charts/issues/2551) +- Duplicates x-axis labels are plotted separately in graph? [\#2549](https://github.com/danielgindi/Charts/issues/2549) +- How to set the label count for X axis ? [\#2548](https://github.com/danielgindi/Charts/issues/2548) +- Hide graph label if value fall below a certain threshold/minimum [\#2547](https://github.com/danielgindi/Charts/issues/2547) +- BarChar Position Label [\#2546](https://github.com/danielgindi/Charts/issues/2546) +- Swift language upgrade required [\#2544](https://github.com/danielgindi/Charts/issues/2544) +- BarChartDataEntry different value than value display for each BarChartDataSet [\#2543](https://github.com/danielgindi/Charts/issues/2543) +- LineChartDataSet why there is no valueFonts [\#2542](https://github.com/danielgindi/Charts/issues/2542) +- Need swift combined chart demo. [\#2540](https://github.com/danielgindi/Charts/issues/2540) +- Pie Chart Highlighted region [\#2536](https://github.com/danielgindi/Charts/issues/2536) +- Replace the value label without redraw the bar. [\#2535](https://github.com/danielgindi/Charts/issues/2535) +- Lines on Horizontal Bar Chart [\#2532](https://github.com/danielgindi/Charts/issues/2532) +- Cannot convert value of type 'AutoreleasingUnsafeMutablePointer\' to expected argument type 'AutoreleasingUnsafeMutablePointer\?' [\#2530](https://github.com/danielgindi/Charts/issues/2530) +- zoom programatically, reset the zoom, set the highlight and moving the X-Axis and the Y-Axis to the middle [\#2529](https://github.com/danielgindi/Charts/issues/2529) +- BarGraph - 0 values - Bar Offset [\#2528](https://github.com/danielgindi/Charts/issues/2528) +- Chart displays intermittently [\#2527](https://github.com/danielgindi/Charts/issues/2527) +- Changing BarChart xAxis label position [\#2526](https://github.com/danielgindi/Charts/issues/2526) +- Create PDF Of Charts [\#2525](https://github.com/danielgindi/Charts/issues/2525) +- What is the equivalent of "onChartDoubleTapped"? [\#2524](https://github.com/danielgindi/Charts/issues/2524) +- Delegate Memory Leak [\#2523](https://github.com/danielgindi/Charts/issues/2523) +- Chart is sometimes not showing data on Plus devices [\#2521](https://github.com/danielgindi/Charts/issues/2521) +- How to run in Xcode 9 \(beta\) [\#2520](https://github.com/danielgindi/Charts/issues/2520) +- HorizontalBarChartView offset X [\#2519](https://github.com/danielgindi/Charts/issues/2519) +- Line not showing in LineChart [\#2518](https://github.com/danielgindi/Charts/issues/2518) +- Displaying float values in bar chart label. [\#2517](https://github.com/danielgindi/Charts/issues/2517) +- Not working with Xcode 9 Beta1 [\#2514](https://github.com/danielgindi/Charts/issues/2514) +- PieChart: Identify univocally a specific entry [\#2513](https://github.com/danielgindi/Charts/issues/2513) +- Right Align Y Value Labels for Horizontal Bar Chart [\#2512](https://github.com/danielgindi/Charts/issues/2512) +- Swift 3 Cubic line chart [\#2510](https://github.com/danielgindi/Charts/issues/2510) +- Inserting dataPoint "labels" in Radar Chart [\#2508](https://github.com/danielgindi/Charts/issues/2508) +- How to remove decimals from y values in iOS Charts? [\#2506](https://github.com/danielgindi/Charts/issues/2506) +- Add background to chart's legend [\#2505](https://github.com/danielgindi/Charts/issues/2505) +- Combine Bar, Line and Pie chart [\#2503](https://github.com/danielgindi/Charts/issues/2503) +- Chart not in centre of view [\#2502](https://github.com/danielgindi/Charts/issues/2502) +- Can't use different Charts Framework with different versions of Xcode [\#2499](https://github.com/danielgindi/Charts/issues/2499) +- How to change the label colors of certain XAxis values? [\#2498](https://github.com/danielgindi/Charts/issues/2498) +- Chart points are being clipped out in ScatterChart [\#2496](https://github.com/danielgindi/Charts/issues/2496) +- PieChart render very small [\#2495](https://github.com/danielgindi/Charts/issues/2495) +- Bar values inside bar horizontally? [\#2494](https://github.com/danielgindi/Charts/issues/2494) +- I used Charts in my iOS project and when I start to zoom the chart labels on xAxis get repeated again and again. How can I fix my problem? [\#2493](https://github.com/danielgindi/Charts/issues/2493) +- linechart shadow [\#2492](https://github.com/danielgindi/Charts/issues/2492) +- Set a fixed bar width in BarChartView [\#2491](https://github.com/danielgindi/Charts/issues/2491) +- Linechart inverted [\#2490](https://github.com/danielgindi/Charts/issues/2490) +- Pie chart not accepting more than one dataSet [\#2489](https://github.com/danielgindi/Charts/issues/2489) +- Graph x-axis values not displaying in swift 3.0 [\#2488](https://github.com/danielgindi/Charts/issues/2488) +- How to round corner in Radar Charts? [\#2487](https://github.com/danielgindi/Charts/issues/2487) +- Display header label on xAxis and yAxis [\#2485](https://github.com/danielgindi/Charts/issues/2485) +- XAxis label issue with multiple/grouped bar chart [\#2481](https://github.com/danielgindi/Charts/issues/2481) +- After integration, the project package becomes bigger. [\#2480](https://github.com/danielgindi/Charts/issues/2480) +- Pinch to Zoom is not working as expected over Bar Chart [\#2479](https://github.com/danielgindi/Charts/issues/2479) +- Two markers on one line \[LineChartView\] [\#2476](https://github.com/danielgindi/Charts/issues/2476) +- Adjust the spacing between bars. \(not grouped\) [\#2475](https://github.com/danielgindi/Charts/issues/2475) +- Issue with order of x-values and Multi LineChart [\#2474](https://github.com/danielgindi/Charts/issues/2474) +- Show Integer values on LineChart [\#2473](https://github.com/danielgindi/Charts/issues/2473) +- Loading a blank chart [\#2472](https://github.com/danielgindi/Charts/issues/2472) +- LineChart isn't shown correct [\#2471](https://github.com/danielgindi/Charts/issues/2471) +- Device Orientation not detected when using Charts module [\#2469](https://github.com/danielgindi/Charts/issues/2469) +- How to set spacing between bars? [\#2467](https://github.com/danielgindi/Charts/issues/2467) +- what happened to sliceSpace function in piechartdataset? [\#2466](https://github.com/danielgindi/Charts/issues/2466) +- How to scroll between charts on carousel [\#2465](https://github.com/danielgindi/Charts/issues/2465) +- PieChartData and NSNumberFormatter memory leak about demo project [\#2464](https://github.com/danielgindi/Charts/issues/2464) +- Custom View within the PieChart Center [\#2463](https://github.com/danielgindi/Charts/issues/2463) +- toggle highlight for pie chart slice [\#2462](https://github.com/danielgindi/Charts/issues/2462) +- HorizontalBarChartView [\#2461](https://github.com/danielgindi/Charts/issues/2461) +- Cubic Line Distorted [\#2459](https://github.com/danielgindi/Charts/issues/2459) +- Plotband support [\#2458](https://github.com/danielgindi/Charts/issues/2458) +- Bubble charts: Can i set the size same to all the bubbles? [\#2456](https://github.com/danielgindi/Charts/issues/2456) +- Single point on line chart not showing - Swift 3 [\#2455](https://github.com/danielgindi/Charts/issues/2455) +- Plotting large amount of data slows down the Graph. [\#2454](https://github.com/danielgindi/Charts/issues/2454) +- Error on Manually adding on my project [\#2453](https://github.com/danielgindi/Charts/issues/2453) +- How to implement Gantt charts using iOS-Charts? [\#2451](https://github.com/danielgindi/Charts/issues/2451) +- How come I can't set a default color theme in ChartColorTemplate.swift? [\#2450](https://github.com/danielgindi/Charts/issues/2450) +- What is relation between the BubbleSize and the axis value?Can we control the size of Bubble in Bubble Chart? [\#2448](https://github.com/danielgindi/Charts/issues/2448) +- chart 3.0 xAxis labels not mapped [\#2447](https://github.com/danielgindi/Charts/issues/2447) +- fatal error: Index out of range while subclassing renderer [\#2446](https://github.com/danielgindi/Charts/issues/2446) +- Bug in line chart yAxis when range are less than 1 [\#2445](https://github.com/danielgindi/Charts/issues/2445) +- Help with custom graphic/chart [\#2442](https://github.com/danielgindi/Charts/issues/2442) +- PieChart center Attributed Text [\#2441](https://github.com/danielgindi/Charts/issues/2441) +- PieChart center Attributed Text [\#2440](https://github.com/danielgindi/Charts/issues/2440) +- show tooltip on click [\#2438](https://github.com/danielgindi/Charts/issues/2438) +- Got Error : “\_OBJC\_CLASS\_$\_\_TtC10ChartsDemo12XYMarkerView” in Charts [\#2437](https://github.com/danielgindi/Charts/issues/2437) +- Change color label over circle [\#2436](https://github.com/danielgindi/Charts/issues/2436) +- How to set labels based on max and min value of the plot? [\#2434](https://github.com/danielgindi/Charts/issues/2434) +- How to make the pie chart selected by default? [\#2431](https://github.com/danielgindi/Charts/issues/2431) +- Animate 3 dataSets one by one [\#2428](https://github.com/danielgindi/Charts/issues/2428) +- Marker points on wrong position [\#2426](https://github.com/danielgindi/Charts/issues/2426) +- Legend leak in version 3.0.1 [\#2425](https://github.com/danielgindi/Charts/issues/2425) +- Show Two Circles in Pie Chart [\#2424](https://github.com/danielgindi/Charts/issues/2424) +- restrainViewPort is not working. Chart stays the same! [\#2423](https://github.com/danielgindi/Charts/issues/2423) +- Line Chart show value on specific coordinate [\#2420](https://github.com/danielgindi/Charts/issues/2420) +- Is it possible to extend the gesture handler? [\#2419](https://github.com/danielgindi/Charts/issues/2419) +- Memory Leak in BarChartView Data [\#2416](https://github.com/danielgindi/Charts/issues/2416) +- Track Scroll Left or Right [\#2415](https://github.com/danielgindi/Charts/issues/2415) +- How can I add the xVals to LineChartData object? [\#2412](https://github.com/danielgindi/Charts/issues/2412) +- Line chart doesn't redraw correctly after removeEntry\(\) [\#2411](https://github.com/danielgindi/Charts/issues/2411) +- Bar width [\#2410](https://github.com/danielgindi/Charts/issues/2410) +- There is no way to restrict zoom level after certain zoom level [\#2409](https://github.com/danielgindi/Charts/issues/2409) +- Half Pie Chart no full view [\#2408](https://github.com/danielgindi/Charts/issues/2408) +- How to use gradient colors for each column in a histogram? [\#2407](https://github.com/danielgindi/Charts/issues/2407) +- Fill line chart when drag with two fingers [\#2405](https://github.com/danielgindi/Charts/issues/2405) +- chartValueSelected Delegate Method Not Called [\#2404](https://github.com/danielgindi/Charts/issues/2404) +- Draw bar line even though the value is zero [\#2403](https://github.com/danielgindi/Charts/issues/2403) +- Adding line/dataset on line chart that already has a line [\#2401](https://github.com/danielgindi/Charts/issues/2401) +- help with labels [\#2400](https://github.com/danielgindi/Charts/issues/2400) +- 'Charts/Charts.h' file not found when tried build using "XCODEBUILD" command in terminal [\#2397](https://github.com/danielgindi/Charts/issues/2397) +- moveViewToX\(\) has no affect on a chart whose frame has not been set yet [\#2395](https://github.com/danielgindi/Charts/issues/2395) +- Appending Units\(i.e. m/s, mpg, etc\) to yaxis?? [\#2394](https://github.com/danielgindi/Charts/issues/2394) +- Chart Top label Issue [\#2392](https://github.com/danielgindi/Charts/issues/2392) +- How to just draw one circle value for LineChartView [\#2391](https://github.com/danielgindi/Charts/issues/2391) +- Support for 3D charts [\#2389](https://github.com/danielgindi/Charts/issues/2389) +- Y Axis range calculation is incorrect for Bar Charts [\#2386](https://github.com/danielgindi/Charts/issues/2386) +- Is having a ChartViewBase inside a custom UIView even possible? [\#2384](https://github.com/danielgindi/Charts/issues/2384) +- "chartValueSelected" is not getting called. [\#2383](https://github.com/danielgindi/Charts/issues/2383) +- Does it support XO line\(American CandleStick\)? [\#2382](https://github.com/danielgindi/Charts/issues/2382) +- Chart Won't Display [\#2381](https://github.com/danielgindi/Charts/issues/2381) +- autoScaleMinMaxEnabled Not Working [\#2374](https://github.com/danielgindi/Charts/issues/2374) +- Graph is being drawn outside of visible area [\#2373](https://github.com/danielgindi/Charts/issues/2373) +- Compile error on Release build configuration [\#2372](https://github.com/danielgindi/Charts/issues/2372) +- moveViewToX clips bar [\#2370](https://github.com/danielgindi/Charts/issues/2370) +- swift 3.x -\> New ChartMarker? [\#2369](https://github.com/danielgindi/Charts/issues/2369) +- Crash on computeAxisValues of Bar Chart [\#2368](https://github.com/danielgindi/Charts/issues/2368) +- How to properly reset zoom on data refresh? [\#2367](https://github.com/danielgindi/Charts/issues/2367) +- What is the meaning of xValue in moveViewToAnimated? [\#2366](https://github.com/danielgindi/Charts/issues/2366) +- Horizontal Bar Chart rightAxis default maximum space [\#2363](https://github.com/danielgindi/Charts/issues/2363) +- Why my LineChartDataSet's line is behind the bar? [\#2354](https://github.com/danielgindi/Charts/issues/2354) +- charts2.5 bottom line render issue [\#2352](https://github.com/danielgindi/Charts/issues/2352) +- Limit the number of bars to 10 when the x-axis is made of strings [\#2351](https://github.com/danielgindi/Charts/issues/2351) +- Not able to plot values in linechart [\#2349](https://github.com/danielgindi/Charts/issues/2349) +- Text in Marker [\#2348](https://github.com/danielgindi/Charts/issues/2348) +- PieChart overlay lines or dots for select slices in the pie chart [\#2347](https://github.com/danielgindi/Charts/issues/2347) +- Multiple colors grid background [\#2346](https://github.com/danielgindi/Charts/issues/2346) +- The direction of the two BarChart [\#2345](https://github.com/danielgindi/Charts/issues/2345) +- how to format y-axix values [\#2343](https://github.com/danielgindi/Charts/issues/2343) +- different Bar color based on values [\#2342](https://github.com/danielgindi/Charts/issues/2342) +- XCode wants to convert Chart [\#2341](https://github.com/danielgindi/Charts/issues/2341) +- Population Pyramid [\#2340](https://github.com/danielgindi/Charts/issues/2340) +- Not all labels shown on horizontal bar chart with large datasets [\#2339](https://github.com/danielgindi/Charts/issues/2339) +- Using ChartViewBase as the type and instantiating the chart later as a specific type [\#2338](https://github.com/danielgindi/Charts/issues/2338) +- Remove Highlight from bar graph [\#2337](https://github.com/danielgindi/Charts/issues/2337) +- Set diffent style to single line graph [\#2336](https://github.com/danielgindi/Charts/issues/2336) +- change the color of the highlight point [\#2334](https://github.com/danielgindi/Charts/issues/2334) +- Extra space to the right of chart [\#2333](https://github.com/danielgindi/Charts/issues/2333) +- xcode 8.3 swift 3.1 [\#2332](https://github.com/danielgindi/Charts/issues/2332) +- AxisDependencyRight Question~~ [\#2331](https://github.com/danielgindi/Charts/issues/2331) +- Module Charts not found XCODE 8.1 Error [\#2330](https://github.com/danielgindi/Charts/issues/2330) +- How to remove Grid [\#2329](https://github.com/danielgindi/Charts/issues/2329) +- The spacing between the two points is wider than the distance between the labels [\#2327](https://github.com/danielgindi/Charts/issues/2327) +- Skipped installing realm-cocoa.framework binary due to the error: [\#2326](https://github.com/danielgindi/Charts/issues/2326) +- Pie Chart view as Int instead of double on segment? [\#2325](https://github.com/danielgindi/Charts/issues/2325) +- Not able to give X axis Values [\#2324](https://github.com/danielgindi/Charts/issues/2324) +- Labels to PieChart? v 3.0.2 [\#2323](https://github.com/danielgindi/Charts/issues/2323) +- How to prevent static data sets from redrawing and hogging CPU [\#2322](https://github.com/danielgindi/Charts/issues/2322) +- BarChart xAxis labels a moving [\#2321](https://github.com/danielgindi/Charts/issues/2321) +- How to add a fade background for data values [\#2320](https://github.com/danielgindi/Charts/issues/2320) +- Limit Line after update to 3.0.2 no longer shown [\#2319](https://github.com/danielgindi/Charts/issues/2319) +- Charts v3.0.2 does not build using Carthage [\#2317](https://github.com/danielgindi/Charts/issues/2317) +- Too much Warnings on the comments [\#2316](https://github.com/danielgindi/Charts/issues/2316) +- spaceMin and spaceMax are not percentages [\#2314](https://github.com/danielgindi/Charts/issues/2314) +- API for increasing or decreasing condition for CandleStick Chart [\#2311](https://github.com/danielgindi/Charts/issues/2311) +- Create Tag to include 'fix for Xcode 8.3' [\#2309](https://github.com/danielgindi/Charts/issues/2309) +- Ambiguous use of 'data' [\#2304](https://github.com/danielgindi/Charts/issues/2304) +- Default backgroundColor \(nil\) displays as black instead of clear. [\#2222](https://github.com/danielgindi/Charts/issues/2222) +- pdf report with Line Chart blurry from iphone 7 [\#2204](https://github.com/danielgindi/Charts/issues/2204) +- how to add Values to Pie Chart? and how to show complete pie chart instead of doughnut [\#2150](https://github.com/danielgindi/Charts/issues/2150) +- 'LineChartView' is unavailable: cannot find Swift declaration for this class [\#2145](https://github.com/danielgindi/Charts/issues/2145) +- Display label MMyyyy for barChart [\#2142](https://github.com/danielgindi/Charts/issues/2142) +- barSpace attribute [\#2137](https://github.com/danielgindi/Charts/issues/2137) +- Bar Chart, Shifting Y Position [\#2134](https://github.com/danielgindi/Charts/issues/2134) +- highlightValue is throwing "fatal error: Index out of range" in Combined Chart [\#2076](https://github.com/danielgindi/Charts/issues/2076) + +**Merged pull requests:** + +- Update xcode project for xcode 9 [\#2767](https://github.com/danielgindi/Charts/pull/2767) ([petester42](https://github.com/petester42)) +- Fixed value setter on PieChartDataEntry [\#2754](https://github.com/danielgindi/Charts/pull/2754) ([martnst](https://github.com/martnst)) +- Conform to macOS api changes in swift 3.2 [\#2717](https://github.com/danielgindi/Charts/pull/2717) ([ohbargain](https://github.com/ohbargain)) +- Fix CombinedChartView not draw markers [\#2702](https://github.com/danielgindi/Charts/pull/2702) ([xzysun](https://github.com/xzysun)) +- Reduce build time with minor reference refactor [\#2679](https://github.com/danielgindi/Charts/pull/2679) ([xinranw](https://github.com/xinranw)) +- Fix Typo: Probider -\> Provider [\#2650](https://github.com/danielgindi/Charts/pull/2650) ([russellbstephens](https://github.com/russellbstephens)) +- Adding a third party tutorial [\#2604](https://github.com/danielgindi/Charts/pull/2604) ([osianSmith](https://github.com/osianSmith)) +- fix \#2099, avoid crash when some chart only allow 1 data set [\#2500](https://github.com/danielgindi/Charts/pull/2500) ([liuxuan30](https://github.com/liuxuan30)) +- tutorial link added to readme [\#2484](https://github.com/danielgindi/Charts/pull/2484) ([annalizhaz](https://github.com/annalizhaz)) +- Allow turning off drag in X and Y axes separately. [\#2413](https://github.com/danielgindi/Charts/pull/2413) ([maciejtrybilo](https://github.com/maciejtrybilo)) +- Run view port jobs afterwards \(Fixes \#2395\) [\#2396](https://github.com/danielgindi/Charts/pull/2396) ([feosuna1](https://github.com/feosuna1)) +- Minor improvements in BalloonMarker.swift [\#2393](https://github.com/danielgindi/Charts/pull/2393) ([valeriyvan](https://github.com/valeriyvan)) +- remove build for ci tests procedure, use `clean test` directly [\#2388](https://github.com/danielgindi/Charts/pull/2388) ([liuxuan30](https://github.com/liuxuan30)) +- Update Travis config for Xcode 8.3 and fix test failures [\#2378](https://github.com/danielgindi/Charts/pull/2378) ([liuxuan30](https://github.com/liuxuan30)) +- Fix Simple Bar Chart Demo, switch use of x and y values [\#2365](https://github.com/danielgindi/Charts/pull/2365) ([franqueli](https://github.com/franqueli)) +- Bug fixing with one line, updating ChartViewBase.swift [\#2355](https://github.com/danielgindi/Charts/pull/2355) ([Eric0625](https://github.com/Eric0625)) +- Fixed, If the last value is the max or min, the range will be wrong [\#2229](https://github.com/danielgindi/Charts/pull/2229) ([aelam](https://github.com/aelam)) +- fix \#2222 move default backgroundColor to initialize\(\) [\#2228](https://github.com/danielgindi/Charts/pull/2228) ([liuxuan30](https://github.com/liuxuan30)) +- Fix \#1879. Similar cut in half issue in scatter chart like others [\#1891](https://github.com/danielgindi/Charts/pull/1891) ([liuxuan30](https://github.com/liuxuan30)) + +## [v3.0.2](https://github.com/danielgindi/Charts/tree/v3.0.2) (2017-04-02) +[Full Changelog](https://github.com/danielgindi/Charts/compare/3.0.2...v3.0.2) + +## [3.0.2](https://github.com/danielgindi/Charts/tree/3.0.2) (2017-04-02) +[Full Changelog](https://github.com/danielgindi/Charts/compare/3.0.1...3.0.2) + +**Implemented enhancements:** + +- Plotting Realm data in Swift. RLMResults not available [\#898](https://github.com/danielgindi/Charts/issues/898) + +**Fixed bugs:** + +- \[Bug\] Double BarChart second value text mispaced [\#1191](https://github.com/danielgindi/Charts/issues/1191) +- \: CGAffineTransformInvert: singular matrix [\#802](https://github.com/danielgindi/Charts/issues/802) + +**Closed issues:** + +- Please give option for installing via Swift Package Manager too [\#2313](https://github.com/danielgindi/Charts/issues/2313) +- Adjust spacing between axis labels and axes? [\#2310](https://github.com/danielgindi/Charts/issues/2310) +- \*PieChart\* Get color of top 3 largest percent [\#2308](https://github.com/danielgindi/Charts/issues/2308) +- Set the x axis data problems, and 2.3.0 apis are quite different.Need your help [\#2307](https://github.com/danielgindi/Charts/issues/2307) +- little issue with chart custoemView size & chart data [\#2305](https://github.com/danielgindi/Charts/issues/2305) +- hello,A small problem. [\#2303](https://github.com/danielgindi/Charts/issues/2303) +- Running 1 of 1 custom shell scripts [\#2302](https://github.com/danielgindi/Charts/issues/2302) +- Multiple warnings xCode 8.3 [\#2298](https://github.com/danielgindi/Charts/issues/2298) +- Remove color label in pie-chart [\#2297](https://github.com/danielgindi/Charts/issues/2297) +- Charts 2.3 with Swift 3 \(xCode 8.3\) [\#2295](https://github.com/danielgindi/Charts/issues/2295) +- Modify Marker before showing value [\#2294](https://github.com/danielgindi/Charts/issues/2294) +- Xcode 8.3: 62 deprecation warnings [\#2293](https://github.com/danielgindi/Charts/issues/2293) +- Fix warning for Xcode8.3 [\#2292](https://github.com/danielgindi/Charts/issues/2292) +- Chart Selected function is not called on click of every Bar. [\#2291](https://github.com/danielgindi/Charts/issues/2291) +- “Swift Language Version” [\#2290](https://github.com/danielgindi/Charts/issues/2290) +- Swift 3.1 support [\#2288](https://github.com/danielgindi/Charts/issues/2288) +- Swift 3.1 Build [\#2287](https://github.com/danielgindi/Charts/issues/2287) +- ChartTouchDelegate never called [\#2286](https://github.com/danielgindi/Charts/issues/2286) +- Radar map size setting [\#2284](https://github.com/danielgindi/Charts/issues/2284) +- How do I set the radar map size? [\#2283](https://github.com/danielgindi/Charts/issues/2283) +- Adjust circle radius for individual line chart data point [\#2282](https://github.com/danielgindi/Charts/issues/2282) +- Get current axis interval between labels [\#2281](https://github.com/danielgindi/Charts/issues/2281) +- Only allow slice space for the selected item in a pie chart [\#2278](https://github.com/danielgindi/Charts/issues/2278) +- PieChartDataSet [\#2277](https://github.com/danielgindi/Charts/issues/2277) +- I want to un-highlight a line chart when dragging has stopped, among other things. Am I missing it? Thanks [\#2276](https://github.com/danielgindi/Charts/issues/2276) +- Demo for Swift 3 [\#2274](https://github.com/danielgindi/Charts/issues/2274) +- Getting the percentage and label for a slice [\#2273](https://github.com/danielgindi/Charts/issues/2273) +- Line chart - LineChartDataSet Background color. [\#2272](https://github.com/danielgindi/Charts/issues/2272) +- place image at top of each bar in bar graph [\#2271](https://github.com/danielgindi/Charts/issues/2271) +- How to draw circle at the end of a data set on line chart [\#2270](https://github.com/danielgindi/Charts/issues/2270) +- when i install pod 'Charts'. its install Old Version Of library 2.3 and give me error convert code into latest swift. [\#2269](https://github.com/danielgindi/Charts/issues/2269) +- ChartsDemo Buildtime Error: No such module 'RealmSwift' [\#2268](https://github.com/danielgindi/Charts/issues/2268) +- Total Data [\#2267](https://github.com/danielgindi/Charts/issues/2267) +- Line Chart Highlight, Remove X axis line and display label [\#2266](https://github.com/danielgindi/Charts/issues/2266) +- Increasing bar width in grouped sets of BarChartView [\#2263](https://github.com/danielgindi/Charts/issues/2263) +- lineChart.leftAxis.startAtZeroEnabled is not available in Swift 3 library [\#2262](https://github.com/danielgindi/Charts/issues/2262) +- Can't find highlightcolor [\#2256](https://github.com/danielgindi/Charts/issues/2256) +- Custom yAxis values [\#2254](https://github.com/danielgindi/Charts/issues/2254) +- Dynamic generate Int values for axis [\#2253](https://github.com/danielgindi/Charts/issues/2253) +- viewController can't be dealloc [\#2252](https://github.com/danielgindi/Charts/issues/2252) +- How to include a gap between data points & lines [\#2251](https://github.com/danielgindi/Charts/issues/2251) +- Highlight particular X and Y coordinations in the iOS charts [\#2250](https://github.com/danielgindi/Charts/issues/2250) +- Bar shapes are overlapped with other bars [\#2248](https://github.com/danielgindi/Charts/issues/2248) +- Xaxis Label value in range \(2.5-5.0,5.0-7.5\) [\#2246](https://github.com/danielgindi/Charts/issues/2246) +- Multiline axis labels are cut off [\#2244](https://github.com/danielgindi/Charts/issues/2244) +- Problems with creating CombinedChart \(Line + grouped BarChart\) in Swift 3.0 [\#2243](https://github.com/danielgindi/Charts/issues/2243) +- Convert to Current Swift Syntax [\#2242](https://github.com/danielgindi/Charts/issues/2242) +- Line chart real time data - memory leak [\#2241](https://github.com/danielgindi/Charts/issues/2241) +- Radar chart bug - grey view shown on 6 plus and 7 plus [\#2238](https://github.com/danielgindi/Charts/issues/2238) +- How to set dual axis in line chart [\#2237](https://github.com/danielgindi/Charts/issues/2237) +- Tableview stuttering when rendering a pie chart [\#2234](https://github.com/danielgindi/Charts/issues/2234) +- Set vertical legend [\#2233](https://github.com/danielgindi/Charts/issues/2233) +- how to join XAxisLabel in MultipleBarChart under every Bar [\#2232](https://github.com/danielgindi/Charts/issues/2232) +- Custom xAxisRenderer [\#2230](https://github.com/danielgindi/Charts/issues/2230) +- demo can not run [\#2227](https://github.com/danielgindi/Charts/issues/2227) +- Change color of lineChartDataSet when chartValueSelected [\#2226](https://github.com/danielgindi/Charts/issues/2226) +- Legend Label problem when the device changes orientation [\#2224](https://github.com/danielgindi/Charts/issues/2224) +- Legend vertical offset for horizontally aligned legends [\#2223](https://github.com/danielgindi/Charts/issues/2223) +- Don't display or load all Variables on the Left of the Bar \(iOS - Swift 3\) [\#2221](https://github.com/danielgindi/Charts/issues/2221) +- Horizontal Bar Chart lines not visible with two BarChartDataSet in chart data [\#2220](https://github.com/danielgindi/Charts/issues/2220) +- Bar chart with limit line for each Bar [\#2219](https://github.com/danielgindi/Charts/issues/2219) +- why the zero can't show at the first [\#2218](https://github.com/danielgindi/Charts/issues/2218) +- About BalloonMarker [\#2216](https://github.com/danielgindi/Charts/issues/2216) +- How can I have these values in positive? Thanks. [\#2212](https://github.com/danielgindi/Charts/issues/2212) +- Line Graph is not showing line on the Chart [\#2209](https://github.com/danielgindi/Charts/issues/2209) +- Issue of enum description [\#2208](https://github.com/danielgindi/Charts/issues/2208) +- I find a issues in HorizontalBarChartView [\#2205](https://github.com/danielgindi/Charts/issues/2205) +- My ipa\(used Charts\) is 40M ;another ipa\(unused Charts\) is 13M,how to be sliming??? [\#2203](https://github.com/danielgindi/Charts/issues/2203) +- Legend vertical offset [\#2202](https://github.com/danielgindi/Charts/issues/2202) +- Charts not showing on tvOS [\#2201](https://github.com/danielgindi/Charts/issues/2201) +- Is it enable to keep the origin visible X Range when I appended more data [\#2198](https://github.com/danielgindi/Charts/issues/2198) +- Issue with Realm [\#2195](https://github.com/danielgindi/Charts/issues/2195) +- External lines - Pie Chart [\#2194](https://github.com/danielgindi/Charts/issues/2194) +- Hide labels - Pie chart [\#2193](https://github.com/danielgindi/Charts/issues/2193) +- is two sided bar graph possible ? [\#2192](https://github.com/danielgindi/Charts/issues/2192) +- Optimisation of drawing many points on line graph [\#2190](https://github.com/danielgindi/Charts/issues/2190) +- Bar Chart with dual axis [\#2188](https://github.com/danielgindi/Charts/issues/2188) +- Customize Text inside Ballon Marker [\#2186](https://github.com/danielgindi/Charts/issues/2186) +- "Shell Script Invocation Error: Command /bin/sh failed with exit code 1' [\#2185](https://github.com/danielgindi/Charts/issues/2185) +- Increase space between bars with only one dataset and assign font for specific value and xAxis label [\#2184](https://github.com/danielgindi/Charts/issues/2184) +- "noDataText" does not work [\#2179](https://github.com/danielgindi/Charts/issues/2179) +- Change color of one label [\#2178](https://github.com/danielgindi/Charts/issues/2178) +- Line Chart not show empty values - Charts 3.0 [\#2176](https://github.com/danielgindi/Charts/issues/2176) +- Bottom Label is not printing whole array list. [\#2175](https://github.com/danielgindi/Charts/issues/2175) +- Stacked Horizontal Chart Scaling [\#2174](https://github.com/danielgindi/Charts/issues/2174) +- How to set different colors for intervals on LineChart? [\#2172](https://github.com/danielgindi/Charts/issues/2172) +- Could you tell me how to forbidden line chart scroll up and down? [\#2171](https://github.com/danielgindi/Charts/issues/2171) +- Fixed BarWidth based on Pixel for BarChart [\#2170](https://github.com/danielgindi/Charts/issues/2170) +- Branch Chart3.0-Swift2.3 not found. [\#2166](https://github.com/danielgindi/Charts/issues/2166) +- "clipValuesToContentEnabled" does not work [\#2163](https://github.com/danielgindi/Charts/issues/2163) +- BarChartView with TableView [\#2161](https://github.com/danielgindi/Charts/issues/2161) +- How to show label on x-axis at regular interval and tail end on the graph line [\#2160](https://github.com/danielgindi/Charts/issues/2160) +- Set line cap to CGMutablePath [\#2159](https://github.com/danielgindi/Charts/issues/2159) +- why we set the y value 2.57,but the chart show 3,if i set y value2.44,the chart show 2.how to do the problem. [\#2157](https://github.com/danielgindi/Charts/issues/2157) +- Demo crush !!! [\#2154](https://github.com/danielgindi/Charts/issues/2154) +- Fixing the Segmentation fault issue after Convert to Swift 3.0 [\#2151](https://github.com/danielgindi/Charts/issues/2151) +- GitHub API request failed [\#2149](https://github.com/danielgindi/Charts/issues/2149) +- y-Values and x-Values as string in barchart, [\#2147](https://github.com/danielgindi/Charts/issues/2147) +- Piechart with smooth edges? [\#2146](https://github.com/danielgindi/Charts/issues/2146) +- Pie chart highlighted slice offset [\#2144](https://github.com/danielgindi/Charts/issues/2144) +- Formatter data on OS X [\#2141](https://github.com/danielgindi/Charts/issues/2141) +- How to add dates to line chart? [\#2136](https://github.com/danielgindi/Charts/issues/2136) +- 'backgroundColor' is inaccessible due to 'internal' protection level on mac OS X [\#2135](https://github.com/danielgindi/Charts/issues/2135) +- Some object files have incompatible Objective-C category definitions. Some category metadata may be lost. All files containing Objective-C categories should be built using the same compiler. [\#2133](https://github.com/danielgindi/Charts/issues/2133) +- Any Demo of all charts in Swift 3 [\#2132](https://github.com/danielgindi/Charts/issues/2132) +- How to access the Position of labels on x axis of Combined Line and Bar chart on swift\(3.0.1\) [\#2131](https://github.com/danielgindi/Charts/issues/2131) +- Wrong Limit line positioning when axisMinimum is set to 0 [\#2128](https://github.com/danielgindi/Charts/issues/2128) +- Extremely Slow compile Times on XCode 8.2.1 and swift 3.0.2 [\#2127](https://github.com/danielgindi/Charts/issues/2127) +- How to add TrackBall and edit label above BarCharts in Charts swift2 and swift 3?? [\#2126](https://github.com/danielgindi/Charts/issues/2126) +- Xcode 8.3 Compatible [\#2125](https://github.com/danielgindi/Charts/issues/2125) +- LineChartData\(dataSets: dataSets\) Missing xVals [\#2124](https://github.com/danielgindi/Charts/issues/2124) +- How to assign custom String values to XAxis? [\#2122](https://github.com/danielgindi/Charts/issues/2122) +- Simple Radar Chart causing hang / cpu 99% [\#2121](https://github.com/danielgindi/Charts/issues/2121) +- Can i use the framework without including the whole project ? [\#2118](https://github.com/danielgindi/Charts/issues/2118) +- Undefined symbols for architecture arm64 - Charts 3.0 CocoaPods [\#2117](https://github.com/danielgindi/Charts/issues/2117) +- method setlabelstoskip missing from XAxis.swift [\#2115](https://github.com/danielgindi/Charts/issues/2115) +- SocketIOClientConfiguration.swift wont compile [\#2113](https://github.com/danielgindi/Charts/issues/2113) +- No code signing identities found: No valid signing identities \(i.e. certificate and private key pair\) were found [\#2112](https://github.com/danielgindi/Charts/issues/2112) +- Can I custom draw circle in LineChart in version 3.0 ?\[help\] [\#2104](https://github.com/danielgindi/Charts/issues/2104) +- App crash XCode 8.2 Chart version 3.0 [\#2103](https://github.com/danielgindi/Charts/issues/2103) +- Charts 3.0.1 - Align x labels \(dates\) with plots [\#2094](https://github.com/danielgindi/Charts/issues/2094) +- Demo in Swift 3 [\#2092](https://github.com/danielgindi/Charts/issues/2092) +- How to set xAxis values from array in Swift 3.0 [\#2090](https://github.com/danielgindi/Charts/issues/2090) +- error to Methode [\#2089](https://github.com/danielgindi/Charts/issues/2089) +- fitBars doesnt seems to work [\#2088](https://github.com/danielgindi/Charts/issues/2088) +- oh, no!!!!!! Demo code can't run [\#2087](https://github.com/danielgindi/Charts/issues/2087) +- In BarChartView leftAxis labels cutdown, does-not fit on screen. [\#2086](https://github.com/danielgindi/Charts/issues/2086) +- accessing .rightAxis gives EXC\_BAD\_ACCESS [\#2082](https://github.com/danielgindi/Charts/issues/2082) +- leftAxis and value overlap in lineChartView [\#2080](https://github.com/danielgindi/Charts/issues/2080) +- I want to add 4 colours to the background of the chart. The colour zones depend on the y values. [\#2079](https://github.com/danielgindi/Charts/issues/2079) +- Value labels for multiple ChartDataSets all aligned at the beginning \(left\) of each bar in HorizontalBarChart [\#2077](https://github.com/danielgindi/Charts/issues/2077) +- How to Resize Labels in Pie Chart Legend [\#2075](https://github.com/danielgindi/Charts/issues/2075) +- Bar chart data entry [\#2074](https://github.com/danielgindi/Charts/issues/2074) +- How can I have a limit zone \(in android library mpandroidchart\) like feature in this iOS library [\#2073](https://github.com/danielgindi/Charts/issues/2073) +- BarChartView is unavailable, cannot find swift declaration [\#2072](https://github.com/danielgindi/Charts/issues/2072) +- Not enable to draw custom shape which is based on the XValue or YValue ? [\#2071](https://github.com/danielgindi/Charts/issues/2071) +- Can horizontalBarChartView invert the Axis ? [\#2070](https://github.com/danielgindi/Charts/issues/2070) +- can't set different padding of each side [\#2068](https://github.com/danielgindi/Charts/issues/2068) +- Area chart with missing points [\#2067](https://github.com/danielgindi/Charts/issues/2067) +- Demo code can't run [\#2066](https://github.com/danielgindi/Charts/issues/2066) +- Positioning the XAxis inconsistent with Y-axis and the Wiki in Swift 3 [\#2065](https://github.com/danielgindi/Charts/issues/2065) +- Radar chart title [\#2061](https://github.com/danielgindi/Charts/issues/2061) +- fixed increment [\#2059](https://github.com/danielgindi/Charts/issues/2059) +- Line Chart with callouts [\#2058](https://github.com/danielgindi/Charts/issues/2058) +- Delegate ChartValueSelected Not Called. [\#2057](https://github.com/danielgindi/Charts/issues/2057) +- IValueFormatter protocol not working [\#2055](https://github.com/danielgindi/Charts/issues/2055) +- "BalloonMarker“ cannot be find in my project [\#2051](https://github.com/danielgindi/Charts/issues/2051) +- How to use marker when I use CombinedChart? [\#2046](https://github.com/danielgindi/Charts/issues/2046) +- yVals have decimal point [\#2045](https://github.com/danielgindi/Charts/issues/2045) +- LeftAxis Labels will disappear [\#2044](https://github.com/danielgindi/Charts/issues/2044) +- Can't addEntry to a set in Swift 3 [\#2043](https://github.com/danielgindi/Charts/issues/2043) +- Will not compile in existing Objective-C Project. [\#2041](https://github.com/danielgindi/Charts/issues/2041) +- labels on xAxis not showing up and incorrect values on yAxis [\#2040](https://github.com/danielgindi/Charts/issues/2040) +- xAxis.valueFormatter = self create retain cycle [\#2039](https://github.com/danielgindi/Charts/issues/2039) +- Label's point of view [\#2038](https://github.com/danielgindi/Charts/issues/2038) +- How to show limited visible xValues labels? [\#2037](https://github.com/danielgindi/Charts/issues/2037) +- BarChart XAxis between Positive & Negative Values [\#2036](https://github.com/danielgindi/Charts/issues/2036) +- Error when trying to run ChartsDemo on iOS Simulator \(image not found\) [\#2035](https://github.com/danielgindi/Charts/issues/2035) +- big snap shot [\#2034](https://github.com/danielgindi/Charts/issues/2034) +- module file's minimum deployment target is ios9.3 [\#2031](https://github.com/danielgindi/Charts/issues/2031) +- Date formatter doesn't show up properly when using multiple bars in a chart. [\#2030](https://github.com/danielgindi/Charts/issues/2030) +- Y axis dynamic sampling ? [\#2029](https://github.com/danielgindi/Charts/issues/2029) +- Convert line chart entry to take dictionary [\#2027](https://github.com/danielgindi/Charts/issues/2027) +- How to set string value line \(27 Oct\) in xAxis [\#2025](https://github.com/danielgindi/Charts/issues/2025) +- Build \[ChartsDemo\] Error : 「ChartsRealm Reason: image not found 」alaway [\#2024](https://github.com/danielgindi/Charts/issues/2024) +- \[LineChartView\] setting xAxis.axisMinimum affects xAxis.spaceMin [\#2022](https://github.com/danielgindi/Charts/issues/2022) +- c vcgffrgfffgffgfgffffrfrfrrfdfdfdfdfdfdfggkjhghghghghjhjhjhjkjkjkkkklklklklikii0987654321poijkl;';lk;l; [\#2021](https://github.com/danielgindi/Charts/issues/2021) +- How to make the highlight line work with UIPanGestureRecognizer [\#2019](https://github.com/danielgindi/Charts/issues/2019) +- BarChart Issue for plotting the value on x-axis serially [\#2017](https://github.com/danielgindi/Charts/issues/2017) +- Please help me with the Pie Charts in Charts 3.0.1. [\#2016](https://github.com/danielgindi/Charts/issues/2016) +- ipa becomes larger after using Charts [\#2015](https://github.com/danielgindi/Charts/issues/2015) +- BarChartView highlight issues [\#2014](https://github.com/danielgindi/Charts/issues/2014) +- How to set up a line chart, the starting point of the distance from the left margin, border distance end points [\#2013](https://github.com/danielgindi/Charts/issues/2013) +- mult bars not show all [\#2012](https://github.com/danielgindi/Charts/issues/2012) +- how to change legend font size? [\#2011](https://github.com/danielgindi/Charts/issues/2011) +- image instead of text in CenterText in pie chart [\#2010](https://github.com/danielgindi/Charts/issues/2010) +- Change PieChart Center Color [\#2009](https://github.com/danielgindi/Charts/issues/2009) +- Demo issues [\#2008](https://github.com/danielgindi/Charts/issues/2008) +- How to display last label in X-Axis [\#2007](https://github.com/danielgindi/Charts/issues/2007) +- One point different values on the axis X [\#2005](https://github.com/danielgindi/Charts/issues/2005) +- Hide all text/labels/values in pieChart [\#2004](https://github.com/danielgindi/Charts/issues/2004) +- it is not an issue. it is related to OHLC chart [\#2003](https://github.com/danielgindi/Charts/issues/2003) +- Disable PieChart Label in Chart [\#2002](https://github.com/danielgindi/Charts/issues/2002) +- \[LineChartViewController stringForValue:axis:\] [\#2001](https://github.com/danielgindi/Charts/issues/2001) +- Values are cut out of the window [\#2000](https://github.com/danielgindi/Charts/issues/2000) +- XAxis in top AND bottom position [\#1999](https://github.com/danielgindi/Charts/issues/1999) +- Can't compile under Xcode 8.1 with Swift 3.0 [\#1998](https://github.com/danielgindi/Charts/issues/1998) +- Always display max 5 visible bars in BarChartView [\#1997](https://github.com/danielgindi/Charts/issues/1997) +- I want touchpoint in the bar to do something [\#1996](https://github.com/danielgindi/Charts/issues/1996) +- Is there any way to change chart data label from bottom of table to top? [\#1995](https://github.com/danielgindi/Charts/issues/1995) +- Installation not clear, for me [\#1994](https://github.com/danielgindi/Charts/issues/1994) +- Add space between bar chart [\#1993](https://github.com/danielgindi/Charts/issues/1993) +- How to fix the distance between each point on the X-coordinate? [\#1992](https://github.com/danielgindi/Charts/issues/1992) +- How to add tips to RadarChartView [\#1991](https://github.com/danielgindi/Charts/issues/1991) +- Piechart issue [\#1990](https://github.com/danielgindi/Charts/issues/1990) +- Multiple colors issue in stacked bar line charts swift3 [\#1989](https://github.com/danielgindi/Charts/issues/1989) +- ChartViewDelegate is not called. [\#1988](https://github.com/danielgindi/Charts/issues/1988) +- Always display vertical scrolling indicator on horizontal bar chart [\#1987](https://github.com/danielgindi/Charts/issues/1987) +- Can't compile DemoProject [\#1986](https://github.com/danielgindi/Charts/issues/1986) +- My pie chart legends still not showing [\#1985](https://github.com/danielgindi/Charts/issues/1985) +- no yValCount in ChartData [\#1982](https://github.com/danielgindi/Charts/issues/1982) +- no limitLineSegmentsBuffer in YAxisRenderer [\#1981](https://github.com/danielgindi/Charts/issues/1981) +- Legend label missing in pie chart [\#1980](https://github.com/danielgindi/Charts/issues/1980) +- For X axis the values are not adding [\#1979](https://github.com/danielgindi/Charts/issues/1979) +- When I have two data, charts shows the three data automatically [\#1978](https://github.com/danielgindi/Charts/issues/1978) +- Two legends for stacked bar chart [\#1977](https://github.com/danielgindi/Charts/issues/1977) +- X axis coordinate point spacing [\#1975](https://github.com/danielgindi/Charts/issues/1975) +- Carthage was not found [\#1974](https://github.com/danielgindi/Charts/issues/1974) +- How to Show XAxis Label On YAxis Bar In BarView Charts? [\#1973](https://github.com/danielgindi/Charts/issues/1973) +- Labels on Mac OS X application : place and title [\#1972](https://github.com/danielgindi/Charts/issues/1972) +- I am gettign @import AppKit is missing in Charts-Swift.h under charts.framework [\#1971](https://github.com/danielgindi/Charts/issues/1971) +- Multiline chart with common data point [\#1970](https://github.com/danielgindi/Charts/issues/1970) +- Version 3.0.1: Fill gradient fills out the wrong side of the chart [\#1968](https://github.com/danielgindi/Charts/issues/1968) +- How to pass data to the X axis?? [\#1967](https://github.com/danielgindi/Charts/issues/1967) +- How do I implement a legend click event? [\#1965](https://github.com/danielgindi/Charts/issues/1965) +- can't set the XVals [\#1964](https://github.com/danielgindi/Charts/issues/1964) +- Color for Legend label [\#1962](https://github.com/danielgindi/Charts/issues/1962) +- Two y axis plot on a side? [\#1961](https://github.com/danielgindi/Charts/issues/1961) +- Scrolling feature? [\#1960](https://github.com/danielgindi/Charts/issues/1960) +- Can you add the chart Of the triangle? [\#1958](https://github.com/danielgindi/Charts/issues/1958) +- Multiple y-data for single x-index [\#1955](https://github.com/danielgindi/Charts/issues/1955) +- LineChartView: axisMaximum and axisMinimum work wrong in rightAxis [\#1953](https://github.com/danielgindi/Charts/issues/1953) +- Radar Chart axis maximum [\#1952](https://github.com/danielgindi/Charts/issues/1952) +- Adding a single x-axis label for two data points. [\#1951](https://github.com/danielgindi/Charts/issues/1951) +- Adding title to X-axis and Y-axis [\#1950](https://github.com/danielgindi/Charts/issues/1950) +- Find screen location for bars in a bar chart [\#1949](https://github.com/danielgindi/Charts/issues/1949) +- \(3.0 Regression\) Scatter chart cuts off data at the edges [\#1946](https://github.com/danielgindi/Charts/issues/1946) +- How automatic showing marker? [\#1944](https://github.com/danielgindi/Charts/issues/1944) +- Right and left margins [\#1942](https://github.com/danielgindi/Charts/issues/1942) +- Displaying an overlay with extra / more detailed information on mouse hover [\#1940](https://github.com/danielgindi/Charts/issues/1940) +- Can we have flexible y Axis scale [\#1939](https://github.com/danielgindi/Charts/issues/1939) +- Charts3.0 - Can not show all the xAxis label if more than 8 value - Swift [\#1938](https://github.com/danielgindi/Charts/issues/1938) +- Barchart xAxis interval [\#1937](https://github.com/danielgindi/Charts/issues/1937) +- Avoiding chart legend [\#1936](https://github.com/danielgindi/Charts/issues/1936) +- Module compiled with Swift 2.3 cannot be imported in Swift 3.0.1 [\#1935](https://github.com/danielgindi/Charts/issues/1935) +- Charts-2.3.0/Source/ChartsRealm/Data/RealmPieData.swift:19:8: No such module 'Realm' [\#1934](https://github.com/danielgindi/Charts/issues/1934) +- iOS Demo Fails to build [\#1933](https://github.com/danielgindi/Charts/issues/1933) +- Pie chart Outside values, Inside Value and legend value [\#1932](https://github.com/danielgindi/Charts/issues/1932) +- Mermory Leak in "specialized ChartXAxisRenderer.drawLabels\(context : CGContext, pos : CGFloat, anchor : CGPoint\) -\> \(\)" [\#1928](https://github.com/danielgindi/Charts/issues/1928) +- stringForValue method return unexpected value when reload TableView data. [\#1927](https://github.com/danielgindi/Charts/issues/1927) +- Can't render CombinedChartView [\#1926](https://github.com/danielgindi/Charts/issues/1926) +- Migration to Chart 3.0, Problem with Stack BarChartView [\#1925](https://github.com/danielgindi/Charts/issues/1925) +- PieChartData issue in Swift 3 [\#1924](https://github.com/danielgindi/Charts/issues/1924) +- Values overlap for bar chart and labels of X-Axis [\#1923](https://github.com/danielgindi/Charts/issues/1923) +- Please Please Help, I can’t get Charts installed properly [\#1922](https://github.com/danielgindi/Charts/issues/1922) +- Chart bar finance \(OHLC Chart\) [\#1921](https://github.com/danielgindi/Charts/issues/1921) +- Double value cannot be converted to Int in AxisRendererBase.swift on line 125 [\#1920](https://github.com/danielgindi/Charts/issues/1920) +- Highlighted values on piechart too high? [\#1919](https://github.com/danielgindi/Charts/issues/1919) +- How to achieve this effect? [\#1918](https://github.com/danielgindi/Charts/issues/1918) +- SOLVED: Round number less than zero x values issue [\#1916](https://github.com/danielgindi/Charts/issues/1916) +- Charts does not install correctly [\#1915](https://github.com/danielgindi/Charts/issues/1915) +- Xcode 8.1 is reporting 'No such Module 'Charts' & Build/Compilation Errors [\#1914](https://github.com/danielgindi/Charts/issues/1914) +- Hide legend [\#1913](https://github.com/danielgindi/Charts/issues/1913) +- xAxis force show last label [\#1912](https://github.com/danielgindi/Charts/issues/1912) +- How to install in Xcode 7.3.1 [\#1911](https://github.com/danielgindi/Charts/issues/1911) +- Can we resurrect Chart2.2.5-Swift3.0? [\#1910](https://github.com/danielgindi/Charts/issues/1910) +- Chart Swift files not running on Obj-C XCODE8.0 install [\#1908](https://github.com/danielgindi/Charts/issues/1908) +- How to draw two circles and compare? [\#1906](https://github.com/danielgindi/Charts/issues/1906) +- custom xAxis for line chart I need an example [\#1905](https://github.com/danielgindi/Charts/issues/1905) +- QUESTION - How mask the ranges values in a Graph [\#1904](https://github.com/danielgindi/Charts/issues/1904) +- How to give xAxis customized labels for linechartview [\#1903](https://github.com/danielgindi/Charts/issues/1903) +- How to set the axis options of radar chart? [\#1902](https://github.com/danielgindi/Charts/issues/1902) +- no match color bar chart with label [\#1900](https://github.com/danielgindi/Charts/issues/1900) +- LineChartView highlightEnabled no work [\#1899](https://github.com/danielgindi/Charts/issues/1899) +- Can i change the value Above bar from double to int? [\#1898](https://github.com/danielgindi/Charts/issues/1898) +- Scrolling x-axis labels [\#1897](https://github.com/danielgindi/Charts/issues/1897) +- noDataText doesn't work on CombinedChart \(works fine on PieChart and BarChart\) [\#1896](https://github.com/danielgindi/Charts/issues/1896) +- StringForValue in class IValueFormatter receives dataSetIndex as 0 [\#1895](https://github.com/danielgindi/Charts/issues/1895) +- Cannot build in big project using cocoapods [\#1894](https://github.com/danielgindi/Charts/issues/1894) +- Carthage build error with xcode 8.1 and Charts 2.3.0 [\#1893](https://github.com/danielgindi/Charts/issues/1893) +- Unable to select BarChartView from storyboard \(iOS\) [\#1892](https://github.com/danielgindi/Charts/issues/1892) +- XAxis entry count is greater than it should be. [\#1890](https://github.com/danielgindi/Charts/issues/1890) +- pod update failed - ARC Semantic Issue [\#1888](https://github.com/danielgindi/Charts/issues/1888) +- How to show marker on y-Axis data? [\#1887](https://github.com/danielgindi/Charts/issues/1887) +- Can't building and run the ChartsDemo [\#1886](https://github.com/danielgindi/Charts/issues/1886) +- how to resolve label overlapping problem with stack bar chart [\#1885](https://github.com/danielgindi/Charts/issues/1885) +- PieChart values [\#1884](https://github.com/danielgindi/Charts/issues/1884) +- Custom marker gets displayed wrong on the latest value [\#1883](https://github.com/danielgindi/Charts/issues/1883) +- Tap gesture inside the candle bar [\#1882](https://github.com/danielgindi/Charts/issues/1882) +- rotating chartview [\#1881](https://github.com/danielgindi/Charts/issues/1881) +- \[Question\] Scatter Chart && Bubble Chart: How to show out whole radius instead of hiding half radius of first data entry? [\#1879](https://github.com/danielgindi/Charts/issues/1879) +- Horizontal bar chart dose not show all xAxis labels. [\#1878](https://github.com/danielgindi/Charts/issues/1878) +- X axis values [\#1877](https://github.com/danielgindi/Charts/issues/1877) +- Pie Chart no xAxis [\#1875](https://github.com/danielgindi/Charts/issues/1875) +- want the demo application in swift 3.0 for Charts [\#1872](https://github.com/danielgindi/Charts/issues/1872) +- Pie Bar Chart issues [\#1870](https://github.com/danielgindi/Charts/issues/1870) +- PieChartView a strange arrow [\#1869](https://github.com/danielgindi/Charts/issues/1869) +- custom gradient color of BarChatView [\#1868](https://github.com/danielgindi/Charts/issues/1868) +- Set space between labels in xAxis [\#1865](https://github.com/danielgindi/Charts/issues/1865) +- label over sample point [\#1864](https://github.com/danielgindi/Charts/issues/1864) +- Realtime Scatterplot crashes when each ChartDataEntry is added dynamically on ScatterView.data [\#1863](https://github.com/danielgindi/Charts/issues/1863) +- Assign Bar Colours Selectively [\#1862](https://github.com/danielgindi/Charts/issues/1862) +- Detect when finger leaves the chart area [\#1861](https://github.com/danielgindi/Charts/issues/1861) +- Pie chart touch event conflict [\#1860](https://github.com/danielgindi/Charts/issues/1860) +- Customize X-axis and grid lines [\#1859](https://github.com/danielgindi/Charts/issues/1859) +- Issue with candle stick when used in combined chart [\#1858](https://github.com/danielgindi/Charts/issues/1858) +- CandleStick Background Color [\#1857](https://github.com/danielgindi/Charts/issues/1857) +- Line Support Gradient Color? [\#1856](https://github.com/danielgindi/Charts/issues/1856) +- Piechart has no xAxis? [\#1855](https://github.com/danielgindi/Charts/issues/1855) +- Retain cycle setting delegate to valueFormatter [\#1854](https://github.com/danielgindi/Charts/issues/1854) +- how to show Xaxis label value as my array value [\#1852](https://github.com/danielgindi/Charts/issues/1852) +- Skip Drawing Circles for LineCharts [\#1795](https://github.com/danielgindi/Charts/issues/1795) +- Realm update [\#1789](https://github.com/danielgindi/Charts/issues/1789) +- "Module compiled with Swift 3.0 cannot be imported in Swift 3.0.1" [\#1788](https://github.com/danielgindi/Charts/issues/1788) +- Move Realm integration to another repository [\#1756](https://github.com/danielgindi/Charts/issues/1756) +- limit line real time update [\#1755](https://github.com/danielgindi/Charts/issues/1755) +- Travis does not use github token for pull request build [\#1734](https://github.com/danielgindi/Charts/issues/1734) +- custom string value at top of bar. [\#1109](https://github.com/danielgindi/Charts/issues/1109) + +**Merged pull requests:** + +- Minor typo fix in console alert message "it's" -\> "its" [\#2301](https://github.com/danielgindi/Charts/pull/2301) ([simonbromberg](https://github.com/simonbromberg)) +- Fix Xcode 8.3 compiler warnings [\#2279](https://github.com/danielgindi/Charts/pull/2279) ([krbarnes](https://github.com/krbarnes)) +- Updated to use Realm version 2.4.3 [\#2199](https://github.com/danielgindi/Charts/pull/2199) ([kimdv](https://github.com/kimdv)) +- Fixed the inconsistency of AxisMax and AxisMin [\#2177](https://github.com/danielgindi/Charts/pull/2177) ([aelam](https://github.com/aelam)) +- Fixes index out of range crash. [\#2167](https://github.com/danielgindi/Charts/pull/2167) ([kzaher](https://github.com/kzaher)) +- remove deprecation warnings in XCode 8.3 [\#2162](https://github.com/danielgindi/Charts/pull/2162) ([LeviDahl](https://github.com/LeviDahl)) +- 'backgroundColor' is inaccessible due to 'internal' protection level … [\#2156](https://github.com/danielgindi/Charts/pull/2156) ([thierryH91200](https://github.com/thierryH91200)) +- Fixes Xcode 8.3 beta build issue [\#2116](https://github.com/danielgindi/Charts/pull/2116) ([davidarve](https://github.com/davidarve)) +- Adds NSPhotoLibraryUsageDescription to plist of ChartsDemo [\#2101](https://github.com/danielgindi/Charts/pull/2101) ([valeriyvan](https://github.com/valeriyvan)) +- Fix demo and test targets not running/testing [\#2084](https://github.com/danielgindi/Charts/pull/2084) ([petester42](https://github.com/petester42)) +- fix a typo, as orientation is horizontal by default [\#2078](https://github.com/danielgindi/Charts/pull/2078) ([liuxuan30](https://github.com/liuxuan30)) +- Update Podspec RealmSwift Dependency to 2.1.1 to be in line with Cartfile [\#2064](https://github.com/danielgindi/Charts/pull/2064) ([anttyc](https://github.com/anttyc)) +- Fix NSCopying implementation in CandleChartDataEntry [\#2056](https://github.com/danielgindi/Charts/pull/2056) ([leo150](https://github.com/leo150)) +- Add support for extensions [\#2048](https://github.com/danielgindi/Charts/pull/2048) ([raptorxcz](https://github.com/raptorxcz)) +- Update "Usage" section of README [\#1984](https://github.com/danielgindi/Charts/pull/1984) ([elaewin](https://github.com/elaewin)) +- All Charts Icons Support Swift3 \[Dub \#629, \#624, \#1261\] [\#1793](https://github.com/danielgindi/Charts/pull/1793) ([abjurato](https://github.com/abjurato)) + +## [3.0.1](https://github.com/danielgindi/Charts/tree/3.0.1) (2016-11-20) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v3.0.1...3.0.1) + +## [v3.0.1](https://github.com/danielgindi/Charts/tree/v3.0.1) (2016-11-20) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v2.3.1...v3.0.1) + +**Closed issues:** + +- Legend under the bar in bar Chart [\#1850](https://github.com/danielgindi/Charts/issues/1850) +- MultipleBarChart barSpace does not work [\#1849](https://github.com/danielgindi/Charts/issues/1849) +- Can not show decimal in y value on BarChart [\#1848](https://github.com/danielgindi/Charts/issues/1848) +- Cannot add labels to a simple Bar Chart [\#1846](https://github.com/danielgindi/Charts/issues/1846) +- when running my project on iphone device but not simulator it has error"image not found" [\#1845](https://github.com/danielgindi/Charts/issues/1845) +- Removing red selector cross on Line Chart nodes [\#1844](https://github.com/danielgindi/Charts/issues/1844) +- Get screen\(x,y\) value from the plotted points [\#1843](https://github.com/danielgindi/Charts/issues/1843) +- Color between two limit lines [\#1842](https://github.com/danielgindi/Charts/issues/1842) +- Charts-umbrella.h [\#1841](https://github.com/danielgindi/Charts/issues/1841) +- Unable to call 'data' from lineChartView. [\#1839](https://github.com/danielgindi/Charts/issues/1839) +- How to use charts library in my objective c program?.. [\#1837](https://github.com/danielgindi/Charts/issues/1837) +- Migration to Swift 3.x [\#1836](https://github.com/danielgindi/Charts/issues/1836) +- How to hide BarChart hide bottom description color & text ? [\#1835](https://github.com/danielgindi/Charts/issues/1835) +- please help Line Graph not working on Charts 2.3.0 \(for Xcode8 and Swift 2.3.0\) [\#1834](https://github.com/danielgindi/Charts/issues/1834) +- Error when adding embedded binaries [\#1832](https://github.com/danielgindi/Charts/issues/1832) +- X-Axis for different different charts [\#1831](https://github.com/danielgindi/Charts/issues/1831) +- Setting values label [\#1829](https://github.com/danielgindi/Charts/issues/1829) +- Adding background color between two limit lines [\#1828](https://github.com/danielgindi/Charts/issues/1828) +- Horizontal bar chart doesn't start at 0 [\#1827](https://github.com/danielgindi/Charts/issues/1827) +- Gradient Background for LineChart. \(Not Working\) [\#1826](https://github.com/danielgindi/Charts/issues/1826) +- y axis label show wiered value 1.11022302462516e- when passed 0 as value [\#1825](https://github.com/danielgindi/Charts/issues/1825) +- Pie chart specific colors [\#1824](https://github.com/danielgindi/Charts/issues/1824) +- Help ? [\#1823](https://github.com/danielgindi/Charts/issues/1823) +- Its possible change the thickness of the pie chart? [\#1822](https://github.com/danielgindi/Charts/issues/1822) +- BarChart moveToX wrong [\#1820](https://github.com/danielgindi/Charts/issues/1820) +- How to set multiple Stackbar with Charts 3 [\#1819](https://github.com/danielgindi/Charts/issues/1819) +- How do i set [\#1818](https://github.com/danielgindi/Charts/issues/1818) +- LimitLine Label Value Overlap with BarChartData Label [\#1817](https://github.com/danielgindi/Charts/issues/1817) +- What is the replacement for xVals for BarChartData? in swift 3.0 [\#1816](https://github.com/danielgindi/Charts/issues/1816) +- Updated Demo Example for swift3 [\#1815](https://github.com/danielgindi/Charts/issues/1815) +- Line Chart: how to change background color through every odd label on YAxis? [\#1812](https://github.com/danielgindi/Charts/issues/1812) +- Can Radar Chart draw backgroud like this? [\#1811](https://github.com/danielgindi/Charts/issues/1811) +- Can i customize the X axis text a different color? [\#1810](https://github.com/danielgindi/Charts/issues/1810) +- Can we make a 3D Barchart with this Library?? [\#1809](https://github.com/danielgindi/Charts/issues/1809) +- 3.0.0 - adding X Values to LineChartData no longer supported? [\#1808](https://github.com/danielgindi/Charts/issues/1808) +- Swift 3 BarChart with image and title. [\#1807](https://github.com/danielgindi/Charts/issues/1807) +- How to make horizontal dotted lines or remove it? [\#1806](https://github.com/danielgindi/Charts/issues/1806) +- Full control over x labels in 3.0.0 [\#1804](https://github.com/danielgindi/Charts/issues/1804) +- How to change stackbar according to order? [\#1803](https://github.com/danielgindi/Charts/issues/1803) +- How to change stackbar according to order [\#1802](https://github.com/danielgindi/Charts/issues/1802) +- How to set multiple StackBar ? [\#1801](https://github.com/danielgindi/Charts/issues/1801) +- \[Swift 3\] LineChartData without xVals on constructor [\#1800](https://github.com/danielgindi/Charts/issues/1800) +- Zooming X and Y axis independently? [\#1799](https://github.com/danielgindi/Charts/issues/1799) +- Auto scroll xAxis [\#1798](https://github.com/danielgindi/Charts/issues/1798) +- How to add “%” to data in ios-chart [\#1797](https://github.com/danielgindi/Charts/issues/1797) +- can we set y axis max value to chart on horizontal bar graphs?? [\#1794](https://github.com/danielgindi/Charts/issues/1794) +- Fix the xAxis to use the values from my dataset [\#1791](https://github.com/danielgindi/Charts/issues/1791) +- PieChart values outside of chart? [\#1790](https://github.com/danielgindi/Charts/issues/1790) +- ChartLimitLine: How to customize label background and Position center of line [\#1787](https://github.com/danielgindi/Charts/issues/1787) +- With Xcode 8.1 can't build [\#1786](https://github.com/danielgindi/Charts/issues/1786) +- CandleStickChartView can not inherit [\#1784](https://github.com/danielgindi/Charts/issues/1784) +- Chart adds a -1 x-axis entry [\#1782](https://github.com/danielgindi/Charts/issues/1782) +- BarChart - Is It possible to limit the number of bars visible at a given time, and allow users to scroll through the rest horizontally ? [\#1781](https://github.com/danielgindi/Charts/issues/1781) +- Unable to Override some properties of LineChartView in Charts version 2.2.5 [\#1777](https://github.com/danielgindi/Charts/issues/1777) +- CandleStickChartView how to fixed-width, or based on the data dynamically calculate the zoom factor [\#1776](https://github.com/danielgindi/Charts/issues/1776) +- Scroll UIImageView on X-axes along with x-vals [\#1775](https://github.com/danielgindi/Charts/issues/1775) +- How to make BarChart Bar Sizes proportional? [\#1774](https://github.com/danielgindi/Charts/issues/1774) +- how can I set the spacing between bars ? [\#1773](https://github.com/danielgindi/Charts/issues/1773) +- Charts 3.0 labelCount bug? [\#1767](https://github.com/danielgindi/Charts/issues/1767) +- use lineCharts ,if i want show custom string at x, don't show int number, how to do it? [\#1760](https://github.com/danielgindi/Charts/issues/1760) +- ChartUtils Crash on 32 Bit Devices [\#1737](https://github.com/danielgindi/Charts/issues/1737) + +**Merged pull requests:** + +- Added a check against NaN [\#1733](https://github.com/danielgindi/Charts/pull/1733) ([Selficide](https://github.com/Selficide)) + +## [v2.3.1](https://github.com/danielgindi/Charts/tree/v2.3.1) (2016-11-04) +[Full Changelog](https://github.com/danielgindi/Charts/compare/2.3.1...v2.3.1) + +## [2.3.1](https://github.com/danielgindi/Charts/tree/2.3.1) (2016-11-04) +[Full Changelog](https://github.com/danielgindi/Charts/compare/3.0.0...2.3.1) + +**Fixed bugs:** + +- \[BUG\] multiple bar chart in ChartsDemo not display full for last x value [\#1770](https://github.com/danielgindi/Charts/issues/1770) +- PieChartDataSet no slice space shown when an entry has 0 value [\#1730](https://github.com/danielgindi/Charts/issues/1730) +- Bar on BarChart and CombinedChart doesn't start one Zero line [\#1729](https://github.com/danielgindi/Charts/issues/1729) +- Weird highlight rect in Stacked Bar Chart Negative [\#1726](https://github.com/danielgindi/Charts/issues/1726) +- CombinedChartView with CandleData - first/last candlesticks are cut in half [\#1717](https://github.com/danielgindi/Charts/issues/1717) +- Bug with showing negative values and vertical zooming Horizontal Bar Chart [\#1702](https://github.com/danielgindi/Charts/issues/1702) +- Setting circleHoleColor to clear causes artifact [\#1691](https://github.com/danielgindi/Charts/issues/1691) +- Charts 3.0 Carthage update issue [\#1690](https://github.com/danielgindi/Charts/issues/1690) + +**Closed issues:** + +- Problem with Formatter [\#1779](https://github.com/danielgindi/Charts/issues/1779) +- Could not cast value of type 'Charts.BarChartData' \(0x109bd1010\) to 'Charts.PieChartData' \(0x109be0320\). [\#1778](https://github.com/danielgindi/Charts/issues/1778) +- BarChartView - The first column and last column show only half? [\#1772](https://github.com/danielgindi/Charts/issues/1772) +- Stacked Bar Chart Opacity of Some Colors [\#1769](https://github.com/danielgindi/Charts/issues/1769) +- Custom Format YAxis [\#1768](https://github.com/danielgindi/Charts/issues/1768) +- to run ChartsDemo [\#1765](https://github.com/danielgindi/Charts/issues/1765) +- There is something wrong with LineChartView,ChartDataEntry,LineChartData and ChartDataEntry [\#1764](https://github.com/danielgindi/Charts/issues/1764) +- Strange margin/space in a grouped BarChart [\#1763](https://github.com/danielgindi/Charts/issues/1763) +- How to get the chart data entry points [\#1762](https://github.com/danielgindi/Charts/issues/1762) +- the newest version ,it can't build successes in xcode8,it pause at half,no stop or fail. [\#1761](https://github.com/danielgindi/Charts/issues/1761) +- Sorry, I no speak English, 3.0版本的LineChartView [\#1759](https://github.com/danielgindi/Charts/issues/1759) +- How to set x-axis labels with ios charts [\#1758](https://github.com/danielgindi/Charts/issues/1758) +- After 3.0 Upgrade, Marker not automatically showing [\#1757](https://github.com/danielgindi/Charts/issues/1757) +- How to set horizontal Value with a string array at my code using Charts 3.0 [\#1754](https://github.com/danielgindi/Charts/issues/1754) +- Issue with centering xAxis labels [\#1750](https://github.com/danielgindi/Charts/issues/1750) +- Charts / Swift 3.0 - Fatal error: Index out of range [\#1749](https://github.com/danielgindi/Charts/issues/1749) +- ChartsDemo dependency on realm-cocoa ~\> 1.1 issue [\#1748](https://github.com/danielgindi/Charts/issues/1748) +- Carthage realm-cocoa ~\> 1.1 dependency conflict [\#1747](https://github.com/danielgindi/Charts/issues/1747) +- how to set a Array of String for X-axis in swift 3? [\#1746](https://github.com/danielgindi/Charts/issues/1746) +- Xcode 8.1 is reporting 'No such Module 'Charts'' [\#1743](https://github.com/danielgindi/Charts/issues/1743) +- Swift: Custom Xaxis and Yaxis problem. [\#1740](https://github.com/danielgindi/Charts/issues/1740) +- xAxis value starting at "-1" instead of "0" in grouped barchart [\#1739](https://github.com/danielgindi/Charts/issues/1739) +- Compiling issue - xcode 8 [\#1736](https://github.com/danielgindi/Charts/issues/1736) +- How to make Radar five top angle tap enabled? [\#1735](https://github.com/danielgindi/Charts/issues/1735) +- Strings for Labels in Swift 3 [\#1732](https://github.com/danielgindi/Charts/issues/1732) +- HorizontalBarChart values not showing Charts 3.0 [\#1731](https://github.com/danielgindi/Charts/issues/1731) +- getMarkerPositionWithHighlight: always return CGPointZero [\#1728](https://github.com/danielgindi/Charts/issues/1728) +- Why drawValues is outside of clipping contentRect [\#1727](https://github.com/danielgindi/Charts/issues/1727) +- Set max highlight distance [\#1725](https://github.com/danielgindi/Charts/issues/1725) +- Trouble making custom labels along the X and Y Axis of my bar chart [\#1724](https://github.com/danielgindi/Charts/issues/1724) +- Swift 3 - BarChartData, resetLabelsToSkip\(\) and setLabelsToSkip\(0\) not working [\#1723](https://github.com/danielgindi/Charts/issues/1723) +- When zooming in, x-axis shows more labels than values [\#1722](https://github.com/danielgindi/Charts/issues/1722) +- How to set the xValues to the BarchartData ? [\#1721](https://github.com/danielgindi/Charts/issues/1721) +- How to show custom text on Y-axis of Line Chart? [\#1720](https://github.com/danielgindi/Charts/issues/1720) +- Add UIButtons to data points in a line graph, plotting date and time in X-axis [\#1719](https://github.com/danielgindi/Charts/issues/1719) +- How to set the xValues to the BarchartData ? [\#1718](https://github.com/danielgindi/Charts/issues/1718) +- \: Error: this application, or a library it uses, has passed an invalid numeric value \(NaN, or not-a-number\) to CoreGraphics API and this value is being ignored.Please fix this problem. [\#1714](https://github.com/danielgindi/Charts/issues/1714) +- cancel group display in BarChart [\#1713](https://github.com/danielgindi/Charts/issues/1713) +- PieChart, label is a little of values ,labels is overlap [\#1710](https://github.com/danielgindi/Charts/issues/1710) +- how to port calls to getEntriesAtIndex [\#1709](https://github.com/danielgindi/Charts/issues/1709) +- Exception upon calling \[ChartDataEntry initWithX:y:\] via ObjC + Charts using Pods as Framework [\#1708](https://github.com/danielgindi/Charts/issues/1708) +- Multiple bar Chart Xvalues Doesn't come centre to the grouped bars... [\#1707](https://github.com/danielgindi/Charts/issues/1707) +- \[BarChartDataEntry\] axis to accept NSString [\#1706](https://github.com/danielgindi/Charts/issues/1706) +- Conflict: Charts's Range conflict with Apple NSRange\(Swift 3: Range\). It makes me can not use the Apple's Range [\#1705](https://github.com/danielgindi/Charts/issues/1705) +- Excuse me, BarChartData the " initWithXVals:\(NSArray \*data\) dataSets:\(NSArray \*data\)" in Swift 3.0 V "XVals" is what method is the?I can't find the way,Help me。 [\#1704](https://github.com/danielgindi/Charts/issues/1704) +- Excuse me,BarChartData the initWithXVals:\(NSArray \*data\) dataSets:\(NSArray \*data\) in Swift 3.0 V What method is the?I can't find the way,Help me。 [\#1703](https://github.com/danielgindi/Charts/issues/1703) +- X-Axis and Y-Axis is not shown in swift 3 [\#1701](https://github.com/danielgindi/Charts/issues/1701) +- Can i use 2.2.5 version with Swift3 [\#1700](https://github.com/danielgindi/Charts/issues/1700) +- I update the pod to 3.0.0 but Xcode still wants to convert to Swift 3 [\#1699](https://github.com/danielgindi/Charts/issues/1699) +- \[Question\] Multiple lines with different units [\#1698](https://github.com/danielgindi/Charts/issues/1698) +- \[Question\] Missing intermediate values [\#1697](https://github.com/danielgindi/Charts/issues/1697) +- What happened to X-Axis labels in 3.0? [\#1696](https://github.com/danielgindi/Charts/issues/1696) +- What is the new delegate for selection of values in the chart swift 3.0 [\#1695](https://github.com/danielgindi/Charts/issues/1695) +- Can I have two different Yaxis scale on combined chart [\#1694](https://github.com/danielgindi/Charts/issues/1694) +- Zooming LineChart xAxis on 32bit device doesn't work correctly. [\#1693](https://github.com/danielgindi/Charts/issues/1693) +- How to show xAxis All value and Rotate Label? v3.0 [\#1692](https://github.com/danielgindi/Charts/issues/1692) +- \[LineChartView\] Wrong position Highlight and xAxis [\#1689](https://github.com/danielgindi/Charts/issues/1689) +- How to get back x-values for BarChart\[Charts 3 migration problem\] [\#1688](https://github.com/danielgindi/Charts/issues/1688) +- How to move data labels outside the chart. [\#1687](https://github.com/danielgindi/Charts/issues/1687) +- RadarChartView implementation [\#1686](https://github.com/danielgindi/Charts/issues/1686) +- problem with custom xaxis labels [\#1685](https://github.com/danielgindi/Charts/issues/1685) +- Update spec on cocoapods to 3.0 [\#1683](https://github.com/danielgindi/Charts/issues/1683) +- Pod install: SSL: certificate verification failed [\#1682](https://github.com/danielgindi/Charts/issues/1682) +- Setting a pieChartDataSet on 3.0 [\#1681](https://github.com/danielgindi/Charts/issues/1681) +- String value at x Axis of BarChart [\#1680](https://github.com/danielgindi/Charts/issues/1680) +- Zooming LineChart x axis on 32bit processor doesn't work as expected [\#1679](https://github.com/danielgindi/Charts/issues/1679) +- ChartLimitLine background color [\#1678](https://github.com/danielgindi/Charts/issues/1678) +- Left and right slide bar chart only half and remove background grid [\#1654](https://github.com/danielgindi/Charts/issues/1654) +- Setting centerAxisLabelsEnabled with a granularity set does not centre [\#1652](https://github.com/danielgindi/Charts/issues/1652) +- Realm and Charts 3.0 tutorial [\#1651](https://github.com/danielgindi/Charts/issues/1651) +- HorizontalBarChartView text for xValues -- charts 3.0 [\#1646](https://github.com/danielgindi/Charts/issues/1646) +- 'spaceBetweenLabels' not found on object XAxis [\#1643](https://github.com/danielgindi/Charts/issues/1643) +- this func -nsuiTouchesEnded does not work [\#1642](https://github.com/danielgindi/Charts/issues/1642) +- Adjust circle for selected point [\#1597](https://github.com/danielgindi/Charts/issues/1597) +- CombinedChartView fitBars property [\#1569](https://github.com/danielgindi/Charts/issues/1569) +- How to show x-axis labels only when value is a DataEntry in Line Chart? [\#1536](https://github.com/danielgindi/Charts/issues/1536) +- Why the coordinate points and the X axis the above data is not aligned? [\#1492](https://github.com/danielgindi/Charts/issues/1492) +- \*\*\*\*\*\*\*\*\*\*\*\*\* Migrating to Charts 3.0 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* [\#1474](https://github.com/danielgindi/Charts/issues/1474) +- How to show ChartMarker in CombinedChart? [\#1454](https://github.com/danielgindi/Charts/issues/1454) +- How to set the data margin Align right? [\#1372](https://github.com/danielgindi/Charts/issues/1372) +- Correct date on x axis [\#1325](https://github.com/danielgindi/Charts/issues/1325) +- The chart above and the chart below how to align [\#1276](https://github.com/danielgindi/Charts/issues/1276) +- Unable to select BarChartView from storyboard \(OS X\) [\#1197](https://github.com/danielgindi/Charts/issues/1197) + +**Merged pull requests:** + +- Fix png image using JPEG type when being saved on macOS [\#1783](https://github.com/danielgindi/Charts/pull/1783) ([petester42](https://github.com/petester42)) +- Updated Width Constraints - Fixes \#1770 [\#1771](https://github.com/danielgindi/Charts/pull/1771) ([SumoSimo](https://github.com/SumoSimo)) +- update cocoapods [\#1684](https://github.com/danielgindi/Charts/pull/1684) ([petester42](https://github.com/petester42)) + +## [3.0.0](https://github.com/danielgindi/Charts/tree/3.0.0) (2016-10-19) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v3.0.0...3.0.0) + +## [v3.0.0](https://github.com/danielgindi/Charts/tree/v3.0.0) (2016-10-19) +[Full Changelog](https://github.com/danielgindi/Charts/compare/2.3.0...v3.0.0) + +**Implemented enhancements:** + +- Chart description is drawn on top of markers [\#1344](https://github.com/danielgindi/Charts/issues/1344) + +**Fixed bugs:** + +- CandleStickChart - last CandleStick cut in half [\#1668](https://github.com/danielgindi/Charts/issues/1668) +- X labels Issues [\#1639](https://github.com/danielgindi/Charts/issues/1639) +- Marker display is abnormal [\#1575](https://github.com/danielgindi/Charts/issues/1575) +- Misplaced Radar Marker [\#1556](https://github.com/danielgindi/Charts/issues/1556) +- fatal error: Double value cannot be converted to Int because it is either infinite or NaN [\#1550](https://github.com/danielgindi/Charts/issues/1550) +- Problem with the xValue begins at 0 [\#1547](https://github.com/danielgindi/Charts/issues/1547) +- \(v3.0 + Swift3.0\)LineChart crash when dataSets is a empty array [\#1491](https://github.com/danielgindi/Charts/issues/1491) +- \(v3.0 + swift3.0\) charts' top are cropped/overlapped in ChartsDemo [\#1489](https://github.com/danielgindi/Charts/issues/1489) +- \(v3.0 + Swift3.0\) Time Line Chart Demo crash [\#1488](https://github.com/danielgindi/Charts/issues/1488) +- Last Value doesn't appear in barCharts and lineCharts [\#1384](https://github.com/danielgindi/Charts/issues/1384) +- Distance between chart legend and the chart is to big in case of rotated labels [\#1360](https://github.com/danielgindi/Charts/issues/1360) +- xAxis labels not align with values in Multiple Bar Chart [\#1334](https://github.com/danielgindi/Charts/issues/1334) +- text value on the last entry is missing from line chart [\#1323](https://github.com/danielgindi/Charts/issues/1323) + +**Closed issues:** + +- Finding the RadarChartView center position in a view [\#1677](https://github.com/danielgindi/Charts/issues/1677) +- How do I Use IValueFormatter to format XAxis labels in swift? [\#1676](https://github.com/danielgindi/Charts/issues/1676) +- How to set lineChart type to cubic lines [\#1674](https://github.com/danielgindi/Charts/issues/1674) +- In IOS 10 Xcode 8,I got some issues [\#1673](https://github.com/danielgindi/Charts/issues/1673) +- the first and last point have a line [\#1672](https://github.com/danielgindi/Charts/issues/1672) +- Last value on line graph has no text [\#1671](https://github.com/danielgindi/Charts/issues/1671) +- can I fix number of overlapping this problem? [\#1670](https://github.com/danielgindi/Charts/issues/1670) +- chartValueSelected delegate not called [\#1669](https://github.com/danielgindi/Charts/issues/1669) +- Charts.frameworkiOS did not show up [\#1667](https://github.com/danielgindi/Charts/issues/1667) +- Half a bar the first one of chart [\#1666](https://github.com/danielgindi/Charts/issues/1666) +- Charts : iOS 10, Xcode 8 - Embedded Framework iTunes Store operation failed while uploading on App Store [\#1665](https://github.com/danielgindi/Charts/issues/1665) +- We need an old version for Xcode 7.0 [\#1664](https://github.com/danielgindi/Charts/issues/1664) +- LineChartView is rotating LineChartData in 3.0 [\#1663](https://github.com/danielgindi/Charts/issues/1663) +- Showing all xAxis labels in a BarChart no matter the number of bars [\#1661](https://github.com/danielgindi/Charts/issues/1661) +- Can I set different color Label in lineChart?ForExample [\#1660](https://github.com/danielgindi/Charts/issues/1660) +- Combined Charts - Negative values for Line Chart are not rendered [\#1659](https://github.com/danielgindi/Charts/issues/1659) +- Swift 2.2 : How to show custom labels on x-axis ? [\#1658](https://github.com/danielgindi/Charts/issues/1658) +- Legends for multiple dataSets and multiple bar charts allignment [\#1657](https://github.com/danielgindi/Charts/issues/1657) +- Multi chart setup xAxis value format [\#1656](https://github.com/danielgindi/Charts/issues/1656) +- xAxis when zooming [\#1655](https://github.com/danielgindi/Charts/issues/1655) +- Request to solve a sort of bug [\#1653](https://github.com/danielgindi/Charts/issues/1653) +- Updating the last Candlestick entry. [\#1649](https://github.com/danielgindi/Charts/issues/1649) +- Use of '@import' when modules are disabled [\#1647](https://github.com/danielgindi/Charts/issues/1647) +- Didn't show last Y Axis [\#1645](https://github.com/danielgindi/Charts/issues/1645) +- noDataText is not working [\#1644](https://github.com/danielgindi/Charts/issues/1644) +- Custom background color [\#1641](https://github.com/danielgindi/Charts/issues/1641) +- Cannot get my Linechart to work since Xcode 8 update [\#1640](https://github.com/danielgindi/Charts/issues/1640) +- Horizontal Highlight at touch/click point... ?? [\#1636](https://github.com/danielgindi/Charts/issues/1636) +- Some acute questions about ZDLineChartView [\#1635](https://github.com/danielgindi/Charts/issues/1635) +- \[Travis\] Travis won't build issue [\#1633](https://github.com/danielgindi/Charts/issues/1633) +- PieChartView cannot show values name . [\#1632](https://github.com/danielgindi/Charts/issues/1632) +- How to make points interactive/draggable [\#1631](https://github.com/danielgindi/Charts/issues/1631) +- Charts 3.0 with Swift 3.0 [\#1630](https://github.com/danielgindi/Charts/issues/1630) +- LineChartData is nolonger allow initWithXVals, what should I do? [\#1629](https://github.com/danielgindi/Charts/issues/1629) +- BarChartData do not find this method initWithXVals: dataSets: [\#1628](https://github.com/danielgindi/Charts/issues/1628) +- Charts 3.0: How to set x-values for a line chart? [\#1627](https://github.com/danielgindi/Charts/issues/1627) +- How can I display the x Axis values on a LineChartView? [\#1625](https://github.com/danielgindi/Charts/issues/1625) +- Xcode - 8.0, Working Fine in Xcode 7.3 -up to iOS\(9.3\) Crash in Xcode 8 - iOS 10 [\#1624](https://github.com/danielgindi/Charts/issues/1624) +- I can't see the final number on the chart. [\#1623](https://github.com/danielgindi/Charts/issues/1623) +- can I Achieve this? Using this framework [\#1622](https://github.com/danielgindi/Charts/issues/1622) +- When Will Charts 3.0 Be Version Tagged? [\#1620](https://github.com/danielgindi/Charts/issues/1620) +- RadarChartData xVals cant use [\#1619](https://github.com/danielgindi/Charts/issues/1619) +- Extract ChartsRealm and Realm from the Charts project [\#1618](https://github.com/danielgindi/Charts/issues/1618) +- Crashing xcode 7.3.1 [\#1617](https://github.com/danielgindi/Charts/issues/1617) +- Method does not override any method from its superclass [\#1616](https://github.com/danielgindi/Charts/issues/1616) +- warning: Swift Charts 2.3.0 - error in module ChartsDebug info from this module will be unavailable in the debugger. [\#1615](https://github.com/danielgindi/Charts/issues/1615) +- ChartViewDelegate's chartValueSelected is tied up with Highlights [\#1614](https://github.com/danielgindi/Charts/issues/1614) +- 'ChartViewDelegate' is unavailable: cannot find Swift declaration for this class. [\#1613](https://github.com/danielgindi/Charts/issues/1613) +- \[NOT AN ISSUE\] Release for Charts 3.0 [\#1612](https://github.com/danielgindi/Charts/issues/1612) +- Charts/Classes/Utils/ChartUtils.swift error [\#1611](https://github.com/danielgindi/Charts/issues/1611) +- Issue with YAxis max and min in the RadarChart [\#1610](https://github.com/danielgindi/Charts/issues/1610) +- App Crash: could not cast to 'Charts.PieChartData': in 2.3.0 when upgrading to XCode 8.0 [\#1609](https://github.com/danielgindi/Charts/issues/1609) +- customAxisMin and customAxisMax not found on object ChartYAxis [\#1608](https://github.com/danielgindi/Charts/issues/1608) +- Using version 3.0 with Carthage? [\#1607](https://github.com/danielgindi/Charts/issues/1607) +- Chart 3.0 swift 3.0 [\#1606](https://github.com/danielgindi/Charts/issues/1606) +- Chart not centered/middled when having less values [\#1605](https://github.com/danielgindi/Charts/issues/1605) +- How to use a date/string for the X value [\#1604](https://github.com/danielgindi/Charts/issues/1604) +- Setting AxisBase.axisMaximum results in an axisRange of zero [\#1603](https://github.com/danielgindi/Charts/issues/1603) +- Pods failing for swift3.0 [\#1602](https://github.com/danielgindi/Charts/issues/1602) +- BarChart View issues [\#1601](https://github.com/danielgindi/Charts/issues/1601) +- Support for swift 3.0 [\#1600](https://github.com/danielgindi/Charts/issues/1600) +- Pod pointing to master branch code created issue in BarChartDataEntry [\#1599](https://github.com/danielgindi/Charts/issues/1599) +- Swift based library, but OC based Demo. Have you ever thought of provide a Swifty Demo? [\#1598](https://github.com/danielgindi/Charts/issues/1598) +- Grid and xaxis label issues. [\#1596](https://github.com/danielgindi/Charts/issues/1596) +- LeftAxis above bars in BarChartView [\#1595](https://github.com/danielgindi/Charts/issues/1595) +- cannot convert value of type\<\> to expected arguments RLMResults\ [\#1594](https://github.com/danielgindi/Charts/issues/1594) +- Member 'index' cannot be used on value of protocol type 'collection'; use a generic constraint instead [\#1593](https://github.com/danielgindi/Charts/issues/1593) +- Scrollable Graph [\#1592](https://github.com/danielgindi/Charts/issues/1592) +- charts 2.3 unsupported architectures i386 [\#1591](https://github.com/danielgindi/Charts/issues/1591) +- BarChart doesn't refresh after new dataSet [\#1590](https://github.com/danielgindi/Charts/issues/1590) +- Label of ChartLimitLine overlaps limit line a little [\#1589](https://github.com/danielgindi/Charts/issues/1589) +- IChartAxisValueFormatter cound't found [\#1588](https://github.com/danielgindi/Charts/issues/1588) +- How to use v2.2.5 swift3.0 in OC Project? [\#1587](https://github.com/danielgindi/Charts/issues/1587) +- Last LineChart y-label not being rendered [\#1585](https://github.com/danielgindi/Charts/issues/1585) +- Charts 3.0: Custom xAxis labels with gaps in data? [\#1584](https://github.com/danielgindi/Charts/issues/1584) +- BarChart xAxis labels disappear after zooming [\#1583](https://github.com/danielgindi/Charts/issues/1583) +- Add space between bars [\#1582](https://github.com/danielgindi/Charts/issues/1582) +- How to use v2.2.5 swift3.0 in OC Project? [\#1581](https://github.com/danielgindi/Charts/issues/1581) +- malloc: \*\*\* error for object : Invalid pointer dequeued from free list\*\*\* set a breakpoint in malloc\_error\_break to debug [\#1580](https://github.com/danielgindi/Charts/issues/1580) +- i want to add % in value [\#1579](https://github.com/danielgindi/Charts/issues/1579) +- Update the code to Swift 3.0 compliance [\#1578](https://github.com/danielgindi/Charts/issues/1578) +- Can I set a text label underneath each bar of a bar chart? [\#1577](https://github.com/danielgindi/Charts/issues/1577) +- Line Chart X-Axis values as a string [\#1576](https://github.com/danielgindi/Charts/issues/1576) +- Hide values in Combines chart [\#1574](https://github.com/danielgindi/Charts/issues/1574) +- Method does not override any method from its superclass [\#1573](https://github.com/danielgindi/Charts/issues/1573) +- Method does not override any method from its superclass [\#1572](https://github.com/danielgindi/Charts/issues/1572) +- Crash in Charts v2.2.5-Swift3.0 [\#1570](https://github.com/danielgindi/Charts/issues/1570) +- Cocoapods integration with objective c projects - can't resolve [\#1568](https://github.com/danielgindi/Charts/issues/1568) +- How to change x value [\#1567](https://github.com/danielgindi/Charts/issues/1567) +- \[Charts 3.0\] Issue with centerAxisLabelsEnabled [\#1566](https://github.com/danielgindi/Charts/issues/1566) +- \[Chart 3.0 BUG\] xAxis labels disappear after a deep zoom in [\#1564](https://github.com/danielgindi/Charts/issues/1564) +- Extraneous space between axis and bars when there is data with value of 0 [\#1557](https://github.com/danielgindi/Charts/issues/1557) +- Chart clip the Ballon Marker [\#1555](https://github.com/danielgindi/Charts/issues/1555) +- Argument labels '\(value:, xIndex:\)' do not match any available overloads, Cannot invoke initializer for type 'BarChartData' with an argument list of type '\(xVals: \[String\], dataSets: \[BarChartDataSet\]\)' [\#1554](https://github.com/danielgindi/Charts/issues/1554) +- Chart clip the Ballon Marker [\#1553](https://github.com/danielgindi/Charts/issues/1553) +- horizontal bar graphs with different colors and offset values [\#1552](https://github.com/danielgindi/Charts/issues/1552) +- valueFormatter API changes in Swift 3 [\#1551](https://github.com/danielgindi/Charts/issues/1551) +- Calling `setAxisMaxValue` leads to transform error. [\#1549](https://github.com/danielgindi/Charts/issues/1549) +- Demo in Swift? [\#1548](https://github.com/danielgindi/Charts/issues/1548) +- The LineChart is not working swift 3 [\#1546](https://github.com/danielgindi/Charts/issues/1546) +- Charts framework not usable in a Swift class added to an Objective C project [\#1545](https://github.com/danielgindi/Charts/issues/1545) +- How to add charts cocoapods dependency for Swift 3 project? [\#1544](https://github.com/danielgindi/Charts/issues/1544) +- Grouped bars in Combined chart [\#1543](https://github.com/danielgindi/Charts/issues/1543) +- I want to control width between bar [\#1542](https://github.com/danielgindi/Charts/issues/1542) +- Crash while using Combined Chart [\#1540](https://github.com/danielgindi/Charts/issues/1540) +- how can i draw only bar chart without x-axis, y-axis , grid line [\#1539](https://github.com/danielgindi/Charts/issues/1539) +- Charts.framework iOS not exist [\#1538](https://github.com/danielgindi/Charts/issues/1538) +- can i set data's starting point? [\#1537](https://github.com/danielgindi/Charts/issues/1537) +- Scatter Chart View V3.0 an another problem with balloon [\#1535](https://github.com/danielgindi/Charts/issues/1535) +- Granularity in line chart not working \(Chart3.0-Swift2.3 \) [\#1534](https://github.com/danielgindi/Charts/issues/1534) +- Error in ChartsPlatform.swift [\#1533](https://github.com/danielgindi/Charts/issues/1533) +- Still got an error when building Charts\(2.3.0\) with carthage [\#1532](https://github.com/danielgindi/Charts/issues/1532) +- Horizontal bar chart xAxis values missing [\#1531](https://github.com/danielgindi/Charts/issues/1531) +- Selection in a bar chart [\#1530](https://github.com/danielgindi/Charts/issues/1530) +- Multiple bar is not working [\#1529](https://github.com/danielgindi/Charts/issues/1529) +- X -axis - time , sometimes incorrectly displayed \( many of the data points \) [\#1528](https://github.com/danielgindi/Charts/issues/1528) +- Convert x value labels to String? from Double? \[Horizontal Barchart\] \(Swift v3\) [\#1527](https://github.com/danielgindi/Charts/issues/1527) +- Method doesn't override any method from its superclass [\#1526](https://github.com/danielgindi/Charts/issues/1526) +- Bar charts X-Axis labels repeating if the number of bars reduce [\#1524](https://github.com/danielgindi/Charts/issues/1524) +- The latest version can not run [\#1523](https://github.com/danielgindi/Charts/issues/1523) +- how to show the Chart without data? [\#1522](https://github.com/danielgindi/Charts/issues/1522) +- The usage is not correct [\#1521](https://github.com/danielgindi/Charts/issues/1521) +- Charts classes not found in swift class in my Objc Xcode project [\#1519](https://github.com/danielgindi/Charts/issues/1519) +- ChartUtils methods are marked internal and cannot be use to create custom charts [\#1518](https://github.com/danielgindi/Charts/issues/1518) +- Re: Fatal error while loading Bar Chart \#1511 [\#1517](https://github.com/danielgindi/Charts/issues/1517) +- I can't run this demo! [\#1516](https://github.com/danielgindi/Charts/issues/1516) +- Charts.framework iOS [\#1515](https://github.com/danielgindi/Charts/issues/1515) +- Setting x-values of BarChartView in Chart 2.2.6 [\#1514](https://github.com/danielgindi/Charts/issues/1514) +- Xcode 8.0,many errors...... [\#1513](https://github.com/danielgindi/Charts/issues/1513) +- Fatal error while loading Bar Chart [\#1511](https://github.com/danielgindi/Charts/issues/1511) +- Fix Intermittent CI Failures [\#1508](https://github.com/danielgindi/Charts/issues/1508) +- Info.plist Utility Error [\#1507](https://github.com/danielgindi/Charts/issues/1507) +- Bar chart "floats" above x-axis when axisMinValue set to 0 [\#1506](https://github.com/danielgindi/Charts/issues/1506) +- Issue with BarDataEntry Method [\#1504](https://github.com/danielgindi/Charts/issues/1504) +- \(v3.0 + Swift3.0\)IChartAxisValueFormatter's protocol function pass on a unexpected value\(double value discard\) [\#1503](https://github.com/danielgindi/Charts/issues/1503) +- Cannot invoke initializer for type 'LineChartData' [\#1502](https://github.com/danielgindi/Charts/issues/1502) +- when click node call chartValueSelected funtion [\#1499](https://github.com/danielgindi/Charts/issues/1499) +- \[BUG\] LineChart--- about "LineChartModeCubicBezier" [\#1490](https://github.com/danielgindi/Charts/issues/1490) +- Unneeded deprecated warning for Legend.position [\#1483](https://github.com/danielgindi/Charts/issues/1483) +- Scatter Chart View V3.0 bad point displayed with BaloonMaker [\#1482](https://github.com/danielgindi/Charts/issues/1482) +- How to set the LineChart disconnect style, I add NAN to Entry, isInBoundsRight function is crashed. [\#1471](https://github.com/danielgindi/Charts/issues/1471) +- \(v3.0\)Demo: no such module realm [\#1460](https://github.com/danielgindi/Charts/issues/1460) +- Please provide swift 2 version for this project [\#1457](https://github.com/danielgindi/Charts/issues/1457) +- Distinguish LineGraph callback. [\#1448](https://github.com/danielgindi/Charts/issues/1448) +- BarChart right/left bar cut in half [\#1446](https://github.com/danielgindi/Charts/issues/1446) +- Graph clipping while setting Y-axis min ,max Value [\#1444](https://github.com/danielgindi/Charts/issues/1444) +- ChartV3 autoScaleMinMaxEnabled not scaling candle charts correctly. [\#1442](https://github.com/danielgindi/Charts/issues/1442) +- conflict with scrollView [\#1438](https://github.com/danielgindi/Charts/issues/1438) +- Getting error, while assigning xVals to PieChartData. [\#1433](https://github.com/danielgindi/Charts/issues/1433) +- HorizontalBarChartView not show value at bar [\#1396](https://github.com/danielgindi/Charts/issues/1396) +- HorizontalBarCharView incorrect results for bounding box query [\#1382](https://github.com/danielgindi/Charts/issues/1382) +- Data entries are missing on the chart [\#1348](https://github.com/danielgindi/Charts/issues/1348) +- \[HEADS UP\] Realm swift 3.0 support is blocked due to Xcode 8 beta 3 swift compiler bug [\#1269](https://github.com/danielgindi/Charts/issues/1269) +- When the X-Axis's text is too long, it will cover the radar chart. [\#1143](https://github.com/danielgindi/Charts/issues/1143) +- Extracting ChartsRealm to a separate project [\#1119](https://github.com/danielgindi/Charts/issues/1119) +- Disable scrolling parent scrollview when readed end of the chart [\#1115](https://github.com/danielgindi/Charts/issues/1115) +- Pie Chart : Multiline label on legend is cutting off [\#1084](https://github.com/danielgindi/Charts/issues/1084) + +**Merged pull requests:** + +- Enter the matrix [\#1650](https://github.com/danielgindi/Charts/pull/1650) ([petester42](https://github.com/petester42)) +- fix bar chart in demo that date starts at 0 [\#1648](https://github.com/danielgindi/Charts/pull/1648) ([liuxuan30](https://github.com/liuxuan30)) +- fix \#1603 and API comment [\#1621](https://github.com/danielgindi/Charts/pull/1621) ([liuxuan30](https://github.com/liuxuan30)) +- Bugfix for fix \#1488, \#1564 [\#1565](https://github.com/danielgindi/Charts/pull/1565) ([liuxuan30](https://github.com/liuxuan30)) +- Single test target to make coverage easier [\#1563](https://github.com/danielgindi/Charts/pull/1563) ([petester42](https://github.com/petester42)) +- Fix codecov [\#1560](https://github.com/danielgindi/Charts/pull/1560) ([petester42](https://github.com/petester42)) +- Adds Codecov [\#1559](https://github.com/danielgindi/Charts/pull/1559) ([petester42](https://github.com/petester42)) +- Fix decimals crash in ChartsUtil [\#1558](https://github.com/danielgindi/Charts/pull/1558) ([petester42](https://github.com/petester42)) +- Fixes messaging issues with charts needing carthage [\#1525](https://github.com/danielgindi/Charts/pull/1525) ([petester42](https://github.com/petester42)) +- Attempt to make CI more stable [\#1510](https://github.com/danielgindi/Charts/pull/1510) ([petester42](https://github.com/petester42)) +- Fix Cocoapods setup being broken [\#1509](https://github.com/danielgindi/Charts/pull/1509) ([petester42](https://github.com/petester42)) + +## [2.3.0](https://github.com/danielgindi/Charts/tree/2.3.0) (2016-09-21) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v2.3.0...2.3.0) + +## [v2.3.0](https://github.com/danielgindi/Charts/tree/v2.3.0) (2016-09-21) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v2.2.5...v2.3.0) + +**Implemented enhancements:** + +- Seek help with CandleStickChartView [\#1297](https://github.com/danielgindi/Charts/issues/1297) +- Support Realm 1.0.1 \(Objective-C\) [\#1201](https://github.com/danielgindi/Charts/issues/1201) + +**Fixed bugs:** + +- macOS demo bar chart's first and last bar got half cut [\#1468](https://github.com/danielgindi/Charts/issues/1468) +- Label drawing glitch when changing data [\#1347](https://github.com/danielgindi/Charts/issues/1347) +- HorizontalBarChartView with multiple data set crashes on tap [\#1339](https://github.com/danielgindi/Charts/issues/1339) +- weird behavior resizing the pie. [\#1286](https://github.com/danielgindi/Charts/issues/1286) +- Line Chart\(Dual YAis\):if i drag the slider,double line only leave the one line \#bug [\#1250](https://github.com/danielgindi/Charts/issues/1250) +- only Have a X-Value,the PieChart too bigger, twinkle [\#1239](https://github.com/danielgindi/Charts/issues/1239) +- Chart always crash when marker added and highlightFullBarEnabled is true [\#1185](https://github.com/danielgindi/Charts/issues/1185) +- App is crashing for certain symbols when granularityEnabled is false [\#1181](https://github.com/danielgindi/Charts/issues/1181) +- Changing chart data + autoScaleMinMaxEnabled causes crash [\#1151](https://github.com/danielgindi/Charts/issues/1151) +- using ChartXAxisValueFormatter doesn't enable 3 lines x axis labels [\#1148](https://github.com/danielgindi/Charts/issues/1148) +- ChartMaker work wrong in a Combined Chart [\#737](https://github.com/danielgindi/Charts/issues/737) +- CombinedChart with grouped bars support [\#169](https://github.com/danielgindi/Charts/issues/169) + +**Closed issues:** + +- Typo in CONTRIBUTING.md [\#1501](https://github.com/danielgindi/Charts/issues/1501) +- noDataText overflows [\#1500](https://github.com/danielgindi/Charts/issues/1500) +- How can I get frame of Line chart? \(with out labels, chart only\) [\#1498](https://github.com/danielgindi/Charts/issues/1498) +- Last label on xAxis is not showing [\#1497](https://github.com/danielgindi/Charts/issues/1497) +- How do I set the value of the x-axis after update ? [\#1496](https://github.com/danielgindi/Charts/issues/1496) +- Xcode 8 swift 3 No Such Module Charts? [\#1494](https://github.com/danielgindi/Charts/issues/1494) +- Give id for node [\#1493](https://github.com/danielgindi/Charts/issues/1493) +- \(v3.0-Swift3.0\)crash because of image not found [\#1487](https://github.com/danielgindi/Charts/issues/1487) +- \(v3.0 LineChart\) xAxis with String/double label issue [\#1481](https://github.com/danielgindi/Charts/issues/1481) +- LineChart. Custom LineChartRenderer does not cross chart border [\#1480](https://github.com/danielgindi/Charts/issues/1480) +- LineChart. Labels for Y axis and Double format [\#1479](https://github.com/danielgindi/Charts/issues/1479) +- stringForValue value argument [\#1478](https://github.com/danielgindi/Charts/issues/1478) +- \[LineChart\] How to Darw "NSString" on xAxis? without Realm.io [\#1477](https://github.com/danielgindi/Charts/issues/1477) +- code 65 result after getting a Carthage update failure [\#1476](https://github.com/danielgindi/Charts/issues/1476) +- How to show xAxis All value and Rotate Label? [\#1475](https://github.com/danielgindi/Charts/issues/1475) +- Compiled with older version of Swift language \(2.0\) [\#1473](https://github.com/danielgindi/Charts/issues/1473) +- Some missing methods in swift 3 version [\#1472](https://github.com/danielgindi/Charts/issues/1472) +- v2.2.5 not support swift2.3 [\#1470](https://github.com/danielgindi/Charts/issues/1470) +- balloon marker [\#1469](https://github.com/danielgindi/Charts/issues/1469) +- How can I highlight single dot in lineChart? [\#1465](https://github.com/danielgindi/Charts/issues/1465) +- release new [\#1464](https://github.com/danielgindi/Charts/issues/1464) +- After the upgrade iOS10 Charts-iOS Change the case [\#1463](https://github.com/danielgindi/Charts/issues/1463) +- \(v3.0\)There is no Chart-iOS framework in Product [\#1462](https://github.com/danielgindi/Charts/issues/1462) +- ios10 the charts can not display! [\#1461](https://github.com/danielgindi/Charts/issues/1461) +- Swift 3.0 and Realm [\#1458](https://github.com/danielgindi/Charts/issues/1458) +- Unable to draw bars [\#1456](https://github.com/danielgindi/Charts/issues/1456) +- \[MC\] System group container issue [\#1455](https://github.com/danielgindi/Charts/issues/1455) +- iOS 10 and swift 3.0 issues [\#1453](https://github.com/danielgindi/Charts/issues/1453) +- Adding additional X index values without the initWithXVals [\#1451](https://github.com/danielgindi/Charts/issues/1451) +- Cannot convert Charts to Swift 3.0 [\#1449](https://github.com/danielgindi/Charts/issues/1449) +- Combine chart have a Bar color gray every bars? [\#1447](https://github.com/danielgindi/Charts/issues/1447) +- Compiling on New XCode 8 [\#1445](https://github.com/danielgindi/Charts/issues/1445) +- Customize scatter chart color for each data in dataSets [\#1443](https://github.com/danielgindi/Charts/issues/1443) +- XCode 8: Crash in xAxis Renderer after upgrade [\#1441](https://github.com/danielgindi/Charts/issues/1441) +- Xcode 8 and swift 3.0 [\#1440](https://github.com/danielgindi/Charts/issues/1440) +- How To use Swift3.0 In Xcode8 [\#1439](https://github.com/danielgindi/Charts/issues/1439) +- Error when running `pod lib lint` from another project [\#1436](https://github.com/danielgindi/Charts/issues/1436) +- Graph cutting off from axisLine while setting axis min ,max Value [\#1435](https://github.com/danielgindi/Charts/issues/1435) +- Cannot compile for targets below iPhone 5s [\#1434](https://github.com/danielgindi/Charts/issues/1434) +- Line chartView, I need a YAxis with the labelNum is inverted order [\#1432](https://github.com/danielgindi/Charts/issues/1432) +- PieChartDataEntry class not found - Swift/CocoaPods [\#1431](https://github.com/danielgindi/Charts/issues/1431) +- How to write a limit for each bar in horizontal bar chart? [\#1429](https://github.com/danielgindi/Charts/issues/1429) +- Bug with 2 candlestick datasets on one chart. [\#1428](https://github.com/danielgindi/Charts/issues/1428) +- getFillLinePosition not calling to create Area graph [\#1427](https://github.com/danielgindi/Charts/issues/1427) +- Lack of documentation [\#1426](https://github.com/danielgindi/Charts/issues/1426) +- Best method to use this in Objective c project [\#1425](https://github.com/danielgindi/Charts/issues/1425) +- Highlight sync between combined and line views [\#1424](https://github.com/danielgindi/Charts/issues/1424) +- How to create two bars one over another for Horizontal bar charts? [\#1423](https://github.com/danielgindi/Charts/issues/1423) +- \[Swift 3.0 specific\] linear line chart has additional line segments wile zooming in [\#1421](https://github.com/danielgindi/Charts/issues/1421) +- Is there a way to import PieChartDataEntry.swift in existing Pod? [\#1419](https://github.com/danielgindi/Charts/issues/1419) +- implement the same behavior as Android api [\#1418](https://github.com/danielgindi/Charts/issues/1418) +- Unable to build project in Xcode 8 [\#1417](https://github.com/danielgindi/Charts/issues/1417) +- Synchronizing scrolling/pan/highlight of multiple views. [\#1415](https://github.com/danielgindi/Charts/issues/1415) +- Custom X-Axis Values [\#1413](https://github.com/danielgindi/Charts/issues/1413) +- Query : When it will be available in CocoaPods? [\#1412](https://github.com/danielgindi/Charts/issues/1412) +- How to set background color of bars [\#1411](https://github.com/danielgindi/Charts/issues/1411) +- Query: Enable gridelines at specific location points. [\#1410](https://github.com/danielgindi/Charts/issues/1410) +- Syntax errors on one of our testing devices [\#1409](https://github.com/danielgindi/Charts/issues/1409) +- how to hide the ValueFormatter [\#1408](https://github.com/danielgindi/Charts/issues/1408) +- I can't see the zero\(float Num\) on ChartYAxis [\#1407](https://github.com/danielgindi/Charts/issues/1407) +- drawSliceTextEnabled = YES not working [\#1404](https://github.com/danielgindi/Charts/issues/1404) +- Customize popup on entry tap [\#1403](https://github.com/danielgindi/Charts/issues/1403) +- Query: How to create an area graph? [\#1402](https://github.com/danielgindi/Charts/issues/1402) +- Negative Bar Chart [\#1401](https://github.com/danielgindi/Charts/issues/1401) +- Cannot invoke initializer for type 'PieChartData' error in Swift 2.3 [\#1400](https://github.com/danielgindi/Charts/issues/1400) +- Get entry location in view when chart value is selected? [\#1399](https://github.com/danielgindi/Charts/issues/1399) +- Can you give me a Charts library wrote by OC. [\#1398](https://github.com/danielgindi/Charts/issues/1398) +- Barchart,,,,draw specific value [\#1397](https://github.com/danielgindi/Charts/issues/1397) +- How to customize left axis with string values? [\#1394](https://github.com/danielgindi/Charts/issues/1394) +- Swift & CocoaPods - Unable to Utilize Charts [\#1393](https://github.com/danielgindi/Charts/issues/1393) +- How to create a Pie chart, no 'how to' ? . The demo app sucks, doesn't compile. [\#1392](https://github.com/danielgindi/Charts/issues/1392) +- Need help in setDrawValues [\#1391](https://github.com/danielgindi/Charts/issues/1391) +- Display Integer value [\#1390](https://github.com/danielgindi/Charts/issues/1390) +- BarChartData Class is Missing InitWithXVals [\#1385](https://github.com/danielgindi/Charts/issues/1385) +- Undeclared or undefined identifiers while trying to compile project [\#1383](https://github.com/danielgindi/Charts/issues/1383) +- How to show/hide one of the line chart during runtime [\#1381](https://github.com/danielgindi/Charts/issues/1381) +- Charts-Swift.h is different [\#1380](https://github.com/danielgindi/Charts/issues/1380) +- infinite recursion in HorizontalBarChartHighlighter [\#1377](https://github.com/danielgindi/Charts/issues/1377) +- Charts errors in xcode beta 6 [\#1375](https://github.com/danielgindi/Charts/issues/1375) +- please tell me how do i handling these problems,thanks! [\#1373](https://github.com/danielgindi/Charts/issues/1373) +- Charts 3.0 and Swift 2.3 branch? [\#1370](https://github.com/danielgindi/Charts/issues/1370) +- Legend. Position is deprecated. [\#1369](https://github.com/danielgindi/Charts/issues/1369) +- App Crash: An instance 0xXXXXXXXX of class Charts.BarChartView was deallocated while key value observers were still registered with it. [\#1368](https://github.com/danielgindi/Charts/issues/1368) +- Unable to compile adding Charts to project via CocoaPods [\#1367](https://github.com/danielgindi/Charts/issues/1367) +- Cannot use PieChartDataSet or PieChartDataEntry when include with Cocoapod [\#1366](https://github.com/danielgindi/Charts/issues/1366) +- Charts is ~20M when built. Desired? [\#1365](https://github.com/danielgindi/Charts/issues/1365) +- swift 3 branch does not compile with Xcode 8 beta 6 [\#1364](https://github.com/danielgindi/Charts/issues/1364) +- There are two lines. The first number starts from scratch, but only one is from zero. The other one has a certain amount of cheap quantity. How do I get the other one from zero. [\#1363](https://github.com/danielgindi/Charts/issues/1363) +- missing class PieChartDataEntry \(macOS\) [\#1358](https://github.com/danielgindi/Charts/issues/1358) +- BarChartView can't show max y value's top label, only show half [\#1357](https://github.com/danielgindi/Charts/issues/1357) +- Horizontal Bar Chart not showing values [\#1356](https://github.com/danielgindi/Charts/issues/1356) +- rightAxis labels are not showing for value less then 1.0 in swift using cocoapod [\#1354](https://github.com/danielgindi/Charts/issues/1354) +- Chart's X-axis labels not resizing to accommodate multi-line text [\#1352](https://github.com/danielgindi/Charts/issues/1352) +- Pie Chart Graph Unusual Visual When Data Of Zero [\#1351](https://github.com/danielgindi/Charts/issues/1351) +- Chart render problem after double tap zoom [\#1350](https://github.com/danielgindi/Charts/issues/1350) +- Chart Bar drawing [\#1349](https://github.com/danielgindi/Charts/issues/1349) +- How to dynamically scale up / down data depends on zoom level [\#1346](https://github.com/danielgindi/Charts/issues/1346) +- Cannot install in ios9.3.2 [\#1345](https://github.com/danielgindi/Charts/issues/1345) +- Where can I find the exact color value of vordiplom colors? [\#1343](https://github.com/danielgindi/Charts/issues/1343) +- How to Modify X Axis values Swift? [\#1340](https://github.com/danielgindi/Charts/issues/1340) +- Line Chart : Data Line Color Change [\#1338](https://github.com/danielgindi/Charts/issues/1338) +- Line Chart x axis and y axis Line Color change? [\#1337](https://github.com/danielgindi/Charts/issues/1337) +- Grouped Bar Charts [\#1333](https://github.com/danielgindi/Charts/issues/1333) +- Integer for ChartDataEntry [\#1332](https://github.com/danielgindi/Charts/issues/1332) +- values from array for x axis on barchart [\#1331](https://github.com/danielgindi/Charts/issues/1331) +- Redundant conformance of 'RLMResults' to protocol 'SequenceType' on RealmChartsUtils [\#1329](https://github.com/danielgindi/Charts/issues/1329) +- Combined Chart Grouped Bar Width Not Changing [\#1328](https://github.com/danielgindi/Charts/issues/1328) +- Undefined symbols for architecture armv7: [\#1327](https://github.com/danielgindi/Charts/issues/1327) +- Error with carthage update ChartsRealm fails to build [\#1326](https://github.com/danielgindi/Charts/issues/1326) +- I am not able to design multicolor bar chart [\#1324](https://github.com/danielgindi/Charts/issues/1324) +- v2.2.5 demo code is different with pod installed version [\#1322](https://github.com/danielgindi/Charts/issues/1322) +- If the all value is 1 or 0, the ChartYAxis is error [\#1321](https://github.com/danielgindi/Charts/issues/1321) +- hide on select grid lines in line chart [\#1320](https://github.com/danielgindi/Charts/issues/1320) +- X data as a Date [\#1317](https://github.com/danielgindi/Charts/issues/1317) +- Also played well, before package, NO error, the recent packaging error, the error is "NO Scuh module 'charts", don't know is what reason to solve, use the xcode 7.1 \(7 b91b\) [\#1316](https://github.com/danielgindi/Charts/issues/1316) +- Crash with marker attached into CombinedChartView [\#1315](https://github.com/danielgindi/Charts/issues/1315) +- How to add more than 3 lines in chart [\#1314](https://github.com/danielgindi/Charts/issues/1314) +- is v3 Ready for production ? [\#1313](https://github.com/danielgindi/Charts/issues/1313) +- xAxis.axisMaxValue not working [\#1312](https://github.com/danielgindi/Charts/issues/1312) +- Symbol not found: \_\_TMVVSS17UnicodeScalarView9Generator Referenced from: Frameworks/Charts.framework/Charts [\#1311](https://github.com/danielgindi/Charts/issues/1311) +- how to named SWIFT\_CLASS\("....."\) [\#1310](https://github.com/danielgindi/Charts/issues/1310) +- How to set the length and color outside pie chart when a slice is highlighted? [\#1309](https://github.com/danielgindi/Charts/issues/1309) +- How to set the length and color outside pie chart when a slice is highlighted? [\#1308](https://github.com/danielgindi/Charts/issues/1308) +- I want set circle empty in Line Chart. Which properties i have to change? [\#1307](https://github.com/danielgindi/Charts/issues/1307) +- noDataText font and color [\#1305](https://github.com/danielgindi/Charts/issues/1305) +- how to let centerAttributedText line feed in bar chart ? [\#1304](https://github.com/danielgindi/Charts/issues/1304) +- Can Legend be selected or multi-selected? [\#1303](https://github.com/danielgindi/Charts/issues/1303) +- add financial bar chart \(Open-high-low-close chart\) [\#1302](https://github.com/danielgindi/Charts/issues/1302) +- How to select the first pie in bar chart? [\#1301](https://github.com/danielgindi/Charts/issues/1301) +- PieChartView Narrow with one value [\#1298](https://github.com/danielgindi/Charts/issues/1298) +- xAxis.axisMaxValue is never considered [\#1293](https://github.com/danielgindi/Charts/issues/1293) +- Please add Swift demo project also [\#1292](https://github.com/danielgindi/Charts/issues/1292) +- Swift 2.3 & 3.0 support: news, issues, PRs and state [\#1291](https://github.com/danielgindi/Charts/issues/1291) +- 2 lines on the charts with the same values [\#1289](https://github.com/danielgindi/Charts/issues/1289) +- How to set the y axis descript text [\#1285](https://github.com/danielgindi/Charts/issues/1285) +- how to setTouchEnabled to false [\#1283](https://github.com/danielgindi/Charts/issues/1283) +- legend set different form for different set [\#1282](https://github.com/danielgindi/Charts/issues/1282) +- Change Label Text Color PieChart [\#1280](https://github.com/danielgindi/Charts/issues/1280) +- Everyone welcome to try out `v3` branch before Charts 3.0 is released! [\#1279](https://github.com/danielgindi/Charts/issues/1279) +- \[FR\] make Marker a protocol [\#1278](https://github.com/danielgindi/Charts/issues/1278) +- Unable to convert charts to Swift3 [\#1277](https://github.com/danielgindi/Charts/issues/1277) +- Start at zero and draw cubic [\#1275](https://github.com/danielgindi/Charts/issues/1275) +- Customised size of x data points and Scatter Graph with Linear Trend Line [\#1274](https://github.com/danielgindi/Charts/issues/1274) +- How can i add null values to my chart? [\#1273](https://github.com/danielgindi/Charts/issues/1273) +- PIE-CHART how to get the index of the selected slice.??? [\#1267](https://github.com/danielgindi/Charts/issues/1267) +- How to select a value in line chart data point and same for bar chart [\#1265](https://github.com/danielgindi/Charts/issues/1265) +- update to the latest realm [\#1262](https://github.com/danielgindi/Charts/issues/1262) +- horizontal bar graph value different decimal places each time [\#1260](https://github.com/danielgindi/Charts/issues/1260) +- Charts vs. ShinobiCharts? [\#1259](https://github.com/danielgindi/Charts/issues/1259) +- LineChart overlap value label and y-Axis [\#1257](https://github.com/danielgindi/Charts/issues/1257) +- how to hide stacked bar chart label having 0 values [\#1256](https://github.com/danielgindi/Charts/issues/1256) +- fillColor for negative values [\#1255](https://github.com/danielgindi/Charts/issues/1255) +- Set custom x-value spacing in graph [\#1254](https://github.com/danielgindi/Charts/issues/1254) +- Hide specific labels on y axis [\#1253](https://github.com/danielgindi/Charts/issues/1253) +- Marker near edges got clipped [\#1251](https://github.com/danielgindi/Charts/issues/1251) +- Custom label for LineChart [\#1248](https://github.com/danielgindi/Charts/issues/1248) +- Chart in TableViewCell [\#1247](https://github.com/danielgindi/Charts/issues/1247) +- Line Chart : Can I drag a vertical line to any point on the screen and get values? Instead of individual touches [\#1246](https://github.com/danielgindi/Charts/issues/1246) +- Line Chart label count not calculating properly [\#1244](https://github.com/danielgindi/Charts/issues/1244) +- CandleChartView screen show count limit [\#1243](https://github.com/danielgindi/Charts/issues/1243) +- addEntryOrdered behavior - clarification [\#1242](https://github.com/danielgindi/Charts/issues/1242) +- Display Max Value on X-axis [\#1241](https://github.com/danielgindi/Charts/issues/1241) +- Value not display for Multiple DataSet in LineChart [\#1240](https://github.com/danielgindi/Charts/issues/1240) +- rightAxis are rounded [\#1238](https://github.com/danielgindi/Charts/issues/1238) +- Now working if “Compile Sources As” option to “Objective C++” [\#1237](https://github.com/danielgindi/Charts/issues/1237) +- Line is drawn below the x axis when the drawCubicEnabled is YES. [\#1236](https://github.com/danielgindi/Charts/issues/1236) +- Label value is cut off in horizontal bar [\#1235](https://github.com/danielgindi/Charts/issues/1235) +- ChartValueSelected Only While Finger Pressed [\#1234](https://github.com/danielgindi/Charts/issues/1234) +- YAxis Labels are clipped with some settings [\#1233](https://github.com/danielgindi/Charts/issues/1233) +- xVals隐藏问题 [\#1232](https://github.com/danielgindi/Charts/issues/1232) +- About the Lable number of x and y [\#1231](https://github.com/danielgindi/Charts/issues/1231) +- How to control not draws a specified point [\#1229](https://github.com/danielgindi/Charts/issues/1229) +- Location have a little problem [\#1228](https://github.com/danielgindi/Charts/issues/1228) +- BarChartView bars do not start at the x-axis. [\#1225](https://github.com/danielgindi/Charts/issues/1225) +- Unable to run on iOS/tvOS 10.0 beta [\#1223](https://github.com/danielgindi/Charts/issues/1223) +- two CombinedChartView's in the same screen changes axis format in the first [\#1222](https://github.com/danielgindi/Charts/issues/1222) +- Horizontal bar chart crashing after tap when more than one data set [\#1221](https://github.com/danielgindi/Charts/issues/1221) +- no suitable image found. [\#1220](https://github.com/danielgindi/Charts/issues/1220) +- wrong offset when using mutiple bar chart in combined chart [\#1219](https://github.com/danielgindi/Charts/issues/1219) +- UnsafeMutablePointer.moveInitializeFrom with negative count [\#1218](https://github.com/danielgindi/Charts/issues/1218) +- Is there any way to hide the label of a DataSet? [\#1217](https://github.com/danielgindi/Charts/issues/1217) +- How can I not be highlighted when I touch ended ? [\#1216](https://github.com/danielgindi/Charts/issues/1216) +- poor styling documentation, how can i make my charts look beautiful? [\#1215](https://github.com/danielgindi/Charts/issues/1215) +- X Axis for Candle Sticks from Realm [\#1214](https://github.com/danielgindi/Charts/issues/1214) +- drawHighlighted\(\) not calling [\#1212](https://github.com/danielgindi/Charts/issues/1212) +- how to set marker for line chart [\#1211](https://github.com/danielgindi/Charts/issues/1211) +- Error when using Charts library with Xcode 8 bet and Swift 3.0 [\#1210](https://github.com/danielgindi/Charts/issues/1210) +- I have an immature small suggestion [\#1209](https://github.com/danielgindi/Charts/issues/1209) +- I have a question BarChart [\#1208](https://github.com/danielgindi/Charts/issues/1208) +- HorizontalBarChart in Combined Chart [\#1207](https://github.com/danielgindi/Charts/issues/1207) +- drawvalue when stack is selected [\#1200](https://github.com/danielgindi/Charts/issues/1200) +- Remove labels from Radar Chart [\#1199](https://github.com/danielgindi/Charts/issues/1199) +- reduce height of grids [\#1198](https://github.com/danielgindi/Charts/issues/1198) +- reduce grid size [\#1194](https://github.com/danielgindi/Charts/issues/1194) +- ChartsView [\#1189](https://github.com/danielgindi/Charts/issues/1189) +- Custom LineChart marker image [\#1188](https://github.com/danielgindi/Charts/issues/1188) +- moveViewToAnimatedWithXIndex high cpu usage [\#1186](https://github.com/danielgindi/Charts/issues/1186) +- can we implement group bar chart and line chart as combined chart [\#1184](https://github.com/danielgindi/Charts/issues/1184) +- Such a difficult chart, can be realized? [\#1183](https://github.com/danielgindi/Charts/issues/1183) +- How to achieve the effect of the picture? Please look carefully [\#1182](https://github.com/danielgindi/Charts/issues/1182) +- Designed initializer of BarChartDataSet crash [\#1180](https://github.com/danielgindi/Charts/issues/1180) +- To judge whether the initial state [\#1178](https://github.com/danielgindi/Charts/issues/1178) +- use cocoa pods mistakes [\#1177](https://github.com/danielgindi/Charts/issues/1177) +- hide description label on charts [\#1176](https://github.com/danielgindi/Charts/issues/1176) +- axis values are rounded [\#1175](https://github.com/danielgindi/Charts/issues/1175) +- how can i add a % on leftAxis [\#1174](https://github.com/danielgindi/Charts/issues/1174) +- Add percent label for pie chart [\#1172](https://github.com/danielgindi/Charts/issues/1172) +- can't add swipe gesture [\#1170](https://github.com/danielgindi/Charts/issues/1170) +- Chart not drawing completely left to right [\#1168](https://github.com/danielgindi/Charts/issues/1168) +- Horizontal-BarChart: change color of bar's value [\#1167](https://github.com/danielgindi/Charts/issues/1167) +- ScatterChartData not working in Swift? [\#1166](https://github.com/danielgindi/Charts/issues/1166) +- Compile error on iPhone 4s simulator [\#1165](https://github.com/danielgindi/Charts/issues/1165) +- Adding an average line to a BarChartView [\#1162](https://github.com/danielgindi/Charts/issues/1162) +- About Swift3.0 [\#1161](https://github.com/danielgindi/Charts/issues/1161) +- How to add images on some points? [\#1160](https://github.com/danielgindi/Charts/issues/1160) +- Suggest combo type chart support gouped bar type [\#1159](https://github.com/danielgindi/Charts/issues/1159) +- Adding Entries dynamicly [\#1157](https://github.com/danielgindi/Charts/issues/1157) +- how can i add a button in redmark and i can click .. [\#1156](https://github.com/danielgindi/Charts/issues/1156) +- How can I select the close value in the candle chart view? [\#1155](https://github.com/danielgindi/Charts/issues/1155) +- Charts setup in Obj C project question [\#1154](https://github.com/danielgindi/Charts/issues/1154) +- I want datasetvalues according leftAxis and RigthAxis different display [\#1153](https://github.com/danielgindi/Charts/issues/1153) +- Unable to build project in new environment and it shows build error [\#1152](https://github.com/danielgindi/Charts/issues/1152) +- Chart Clipping [\#1149](https://github.com/danielgindi/Charts/issues/1149) +- How to handle small interval [\#1147](https://github.com/danielgindi/Charts/issues/1147) +- How to show the label [\#1146](https://github.com/danielgindi/Charts/issues/1146) +- specify certain point custom color [\#1144](https://github.com/danielgindi/Charts/issues/1144) +- when scaled touch move can't toggle highlight [\#1141](https://github.com/danielgindi/Charts/issues/1141) +- Support Swift 3.0 \(Xcode 8\) [\#1140](https://github.com/danielgindi/Charts/issues/1140) +- How to show bar chart value labels only on selection [\#1139](https://github.com/danielgindi/Charts/issues/1139) +- BalloonMarker overlapping issue [\#1137](https://github.com/danielgindi/Charts/issues/1137) +- Customize Axis visible distance [\#1135](https://github.com/danielgindi/Charts/issues/1135) +- Different width for stacked charts [\#1134](https://github.com/danielgindi/Charts/issues/1134) +- Properly setting up a fork of this project [\#1133](https://github.com/danielgindi/Charts/issues/1133) +- Issues with xcode 8.0 beta [\#1132](https://github.com/danielgindi/Charts/issues/1132) +- Disable touch events, so do not show Label [\#1129](https://github.com/danielgindi/Charts/issues/1129) +- custom chart label layout [\#1128](https://github.com/danielgindi/Charts/issues/1128) +- BarChartView yAxis origin y are not start from y:0.0? [\#1127](https://github.com/danielgindi/Charts/issues/1127) +- Space at the bottom of the Line Chart View in landscape view [\#1125](https://github.com/danielgindi/Charts/issues/1125) +- Failing to build the project [\#1124](https://github.com/danielgindi/Charts/issues/1124) +- Rounding error on Y-axis when all Y values are zeroes [\#1123](https://github.com/danielgindi/Charts/issues/1123) +- Can't hide small slice labels from pie chart. [\#1122](https://github.com/danielgindi/Charts/issues/1122) +- Customizing the x-axes labels. [\#1120](https://github.com/danielgindi/Charts/issues/1120) +- Using prebuilt frameworks is not recommended [\#1118](https://github.com/danielgindi/Charts/issues/1118) +- chartValueSelected on TVOS [\#1117](https://github.com/danielgindi/Charts/issues/1117) +- Single LineChartDataSet in LineChartView [\#1116](https://github.com/danielgindi/Charts/issues/1116) +- how to show only positive values in barchart? [\#1114](https://github.com/danielgindi/Charts/issues/1114) +- Slow Build Time [\#1113](https://github.com/danielgindi/Charts/issues/1113) +- BarChartDataEntry with Int instead of Double [\#1112](https://github.com/danielgindi/Charts/issues/1112) +- Embedded Binaries charts.framewor But nothing happen! [\#1111](https://github.com/danielgindi/Charts/issues/1111) +- How to draw Combined Chart on the left [\#1110](https://github.com/danielgindi/Charts/issues/1110) +- BarChartDataSet.values is a get-only [\#1108](https://github.com/danielgindi/Charts/issues/1108) +- 有没有 oc版的? [\#1107](https://github.com/danielgindi/Charts/issues/1107) +- Change color of highlight in chart [\#1106](https://github.com/danielgindi/Charts/issues/1106) +- Sync selected value in 2 chart [\#1105](https://github.com/danielgindi/Charts/issues/1105) +- Are two charts can be linked ? [\#1103](https://github.com/danielgindi/Charts/issues/1103) +- BarChart bottom not on the Xaxis [\#1102](https://github.com/danielgindi/Charts/issues/1102) +- BUG::: leftAxis.axisMinValue !!!=== 0.0 [\#1101](https://github.com/danielgindi/Charts/issues/1101) +- CandleStickView Memory leak [\#1100](https://github.com/danielgindi/Charts/issues/1100) +- application doesn't compile for iphone 4s and iphone 5 device. [\#1098](https://github.com/danielgindi/Charts/issues/1098) +- ChartHighlight init data in function of highlightValue error [\#1096](https://github.com/danielgindi/Charts/issues/1096) +- improvement: custom labels on BarChart [\#1095](https://github.com/danielgindi/Charts/issues/1095) +- Missing alternate x-axis labels in vertical bar chart [\#1093](https://github.com/danielgindi/Charts/issues/1093) +- ChartHighlight class initialization is error in ChartViewBase [\#1090](https://github.com/danielgindi/Charts/issues/1090) +- how can I change the mark view [\#1086](https://github.com/danielgindi/Charts/issues/1086) +- Pie Chart with value lines [\#1085](https://github.com/danielgindi/Charts/issues/1085) +- Chart Demo not Compiling [\#1083](https://github.com/danielgindi/Charts/issues/1083) +- set the Y range [\#1079](https://github.com/danielgindi/Charts/issues/1079) +- Sync zoom in 2 chart [\#1078](https://github.com/danielgindi/Charts/issues/1078) +- The rotated xAxis label out of the view [\#1068](https://github.com/danielgindi/Charts/issues/1068) +- visibleXRangeMaximum not refreshing [\#1037](https://github.com/danielgindi/Charts/issues/1037) +- Fill area between two line in Line chart [\#1032](https://github.com/danielgindi/Charts/issues/1032) +- Left Axis not showing labels after update to Swift 2.3 [\#997](https://github.com/danielgindi/Charts/issues/997) +- highestVisibleXIndex has regression issue [\#985](https://github.com/danielgindi/Charts/issues/985) +- Problem with bitcode [\#979](https://github.com/danielgindi/Charts/issues/979) +- BarChartView height is not reflecting the values assigned to it. [\#977](https://github.com/danielgindi/Charts/issues/977) +- I use the RadarChartView,when displaying two sets of data [\#974](https://github.com/danielgindi/Charts/issues/974) +- Overlapping with multiple data styles [\#972](https://github.com/danielgindi/Charts/issues/972) +- XAxis Values label rotation [\#953](https://github.com/danielgindi/Charts/issues/953) +- Custom Y Value Formatter [\#943](https://github.com/danielgindi/Charts/issues/943) +- Bar chart missing y axis label [\#858](https://github.com/danielgindi/Charts/issues/858) +- Overlapping bar chart [\#857](https://github.com/danielgindi/Charts/issues/857) +- iOS-charts Get Currently visible bars for MultipleBarChartViewController demo [\#782](https://github.com/danielgindi/Charts/issues/782) +- Live data Line Chart [\#754](https://github.com/danielgindi/Charts/issues/754) +- Support custom formatting of chart labels [\#750](https://github.com/danielgindi/Charts/issues/750) +- Horizontally flipped x-axis [\#738](https://github.com/danielgindi/Charts/issues/738) +- Annotations issues and asking for supporting more types of markers [\#722](https://github.com/danielgindi/Charts/issues/722) +- Drop iOS 7 support in readme [\#601](https://github.com/danielgindi/Charts/issues/601) +- HorizontalBarChartView displays bar shadow when left and right axis hidden [\#311](https://github.com/danielgindi/Charts/issues/311) +- Making X-Values Properly Scaled \(Not Equidistant\) [\#194](https://github.com/danielgindi/Charts/issues/194) +- LineChart Axis Inset? [\#46](https://github.com/danielgindi/Charts/issues/46) + +**Merged pull requests:** + +- bump Charts version to 3.0.0 [\#1505](https://github.com/danielgindi/Charts/pull/1505) ([liuxuan30](https://github.com/liuxuan30)) +- porting \#1452 into master [\#1486](https://github.com/danielgindi/Charts/pull/1486) ([liuxuan30](https://github.com/liuxuan30)) +- Don't override project settings in targets [\#1484](https://github.com/danielgindi/Charts/pull/1484) ([petester42](https://github.com/petester42)) +- change Charts baseSDK to iOS 10 [\#1467](https://github.com/danielgindi/Charts/pull/1467) ([liuxuan30](https://github.com/liuxuan30)) +- migrate more ChartsDemo project setting to swift 3.0 [\#1466](https://github.com/danielgindi/Charts/pull/1466) ([liuxuan30](https://github.com/liuxuan30)) +- Fix bar layout bug, pie callback bug [\#1452](https://github.com/danielgindi/Charts/pull/1452) ([aoverholtzer](https://github.com/aoverholtzer)) +- Update project structure for simplicity and fixing carthage [\#1422](https://github.com/danielgindi/Charts/pull/1422) ([petester42](https://github.com/petester42)) +- \[swift 3.0 specific\]fix linear line chart additional line segments wile zooming in [\#1420](https://github.com/danielgindi/Charts/pull/1420) ([liuxuan30](https://github.com/liuxuan30)) +- fix attempt for Realm support [\#1414](https://github.com/danielgindi/Charts/pull/1414) ([liuxuan30](https://github.com/liuxuan30)) +- migrate Chart v3 code in master to swift 2.3 branch [\#1389](https://github.com/danielgindi/Charts/pull/1389) ([liuxuan30](https://github.com/liuxuan30)) +- fix bridgedObjCGetStringArray warning and more copyWithZone\(\_ zone: NSZone?\) -\> AnyObject errors [\#1379](https://github.com/danielgindi/Charts/pull/1379) ([liuxuan30](https://github.com/liuxuan30)) +- migrate `public` to `open` [\#1378](https://github.com/danielgindi/Charts/pull/1378) ([liuxuan30](https://github.com/liuxuan30)) +- Swift 3.0 beta 6 \(acegreen's branch, but with fixes for OS X\) [\#1353](https://github.com/danielgindi/Charts/pull/1353) ([pixelspark](https://github.com/pixelspark)) +- Conforms to Swift 3 - Xcode 8 beta 6 [\#1342](https://github.com/danielgindi/Charts/pull/1342) ([acegreen](https://github.com/acegreen)) +- When only one of scaleXEnabled or scaleYEnabled is effective [\#1319](https://github.com/danielgindi/Charts/pull/1319) ([essoecc](https://github.com/essoecc)) +- V3 [\#1318](https://github.com/danielgindi/Charts/pull/1318) ([vishaldeshai](https://github.com/vishaldeshai)) +- convert RunLoopMode to swift 3.0 syntax [\#1296](https://github.com/danielgindi/Charts/pull/1296) ([liuxuan30](https://github.com/liuxuan30)) +- fix more ChartsDemo complains [\#1295](https://github.com/danielgindi/Charts/pull/1295) ([liuxuan30](https://github.com/liuxuan30)) +- just fix all Xcode beta 4 complains, except for Realm bug [\#1294](https://github.com/danielgindi/Charts/pull/1294) ([liuxuan30](https://github.com/liuxuan30)) +- Swift 3.0 - Xcode 8 Beta 4 [\#1290](https://github.com/danielgindi/Charts/pull/1290) ([acegreen](https://github.com/acegreen)) +- Few more changes needed to build with Swift 2.3 [\#1281](https://github.com/danielgindi/Charts/pull/1281) ([EpicDraws](https://github.com/EpicDraws)) +- fix Realm pod spec typo [\#1271](https://github.com/danielgindi/Charts/pull/1271) ([liuxuan30](https://github.com/liuxuan30)) +- support Realm 1.0.2 [\#1270](https://github.com/danielgindi/Charts/pull/1270) ([liuxuan30](https://github.com/liuxuan30)) +- upgrade Realm to 1.0.2 [\#1268](https://github.com/danielgindi/Charts/pull/1268) ([liuxuan30](https://github.com/liuxuan30)) +- Typo fix, our of range =\> out of range [\#1264](https://github.com/danielgindi/Charts/pull/1264) ([chris-gunawardena](https://github.com/chris-gunawardena)) +- Fix Swift 3 compilation errors for iOS [\#1258](https://github.com/danielgindi/Charts/pull/1258) ([puthirith](https://github.com/puthirith)) +- remove brew upgrade carthage for travis and update ios-snapshot-test-case to 2.1.2 [\#1249](https://github.com/danielgindi/Charts/pull/1249) ([liuxuan30](https://github.com/liuxuan30)) +- improve comment to warn users how to use setVisibleRange APIs [\#1245](https://github.com/danielgindi/Charts/pull/1245) ([liuxuan30](https://github.com/liuxuan30)) +- for \#1208, seems drawBarShadowEnabled should be false by default [\#1226](https://github.com/danielgindi/Charts/pull/1226) ([liuxuan30](https://github.com/liuxuan30)) +- BUGFIX: fix infinite recursive call of getXIndex\(\_:\) [\#1213](https://github.com/danielgindi/Charts/pull/1213) ([AntiMoron](https://github.com/AntiMoron)) +- Add missing imports for iOS 7 support [\#1205](https://github.com/danielgindi/Charts/pull/1205) ([VincentSit](https://github.com/VincentSit)) +- upgrade carthage, resolve test failure config [\#1203](https://github.com/danielgindi/Charts/pull/1203) ([liuxuan30](https://github.com/liuxuan30)) +- update iso-snapshot-test-case to master to have the fix for now [\#1202](https://github.com/danielgindi/Charts/pull/1202) ([liuxuan30](https://github.com/liuxuan30)) +- Migrate to Swift 3 \(now targeted at the Swift-3.0 branch\) [\#1171](https://github.com/danielgindi/Charts/pull/1171) ([pixelspark](https://github.com/pixelspark)) +- Swift 2.3 [\#1163](https://github.com/danielgindi/Charts/pull/1163) ([liuxuan30](https://github.com/liuxuan30)) +- Ignoring .DS\_Store files [\#1130](https://github.com/danielgindi/Charts/pull/1130) ([einsteinx2](https://github.com/einsteinx2)) + +## [v2.2.5](https://github.com/danielgindi/Charts/tree/v2.2.5) (2016-05-30) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v2.2.4...v2.2.5) + +**Implemented enhancements:** + +- Support for Xamarin.Forms [\#606](https://github.com/danielgindi/Charts/issues/606) + +**Fixed bugs:** + +- fatal error: stride size must not be zero [\#981](https://github.com/danielgindi/Charts/issues/981) +- highestVisibleXIndex is smaller than lowestVisibleXIndex [\#940](https://github.com/danielgindi/Charts/issues/940) +- Crash on zoom [\#931](https://github.com/danielgindi/Charts/issues/931) +- ChartLegend yEntrySpace not work [\#886](https://github.com/danielgindi/Charts/issues/886) +- Selection on bubble chart [\#654](https://github.com/danielgindi/Charts/issues/654) +- Cubic Line goes too much over the top or below bottom. Needs flattening. [\#407](https://github.com/danielgindi/Charts/issues/407) + +**Closed issues:** + +- Podspec prepare command fails on `pod install` [\#1080](https://github.com/danielgindi/Charts/issues/1080) +- Why not the same as Android and IOS parameters? RendererBase.calcXBounds\(\) [\#1077](https://github.com/danielgindi/Charts/issues/1077) +- Why not the same parameters ?RendererBase.calcXBounds\(\) [\#1076](https://github.com/danielgindi/Charts/issues/1076) +- Crash: fatal error: Can't form Range with end \< start [\#1075](https://github.com/danielgindi/Charts/issues/1075) +- automatically calculated labels with a custom roof \(axisMaxValue only if exceeding it\) [\#1074](https://github.com/danielgindi/Charts/issues/1074) +- Swift Version [\#1073](https://github.com/danielgindi/Charts/issues/1073) +- CodeSign for "Framework" in SDK "iOS 9.3" [\#1072](https://github.com/danielgindi/Charts/issues/1072) +- Changing size of centre section - pie chart [\#1071](https://github.com/danielgindi/Charts/issues/1071) +- PieChartView does not draw chart ! [\#1070](https://github.com/danielgindi/Charts/issues/1070) +- Real-time Charts [\#1069](https://github.com/danielgindi/Charts/issues/1069) +- swift2.2, I have a pieChartView problem [\#1067](https://github.com/danielgindi/Charts/issues/1067) +- carthage compatibility [\#1064](https://github.com/danielgindi/Charts/issues/1064) +- LineChart set a great amount data to LineChartDataSet, cpu increase highly to 97% [\#1063](https://github.com/danielgindi/Charts/issues/1063) +- Realm.io Horizontal combine bar chart - iOS [\#1062](https://github.com/danielgindi/Charts/issues/1062) +- Line chart font size problem [\#1061](https://github.com/danielgindi/Charts/issues/1061) +- BarChart won't sit on bottom of screen for some datasets, Why? How to fix? [\#1059](https://github.com/danielgindi/Charts/issues/1059) +- Very odd line at top of graph [\#1058](https://github.com/danielgindi/Charts/issues/1058) +- After upgrading to Xcode 7.3.1, getting bridging issue [\#1057](https://github.com/danielgindi/Charts/issues/1057) +- How can I remove the gap between the bar [\#1056](https://github.com/danielgindi/Charts/issues/1056) +- Pie Chart label position [\#1055](https://github.com/danielgindi/Charts/issues/1055) +- Cant understand .axisMaxValue [\#1054](https://github.com/danielgindi/Charts/issues/1054) +- Is there a way to get a different background colour for different values of the x axis? [\#1053](https://github.com/danielgindi/Charts/issues/1053) +- Without drawLimitLinesBehindDataEnabled, limit lines go outside chart area [\#1052](https://github.com/danielgindi/Charts/issues/1052) +- The horizontal line that forms the grid of the LineChartView are not the same color [\#1051](https://github.com/danielgindi/Charts/issues/1051) +- Issue with coloring grouped datasets in barchart [\#1050](https://github.com/danielgindi/Charts/issues/1050) +- Issues with y axis values [\#1047](https://github.com/danielgindi/Charts/issues/1047) +- Marker out of view [\#1046](https://github.com/danielgindi/Charts/issues/1046) +- How to draw OHLC chart \( Open high low close \) ? [\#1045](https://github.com/danielgindi/Charts/issues/1045) +- How to achieve this effect [\#1044](https://github.com/danielgindi/Charts/issues/1044) +- Changing the size of the interception \(dots\) font in Line Chart ? [\#1043](https://github.com/danielgindi/Charts/issues/1043) +- Multiple entries of the same item in legend [\#1042](https://github.com/danielgindi/Charts/issues/1042) +- How to draw this bar Chart [\#1039](https://github.com/danielgindi/Charts/issues/1039) +- Right axis display decimals [\#1036](https://github.com/danielgindi/Charts/issues/1036) +- Crash on getMarkerPosition [\#1034](https://github.com/danielgindi/Charts/issues/1034) +- Set the bar at the top of the number animation [\#1033](https://github.com/danielgindi/Charts/issues/1033) +- Bar height is calculated wrong [\#1031](https://github.com/danielgindi/Charts/issues/1031) +- How to draw gridBackground by Dashed Line [\#1030](https://github.com/danielgindi/Charts/issues/1030) +- setVisibleYRangeMaximum puts line data off screen [\#1029](https://github.com/danielgindi/Charts/issues/1029) +- How to set max value of xAxis is last object of xVals [\#1028](https://github.com/danielgindi/Charts/issues/1028) +- Can't set text of Legend? [\#1027](https://github.com/danielgindi/Charts/issues/1027) +- conflict between auto scale and axis.axisMin/MaxValue [\#1026](https://github.com/danielgindi/Charts/issues/1026) +- Extend beyond values \(feature request\) [\#1025](https://github.com/danielgindi/Charts/issues/1025) +- Error: "Assignment to readonly property" when updating charts data [\#1024](https://github.com/danielgindi/Charts/issues/1024) +- Scrolling in a scroll view is blocked if the chart in the scroll view is not fully zoomed out. [\#1023](https://github.com/danielgindi/Charts/issues/1023) +- Print statements \(Logs\) [\#1021](https://github.com/danielgindi/Charts/issues/1021) +- How to get to the origin of the chartView.marker? [\#1020](https://github.com/danielgindi/Charts/issues/1020) +- Target Line for Bar Chart [\#1019](https://github.com/danielgindi/Charts/issues/1019) +- Different code between github and pod [\#1018](https://github.com/danielgindi/Charts/issues/1018) +- BarChart Can‘t display Markers [\#1017](https://github.com/danielgindi/Charts/issues/1017) +- Can't buliding in XCode7.1 [\#1016](https://github.com/danielgindi/Charts/issues/1016) +- Show Bar Borders in Combined Chart Demo Crash [\#1014](https://github.com/danielgindi/Charts/issues/1014) +- ChartDataEntry can't initialize with float value [\#1013](https://github.com/danielgindi/Charts/issues/1013) +- Override with Wrong Argument Label? [\#1009](https://github.com/danielgindi/Charts/issues/1009) +- On Y Axis "0" may be displayed as "-0" [\#1008](https://github.com/danielgindi/Charts/issues/1008) +- Change x-axis in bubble chart [\#1007](https://github.com/danielgindi/Charts/issues/1007) +- Change the width of chart [\#1005](https://github.com/danielgindi/Charts/issues/1005) +- OC project BalloonMarker.swift error [\#1004](https://github.com/danielgindi/Charts/issues/1004) +- How to let the Y axis shows is not only a number, but the custom string [\#1003](https://github.com/danielgindi/Charts/issues/1003) +- ask questions about CombinedChartViewController.h [\#1001](https://github.com/danielgindi/Charts/issues/1001) +- Crash when debug build, works on release build [\#999](https://github.com/danielgindi/Charts/issues/999) +- Demo crashed when running on phone\( iOS 9.0\),but can run on iPhone \(iOS 7.0\) [\#998](https://github.com/danielgindi/Charts/issues/998) +- Emergency Problem [\#996](https://github.com/danielgindi/Charts/issues/996) +- Radar Chart- Setting the maximum Y-Axis value. [\#994](https://github.com/danielgindi/Charts/issues/994) +- Y-Axis labels zooming issue [\#991](https://github.com/danielgindi/Charts/issues/991) +- XY Bubble Chart [\#990](https://github.com/danielgindi/Charts/issues/990) +- Adding text labels to Y- Axis? [\#988](https://github.com/danielgindi/Charts/issues/988) +- Build Failed: expression in list of expression [\#987](https://github.com/danielgindi/Charts/issues/987) +- autoScaleMinMaxEnabled does not work with Candle Charts [\#986](https://github.com/danielgindi/Charts/issues/986) +- gesture conflict when lineChartView in tableView [\#984](https://github.com/danielgindi/Charts/issues/984) +- Conflicting other pod depencies [\#983](https://github.com/danielgindi/Charts/issues/983) +- NaN makes highestVisibleXIndex crash [\#980](https://github.com/danielgindi/Charts/issues/980) +- Draw Horiztontal Line on Bar Chart [\#976](https://github.com/danielgindi/Charts/issues/976) +- Show empty Chart when there are no data [\#975](https://github.com/danielgindi/Charts/issues/975) +- Unexpected problem with Import Charts [\#973](https://github.com/danielgindi/Charts/issues/973) +- In which file can I edit the yaxis maximum??? [\#971](https://github.com/danielgindi/Charts/issues/971) +- Help with customizing [\#970](https://github.com/danielgindi/Charts/issues/970) +- Where and how can I set a y axis custom max value? [\#968](https://github.com/danielgindi/Charts/issues/968) +- The horizontal bar graph data values are exceeding the graph space. [\#967](https://github.com/danielgindi/Charts/issues/967) +- Where can I add data to my bar chart? [\#966](https://github.com/danielgindi/Charts/issues/966) +- Getting Error cannot load underlying module XCTest [\#965](https://github.com/danielgindi/Charts/issues/965) +- Don't show the horizontal line [\#964](https://github.com/danielgindi/Charts/issues/964) +- Where do I use the import line? [\#963](https://github.com/danielgindi/Charts/issues/963) +- changing bottom 'key' label? [\#962](https://github.com/danielgindi/Charts/issues/962) +- move "{" to the right side of last line [\#961](https://github.com/danielgindi/Charts/issues/961) +- Overriding Highlight [\#960](https://github.com/danielgindi/Charts/issues/960) +- hide values under 10% [\#959](https://github.com/danielgindi/Charts/issues/959) +- x axis label gets cut [\#958](https://github.com/danielgindi/Charts/issues/958) +- enlarge the spacing between the x axis labels to the y axis labels [\#957](https://github.com/danielgindi/Charts/issues/957) +- Cubic line chart is not full bleed [\#956](https://github.com/danielgindi/Charts/issues/956) +- Several properties work in emulator but don't \(or crash\) on iPhone [\#955](https://github.com/danielgindi/Charts/issues/955) +- Cannot pass in struct to ChartDataEntry [\#954](https://github.com/danielgindi/Charts/issues/954) +- A "divide by 0" bug [\#952](https://github.com/danielgindi/Charts/issues/952) +- Line Chart Dynamic Updating [\#951](https://github.com/danielgindi/Charts/issues/951) +- Updating version alters bar chart layout [\#950](https://github.com/danielgindi/Charts/issues/950) +- Bar chart floating y position [\#947](https://github.com/danielgindi/Charts/issues/947) +- setVisibleXRangeMinimum cause crash [\#946](https://github.com/danielgindi/Charts/issues/946) +- Carthage [\#942](https://github.com/danielgindi/Charts/issues/942) +- How to draw 2 lineCharts in a combinedChart? [\#939](https://github.com/danielgindi/Charts/issues/939) +- highlight last data in bar chart [\#938](https://github.com/danielgindi/Charts/issues/938) +- 我想用charts显示的数据为'int'类型 [\#936](https://github.com/danielgindi/Charts/issues/936) +- Don't see updates in PieChartDataSet from 2.2.4 [\#933](https://github.com/danielgindi/Charts/issues/933) +- Bubbles size of bubble chart [\#930](https://github.com/danielgindi/Charts/issues/930) +- Binding for Xamarin [\#929](https://github.com/danielgindi/Charts/issues/929) +- Line chart with 2 colours [\#928](https://github.com/danielgindi/Charts/issues/928) +- Disable top/bottom YAxis line drawing [\#927](https://github.com/danielgindi/Charts/issues/927) +- Coloring by bars and not by stacks in a StackBar chart [\#925](https://github.com/danielgindi/Charts/issues/925) +- How to set the scaling for the left/right axis. [\#924](https://github.com/danielgindi/Charts/issues/924) +- Use of undeclared 'CGFloat' [\#923](https://github.com/danielgindi/Charts/issues/923) +- Diffrent X-axis label color [\#921](https://github.com/danielgindi/Charts/issues/921) +- Vertical bar chart: capture of scrollView delegate callbacks and load additional data [\#920](https://github.com/danielgindi/Charts/issues/920) +- groupspace doesn't work [\#919](https://github.com/danielgindi/Charts/issues/919) +- Could the label of the LineChartDataSet be hidden [\#918](https://github.com/danielgindi/Charts/issues/918) +- if use pod Charts/Realm ,than @import Charts: could not build module "Charts" [\#917](https://github.com/danielgindi/Charts/issues/917) +- @import Charts: could not build module "Charts" [\#916](https://github.com/danielgindi/Charts/issues/916) +- LineChard with different color for filling [\#915](https://github.com/danielgindi/Charts/issues/915) +- start animation at minimum visible y-Position [\#914](https://github.com/danielgindi/Charts/issues/914) +- Line chart yAxis data interval [\#912](https://github.com/danielgindi/Charts/issues/912) +- Unable to display empty bars in barcharts [\#911](https://github.com/danielgindi/Charts/issues/911) +- Bar chart y axis interval digits [\#910](https://github.com/danielgindi/Charts/issues/910) +- How to use any chart in My App. [\#909](https://github.com/danielgindi/Charts/issues/909) +- Specifiy axisMinimum and axisMaximum range [\#908](https://github.com/danielgindi/Charts/issues/908) +- Symbol not Found on Xcode 7.3 [\#907](https://github.com/danielgindi/Charts/issues/907) +- noDataTextDescription not display [\#906](https://github.com/danielgindi/Charts/issues/906) +- Bar chart starting point non zero [\#905](https://github.com/danielgindi/Charts/issues/905) +- Do pod install with cocoapods [\#904](https://github.com/danielgindi/Charts/issues/904) +- Feature request :\) blur shadow for line chart [\#903](https://github.com/danielgindi/Charts/issues/903) +- Add Lines between labels [\#902](https://github.com/danielgindi/Charts/issues/902) +- Real number x axis line for BarChartView [\#901](https://github.com/danielgindi/Charts/issues/901) +- Piechart with vertical legend [\#840](https://github.com/danielgindi/Charts/issues/840) +- ChartEasingOption causes entire background to be filled with color [\#826](https://github.com/danielgindi/Charts/issues/826) +- Could not cast value of type 'Charts.BarChartData' \(0x10bbd31f0\) to 'MYPROJ.BarChartData' \(0x10aeed700\). [\#825](https://github.com/danielgindi/Charts/issues/825) +- BarChartView: Rectangle with borders and without filling color [\#822](https://github.com/danielgindi/Charts/issues/822) +- Is there any possibility for grouping x axis values in line chart? [\#798](https://github.com/danielgindi/Charts/issues/798) +- Being OSX too, should we rename repo to just `Charts`? [\#787](https://github.com/danielgindi/Charts/issues/787) +- Missing a piece of data to the left [\#785](https://github.com/danielgindi/Charts/issues/785) +- How to remove these white/gray lines [\#758](https://github.com/danielgindi/Charts/issues/758) +- If data is not set \(e.g. public var noDataText = "No chart data available."\) [\#756](https://github.com/danielgindi/Charts/issues/756) +- ChartEasingOption properties \(animate\) [\#726](https://github.com/danielgindi/Charts/issues/726) +- Moving pie chart location \(legend overlaps chart\) [\#707](https://github.com/danielgindi/Charts/issues/707) +- CombinedChartView bubbleData size not working [\#692](https://github.com/danielgindi/Charts/issues/692) +- Stop axis labels duplicating. [\#315](https://github.com/danielgindi/Charts/issues/315) +- Can we show Pie chart Value out of slice instead showing inside the slice ? [\#90](https://github.com/danielgindi/Charts/issues/90) +- Double tap to zoom into the chart should center to Point that was tapped [\#83](https://github.com/danielgindi/Charts/issues/83) + +**Merged pull requests:** + +- Revert "Simple changes to allow OS X 10.10 support" [\#1088](https://github.com/danielgindi/Charts/pull/1088) ([danielgindi](https://github.com/danielgindi)) +- Simple changes to allow OS X 10.10 support [\#1087](https://github.com/danielgindi/Charts/pull/1087) ([einsteinx2](https://github.com/einsteinx2)) +- Fix \#1014: fix combined chart crash while toggle bar borders [\#1015](https://github.com/danielgindi/Charts/pull/1015) ([liuxuan30](https://github.com/liuxuan30)) +- Highlight enhancements \(Closes \#654, closes \#702\) [\#1012](https://github.com/danielgindi/Charts/pull/1012) ([danielgindi](https://github.com/danielgindi)) +- Fix typo [\#949](https://github.com/danielgindi/Charts/pull/949) ([emiranda04](https://github.com/emiranda04)) +- fix \#940. another loop bounds crash [\#941](https://github.com/danielgindi/Charts/pull/941) ([liuxuan30](https://github.com/liuxuan30)) +- Fix a crash when using markers with a PieChart [\#937](https://github.com/danielgindi/Charts/pull/937) ([rofreg](https://github.com/rofreg)) +- Horizontal cubic line [\#935](https://github.com/danielgindi/Charts/pull/935) ([danielgindi](https://github.com/danielgindi)) +- Property circleHoleRadius added to ILineChartDataSet protocol. [\#934](https://github.com/danielgindi/Charts/pull/934) ([olbartek](https://github.com/olbartek)) +- replace old github link to latest https://github.com/danielgindi/Charts [\#932](https://github.com/danielgindi/Charts/pull/932) ([liuxuan30](https://github.com/liuxuan30)) +- Some minor nits [\#913](https://github.com/danielgindi/Charts/pull/913) ([ruurd](https://github.com/ruurd)) +- add a switch whether to draw limit line's labels. default is true [\#887](https://github.com/danielgindi/Charts/pull/887) ([liuxuan30](https://github.com/liuxuan30)) + +## [v2.2.4](https://github.com/danielgindi/Charts/tree/v2.2.4) (2016-03-31) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v2.2.3...v2.2.4) + +**Fixed bugs:** + +- Cubic line goes over the last point [\#683](https://github.com/danielgindi/Charts/issues/683) +- drawCubicEnabled on LineChartView is missing points when Y Values are missing [\#157](https://github.com/danielgindi/Charts/issues/157) + +**Closed issues:** + +- can not run ChartsDemo. [\#900](https://github.com/danielgindi/Charts/issues/900) +- Barchart xAxis always displaying [\#899](https://github.com/danielgindi/Charts/issues/899) +- Multiple 'Charts.framework'. Build fails due to dependencies. [\#897](https://github.com/danielgindi/Charts/issues/897) +- Custom X Axis for BarChartView [\#896](https://github.com/danielgindi/Charts/issues/896) +- UISwipeGestureRecognizer for BarChartView [\#895](https://github.com/danielgindi/Charts/issues/895) +- The view hierarchy is not prepared for the constraint [\#893](https://github.com/danielgindi/Charts/issues/893) +- Could not find `Charts.framework` in the "Embedded Binaries" [\#891](https://github.com/danielgindi/Charts/issues/891) +- Barchart with diffrent width bar [\#890](https://github.com/danielgindi/Charts/issues/890) +- Weird numbers on BarChart [\#889](https://github.com/danielgindi/Charts/issues/889) +- Two line in X-Axis [\#888](https://github.com/danielgindi/Charts/issues/888) +- Set the leftAxis label color differently [\#885](https://github.com/danielgindi/Charts/issues/885) +- Could leftAxis and rightAxis's border be hidden? [\#884](https://github.com/danielgindi/Charts/issues/884) +- The barchart data not filled the whole container [\#883](https://github.com/danielgindi/Charts/issues/883) +- Barchart positive negtive label and xAxis overlapping [\#882](https://github.com/danielgindi/Charts/issues/882) +- How to remove the edge's border of time line chart filled shaped [\#881](https://github.com/danielgindi/Charts/issues/881) +- Master branch is not compiling [\#879](https://github.com/danielgindi/Charts/issues/879) +- App Submission - API analysis file too large [\#878](https://github.com/danielgindi/Charts/issues/878) +- Swift 2.2 [\#877](https://github.com/danielgindi/Charts/issues/877) +- avoidFirstLastClippingEnabled Still be clipped in CombinedChartView [\#876](https://github.com/danielgindi/Charts/issues/876) +- How to make the ChartXAxis has an offset between the zero point [\#875](https://github.com/danielgindi/Charts/issues/875) +- Carthage & Xcode 7.3 Pre-Built Binaries Error [\#874](https://github.com/danielgindi/Charts/issues/874) +- Scrolling glitch [\#873](https://github.com/danielgindi/Charts/issues/873) +- Request for enhancement: combined chart\(BarChart \(grouped DataSets\) and linechart\) [\#871](https://github.com/danielgindi/Charts/issues/871) +- CandleStickChartView.shadowColor [\#870](https://github.com/danielgindi/Charts/issues/870) +- Marker behind line limit [\#867](https://github.com/danielgindi/Charts/issues/867) +- Horizontal Chart Issue [\#866](https://github.com/danielgindi/Charts/issues/866) +- How to move data points with finger drag at run time. [\#865](https://github.com/danielgindi/Charts/issues/865) +- Chart customAxisMax and customAxisMin doesn't update correctly [\#864](https://github.com/danielgindi/Charts/issues/864) +- auto scale min/max option doesn't seem to change anything [\#863](https://github.com/danielgindi/Charts/issues/863) +- Confused as to how to install using CocoaPods [\#862](https://github.com/danielgindi/Charts/issues/862) +- Different spacing between same width bars in BarChartView [\#860](https://github.com/danielgindi/Charts/issues/860) +- Get color of the specify data? [\#859](https://github.com/danielgindi/Charts/issues/859) +- DrawCubicEnabled line starts from wrong position [\#855](https://github.com/danielgindi/Charts/issues/855) +- How to prevent xAxis values and dataset value get overlapped ? [\#854](https://github.com/danielgindi/Charts/issues/854) +- Program crash [\#853](https://github.com/danielgindi/Charts/issues/853) +- Zoomin Graphview [\#852](https://github.com/danielgindi/Charts/issues/852) +- Make ChartXAxisRenderer calculate labelsWidth based on string output by custom ChartXAxisValueFormatter [\#851](https://github.com/danielgindi/Charts/issues/851) +- Zooming an already zoomed view [\#850](https://github.com/danielgindi/Charts/issues/850) +- BarChart adds double x axis [\#849](https://github.com/danielgindi/Charts/issues/849) +- Remove text above dot in iOS Charts [\#848](https://github.com/danielgindi/Charts/issues/848) +- how to start graph from \(0,0\) points instead of 60 on y-Axis? [\#846](https://github.com/danielgindi/Charts/issues/846) +- Change dataSet axis dependency [\#845](https://github.com/danielgindi/Charts/issues/845) +- integrate native chart display incorrectly [\#842](https://github.com/danielgindi/Charts/issues/842) +- How can I draw bubble charts in swift project. [\#841](https://github.com/danielgindi/Charts/issues/841) +- Making HorizontalBarChartView scrolling vertically [\#839](https://github.com/danielgindi/Charts/issues/839) +- custom BallonMaker text [\#838](https://github.com/danielgindi/Charts/issues/838) +- Horizontal zoom in line chart [\#837](https://github.com/danielgindi/Charts/issues/837) +- ScatterChart - Is it possible to create a background color like this? [\#835](https://github.com/danielgindi/Charts/issues/835) +- How to create Stacked Bar Chart and Grouped Bar Chart [\#834](https://github.com/danielgindi/Charts/issues/834) +- fatal error: unexpectedly found nil while unwrapping an Optional value error when I set barChartView.noDataText [\#833](https://github.com/danielgindi/Charts/issues/833) +- Can I change fonts of labels on x And y axis in a bar graph. [\#832](https://github.com/danielgindi/Charts/issues/832) +- LineChartView avoid painting 0 values [\#830](https://github.com/danielgindi/Charts/issues/830) +- \[Feature\] Double-tap Gesture [\#829](https://github.com/danielgindi/Charts/issues/829) +- How to draw a rectangle,or how to get the last point's CGPoint? [\#827](https://github.com/danielgindi/Charts/issues/827) +- Changing width of the bar in bar chart [\#820](https://github.com/danielgindi/Charts/issues/820) +- The return value is a problem with the calculateMinimumRadiusForSpacedSlice method [\#819](https://github.com/danielgindi/Charts/issues/819) +- import Charts: Error No Such Module Charts? [\#818](https://github.com/danielgindi/Charts/issues/818) +- Can we define minor and major grid lines 
with specification like \(line color, line thickness, on/off \)? [\#817](https://github.com/danielgindi/Charts/issues/817) +- LineChart Delegate for line values [\#816](https://github.com/danielgindi/Charts/issues/816) +- Linechart X Labels overlap feature [\#813](https://github.com/danielgindi/Charts/issues/813) +- Can we support 2 more than y scales/ multiple Y axis ? [\#812](https://github.com/danielgindi/Charts/issues/812) +- Codesign error to physical device on latest [\#810](https://github.com/danielgindi/Charts/issues/810) +- Programatically scroll to end of line chart [\#809](https://github.com/danielgindi/Charts/issues/809) +- BalloonMarker - display X data [\#808](https://github.com/danielgindi/Charts/issues/808) +- multiple datasets with different x-values in chart [\#807](https://github.com/danielgindi/Charts/issues/807) +- Will ios-charts supoprt non-uniform data [\#806](https://github.com/danielgindi/Charts/issues/806) +- Not able to build for iPhone 6 [\#805](https://github.com/danielgindi/Charts/issues/805) +- Gap issues on latest version [\#804](https://github.com/danielgindi/Charts/issues/804) +- Error in 'ChartPlatform.swift' while compiling : Expected \#else or \#endif at the end of configuration block [\#803](https://github.com/danielgindi/Charts/issues/803) +- In iOS-Chart how to hide the x and y axis and all the grid lines. [\#801](https://github.com/danielgindi/Charts/issues/801) +- Create Chart from data in Firebase db [\#800](https://github.com/danielgindi/Charts/issues/800) +- How to make the chart and the other chart with the same translation [\#799](https://github.com/danielgindi/Charts/issues/799) +- Color of crosshairs? [\#796](https://github.com/danielgindi/Charts/issues/796) +- How to make horizontal dotted line to solid line same as vertical line. [\#793](https://github.com/danielgindi/Charts/issues/793) +- ios 8.1 fatal error:value failed to bridge from Swift type to a Objective-C type [\#792](https://github.com/danielgindi/Charts/issues/792) +- xAxis end label is cutting down in Line chart [\#791](https://github.com/danielgindi/Charts/issues/791) +- Is there a way to have multi line labels in x axis. [\#790](https://github.com/danielgindi/Charts/issues/790) +- help! [\#788](https://github.com/danielgindi/Charts/issues/788) +- Positioning on changing of the screen orientation [\#786](https://github.com/danielgindi/Charts/issues/786) +- Scatter chart data set color not working [\#784](https://github.com/danielgindi/Charts/issues/784) +- fatal error: value failed to bridge from Swift type to a Objective-C type [\#783](https://github.com/danielgindi/Charts/issues/783) +- Error on RadarChart \(drawFilledEnabled set to true\) [\#760](https://github.com/danielgindi/Charts/issues/760) +- Can't set x axis offset [\#677](https://github.com/danielgindi/Charts/issues/677) +- Right Y-Axis values displaying incorrectly in LineChartDemo [\#665](https://github.com/danielgindi/Charts/issues/665) +- Y - Axis Values stick together [\#608](https://github.com/danielgindi/Charts/issues/608) +- Charts over scrollview not scrolling in iPad only [\#550](https://github.com/danielgindi/Charts/issues/550) +- Stepped line charts [\#539](https://github.com/danielgindi/Charts/issues/539) +- Line chart circle positions [\#535](https://github.com/danielgindi/Charts/issues/535) +- Y-Axis values "stick together" occasionally [\#469](https://github.com/danielgindi/Charts/issues/469) +- Feature : initial display of the graph [\#468](https://github.com/danielgindi/Charts/issues/468) +- Candle Stick not filled make the stick and the gridline show within the candle [\#444](https://github.com/danielgindi/Charts/issues/444) +- Unit tests? ;\) [\#414](https://github.com/danielgindi/Charts/issues/414) +- How to draw a line only for the 5th value of dataset along x axis? [\#409](https://github.com/danielgindi/Charts/issues/409) +- Data Showing 0 and 1 only in y-axis if array contains only 0.0 double values. [\#338](https://github.com/danielgindi/Charts/issues/338) +- Extending lines between data points when zoomed and panning [\#330](https://github.com/danielgindi/Charts/issues/330) +- lowestVisibleXIndex never gets zero after zooming out [\#294](https://github.com/danielgindi/Charts/issues/294) +- on candle graph, when the candle is small then its not showing [\#281](https://github.com/danielgindi/Charts/issues/281) +- Bar Chart \> Range bar [\#100](https://github.com/danielgindi/Charts/issues/100) +- General discussion & news [\#92](https://github.com/danielgindi/Charts/issues/92) +- Core Data interfacing? [\#15](https://github.com/danielgindi/Charts/issues/15) + +**Merged pull requests:** + +- remove duplicated statement [\#894](https://github.com/danielgindi/Charts/pull/894) ([liuxuan30](https://github.com/liuxuan30)) +- Add new pie chart renderer with polyline indicate [\#869](https://github.com/danielgindi/Charts/pull/869) ([wjacker](https://github.com/wjacker)) +- Add a Gitter chat badge to README.md [\#861](https://github.com/danielgindi/Charts/pull/861) ([gitter-badger](https://github.com/gitter-badger)) +- Type bug in PieChartData [\#847](https://github.com/danielgindi/Charts/pull/847) ([leoMehlig](https://github.com/leoMehlig)) +- Supporting borders on bars, Fixes issue \#822 [\#844](https://github.com/danielgindi/Charts/pull/844) ([AndreasIgelCC](https://github.com/AndreasIgelCC)) +- Update Readme [\#828](https://github.com/danielgindi/Charts/pull/828) ([PhilJay](https://github.com/PhilJay)) +- Keep position on rotation [\#824](https://github.com/danielgindi/Charts/pull/824) ([leoMehlig](https://github.com/leoMehlig)) +- Set code signing identity for iOS targets [\#811](https://github.com/danielgindi/Charts/pull/811) ([krbarnes](https://github.com/krbarnes)) +- Add trailing newline for preprocessor statement [\#795](https://github.com/danielgindi/Charts/pull/795) ([boourns](https://github.com/boourns)) + +## [v2.2.3](https://github.com/danielgindi/Charts/tree/v2.2.3) (2016-02-29) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v2.2.2...v2.2.3) + +**Closed issues:** + +- How to create the chartmarker with swift? [\#776](https://github.com/danielgindi/Charts/issues/776) +- CombinedChartView: Wrong positions of bars when using multiple Bar and Graph -Datasets [\#775](https://github.com/danielgindi/Charts/issues/775) +- Getting co-ordinates of all plotted points in LineChartView [\#774](https://github.com/danielgindi/Charts/issues/774) +- Multiline label on xAxis cutting off [\#773](https://github.com/danielgindi/Charts/issues/773) +- Can't set ChartViewBase's data property back to nil to clear out data [\#771](https://github.com/danielgindi/Charts/issues/771) +- How to set position label radar chart. in Swift . [\#770](https://github.com/danielgindi/Charts/issues/770) +- How to control which entries on xAxis be shown? [\#768](https://github.com/danielgindi/Charts/issues/768) +- Tests failing after startAtZero was removed [\#767](https://github.com/danielgindi/Charts/issues/767) +- When a value repeats, bars are not showed [\#766](https://github.com/danielgindi/Charts/issues/766) +- Proposal: shall we unify yAxis.entries and yAxis.axisRange to have same max and min value? [\#763](https://github.com/danielgindi/Charts/issues/763) +- Ability to set linechart with fixed amount of x values shown and pan to other data points [\#762](https://github.com/danielgindi/Charts/issues/762) +- PieChart setMaxAngle [\#757](https://github.com/danielgindi/Charts/issues/757) +- Simply not installing [\#749](https://github.com/danielgindi/Charts/issues/749) +- Line charts have unintended breaks when next or previous point not visible. [\#748](https://github.com/danielgindi/Charts/issues/748) +- Remove border around linechart with gradient fill [\#747](https://github.com/danielgindi/Charts/issues/747) +- Old graphics not removed when adding new data [\#745](https://github.com/danielgindi/Charts/issues/745) +- Display values outside of the piechart [\#743](https://github.com/danielgindi/Charts/issues/743) +- Cubic line charts don't get filled correctly if data doesn't start at index 0 [\#711](https://github.com/danielgindi/Charts/issues/711) +- Center text vertically [\#682](https://github.com/danielgindi/Charts/issues/682) +- Animated moveViewToX\(\) [\#318](https://github.com/danielgindi/Charts/issues/318) +- Any chance of porting this to OSX? [\#43](https://github.com/danielgindi/Charts/issues/43) + +**Merged pull requests:** + +- Add "Toggle Data" option to demo charts. \(\#771 Support\) [\#781](https://github.com/danielgindi/Charts/pull/781) ([ospr](https://github.com/ospr)) +- Add missing UIKit imports for iOS 7 [\#780](https://github.com/danielgindi/Charts/pull/780) ([asmarques](https://github.com/asmarques)) +- Feature \#539 Stepped line charts [\#778](https://github.com/danielgindi/Charts/pull/778) ([ezamagni](https://github.com/ezamagni)) +- Make ChartViewBase's \_data optional. \(Fixes \#771\) [\#772](https://github.com/danielgindi/Charts/pull/772) ([ospr](https://github.com/ospr)) +- Add Carthage compatibility badge [\#769](https://github.com/danielgindi/Charts/pull/769) ([Bogidon](https://github.com/Bogidon)) +- update cocoapods url [\#755](https://github.com/danielgindi/Charts/pull/755) ([stevenedds](https://github.com/stevenedds)) +- add ci status [\#752](https://github.com/danielgindi/Charts/pull/752) ([petester42](https://github.com/petester42)) +- Correct the spelling of CocoaPods in README [\#751](https://github.com/danielgindi/Charts/pull/751) ([ReadmeCritic](https://github.com/ReadmeCritic)) +- LineChartRenderer context bug [\#746](https://github.com/danielgindi/Charts/pull/746) ([leoMehlig](https://github.com/leoMehlig)) +- Fix for cubic line chart fill when charts that don't start at x-index 0 \#711 [\#712](https://github.com/danielgindi/Charts/pull/712) ([gunterhager](https://github.com/gunterhager)) +- add support for lineCap setting for line chart [\#658](https://github.com/danielgindi/Charts/pull/658) ([liuxuan30](https://github.com/liuxuan30)) + +## [v2.2.2](https://github.com/danielgindi/Charts/tree/v2.2.2) (2016-02-09) +[Full Changelog](https://github.com/danielgindi/Charts/compare/2.2.1...v2.2.2) + +**Fixed bugs:** + +- Using BarChartDataSet default initializer causes a crash [\#734](https://github.com/danielgindi/Charts/issues/734) + +**Closed issues:** + +- Display dataSet labels on axis for horizontal bar [\#741](https://github.com/danielgindi/Charts/issues/741) +- Getting x,y values of points in LineChart [\#739](https://github.com/danielgindi/Charts/issues/739) +- Module 'Realm' not found in v2.2.1 [\#735](https://github.com/danielgindi/Charts/issues/735) +- cannot compile ios charts because of Ream environment missing. [\#733](https://github.com/danielgindi/Charts/issues/733) +- Issue in valueFormatter [\#732](https://github.com/danielgindi/Charts/issues/732) +- Multi colors for linechart's circles [\#730](https://github.com/danielgindi/Charts/issues/730) +- LineChartData omits and misaligns values when data isn't continuous [\#728](https://github.com/danielgindi/Charts/issues/728) +- Apache license and correct attribution in an iOS app? [\#678](https://github.com/danielgindi/Charts/issues/678) + +## [2.2.1](https://github.com/danielgindi/Charts/tree/2.2.1) (2016-02-01) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v2.2.1...2.2.1) + +## [v2.2.1](https://github.com/danielgindi/Charts/tree/v2.2.1) (2016-02-01) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v2.2.0...v2.2.1) + +**Fixed bugs:** + +- Can't set hole color to nil for Pie Chart [\#646](https://github.com/danielgindi/Charts/issues/646) + +**Closed issues:** + +- X-Axis at bottom of chart? [\#727](https://github.com/danielgindi/Charts/issues/727) +- 2.2.0 not published yet [\#723](https://github.com/danielgindi/Charts/issues/723) +- Highlight selected line by changing line width or line color [\#721](https://github.com/danielgindi/Charts/issues/721) +- Draw a Line that connects dots in Scatter Chart \(Simulate Line Chart not equidistant\) [\#720](https://github.com/danielgindi/Charts/issues/720) +- drawCubicEnabled performance issues [\#717](https://github.com/danielgindi/Charts/issues/717) +- how to disable zooming of graph on double click? [\#716](https://github.com/danielgindi/Charts/issues/716) +- Convert it to percent bar graph system [\#674](https://github.com/danielgindi/Charts/issues/674) +- Refresh charts view when the data change [\#672](https://github.com/danielgindi/Charts/issues/672) +- The most top label of ChartYAxis doesn't render which seems a bug. [\#647](https://github.com/danielgindi/Charts/issues/647) +- RadarChart animation [\#574](https://github.com/danielgindi/Charts/issues/574) +- Having the area below a line graph be gradient layer instead of background color [\#186](https://github.com/danielgindi/Charts/issues/186) + +**Merged pull requests:** + +- Update podspec for realm and 2.2.0 [\#725](https://github.com/danielgindi/Charts/pull/725) ([petester42](https://github.com/petester42)) + +## [v2.2.0](https://github.com/danielgindi/Charts/tree/v2.2.0) (2016-01-26) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v2.1.6...v2.2.0) + +**Fixed bugs:** + +- ChartDataSet calcYValueSum\(\) bug [\#604](https://github.com/danielgindi/Charts/issues/604) + +**Closed issues:** + +- Realm module not found when using a static library of Realm in my pod project in Objective-C [\#714](https://github.com/danielgindi/Charts/issues/714) +- how to get a custom legend [\#710](https://github.com/danielgindi/Charts/issues/710) +- I can't change the default grey background on the line chart [\#706](https://github.com/danielgindi/Charts/issues/706) +- I couldn't find Charts.xcodeproj [\#705](https://github.com/danielgindi/Charts/issues/705) +- Background Colour Changes [\#701](https://github.com/danielgindi/Charts/issues/701) +- Continuing the last closed \#695 [\#700](https://github.com/danielgindi/Charts/issues/700) +- Realm error [\#699](https://github.com/danielgindi/Charts/issues/699) +- Grid with constant width cells [\#697](https://github.com/danielgindi/Charts/issues/697) +- Pie chart is too small in tableview header view [\#696](https://github.com/danielgindi/Charts/issues/696) +- The delegate method is not getting called [\#695](https://github.com/danielgindi/Charts/issues/695) +- Not compatible with app extensions as a framework [\#693](https://github.com/danielgindi/Charts/issues/693) +- Set label for each column in group bar chart [\#691](https://github.com/danielgindi/Charts/issues/691) +- How to custom XAxis [\#689](https://github.com/danielgindi/Charts/issues/689) +- Need Help to setup this library on application with Objective C\(No auto layout\) with deployment target iOS 7.0 [\#688](https://github.com/danielgindi/Charts/issues/688) +- RadarChartView - Unknown type name [\#687](https://github.com/danielgindi/Charts/issues/687) +- How to make CandleStickChart and BarChart do the same action [\#685](https://github.com/danielgindi/Charts/issues/685) +- Issue with x-axis fixed label width [\#684](https://github.com/danielgindi/Charts/issues/684) +- Can I package the project in a dynamic library \(.framework\)? [\#681](https://github.com/danielgindi/Charts/issues/681) +- Dynamic LineChartView [\#680](https://github.com/danielgindi/Charts/issues/680) +- Horizontal Bar Chart Rounding [\#676](https://github.com/danielgindi/Charts/issues/676) +- Line Chart Highlight Styling [\#671](https://github.com/danielgindi/Charts/issues/671) +- Allow control of circle line width in Line Chart. [\#669](https://github.com/danielgindi/Charts/issues/669) +- Programatically highlight a data point in line chart [\#668](https://github.com/danielgindi/Charts/issues/668) +- Question: X-Axis set range of displayed entries, LineChart [\#667](https://github.com/danielgindi/Charts/issues/667) +- "No such module" error for archive with custom configuration in objc project. [\#664](https://github.com/danielgindi/Charts/issues/664) +- How to run this chart in iOS7? [\#663](https://github.com/danielgindi/Charts/issues/663) +- draw only the maximum and minimum values on the LineChartView [\#662](https://github.com/danielgindi/Charts/issues/662) +- Combine horizontal bar chart and line chart [\#661](https://github.com/danielgindi/Charts/issues/661) +- Can't import charts in Swift [\#659](https://github.com/danielgindi/Charts/issues/659) +- Realtime data [\#657](https://github.com/danielgindi/Charts/issues/657) +- xcode7.2 iOS 9 crash [\#656](https://github.com/danielgindi/Charts/issues/656) +- draw line chart with Gradient background [\#653](https://github.com/danielgindi/Charts/issues/653) +- Draw Straight Line on Line Chart with 2 fingers and show the Gradient of it [\#652](https://github.com/danielgindi/Charts/issues/652) +- Add To existing project and that too for iOS 7 [\#650](https://github.com/danielgindi/Charts/issues/650) +- xcode 7.1 error at xctest [\#644](https://github.com/danielgindi/Charts/issues/644) +- How to work out this in objective c [\#642](https://github.com/danielgindi/Charts/issues/642) +- 【StackedBarChartView】How to handle 0? [\#637](https://github.com/danielgindi/Charts/issues/637) +- Not able to archive build : Command failed due to signal: Segmentation fault: 11 [\#634](https://github.com/danielgindi/Charts/issues/634) +- Xcode7.1.1 contains error [\#633](https://github.com/danielgindi/Charts/issues/633) +- ChartDataSet's entryCount computed property raises a signal when \_yVals is nil [\#631](https://github.com/danielgindi/Charts/issues/631) +- Not able to set custom class as a BarChartViewController in objective c [\#628](https://github.com/danielgindi/Charts/issues/628) +- I want to know the project name - swift. h class of how to generate [\#627](https://github.com/danielgindi/Charts/issues/627) +- LineChart xAxis can't match the point [\#626](https://github.com/danielgindi/Charts/issues/626) +- set width of highlight in pie [\#625](https://github.com/danielgindi/Charts/issues/625) +- what's wrong with:\_OBJC\_CLASS\_$\_\_TtC6Charts13LineChartView [\#623](https://github.com/danielgindi/Charts/issues/623) +- How to draw a LineChartDataSet skipping certain data points [\#622](https://github.com/danielgindi/Charts/issues/622) +- Show % Percentage value with Legend data [\#621](https://github.com/danielgindi/Charts/issues/621) +- \[Enhancement\] avoidFirstLastClipping should keep the labels centered [\#619](https://github.com/danielgindi/Charts/issues/619) +- yAxis label shows only when i touch the view [\#618](https://github.com/danielgindi/Charts/issues/618) +- Legend colors not correct [\#617](https://github.com/danielgindi/Charts/issues/617) +- \[suggestion\] Warning when wrong ChartDataSet is used for view [\#616](https://github.com/danielgindi/Charts/issues/616) +- How to make the chart and the other chart with the same action [\#615](https://github.com/danielgindi/Charts/issues/615) +- touchesEnded event in BarChartView not called [\#613](https://github.com/danielgindi/Charts/issues/613) +- I put the deployment of XCODE target to 8.0 is an error, but change to 8.3 won't go wrong, what's the matter? [\#612](https://github.com/danielgindi/Charts/issues/612) +- why drawValues has some condition which uses break, some uses continue? [\#611](https://github.com/danielgindi/Charts/issues/611) +- Real Time Data and Moving X happens automatically ? [\#610](https://github.com/danielgindi/Charts/issues/610) +- A way to add data to chart data entries in real time ? [\#609](https://github.com/danielgindi/Charts/issues/609) +- Min and max number of horizontal lines [\#603](https://github.com/danielgindi/Charts/issues/603) +- Pie Chart only one Legend data is visible [\#602](https://github.com/danielgindi/Charts/issues/602) +- Myproject-swift.h has not founded in my project why?? [\#599](https://github.com/danielgindi/Charts/issues/599) +- Charts pulled from cocoapods is still of version 2.1.3 and it has compile errors against Swift 2.0 [\#598](https://github.com/danielgindi/Charts/issues/598) +- Fetch Stack Label at the click of the stack bar in the bar chart [\#596](https://github.com/danielgindi/Charts/issues/596) +- Cannot load underlying module for 'XCTest' when i am using charts in xcode7.1 [\#595](https://github.com/danielgindi/Charts/issues/595) +- setLabelsToSkip does not seem to function properly [\#594](https://github.com/danielgindi/Charts/issues/594) +- Work around for scalable xaxis for line chart [\#593](https://github.com/danielgindi/Charts/issues/593) +- unknown class Issue [\#592](https://github.com/danielgindi/Charts/issues/592) +- Selective fill colors on LineChartView [\#591](https://github.com/danielgindi/Charts/issues/591) +- how to set the YAxis or XAxis for custom value [\#590](https://github.com/danielgindi/Charts/issues/590) +- Finger drawing \(draw values into the chart with touch-gesture\) implemented? [\#589](https://github.com/danielgindi/Charts/issues/589) +- how to limit the YAxis Label's width? [\#588](https://github.com/danielgindi/Charts/issues/588) +- how to combine chart as follows [\#587](https://github.com/danielgindi/Charts/issues/587) +- no data available [\#585](https://github.com/danielgindi/Charts/issues/585) +- Is there a way to add arrows to highlight line? [\#584](https://github.com/danielgindi/Charts/issues/584) +- Getting question \(?\) mark while importing the library. How to get it resolved [\#583](https://github.com/danielgindi/Charts/issues/583) +- Mixed Font Style for Line Chart of X-Axis [\#581](https://github.com/danielgindi/Charts/issues/581) +- How to remove background gridlines from Bar Chart [\#579](https://github.com/danielgindi/Charts/issues/579) +- Question: Gesture Detection [\#578](https://github.com/danielgindi/Charts/issues/578) +- Crash originating in ChartViewPortHandler [\#576](https://github.com/danielgindi/Charts/issues/576) +- Add gaps in LineChart [\#572](https://github.com/danielgindi/Charts/issues/572) +- Cannot call getBarBounds from objective-c [\#570](https://github.com/danielgindi/Charts/issues/570) +- issue with Bar width [\#569](https://github.com/danielgindi/Charts/issues/569) +- UIPanGesture blocked while zoomed out completely [\#566](https://github.com/danielgindi/Charts/issues/566) +- Using Charts library for real-time plotting [\#565](https://github.com/danielgindi/Charts/issues/565) +- iOS-Charts not working on Jenkins [\#564](https://github.com/danielgindi/Charts/issues/564) +- Swift 2 \(Xcode 7\) Bad address on accessing chart view [\#563](https://github.com/danielgindi/Charts/issues/563) +- Custom offsets [\#562](https://github.com/danielgindi/Charts/issues/562) +- iOS 7 && Xcode 7.1.1 build not success, 'Charts' Module no found [\#560](https://github.com/danielgindi/Charts/issues/560) +- ChartYAxisValueFormatter in iOS [\#559](https://github.com/danielgindi/Charts/issues/559) +- can i add this? [\#557](https://github.com/danielgindi/Charts/issues/557) +- Problem uploading the archive. [\#556](https://github.com/danielgindi/Charts/issues/556) +- A strange issue when the APP second launch in debug mode [\#554](https://github.com/danielgindi/Charts/issues/554) +- Auto-adjusting graph scale on moving [\#553](https://github.com/danielgindi/Charts/issues/553) +- Bar Chart view group in Swift [\#551](https://github.com/danielgindi/Charts/issues/551) +- how to change the bar width [\#549](https://github.com/danielgindi/Charts/issues/549) +- Calculating space \(in px\) between two points [\#548](https://github.com/danielgindi/Charts/issues/548) +- CocoaPods can only install Charts with Version `2.1.3` [\#547](https://github.com/danielgindi/Charts/issues/547) +- App didn't started with Charts [\#546](https://github.com/danielgindi/Charts/issues/546) +- Setting custom values on top of bar chart [\#545](https://github.com/danielgindi/Charts/issues/545) +- Issues submitting app to Apple store [\#544](https://github.com/danielgindi/Charts/issues/544) +- Guidance on scrollable/pannable charts [\#543](https://github.com/danielgindi/Charts/issues/543) +- Line chart in tableview cell [\#542](https://github.com/danielgindi/Charts/issues/542) +- center lineChart value label to circle [\#541](https://github.com/danielgindi/Charts/issues/541) +- Use LineChartView create chartview will not slide, [\#540](https://github.com/danielgindi/Charts/issues/540) +- Getting some interesting errors when trying to upload our project to ITC with the latest ios-charts. [\#538](https://github.com/danielgindi/Charts/issues/538) +- Running demo direct error, this is how it happened [\#536](https://github.com/danielgindi/Charts/issues/536) +- StackLabels [\#534](https://github.com/danielgindi/Charts/issues/534) +- Legend at bottom of graph show on more than one line. [\#532](https://github.com/danielgindi/Charts/issues/532) +- Do we have any static library for ios-charts? [\#531](https://github.com/danielgindi/Charts/issues/531) +- Highlight a label in xAxis [\#530](https://github.com/danielgindi/Charts/issues/530) +- BalloonMarker shows float number with many digits after '.' [\#529](https://github.com/danielgindi/Charts/issues/529) +- Get the visible max and min yAxis values [\#528](https://github.com/danielgindi/Charts/issues/528) +- Scale and displacement by code [\#527](https://github.com/danielgindi/Charts/issues/527) +- My own app is crashed and got error is fatal error: value failed to bridge from Swift type to a Objective-C type [\#525](https://github.com/danielgindi/Charts/issues/525) +- if I want to set the RadarLabel like this! [\#524](https://github.com/danielgindi/Charts/issues/524) +- Pie Chart Legends Missing with the dynamically filled data. [\#518](https://github.com/danielgindi/Charts/issues/518) +- Resize chart due to data update [\#517](https://github.com/danielgindi/Charts/issues/517) +- How to detect end of chart event? [\#508](https://github.com/danielgindi/Charts/issues/508) +- Cannot distribute inhouse build with ios-charts library embedded to my project [\#486](https://github.com/danielgindi/Charts/issues/486) +- Excessive Printing to Console [\#417](https://github.com/danielgindi/Charts/issues/417) +- Module is not extensible [\#357](https://github.com/danielgindi/Charts/issues/357) + +**Merged pull requests:** + +- Activate require app extension safe API to be able to use library inside an app extension [\#708](https://github.com/danielgindi/Charts/pull/708) ([adonaire-sage](https://github.com/adonaire-sage)) +- fix code indent problem in ChartYAxisRendererRadarChart, ChartYAxisRenderer, BarChartDataSet, RadarChartView [\#675](https://github.com/danielgindi/Charts/pull/675) ([liuxuan30](https://github.com/liuxuan30)) +- add an option to set line cap of axis grid line [\#660](https://github.com/danielgindi/Charts/pull/660) ([mconintet](https://github.com/mconintet)) +- Fix minor typo in BarLineChartViewBase [\#651](https://github.com/danielgindi/Charts/pull/651) ([patrickreynolds](https://github.com/patrickreynolds)) +- Stop axis labels duplicating. \#315 \[Pending squash and cleanup\] [\#648](https://github.com/danielgindi/Charts/pull/648) ([noais](https://github.com/noais)) +- Adapted ChartLegendRenderer class to upcoming Swift 3 changes and improved code readability [\#643](https://github.com/danielgindi/Charts/pull/643) ([zntfdr](https://github.com/zntfdr)) +- Remove verbose semicolons [\#639](https://github.com/danielgindi/Charts/pull/639) ([AntiMoron](https://github.com/AntiMoron)) +- Adds CI [\#636](https://github.com/danielgindi/Charts/pull/636) ([petester42](https://github.com/petester42)) +- Add missing images for bar chart tests [\#635](https://github.com/danielgindi/Charts/pull/635) ([petester42](https://github.com/petester42)) +- Use nil coalescing in ChartDataSet's entryCount \(Fixes \#631\) [\#632](https://github.com/danielgindi/Charts/pull/632) ([aarondaub](https://github.com/aarondaub)) +- add highlight circle for radar chart [\#630](https://github.com/danielgindi/Charts/pull/630) ([liuxuan30](https://github.com/liuxuan30)) +- Remove useless parentheses causing swift build error [\#614](https://github.com/danielgindi/Charts/pull/614) ([chanil1218](https://github.com/chanil1218)) +- Add change log file. [\#605](https://github.com/danielgindi/Charts/pull/605) ([skywinder](https://github.com/skywinder)) +- add initialize dataSets in setter [\#600](https://github.com/danielgindi/Charts/pull/600) ([liuxuan30](https://github.com/liuxuan30)) +- Bar chart tests [\#580](https://github.com/danielgindi/Charts/pull/580) ([alvesjtiago](https://github.com/alvesjtiago)) +- Make getBarBounds callable from Objective-C code \(Fixes \#570\) [\#571](https://github.com/danielgindi/Charts/pull/571) ([adonaire-sage](https://github.com/adonaire-sage)) +- round the float value before we cast to Int [\#558](https://github.com/danielgindi/Charts/pull/558) ([liuxuan30](https://github.com/liuxuan30)) + +## [v2.1.6](https://github.com/danielgindi/Charts/tree/v2.1.6) (2015-11-02) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v2.1.5...v2.1.6) + +**Implemented enhancements:** + +- X axis names visibility \(Rotation\) [\#61](https://github.com/danielgindi/Charts/issues/61) + +**Closed issues:** + +- hello,this library is very great!!! [\#523](https://github.com/danielgindi/Charts/issues/523) +- \[BUG\] highlight when triggering pan gesture in default scale not working [\#520](https://github.com/danielgindi/Charts/issues/520) +- Implementing Gestures [\#519](https://github.com/danielgindi/Charts/issues/519) +- Does ios-charts work for Mac Cocoa programming? [\#516](https://github.com/danielgindi/Charts/issues/516) +- No 'setHighlightPerTapEnabled\(boolean enabled\)' in iosCharts? [\#515](https://github.com/danielgindi/Charts/issues/515) +- This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes. This will cause an exception in a future release. [\#514](https://github.com/danielgindi/Charts/issues/514) +- How to set position of description? [\#512](https://github.com/danielgindi/Charts/issues/512) +- Can't update library to 2.1.5 by cocoapods [\#511](https://github.com/danielgindi/Charts/issues/511) +- How in your chart on the basis of the modified? [\#510](https://github.com/danielgindi/Charts/issues/510) +- How can I reset bargraph total width ? [\#509](https://github.com/danielgindi/Charts/issues/509) +- ComboChartView highlight [\#507](https://github.com/danielgindi/Charts/issues/507) +- Making a line chart set with images on the chart [\#506](https://github.com/danielgindi/Charts/issues/506) +- the text rotation (Cry for help) [\#505](https://github.com/danielgindi/Charts/issues/505) +- StackedBar Chart highlighting complete single bar [\#504](https://github.com/danielgindi/Charts/issues/504) +- LineChart crashes if no entries [\#496](https://github.com/danielgindi/Charts/issues/496) +- Background color and floats on Y axis. [\#495](https://github.com/danielgindi/Charts/issues/495) +- Facing problem while achieving the build on Xcode7 [\#492](https://github.com/danielgindi/Charts/issues/492) +- About method setCircleColor & setCircleHoleColor [\#491](https://github.com/danielgindi/Charts/issues/491) +- inner web lines missing. [\#490](https://github.com/danielgindi/Charts/issues/490) +- Positioning using screen points instead of xIndex [\#487](https://github.com/danielgindi/Charts/issues/487) +- Selectable marker view & images at Y axis [\#485](https://github.com/danielgindi/Charts/issues/485) +- Could you draw a discontinuous line? [\#484](https://github.com/danielgindi/Charts/issues/484) +- Using image as marker in the chart [\#483](https://github.com/danielgindi/Charts/issues/483) +- Line chart can set the position of the x axis, such as in the chart below [\#482](https://github.com/danielgindi/Charts/issues/482) +- ```xAxis.avoidFirstLastClippingEnabled=YES``` problem.Version 2.1.4a [\#479](https://github.com/danielgindi/Charts/issues/479) +- Zombie exception [\#477](https://github.com/danielgindi/Charts/issues/477) +- chartView does't overlay with dark color highlighted value in bar chart [\#449](https://github.com/danielgindi/Charts/issues/449) +- viewPortHandler.setMaximumScaleX not working for horizontal bar chart [\#256](https://github.com/danielgindi/Charts/issues/256) + +**Merged pull requests:** + +- Implemented support for rotated labels on the x-axis [\#513](https://github.com/danielgindi/Charts/pull/513) ([danielgindi](https://github.com/danielgindi)) +- update targets to build framework with same name [\#501](https://github.com/danielgindi/Charts/pull/501) ([petester42](https://github.com/petester42)) +- Adds test support without cocoapods [\#500](https://github.com/danielgindi/Charts/pull/500) ([petester42](https://github.com/petester42)) +- Fixed drag offset panning bug [\#498](https://github.com/danielgindi/Charts/pull/498) ([leoMehlig](https://github.com/leoMehlig)) +- Revert "BUGFIX:fix xAxis labels of bar chart" [\#497](https://github.com/danielgindi/Charts/pull/497) ([danielgindi](https://github.com/danielgindi)) +- if only line data exists and no other data, turn \_deltaX to 1.0 [\#493](https://github.com/danielgindi/Charts/pull/493) ([liuxuan30](https://github.com/liuxuan30)) +- BUGFIX:fix xAxis labels of bar chart [\#489](https://github.com/danielgindi/Charts/pull/489) ([AntiMoron](https://github.com/AntiMoron)) +- Fix issue related to PhilJay/MPAndroidChart\#1121 [\#488](https://github.com/danielgindi/Charts/pull/488) ([PhilJay](https://github.com/PhilJay)) +- Approved, pending styling: Fix Scroll issue when the graph is in a UITableView [\#464](https://github.com/danielgindi/Charts/pull/464) ([coupgar](https://github.com/coupgar)) +- Add ability to turn off antialias for grid lines [\#462](https://github.com/danielgindi/Charts/pull/462) ([vvit](https://github.com/vvit)) + +## [v2.1.5](https://github.com/danielgindi/Charts/tree/v2.1.5) (2015-10-15) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v2.1.4a...v2.1.5) + +**Fixed bugs:** + +- chart is scrolling to top when reach maxScaleY and try zoom in again [\#463](https://github.com/danielgindi/Charts/issues/463) +- Pie chart does not work well with separate animations on x and y axis simultaneously [\#456](https://github.com/danielgindi/Charts/issues/456) + +**Closed issues:** + +- YAxis size calculations [\#480](https://github.com/danielgindi/Charts/issues/480) +- Can't install app due to non matching architecture. [\#476](https://github.com/danielgindi/Charts/issues/476) +- compiling for iPhone4s gives error like \#344 [\#475](https://github.com/danielgindi/Charts/issues/475) +- Compilation issue [\#473](https://github.com/danielgindi/Charts/issues/473) +- Problem with marker in Swift [\#472](https://github.com/danielgindi/Charts/issues/472) +- Crash: function signature specialization \ of Charts.BarLineChartViewBase.calcModulus \(Charts.BarLineChartViewBase\)\(\) -\> \(\), line 444 [\#471](https://github.com/danielgindi/Charts/issues/471) +- Pinch to Zoom is not being disabled properly. [\#470](https://github.com/danielgindi/Charts/issues/470) +- how to draw a graph having x value but no values in y [\#467](https://github.com/danielgindi/Charts/issues/467) +- Why set barRect.size.height = bottom - top to be negative? [\#465](https://github.com/danielgindi/Charts/issues/465) +- swift 1.2 branch [\#459](https://github.com/danielgindi/Charts/issues/459) +- Has anyone meet the '\# has been removed from swift' problem under XCode version 7.0.1? [\#458](https://github.com/danielgindi/Charts/issues/458) +- Multiple negative-able values in Stack bar chart [\#455](https://github.com/danielgindi/Charts/issues/455) +- Limit Line Label Text Color [\#454](https://github.com/danielgindi/Charts/issues/454) +- problems using autoScaleMinMaxEnabled [\#453](https://github.com/danielgindi/Charts/issues/453) +- how to update the ios-charts in existing projects. [\#452](https://github.com/danielgindi/Charts/issues/452) +- Provide callbacks on ChartViewDelegate to better handle dragging, touch, etc [\#451](https://github.com/danielgindi/Charts/issues/451) +- moveViewToX problem [\#450](https://github.com/danielgindi/Charts/issues/450) +- bar width [\#448](https://github.com/danielgindi/Charts/issues/448) +- Can we show title of Axis? [\#447](https://github.com/danielgindi/Charts/issues/447) +- Make \_chart in CombinedChartRenderer internal [\#446](https://github.com/danielgindi/Charts/issues/446) +- Dynamic graph display [\#445](https://github.com/danielgindi/Charts/issues/445) +- Demo project is not working [\#443](https://github.com/danielgindi/Charts/issues/443) +- xcode 7 issue? - non-existent file for the CFBundleExecutable key [\#442](https://github.com/danielgindi/Charts/issues/442) +- Custom Y Axis entries with String values [\#441](https://github.com/danielgindi/Charts/issues/441) +- Change size of the view that contain the chart [\#440](https://github.com/danielgindi/Charts/issues/440) +- Label lines with different style, larger and not for all lines in grid [\#439](https://github.com/danielgindi/Charts/issues/439) +- Pie chart data labels not in correct position. [\#436](https://github.com/danielgindi/Charts/issues/436) +- Glitch while scrolling [\#430](https://github.com/danielgindi/Charts/issues/430) +- A field crash issue for highestVisibleXIndex [\#329](https://github.com/danielgindi/Charts/issues/329) +- Empty configuration over full configuration [\#308](https://github.com/danielgindi/Charts/issues/308) +- \[BarChart\] single dataSet + force groupSpace=0.8 leads to wrong xAxis label rendering and highlight [\#284](https://github.com/danielgindi/Charts/issues/284) +- Prebuilt Frameworks & Tagged Releases [\#217](https://github.com/danielgindi/Charts/issues/217) + +**Merged pull requests:** + +- Changed \_chart access modifier from private to internal [\#478](https://github.com/danielgindi/Charts/pull/478) ([AlBirdie](https://github.com/AlBirdie)) +- fixed noDataText and NoDataTextDescription texts ovelapping issue [\#457](https://github.com/danielgindi/Charts/pull/457) ([zntfdr](https://github.com/zntfdr)) +- Only alow scaling further if the user can still zoom \(Fixes \#437\) [\#438](https://github.com/danielgindi/Charts/pull/438) ([iangmaia](https://github.com/iangmaia)) +- Make the ChartXAxisRenderer more flexible: now possible to overwrite drawing the line or label of the ChartLimitLine [\#432](https://github.com/danielgindi/Charts/pull/432) ([pajai](https://github.com/pajai)) + +## [v2.1.4a](https://github.com/danielgindi/Charts/tree/v2.1.4a) (2015-10-02) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v2.1.4...v2.1.4a) + +**Fixed bugs:** + +- CGContextAddLineToPoint no current point. [\#419](https://github.com/danielgindi/Charts/issues/419) +- Crash by initialize\(\) of CombinedChartView [\#406](https://github.com/danielgindi/Charts/issues/406) +- Radar chart + Bar Line chart Base + startAtZeroEnabled = false + negative values [\#166](https://github.com/danielgindi/Charts/issues/166) + +**Closed issues:** + +- RadarChart \(spider web chart\) issue [\#435](https://github.com/danielgindi/Charts/issues/435) +- dyld\_fatal\_error [\#434](https://github.com/danielgindi/Charts/issues/434) +- Xcode 6.4 compilation errors [\#433](https://github.com/danielgindi/Charts/issues/433) +- Error: Can't build demo project with XCode Version 6.4 \(6E35b\) [\#431](https://github.com/danielgindi/Charts/issues/431) +- Custom ChartXAxisValueFormatter not Being Called with Data containing NSObjects [\#429](https://github.com/danielgindi/Charts/issues/429) +- Error Swift 2 - ChartViewBase.swift [\#428](https://github.com/danielgindi/Charts/issues/428) +- How to return xIndex that be selected in chart? [\#427](https://github.com/danielgindi/Charts/issues/427) +- always return 0 in chartValueSelected function [\#426](https://github.com/danielgindi/Charts/issues/426) +- Radar Chart can not open in Charts Demo project [\#424](https://github.com/danielgindi/Charts/issues/424) +- ScatterChartRenderer - create a custom shape [\#423](https://github.com/danielgindi/Charts/issues/423) +- How to add custom text to the diagram [\#421](https://github.com/danielgindi/Charts/issues/421) +- App/Xcode crashing when charts are loaded [\#410](https://github.com/danielgindi/Charts/issues/410) +- Max Y value sometimes get clipped [\#405](https://github.com/danielgindi/Charts/issues/405) +- Display X-axis and y-axis names and Can i display x axis values vertically [\#403](https://github.com/danielgindi/Charts/issues/403) +- How to show time values in horizontal Bar chart? [\#402](https://github.com/danielgindi/Charts/issues/402) +- ios 9 - xcode 7 [\#400](https://github.com/danielgindi/Charts/issues/400) +- bar chart with gradient [\#398](https://github.com/danielgindi/Charts/issues/398) +- Multiple Lines in LineChart. [\#397](https://github.com/danielgindi/Charts/issues/397) +- Line Graph error [\#396](https://github.com/danielgindi/Charts/issues/396) +- Charts running on Simulator only [\#381](https://github.com/danielgindi/Charts/issues/381) +- Multiple axis - line charts drawing [\#366](https://github.com/danielgindi/Charts/issues/366) +- Marker frame adjustment according to bounds [\#364](https://github.com/danielgindi/Charts/issues/364) +- Sequencing of legend titles [\#363](https://github.com/danielgindi/Charts/issues/363) +- Legend has only one label [\#361](https://github.com/danielgindi/Charts/issues/361) +- Can add the missing value support [\#355](https://github.com/danielgindi/Charts/issues/355) +- CombinedChartView line + bar [\#353](https://github.com/danielgindi/Charts/issues/353) +- drawFillEnabled in line chart bug? [\#351](https://github.com/danielgindi/Charts/issues/351) +- \[BUG\] highlighted bar animation on Y Axis for all bar charts is wrong and not same speed [\#349](https://github.com/danielgindi/Charts/issues/349) +- HELP : some problem never met about iOS-charts [\#341](https://github.com/danielgindi/Charts/issues/341) +- Multiple line Chart, same view [\#340](https://github.com/danielgindi/Charts/issues/340) +- Position Pie Chart over the View [\#337](https://github.com/danielgindi/Charts/issues/337) +- Having multiple colour bands with an area that changes dynamically over time [\#336](https://github.com/danielgindi/Charts/issues/336) +- Adding Large number of data points -- addEntry\(\) [\#333](https://github.com/danielgindi/Charts/issues/333) +- Can I implement this kind of chart with this library? [\#328](https://github.com/danielgindi/Charts/issues/328) +- iOS Chart Y-Axis High Limit [\#317](https://github.com/danielgindi/Charts/issues/317) +- how to place the Y axis label at the bottom of the chart? [\#314](https://github.com/danielgindi/Charts/issues/314) +- Real-time Charts [\#263](https://github.com/danielgindi/Charts/issues/263) +- Drawing circles for values on the radar chart [\#138](https://github.com/danielgindi/Charts/issues/138) + +**Merged pull requests:** + +- Start of pan gesture should not be cancelled by no drag [\#420](https://github.com/danielgindi/Charts/pull/420) ([niraj-rayalla](https://github.com/niraj-rayalla)) +- Allow the minimum offset to be customized [\#395](https://github.com/danielgindi/Charts/pull/395) ([icecrystal23](https://github.com/icecrystal23)) +- Add support for a legend above the chart [\#393](https://github.com/danielgindi/Charts/pull/393) ([icecrystal23](https://github.com/icecrystal23)) +- Add target for tvOS and get it to compile [\#392](https://github.com/danielgindi/Charts/pull/392) ([icecrystal23](https://github.com/icecrystal23)) +- be explicit on how to install 'Charts' when using CocoaPods since [\#376](https://github.com/danielgindi/Charts/pull/376) ([codeHatcher](https://github.com/codeHatcher)) + +## [v2.1.4](https://github.com/danielgindi/Charts/tree/v2.1.4) (2015-09-21) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v2.1.3...v2.1.4) + +**Fixed bugs:** + +- UIPanGestureRecognizer causes index out of bounds crash [\#327](https://github.com/danielgindi/Charts/issues/327) +- Radar chart radius is still affected by label size when label drawing is disabled [\#153](https://github.com/danielgindi/Charts/issues/153) +- XGrid not in sync for identical x values but different chart types [\#99](https://github.com/danielgindi/Charts/issues/99) + +**Closed issues:** + +- Xcode 7 and iOS 9 Support \(Deployment Target iOS 7.0\) [\#404](https://github.com/danielgindi/Charts/issues/404) +- Legend titles aren't printing if there are more than 5 [\#401](https://github.com/danielgindi/Charts/issues/401) +- Swift 2.0 branch not found [\#399](https://github.com/danielgindi/Charts/issues/399) +- Values are not drawn in the correct location when the y-axis does not start at zero [\#391](https://github.com/danielgindi/Charts/issues/391) +- Swift-2.0 branch runtime crashes after distributed on the TestFlight [\#390](https://github.com/danielgindi/Charts/issues/390) +- ios-charts Integration problem [\#389](https://github.com/danielgindi/Charts/issues/389) +- Can't change X-axis label color [\#387](https://github.com/danielgindi/Charts/issues/387) +- StackedBarChart in horizontal manner [\#384](https://github.com/danielgindi/Charts/issues/384) +- Add ios-charts to existing project in XCode 7 [\#383](https://github.com/danielgindi/Charts/issues/383) +- Xcode7 Swift 2.0 issue \[ChartSelectionDetail.swift\] [\#380](https://github.com/danielgindi/Charts/issues/380) +- Installing ios-charts in an existing project [\#379](https://github.com/danielgindi/Charts/issues/379) +- I upgraded my UXcode 7,I can't use charts framework. [\#378](https://github.com/danielgindi/Charts/issues/378) +- How to achieve 0 spacing between bars? [\#365](https://github.com/danielgindi/Charts/issues/365) +- Xcode 7.0 and Swift 2.0 issue [\#358](https://github.com/danielgindi/Charts/issues/358) +- Unable to run a demo [\#356](https://github.com/danielgindi/Charts/issues/356) +- Using Embedded Binaries giving build failed error in xcode 7 ? [\#354](https://github.com/danielgindi/Charts/issues/354) +- is there a object-c version this project? [\#352](https://github.com/danielgindi/Charts/issues/352) +- adding cross platform feature [\#350](https://github.com/danielgindi/Charts/issues/350) +- Some problems about CandleStickChart [\#348](https://github.com/danielgindi/Charts/issues/348) +- Some problems about CandleStickChart [\#347](https://github.com/danielgindi/Charts/issues/347) +- Pie chart is getting drawn again and again on rotation in iOS [\#346](https://github.com/danielgindi/Charts/issues/346) +- 对于高于限制线的点,我怎么改变点的样式和颜色呢? [\#345](https://github.com/danielgindi/Charts/issues/345) +- Swift-2.0 Branch Error [\#344](https://github.com/danielgindi/Charts/issues/344) +- Multiple lines [\#342](https://github.com/danielgindi/Charts/issues/342) +- Daniel are you really fit? [\#339](https://github.com/danielgindi/Charts/issues/339) +- For CandleStickChart, how can I limit according to the count of candles [\#334](https://github.com/danielgindi/Charts/issues/334) +- how can i disable the doubles? i only need the chat show int data [\#332](https://github.com/danielgindi/Charts/issues/332) +- Bug: Xcode 7 beta 5: dyld: Library not loaded: @rpath/Charts.framework/Charts [\#326](https://github.com/danielgindi/Charts/issues/326) +- Disappearing Line Segment when scrolling [\#325](https://github.com/danielgindi/Charts/issues/325) +- CombinedChart with BarChartData cuts the first and last bars in half [\#323](https://github.com/danielgindi/Charts/issues/323) +- Bug \(?\) in CandleStickChartRenderer when showing empty dataset among multiple datasets [\#320](https://github.com/danielgindi/Charts/issues/320) +- Xcode 7 Beta 6 print\(.. appendNewLine\) - Swift 2.0 branch [\#316](https://github.com/danielgindi/Charts/issues/316) +- Ability to disable legends completely [\#312](https://github.com/danielgindi/Charts/issues/312) +- BarChart draws additional horizontal grid lines when setting custom customAxisMax/labelCount [\#310](https://github.com/danielgindi/Charts/issues/310) +- Take selectionShift into account when displaying pie chart [\#309](https://github.com/danielgindi/Charts/issues/309) +- Line Chart Line is not drawing properly for the large yValues [\#307](https://github.com/danielgindi/Charts/issues/307) +- Zero valued slices overlap [\#305](https://github.com/danielgindi/Charts/issues/305) +- setVisibleXRangeMaximum working differently than expected [\#304](https://github.com/danielgindi/Charts/issues/304) +- MyProject-Swift.h header not found when embedding framework into ObjectiveC project [\#303](https://github.com/danielgindi/Charts/issues/303) +- Using NSNumberFormatter or .getBarBounds\(\) to Display Custom Values [\#302](https://github.com/danielgindi/Charts/issues/302) +- Unknown class \_TtC6Charts12BarChartView in Interface Builder file. [\#301](https://github.com/danielgindi/Charts/issues/301) +- Possible regression because of recent `startAtZeroEnabled` changes [\#300](https://github.com/danielgindi/Charts/issues/300) +- Axis titles? [\#299](https://github.com/danielgindi/Charts/issues/299) +- xcode 6.4 , Swift 1.2 build fail [\#298](https://github.com/danielgindi/Charts/issues/298) +- it has this problem "'\#' has been removed from Swift" in many places [\#296](https://github.com/danielgindi/Charts/issues/296) +- chartScaled not so useful without the touch location [\#295](https://github.com/danielgindi/Charts/issues/295) +- ChartMarker don't draw [\#293](https://github.com/danielgindi/Charts/issues/293) +- Multiple line charts on the same graph [\#292](https://github.com/danielgindi/Charts/issues/292) +- Release Version 2.1.3 on CocoaPods [\#289](https://github.com/danielgindi/Charts/issues/289) +- saveToCameraRoll strange behavior [\#288](https://github.com/danielgindi/Charts/issues/288) +- ios-charts for swift 2.0 cannot compile on XCode7 beta 5 - self.dynamicType.allocWithZone\(zone\) issue [\#287](https://github.com/danielgindi/Charts/issues/287) +- installing with cocoapods [\#283](https://github.com/danielgindi/Charts/issues/283) +- iOS 9 Won't Compile \(Also, no such module 'Charts'\) [\#282](https://github.com/danielgindi/Charts/issues/282) +- Allow to align the Legend! [\#279](https://github.com/danielgindi/Charts/issues/279) +- Demo chart for Swift? [\#278](https://github.com/danielgindi/Charts/issues/278) +- Cocoapods support [\#277](https://github.com/danielgindi/Charts/issues/277) +- ios-charts different plotting activity than MKAndroidChart [\#276](https://github.com/danielgindi/Charts/issues/276) +- Highlight Doest'n work properly on UIPageViewController in LineChart. [\#275](https://github.com/danielgindi/Charts/issues/275) +- command failed due to signal: Abort trap: 6 charts [\#271](https://github.com/danielgindi/Charts/issues/271) +- having hard time to put working on version iOS 7.1 [\#270](https://github.com/danielgindi/Charts/issues/270) +- Library not found while building application through distribution certificate [\#266](https://github.com/danielgindi/Charts/issues/266) +- Crash on one entry point in charts [\#265](https://github.com/danielgindi/Charts/issues/265) +- when add points dynamicly, scale is changeing, [\#264](https://github.com/danielgindi/Charts/issues/264) +- About Auto-scaling on axis [\#259](https://github.com/danielgindi/Charts/issues/259) +- \[CombinedChart\] Grouped Bars + line chart [\#252](https://github.com/danielgindi/Charts/issues/252) +- \*\*\* Announcements \*\*\* [\#236](https://github.com/danielgindi/Charts/issues/236) +- \[BUG\] xAxis label too long causes radar chart cannot render correctly [\#205](https://github.com/danielgindi/Charts/issues/205) + +**Merged pull requests:** + +- Allow setting maximum y-scale factor [\#388](https://github.com/danielgindi/Charts/pull/388) ([noais](https://github.com/noais)) +- Swift 2.0 [\#386](https://github.com/danielgindi/Charts/pull/386) ([danielgindi](https://github.com/danielgindi)) +- Fix default value of forceLabelsEnabled [\#360](https://github.com/danielgindi/Charts/pull/360) ([yas375](https://github.com/yas375)) +- Update BarLineChartViewBase.swift [\#359](https://github.com/danielgindi/Charts/pull/359) ([Ewg777](https://github.com/Ewg777)) +- combined chart - seems we should use same chartXMin and chartXMax even there is no bubble data [\#324](https://github.com/danielgindi/Charts/pull/324) ([liuxuan30](https://github.com/liuxuan30)) +- fix pie chart clipping [\#313](https://github.com/danielgindi/Charts/pull/313) ([petester42](https://github.com/petester42)) +- Changed Release signing configuration to "iOS Developer" to improve Carthage compatibility [\#297](https://github.com/danielgindi/Charts/pull/297) ([JaviSoto](https://github.com/JaviSoto)) +- Fixes xcode beta 5 compile errors [\#291](https://github.com/danielgindi/Charts/pull/291) ([petester42](https://github.com/petester42)) +- bump podspec to 2.1.3 [\#290](https://github.com/danielgindi/Charts/pull/290) ([petester42](https://github.com/petester42)) +- Minor refactor for BarLineChartViewBase [\#268](https://github.com/danielgindi/Charts/pull/268) ([liuxuan30](https://github.com/liuxuan30)) +- Enhanced label positioning at limit lines \(enum ChartLimitLabelPosition\) [\#243](https://github.com/danielgindi/Charts/pull/243) ([SvenMuc](https://github.com/SvenMuc)) + +## [v2.1.3](https://github.com/danielgindi/Charts/tree/v2.1.3) (2015-08-05) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v2.1.2...v2.1.3) + +**Closed issues:** + +- Limit Legend for combined charts [\#272](https://github.com/danielgindi/Charts/issues/272) +- Default zoom level at a position. [\#267](https://github.com/danielgindi/Charts/issues/267) +- drawValuesForWholeStackEnabled deprecated? [\#261](https://github.com/danielgindi/Charts/issues/261) +- Another Command failed due to signal: Segmentation fault: 11 [\#260](https://github.com/danielgindi/Charts/issues/260) +- moveViewToX [\#258](https://github.com/danielgindi/Charts/issues/258) +- How to add point dynamicly [\#257](https://github.com/danielgindi/Charts/issues/257) +- Real time graph - X-axis moving? [\#255](https://github.com/danielgindi/Charts/issues/255) +- 2.1.2 Not Yet in CocoaPods Master Repo [\#251](https://github.com/danielgindi/Charts/issues/251) +- Heads up [\#250](https://github.com/danielgindi/Charts/issues/250) +- Disable HorizontalHighlightIndicator on LineChart. [\#249](https://github.com/danielgindi/Charts/issues/249) +- double vision in the chart [\#245](https://github.com/danielgindi/Charts/issues/245) +- Can't find anything like "isWordWrapEnabled" in PieChart [\#244](https://github.com/danielgindi/Charts/issues/244) +- Grouped columns misplaced [\#242](https://github.com/danielgindi/Charts/issues/242) +- Swift2 upgrade problem "Redundant conformance of 'ChartDataEntry' to protocol 'Equatable'" [\#241](https://github.com/danielgindi/Charts/issues/241) +- App created by Archive cannot run on devices. [\#240](https://github.com/danielgindi/Charts/issues/240) +- What's the differences between setAxisMaximum and customAxisMax [\#239](https://github.com/danielgindi/Charts/issues/239) +- Problem importing framework to Xcode 6.4 in Swift Project [\#233](https://github.com/danielgindi/Charts/issues/233) +- PieChartData initialisers ambiguous when xVals parameter is nil [\#224](https://github.com/danielgindi/Charts/issues/224) +- \[BUG\] all-negative Stacked horizontal Bar Chart size is not correct [\#222](https://github.com/danielgindi/Charts/issues/222) +- \[BUG\] Bar Chart incorrect rendering for special data [\#214](https://github.com/danielgindi/Charts/issues/214) +- Projects using Charts [\#145](https://github.com/danielgindi/Charts/issues/145) +- Legend Height Adjustment [\#81](https://github.com/danielgindi/Charts/issues/81) +- Multiple legend entrys will be rendered outside of the view [\#80](https://github.com/danielgindi/Charts/issues/80) + +**Merged pull requests:** + +- Add a Code Hunt vote badge to README.md [\#262](https://github.com/danielgindi/Charts/pull/262) ([CodeHuntIO](https://github.com/CodeHuntIO)) +- Updated podspec [\#254](https://github.com/danielgindi/Charts/pull/254) ([petester42](https://github.com/petester42)) +- try to fix bar chart + Horizontal Bar chart wrong render + highlight position bug for issue \#214 and \#242. [\#248](https://github.com/danielgindi/Charts/pull/248) ([liuxuan30](https://github.com/liuxuan30)) + +## [v2.1.2](https://github.com/danielgindi/Charts/tree/v2.1.2) (2015-07-26) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v2.1.1...v2.1.2) + +## [v2.1.1](https://github.com/danielgindi/Charts/tree/v2.1.1) (2015-07-26) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v2.1.0...v2.1.1) + +**Fixed bugs:** + +- Render Crash Due to Rect NAN from rectValueToPixel in BarChartRenderer.swift [\#177](https://github.com/danielgindi/Charts/issues/177) +- Can we add nil values to a dataset yet? [\#113](https://github.com/danielgindi/Charts/issues/113) +- Incorrect chart view adjustment after moveViewtoX\(xIndex: Int\) [\#82](https://github.com/danielgindi/Charts/issues/82) +- Margin insets not changing during zoom when formatter changes output width [\#72](https://github.com/danielgindi/Charts/issues/72) +- Line chart crashes with a big float [\#62](https://github.com/danielgindi/Charts/issues/62) + +**Closed issues:** + +- App is crashing when line chart is scrolled into view and then back out. [\#238](https://github.com/danielgindi/Charts/issues/238) +- Demo Project: In BalloonMarker.swift : "Error: No such module 'charts' " XCode 6.4 [\#237](https://github.com/danielgindi/Charts/issues/237) +- How to draw Line segments in one Line Chart. [\#235](https://github.com/danielgindi/Charts/issues/235) +- How to disable the continuos selection in chart with swipe? [\#234](https://github.com/danielgindi/Charts/issues/234) +- Podspec 3 months old [\#231](https://github.com/danielgindi/Charts/issues/231) +- Setting background in Objective C [\#230](https://github.com/danielgindi/Charts/issues/230) +- ChartYAxis valueFormatter NSFormatter instead of NSNumberFormatter [\#228](https://github.com/danielgindi/Charts/issues/228) +- How to setup up y-axis with min, max value and a fixed step between the grid lines? [\#227](https://github.com/danielgindi/Charts/issues/227) +- What's the proper way to manually set chart's scale and scroll offset? [\#226](https://github.com/danielgindi/Charts/issues/226) +- How could you set the Y values at the bottom in LineChart? [\#223](https://github.com/danielgindi/Charts/issues/223) +- Is there guidance to beginner to use this? [\#220](https://github.com/danielgindi/Charts/issues/220) +- Chart's PanGesture conflicts with UITableView PanGesture [\#219](https://github.com/danielgindi/Charts/issues/219) +- \(swift-2.0 branch\) building Charts.xcodeproj fails \(exit code 65\) with Release configuration [\#218](https://github.com/danielgindi/Charts/issues/218) +- Crash on device - iOS 8.3 [\#216](https://github.com/danielgindi/Charts/issues/216) +- Remove dependencies warning [\#215](https://github.com/danielgindi/Charts/issues/215) +- Update Podspec to reflect commits since early May? [\#213](https://github.com/danielgindi/Charts/issues/213) +- \[BUG\]negative values rendering +highlight rect rendering not correct for stacked bar + stacked horizontal bar chart [\#212](https://github.com/danielgindi/Charts/issues/212) +- \[BUG\]postive bars in demo Stack BarChart Negative disappear after scrolling [\#211](https://github.com/danielgindi/Charts/issues/211) +- Horizontal bar chart in combined bar chart. [\#210](https://github.com/danielgindi/Charts/issues/210) +- Can I use this library in an objective-c project targeting iOS 7 & 8? [\#206](https://github.com/danielgindi/Charts/issues/206) +- When animating charts after reload, chart is shown fully drawn before animating. [\#204](https://github.com/danielgindi/Charts/issues/204) +- Array index out of range when removing entries from DataSet [\#203](https://github.com/danielgindi/Charts/issues/203) +- Issue while displaying the chart \(HorizontalBarChartView\) [\#202](https://github.com/danielgindi/Charts/issues/202) +- Charts stuttering when reloaded [\#201](https://github.com/danielgindi/Charts/issues/201) +- Scaling Yaxis [\#199](https://github.com/danielgindi/Charts/issues/199) +- Don't draw zero value label [\#197](https://github.com/danielgindi/Charts/issues/197) +- Library not loaded: @rpath/Charts.framework/Charts [\#196](https://github.com/danielgindi/Charts/issues/196) +- How can i get this chart? [\#195](https://github.com/danielgindi/Charts/issues/195) +- Crashing on adding the null value to and array [\#193](https://github.com/danielgindi/Charts/issues/193) +- ChartDataEntry not drawn after certain xIndex [\#190](https://github.com/danielgindi/Charts/issues/190) +- Highlight multiple values [\#187](https://github.com/danielgindi/Charts/issues/187) +- ChartData.removeEntryByXIndex removes the wrong entry [\#182](https://github.com/danielgindi/Charts/issues/182) +- Label on Limit Lines cause crash [\#181](https://github.com/danielgindi/Charts/issues/181) +- \[feature request\] render xAxis like yAxis style Namely from discrete way to continuous way [\#176](https://github.com/danielgindi/Charts/issues/176) +- Annotation label support? [\#175](https://github.com/danielgindi/Charts/issues/175) +- Multiple DataSet Error [\#174](https://github.com/danielgindi/Charts/issues/174) +- AddEntry issue in ChartData [\#173](https://github.com/danielgindi/Charts/issues/173) +- Bar Chart Bars Disappears On Zoom And Highlight Bars Don't Match [\#172](https://github.com/danielgindi/Charts/issues/172) +- Clearing all highlighted values [\#171](https://github.com/danielgindi/Charts/issues/171) +- BarChartView work with TableView [\#167](https://github.com/danielgindi/Charts/issues/167) +- Make scroll to graph without pinch [\#164](https://github.com/danielgindi/Charts/issues/164) +- When i set valueformatter , Have problem. [\#163](https://github.com/danielgindi/Charts/issues/163) +- Combined Chart With array of line charts [\#162](https://github.com/danielgindi/Charts/issues/162) +- Issues with chart rendering... [\#161](https://github.com/danielgindi/Charts/issues/161) +- How to set yAxis to normal number [\#160](https://github.com/danielgindi/Charts/issues/160) +- How to set yValue display 0 2 3 5 [\#159](https://github.com/danielgindi/Charts/issues/159) +- \[BUG\] \_yAxis.entries will not be cleaned up in computeAxisValues in radar chart [\#158](https://github.com/danielgindi/Charts/issues/158) +- \[feature request\] support fixed yAxis interval and xAxis labelCount [\#155](https://github.com/danielgindi/Charts/issues/155) +- app crashes at launch as in house release build on iPhone - but debugging is fine [\#154](https://github.com/danielgindi/Charts/issues/154) +- \[feature request\] enable legend view scrollable [\#151](https://github.com/danielgindi/Charts/issues/151) +- \[feature request\] support custom handler for gestures [\#148](https://github.com/danielgindi/Charts/issues/148) +- unsuccessful at installing for ios 7.0 [\#144](https://github.com/danielgindi/Charts/issues/144) +- cannot po swift local variable in my Objective-C project [\#143](https://github.com/danielgindi/Charts/issues/143) +- Real time line chart [\#142](https://github.com/danielgindi/Charts/issues/142) +- Bar chart some values \< 0 [\#141](https://github.com/danielgindi/Charts/issues/141) +- Any demo in swift ? [\#139](https://github.com/danielgindi/Charts/issues/139) +- compiling time costs 2-3 minutes after import swift code files, is it normal? [\#137](https://github.com/danielgindi/Charts/issues/137) +- iOS7 can't build success [\#136](https://github.com/danielgindi/Charts/issues/136) +- Warnings on the comments [\#135](https://github.com/danielgindi/Charts/issues/135) +- Still seeing undeclared UIColor, CGFloat error with latest code [\#133](https://github.com/danielgindi/Charts/issues/133) +- Error while drawing radar chart [\#132](https://github.com/danielgindi/Charts/issues/132) +- Cannot assign a value of type 'ChartLimitLabelPosition' to a value of type 'ChartLimitLine.ChartLimitLabelPosition' [\#131](https://github.com/danielgindi/Charts/issues/131) +- Data disappearing while zooming/panning when y-values are not ordered by x [\#130](https://github.com/danielgindi/Charts/issues/130) +- Cannot load underlying module for 'Charts' [\#129](https://github.com/danielgindi/Charts/issues/129) +- Any way to add/use image for xVals? [\#126](https://github.com/danielgindi/Charts/issues/126) +- Install with cocoapod into project supporting iOS 7 and later [\#125](https://github.com/danielgindi/Charts/issues/125) +- Lines clipping top and bottom with lineWidth \> 1 [\#123](https://github.com/danielgindi/Charts/issues/123) +- Candle chart - make the shadow same color as an increasing/decreasing candle color [\#122](https://github.com/danielgindi/Charts/issues/122) +- Down-casted Array element failed to match the target type [\#121](https://github.com/danielgindi/Charts/issues/121) +- y axis spaces between labels are too wide [\#120](https://github.com/danielgindi/Charts/issues/120) +- Different colors for single data set in Bar Chart [\#118](https://github.com/danielgindi/Charts/issues/118) +- The new version demo has a problem. [\#117](https://github.com/danielgindi/Charts/issues/117) +- non-public selectors while submitting app [\#116](https://github.com/danielgindi/Charts/issues/116) +- Adding a minimum parameter to setVisibleXRange [\#115](https://github.com/danielgindi/Charts/issues/115) +- Add 'drawHighlightEnabled' to ChartDataSet [\#114](https://github.com/danielgindi/Charts/issues/114) +- Pull to refresh [\#112](https://github.com/danielgindi/Charts/issues/112) +- Can we create thumb for each chart? [\#111](https://github.com/danielgindi/Charts/issues/111) +- Issue setting the chartView.delegate to self. [\#110](https://github.com/danielgindi/Charts/issues/110) +- combine swift in Objective-C project [\#108](https://github.com/danielgindi/Charts/issues/108) +- get X translation distance on the x-axis [\#105](https://github.com/danielgindi/Charts/issues/105) +- Horizontal Bar Chart Screenshot on README is Broken [\#103](https://github.com/danielgindi/Charts/issues/103) +- Bars [\#102](https://github.com/danielgindi/Charts/issues/102) +- Crash when redraw graph from 2 lines to 1 line with click on highlight [\#101](https://github.com/danielgindi/Charts/issues/101) +- Release Bug [\#98](https://github.com/danielgindi/Charts/issues/98) +- Add '@objc' to ChartViewPortHandler [\#97](https://github.com/danielgindi/Charts/issues/97) +- Bar Chart Delegate. [\#96](https://github.com/danielgindi/Charts/issues/96) +- Cannot turn off Barchart Zoom Propertry [\#91](https://github.com/danielgindi/Charts/issues/91) +- calcMinMax\(\) during scrolling / panning [\#89](https://github.com/danielgindi/Charts/issues/89) +- defaultTouchEventsEnabled [\#88](https://github.com/danielgindi/Charts/issues/88) +- 'chartsample-Swift.h' file not found [\#87](https://github.com/danielgindi/Charts/issues/87) +- Infinite loop when setting data on ChartDataEntry object [\#86](https://github.com/danielgindi/Charts/issues/86) +- Custom text over bar chart. [\#84](https://github.com/danielgindi/Charts/issues/84) +- Stop hiding of xAxis label. [\#79](https://github.com/danielgindi/Charts/issues/79) +- Consider draw map chart without location, navigation stuff? [\#78](https://github.com/danielgindi/Charts/issues/78) +- Line Chart - Simple Design [\#77](https://github.com/danielgindi/Charts/issues/77) +- Can you give me a swift's demo [\#75](https://github.com/danielgindi/Charts/issues/75) +- What files exactly should I drag to my project to make it work on iOS 7.0? [\#73](https://github.com/danielgindi/Charts/issues/73) +- How to check chart is zoomed in ? [\#71](https://github.com/danielgindi/Charts/issues/71) +- Changing descriptionTextColor not possible [\#70](https://github.com/danielgindi/Charts/issues/70) +- Confused by this snippet code [\#69](https://github.com/danielgindi/Charts/issues/69) +- XAxis Co-Ordination with Y Axis [\#68](https://github.com/danielgindi/Charts/issues/68) +- Is there a way can make LineDataSets not selected when their visible property is no? [\#67](https://github.com/danielgindi/Charts/issues/67) +- Multiple Chart View Within ScrollView [\#65](https://github.com/danielgindi/Charts/issues/65) + +**Merged pull requests:** + +- Fixes to allow the code to compile with Swift 2.0 [\#232](https://github.com/danielgindi/Charts/pull/232) ([jmacmullin](https://github.com/jmacmullin)) +- fix radar chart negative value rendering bug if startAtZeroEnabled is false for issue \#166 [\#207](https://github.com/danielgindi/Charts/pull/207) ([liuxuan30](https://github.com/liuxuan30)) +- Fixes for beta 3 [\#200](https://github.com/danielgindi/Charts/pull/200) ([petester42](https://github.com/petester42)) +- Performance Enhancements \#29 - candle chart [\#192](https://github.com/danielgindi/Charts/pull/192) ([dorsoft](https://github.com/dorsoft)) +- Candle chart - make the shadow same color as an candle color \#122 [\#191](https://github.com/danielgindi/Charts/pull/191) ([dorsoft](https://github.com/dorsoft)) +- ChartData.removeEntryByXIndex removes the wrong entry \#182 [\#185](https://github.com/danielgindi/Charts/pull/185) ([dorsoft](https://github.com/dorsoft)) +- The line charts have started to properly display balloon markers [\#179](https://github.com/danielgindi/Charts/pull/179) ([Maxim-38RUS-Zabelin](https://github.com/Maxim-38RUS-Zabelin)) +- Fix a silly bug. should check if first is -0.0 [\#165](https://github.com/danielgindi/Charts/pull/165) ([liuxuan30](https://github.com/liuxuan30)) +- add NaN check to allow non-digits handling for radar chart [\#152](https://github.com/danielgindi/Charts/pull/152) ([liuxuan30](https://github.com/liuxuan30)) +- optional protocol method should not be force unwrapped [\#147](https://github.com/danielgindi/Charts/pull/147) ([liuxuan30](https://github.com/liuxuan30)) +- add missing module CoreGraphics for BubbleChartView [\#146](https://github.com/danielgindi/Charts/pull/146) ([liuxuan30](https://github.com/liuxuan30)) +- Adding a minimum parameter to setVisibleXRange [\#119](https://github.com/danielgindi/Charts/pull/119) ([dorsoft](https://github.com/dorsoft)) +- Added support for setting a custom width that is wider than the longe… [\#107](https://github.com/danielgindi/Charts/pull/107) ([AlBirdie](https://github.com/AlBirdie)) +- Offset adjustment when drawLabels on the x axis is disabled. [\#106](https://github.com/danielgindi/Charts/pull/106) ([AlBirdie](https://github.com/AlBirdie)) +- AutoScaling yAxis during panning / zooming [\#95](https://github.com/danielgindi/Charts/pull/95) ([AlBirdie](https://github.com/AlBirdie)) +- Allow access to setLabelsToSkip from Objective-C. [\#93](https://github.com/danielgindi/Charts/pull/93) ([mkubenka](https://github.com/mkubenka)) +- Changing iOS deployment target to 8.0 from 8.1 [\#74](https://github.com/danielgindi/Charts/pull/74) ([michaelmcguire](https://github.com/michaelmcguire)) + +## [v2.1.0](https://github.com/danielgindi/Charts/tree/v2.1.0) (2015-05-05) +[Full Changelog](https://github.com/danielgindi/Charts/compare/v2.0.9...v2.1.0) + +**Implemented enhancements:** + +- Drawing CubicLineChart based on NSDates [\#38](https://github.com/danielgindi/Charts/issues/38) +- Skip first and last value [\#23](https://github.com/danielgindi/Charts/issues/23) + +**Fixed bugs:** + +- Chart Line vanishes on pinch to zoom [\#63](https://github.com/danielgindi/Charts/issues/63) + +**Closed issues:** + +- Expose chartYMin and chartYMax to rendererDelegates [\#64](https://github.com/danielgindi/Charts/issues/64) +- dyld\_fatal\_error [\#60](https://github.com/danielgindi/Charts/issues/60) +- Unknown class LineChartView in Interface Builder file [\#59](https://github.com/danielgindi/Charts/issues/59) +- Is there any inertia effect in the library? [\#58](https://github.com/danielgindi/Charts/issues/58) +- Library not loaded: @rpath/Charts.framework/Charts Xcode 6.3.1, iOS 8.3 [\#57](https://github.com/danielgindi/Charts/issues/57) +- i am getting this issue? [\#55](https://github.com/danielgindi/Charts/issues/55) +- sample swift project of danielgindi/ios-charts? [\#54](https://github.com/danielgindi/Charts/issues/54) +- i want develop charts in swift? [\#53](https://github.com/danielgindi/Charts/issues/53) +- When I used iOS-charts in iOS 7 project [\#52](https://github.com/danielgindi/Charts/issues/52) +- Changing the specific data point \(circle color\) in Line Chart [\#51](https://github.com/danielgindi/Charts/issues/51) +- When i use ios-charts with swift .. [\#50](https://github.com/danielgindi/Charts/issues/50) +- Charts won't draw unless initialized with a frame [\#49](https://github.com/danielgindi/Charts/issues/49) +- PieChart chartValueSelected don't return the good entry [\#48](https://github.com/danielgindi/Charts/issues/48) +- Cannot find this repo through Cocoapods.org [\#47](https://github.com/danielgindi/Charts/issues/47) +- Use of undeclared type 'CGFloat' [\#44](https://github.com/danielgindi/Charts/issues/44) +- CandleChartData isn't combinable with other data types [\#42](https://github.com/danielgindi/Charts/issues/42) +- Two graphs overlaying each other [\#41](https://github.com/danielgindi/Charts/issues/41) +- Charts with long Title [\#40](https://github.com/danielgindi/Charts/issues/40) +- piechart - yOffset [\#39](https://github.com/danielgindi/Charts/issues/39) +- Two different-scale axis support for different data sets [\#36](https://github.com/danielgindi/Charts/issues/36) +- IBInspectable support? [\#34](https://github.com/danielgindi/Charts/issues/34) +- ChartsDemo-swift.h file not found [\#31](https://github.com/danielgindi/Charts/issues/31) +- Pinch zoom release triggers pan [\#30](https://github.com/danielgindi/Charts/issues/30) +- UISwipeGestureRecognizer [\#28](https://github.com/danielgindi/Charts/issues/28) +- pod not support iOS 7.0 ??? [\#27](https://github.com/danielgindi/Charts/issues/27) +- How to add a line-chart view in UITableViewCell ? [\#26](https://github.com/danielgindi/Charts/issues/26) +- Charts/Charts.h file not found [\#24](https://github.com/danielgindi/Charts/issues/24) +- Carthage support [\#21](https://github.com/danielgindi/Charts/issues/21) +- Unresolved identifier `CGFloat` in iOS 7 project [\#19](https://github.com/danielgindi/Charts/issues/19) +- Last item's visibility issue when zooming [\#18](https://github.com/danielgindi/Charts/issues/18) +- Unable to hide Y values [\#17](https://github.com/danielgindi/Charts/issues/17) + +**Merged pull requests:** + +- Fix x-axis limit line render issue. [\#66](https://github.com/danielgindi/Charts/pull/66) ([mkubenka](https://github.com/mkubenka)) +- Added possibility to set the axisLabelModulus manually. [\#56](https://github.com/danielgindi/Charts/pull/56) ([webventil](https://github.com/webventil)) +- Add missing UIKit imports for iOS 7 support [\#45](https://github.com/danielgindi/Charts/pull/45) ([msanders](https://github.com/msanders)) +- Add 'init' to PieChartData to be used from Swift [\#37](https://github.com/danielgindi/Charts/pull/37) ([jmnavarro](https://github.com/jmnavarro)) +- Bubble chart work by @petester42 [\#32](https://github.com/danielgindi/Charts/pull/32) ([danielgindi](https://github.com/danielgindi)) +- Added Bubble Chart Type [\#25](https://github.com/danielgindi/Charts/pull/25) ([petester42](https://github.com/petester42)) +- Shared Charts.framework scheme [\#22](https://github.com/danielgindi/Charts/pull/22) ([zenkimoto](https://github.com/zenkimoto)) +- Add missing UIKit [\#20](https://github.com/danielgindi/Charts/pull/20) ([mkalmes](https://github.com/mkalmes)) + +## [v2.0.9](https://github.com/danielgindi/Charts/tree/v2.0.9) (2015-04-08) +[Full Changelog](https://github.com/danielgindi/Charts/compare/0.0.1...v2.0.9) + +**Closed issues:** + +- Import with Swift\(not objc\) not working [\#14](https://github.com/danielgindi/Charts/issues/14) + +**Merged pull requests:** + +- Added a podspec [\#13](https://github.com/danielgindi/Charts/pull/13) ([petester42](https://github.com/petester42)) + +## [0.0.1](https://github.com/danielgindi/Charts/tree/0.0.1) (2015-04-07) +**Closed issues:** + +- Need Version to be compatible with Xcode 6.2 [\#12](https://github.com/danielgindi/Charts/issues/12) +- Can't import "module-swift.h" [\#11](https://github.com/danielgindi/Charts/issues/11) +- A lot of compile errors. [\#10](https://github.com/danielgindi/Charts/issues/10) +- 357 Compile Errors on framework files [\#8](https://github.com/danielgindi/Charts/issues/8) +- demo crashes, and no swift examples? [\#7](https://github.com/danielgindi/Charts/issues/7) +- xcode complains ChartsDemo-Swift.h can't be found [\#6](https://github.com/danielgindi/Charts/issues/6) +- Cocoapod [\#4](https://github.com/danielgindi/Charts/issues/4) +- Trying to compile demo code,but tons of compiler errors [\#3](https://github.com/danielgindi/Charts/issues/3) +- Command failed due to signal: Segmentation fault: 11 [\#2](https://github.com/danielgindi/Charts/issues/2) + +**Merged pull requests:** + +- Fix README typo [\#5](https://github.com/danielgindi/Charts/pull/5) ([nwest](https://github.com/nwest)) +- Add a Bitdeli Badge to README [\#1](https://github.com/danielgindi/Charts/pull/1) ([bitdeli-chef](https://github.com/bitdeli-chef)) + + + +\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \ No newline at end of file diff --git a/Carthage/Checkouts/Charts/CONTRIBUTING.md b/Carthage/Checkouts/Charts/CONTRIBUTING.md new file mode 100644 index 00000000000..5b66f22f8fb --- /dev/null +++ b/Carthage/Checkouts/Charts/CONTRIBUTING.md @@ -0,0 +1,49 @@ +# How to contribute + +Bug-fixes and features often come from users of the Charts framework, and improving it greatly. We want to keep it as easy as possible to contribute changes that improve the experience for users all around the world. There are a few guidelines that we +need contributors to follow so that we can have a chance of keeping on +top of things. + +## Simple issues and bug reports + +If you are reporting a bug which can be observed visually, please add to your issue either: + +* Screenshots, if the bug is easily explainable +* A working sample project that we can compile, run, and immediately observe the issue + +## Getting Started with Contributions + +* Make sure you have a [GitHub account](https://github.com/signup/free) +* Submit a ticket for your issue, assuming one does not already exist. + * Clearly describe the issue including steps to reproduce when it is a bug. + * Make sure you fill in the earliest version (or commit number) that you know has the issue. +* Fork the repository on GitHub + +## Making Changes + +* Create a topic branch from where you want to base your work. This is usually the master branch. +* Make commits of logical units. +* Make sure your code conforms to the code style around it. It's easy, just look around! +* If you have made changes back and forth, or have made merges, your commit history might look messy and hard to understand. A single issue or change should still be in one commit. So please squash those commits together and rebase them however you need to - to make our lives easier when reading it later. +* Check for unnecessary whitespace with `git diff --check` before committing. +* Make sure your commit messages are in the proper format. + +```` + First line must be up to 50 chars (Fixes #1234) + + The first line should be a short statement as to what have changed, and should also include an issue number, prefixed with a hash. + The body of the message comes after an empty new line, and describes the changes + more thoroughly, especially if there was a special case handled there, + or maybe some trickery that only code wizards can understand. +```` + +* Make sure you have tested your changes well. +* If your changes could theoretically affect some other component or case, which you do not necessarily use, you still have to test it. +* Create a Pull Request from your topic branch to the relevant branch in the main repo. If you go to the main repo of the framework, you'll see a big green button which pretty much prepares the PR for you. You just have to hit it. + +## Making Trivial Changes + +For changes of a trivial nature to comments and documentation, it is not +always necessary to create a new ticket. In this case, it is +appropriate to start the first line of a commit with '(doc)' instead of +a ticket number. Even the default commit message the GitHub generates is fine with us. diff --git a/Carthage/Checkouts/Charts/Cartfile.private b/Carthage/Checkouts/Charts/Cartfile.private new file mode 100644 index 00000000000..ca931038c5c --- /dev/null +++ b/Carthage/Checkouts/Charts/Cartfile.private @@ -0,0 +1 @@ +github "uber/ios-snapshot-test-case" diff --git a/Carthage/Checkouts/Charts/Cartfile.resolved b/Carthage/Checkouts/Charts/Cartfile.resolved new file mode 100644 index 00000000000..7c08e7ba555 --- /dev/null +++ b/Carthage/Checkouts/Charts/Cartfile.resolved @@ -0,0 +1 @@ +github "uber/ios-snapshot-test-case" "6.0.3" diff --git a/Carthage/Checkouts/Charts/Charts.podspec b/Carthage/Checkouts/Charts/Charts.podspec new file mode 100644 index 00000000000..b40042a3058 --- /dev/null +++ b/Carthage/Checkouts/Charts/Charts.podspec @@ -0,0 +1,19 @@ +Pod::Spec.new do |s| + s.name = "Charts" + s.version = "3.3.0" + s.summary = "Charts is a powerful & easy to use chart library for iOS, tvOS and OSX (and Android)" + s.homepage = "https://github.com/danielgindi/Charts" + s.license = { :type => "Apache License, Version 2.0", :file => "LICENSE" } + s.authors = "Daniel Cohen Gindi", "Philipp Jahoda" + s.ios.deployment_target = "8.0" + s.tvos.deployment_target = "9.0" + s.osx.deployment_target = "10.11" + s.source = { :git => "https://github.com/danielgindi/Charts.git", :tag => "v#{s.version}" } + s.default_subspec = "Core" + s.swift_version = '5.0' + s.cocoapods_version = '>= 1.5.0' + + s.subspec "Core" do |ss| + ss.source_files = "Source/Charts/**/*.swift" + end +end diff --git a/Carthage/Checkouts/Charts/Charts.xcodeproj/project.pbxproj b/Carthage/Checkouts/Charts/Charts.xcodeproj/project.pbxproj new file mode 100644 index 00000000000..61309fb5800 --- /dev/null +++ b/Carthage/Checkouts/Charts/Charts.xcodeproj/project.pbxproj @@ -0,0 +1,1260 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 00B8BF5901C2D220357B0B2A /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 41DDB768A1D033A34F0EF9E0 /* Media.xcassets */; }; + 00BC23EF0E04E17188344403 /* BarChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D7184C8A5A60A3522AB9B05 /* BarChartDataProvider.swift */; }; + 02A6E6E1A82A27A66B8D08C4 /* MoveViewJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 266E162DA8B29D9AEB6A9397 /* MoveViewJob.swift */; }; + 03960E8148C6AEDACE4B77CC /* IMarker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 596963A429D485E3894C4666 /* IMarker.swift */; }; + 0511E43EF3FD2CDE7F7F15DB /* ScatterChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FD37A55B4D85D883E29C744 /* ScatterChartDataProvider.swift */; }; + 05253AFC448C107DEF54C2FE /* CombinedChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52265C1B343CCC41AF2300E3 /* CombinedChartRenderer.swift */; }; + 0529DD51622C8769C1121F90 /* CrossShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823F7DB281C6C6F069A69605 /* CrossShapeRenderer.swift */; }; + 0577C2B38BCE4C871F262714 /* AnimatedZoomViewJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C2EA58CB336967198D30D20 /* AnimatedZoomViewJob.swift */; }; + 064989461F5C99C7006E8BB3 /* Snapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064989451F5C99C7006E8BB3 /* Snapshot.swift */; }; + 0A772AEC08246FEC480673E5 /* PieRadarChartViewBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A6C9631C69B2D772BBD9232 /* PieRadarChartViewBase.swift */; }; + 0C52C70C6E6EA09BD7426386 /* RadarChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BBB57D6FA41029B08F26D7B /* RadarChartData.swift */; }; + 0CAF514A280FF6A14E2A1A23 /* CombinedChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11EF1FE22549E885C8F40738 /* CombinedChartView.swift */; }; + 0D8A89398F9BD5DCC8D7F976 /* ICandleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18BFB0A14A5C47A302A597D9 /* ICandleChartDataSet.swift */; }; + 11F68AA2EBF822D7208EE002 /* YAxisRendererRadarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA5A16F4A382813C4FE8BDF9 /* YAxisRendererRadarChart.swift */; }; + 1311BEC21E9CC264E971EFAF /* ILineRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F7E6A99D82E6AE3804D5A39 /* ILineRadarChartDataSet.swift */; }; + 135F11CE20425AF600D655A3 /* PieChartTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 135F11CD20425AF600D655A3 /* PieChartTests.swift */; }; + 146EE16342C2BADC92E45BF2 /* ILineScatterCandleRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9249AD9AEC8C85772365A128 /* ILineScatterCandleRadarChartDataSet.swift */; }; + 17E994DA88777AA1D8CCFC58 /* BarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C31AA65EA27776F8C653C7E8 /* BarChartDataSet.swift */; }; + 203A39685CC96FC625F616E4 /* IHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 998F2BFE318471AFC05B50AC /* IHighlighter.swift */; }; + 219192CA6B4895319AB49DCA /* BarLineScatterCandleBubbleRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B1C588E9DF6FFD56D7ADF8E /* BarLineScatterCandleBubbleRenderer.swift */; }; + 224EFF991FBAAC4700CF9B3B /* EquatableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 224EFF981FBAAC4700CF9B3B /* EquatableTests.swift */; }; + 23649EFC635A76022F07FFA6 /* PieChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD02157CF8CEE1189BF681DA /* PieChartDataEntry.swift */; }; + 23FA50B2730D8C7ACA091C4F /* BarChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75F279974FE650E57A061B09 /* BarChartRenderer.swift */; }; + 24151B0729D77251A8494D70 /* LineRadarRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 105FFC9D3773A9C7A60A897F /* LineRadarRenderer.swift */; }; + 2876E17AEB1D92D7BBC4C38A /* PieChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DCD13D558BA177D5952AD66 /* PieChartView.swift */; }; + 28FEE609C5B22FD64C7E5D10 /* BarLineScatterCandleBubbleChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FF03960A871A092F5B54315 /* BarLineScatterCandleBubbleChartDataProvider.swift */; }; + 2A94F1724FEA9E16A81A8E1F /* XAxisRendererHorizontalBarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F3D55A7E6176D52DC957D27 /* XAxisRendererHorizontalBarChart.swift */; }; + 2B791E64E7C4523B1A63F72A /* ScatterChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7AD2FC320A16CA1EE0A52F4 /* ScatterChartData.swift */; }; + 2B821AAC3EBD60A73EACBCE6 /* LegendRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F715DB2C56C9E0615542625B /* LegendRenderer.swift */; }; + 2BA03CEC36BADCF682F1328B /* LineChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFABD027DAF6851088F002AC /* LineChartDataProvider.swift */; }; + 2BF85BEA981B359A65E9BF67 /* LineChartTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E1819D72CD7B6C4A4E8048 /* LineChartTests.swift */; }; + 2C40CFFC8D88BEA70E0A50B0 /* IBubbleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3788EC55EF908B0805D7C2F /* IBubbleChartDataSet.swift */; }; + 2C879FC24D7A15D70BE4063F /* PieChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E03A4987F72414A02A0631B /* PieChartData.swift */; }; + 2FBA7E982EB57932B9F3E9B5 /* YAxis.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB92A80F861C1362EED8D946 /* YAxis.swift */; }; + 3097296AC7FFA994FE4AD312 /* PieRadarHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04F7B9DF1F2D66E7279771D4 /* PieRadarHighlighter.swift */; }; + 30DCC4BAA5601B154ABADA13 /* CandleChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F8146ABC9FC311AF8CA699C /* CandleChartDataProvider.swift */; }; + 331AA2C4BC34F56C23012F02 /* CombinedChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DDE409E9ECF54D2C146A6F0 /* CombinedChartData.swift */; }; + 3395682A1E27756651FF6F4D /* BarChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0108D5925E21A47DA36A66AA /* BarChartData.swift */; }; + 369DEB23452CB436A3A1A644 /* MarkerImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 392AAEB02DD7B351D92907C2 /* MarkerImage.swift */; }; + 383D68A13E1C3D6A251E5147 /* CandleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 274116834B1B0345D622E027 /* CandleChartDataSet.swift */; }; + 3B11556EB7DC034E2FC958E4 /* BarChartTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3F5E1A69EC06E86505F7B1 /* BarChartTests.swift */; }; + 3CBE95F1E9394FA08CDCF31E /* BarHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 543729805D897CC03E5F78D3 /* BarHighlighter.swift */; }; + 40C82F2209E1BA9E41E8F3DA /* ChartColorTemplates.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6227A646166E248F90F86AD /* ChartColorTemplates.swift */; }; + 41B13F3179ACB5A3837C6E55 /* YAxisRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 688B80F1AA88AE54152BE768 /* YAxisRenderer.swift */; }; + 41BEBF8BDB9DC403B5697D67 /* XAxisRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C02C3AF5C92FCFC18224C35 /* XAxisRenderer.swift */; }; + 4272DA5D44AF7DA05A5A8287 /* BubbleChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDEAF554FD0D68EA4C0E7E49 /* BubbleChartDataProvider.swift */; }; + 4390D74986A92DEF4F4F2BF0 /* ChartLimitLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6DEBFAB1D73E944ED430B4F /* ChartLimitLine.swift */; }; + 45C459FA25DFCBE62FA6A06C /* BarChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3F8BFF1CBC58D5B9DBFFB9B /* BarChartDataEntry.swift */; }; + 48E875BBD6540BDE1C1B7D3D /* AxisBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B7AEFBF4D85B9D2EAAB3071 /* AxisBase.swift */; }; + 4E98788ABEF6496C23F3E6C6 /* HorizontalBarHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33BE9A97FFA41D3D85CAFFC7 /* HorizontalBarHighlighter.swift */; }; + 4FACC6FD308AFB231EB4A93D /* XAxisRendererRadarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC19DC2434D65FFB446A61B7 /* XAxisRendererRadarChart.swift */; }; + 50476F8E6662CAFC1EFE0723 /* IScatterChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 219BC9CEA037F897E92E45D1 /* IScatterChartDataSet.swift */; }; + 515E286E6C47594D3FFA3DD1 /* ViewPortHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72EAEBB7CF73E33565FC2896 /* ViewPortHandler.swift */; }; + 53A91F6F86740E26FE733639 /* BarLineScatterCandleBubbleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D717F0808DE7EC8A4AE9C2A /* BarLineScatterCandleBubbleChartDataSet.swift */; }; + 56E0F5EA9255B9B92876E040 /* BubbleChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2194AA554712E6BA2677F114 /* BubbleChartRenderer.swift */; }; + 5C457D9A50DA20869AD1739D /* ScatterChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18462BFDD9DEE76D51D40503 /* ScatterChartView.swift */; }; + 5DC9BC1B6C128B2C9995AB84 /* ScatterChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80D5B764EC0AE1E17E55DC67 /* ScatterChartRenderer.swift */; }; + 5F96E95C7073D21EFE02BCF7 /* LineChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DABDBBCCE6B3620C967F04A /* LineChartRenderer.swift */; }; + 60EDF735AAB7195DCFA5FE4D /* CandleStickChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA1A58428DC4780BAB4EAADC /* CandleStickChartView.swift */; }; + 6303DBDEE4FAB8E40D023BCE /* RadarChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2440DB759AB93B4A928A3F6F /* RadarChartView.swift */; }; + 63C0A21D145BFEDED5406E4D /* BubbleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44829AF0ADA583F1F0279B7 /* BubbleChartDataSet.swift */; }; + 64FA1EDB4DC1F65727D52D10 /* CombinedHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2465CB73738EBAFB46C57288 /* CombinedHighlighter.swift */; }; + 65EA404AE098EBCE8D5DE04B /* CombinedChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A140F644332704916947B58C /* CombinedChartDataProvider.swift */; }; + 66A18A8EEBAAAC2EDA31ABEC /* ChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CEC0C69C89CE9B99F3B4409 /* ChartDataSet.swift */; }; + 69EA073EDF75D49ABE1715D6 /* RadarChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC9C3D69ACB5BDE22421E15 /* RadarChartRenderer.swift */; }; + 73EDF662AD989E930D365B72 /* PieHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7036F11832C017E26AC750A4 /* PieHighlighter.swift */; }; + 758EB1C75063ED3373542F3B /* Highlight.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D64616883374310C505EC39 /* Highlight.swift */; }; + 779B46E9F13A087BFA47D539 /* DefaultAxisValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A4770E0F75EFFC30707A7C8 /* DefaultAxisValueFormatter.swift */; }; + 78084A4F1D850D5775BC139E /* XAxis.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5225ABC3C0C2F65FC094EEBB /* XAxis.swift */; }; + 795E100895C24049509F1EDE /* PieChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46D8013D44629521B1746364 /* PieChartRenderer.swift */; }; + 796D3E63A37A95FD9D1AB9A1 /* ChevronDownShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52E8344160B5E689DA3C25C /* ChevronDownShapeRenderer.swift */; }; + 7C9CE6718D18859A35146098 /* BarLineScatterCandleBubbleChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 559DB735FEA17AB90676D6CA /* BarLineScatterCandleBubbleChartData.swift */; }; + 7CB7F74752619B0270CCB0A9 /* LineRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E31A4356CC6F283C29954B /* LineRadarChartDataSet.swift */; }; + 7D546013F3A14FF5BB7F3294 /* ChartDataEntryBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12409C3EA15787C11AF0D2BC /* ChartDataEntryBase.swift */; }; + 7E7561DE19DC7CABBE0B2D3A /* LineChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0619A877C69A95ECCC440A44 /* LineChartView.swift */; }; + 7EE6EFE70CF4D8B09CAFCD01 /* AnimatedMoveViewJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA157EFF2F952192C11DF937 /* AnimatedMoveViewJob.swift */; }; + 8102A555DD6C93AC1290EA7C /* Fill.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A4CFFFB65819121595F06F1 /* Fill.swift */; }; + 81892994002C0640AD858748 /* ChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = E120E76C6F1B5877D56126DD /* ChartData.swift */; }; + 83BBAF3EDC31FD452F8BF1DB /* IRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EAD807534620E3B53327F04 /* IRadarChartDataSet.swift */; }; + 846AC09831FA93F66732591B /* YAxisRendererHorizontalBarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAE417AAA0FCA0DD00E77489 /* YAxisRendererHorizontalBarChart.swift */; }; + 8A463E2947F211C594CA5E95 /* TransformerHorizontalBarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 324C9127B53A8D39C8B49277 /* TransformerHorizontalBarChart.swift */; }; + 8A9FF54E2075A9047CC8E953 /* IShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA1D3D13180C2E3893A82546 /* IShapeRenderer.swift */; }; + 8BCCD709AACC565613D9DA68 /* CandleStickChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD5C6D20243EC2F19069AACD /* CandleStickChartRenderer.swift */; }; + 8E1192F7A7152E9DA92C56A9 /* ChartUtilsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB9062A28AAB9469752A954 /* ChartUtilsTests.swift */; }; + 8EF7B3FBE37F72CC030CD865 /* SquareShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32FC01A016DFF1BA73AF9182 /* SquareShapeRenderer.swift */; }; + 8F4B1A9060472764073DFA0B /* TriangleShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8FB6219B143F8F7DA762950 /* TriangleShapeRenderer.swift */; }; + 9360348A04723E653FBC8B18 /* MarkerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48164CCD83C51B496533CB77 /* MarkerView.swift */; }; + 93A94E1FF55041A6032891FE /* XShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23D35CF6F9177D77B6B97AE1 /* XShapeRenderer.swift */; }; + 9400725714D0DA707DDECD2E /* ViewPortJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA7BDB22C97F39A4B33E38A7 /* ViewPortJob.swift */; }; + 95B6D6F35684292A62DBEA74 /* LineChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5A75AA73C5AA381DA517959 /* LineChartDataSet.swift */; }; + 967EE2EDDE3337C5C4337C59 /* IndexAxisValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10DD0A02E3CF611BD11EBA9B /* IndexAxisValueFormatter.swift */; }; + 97AD2D4620AF917100F9C24A /* Platform+Accessibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97AD2D4520AF917100F9C24A /* Platform+Accessibility.swift */; }; + 97E033CC0ABEF0F448DAFA8E /* DataApproximator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93EF9709CF635BEE70D1ABC5 /* DataApproximator.swift */; }; + 98E2EEF45E8933E4AD182D58 /* ChartViewBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EFAD7920F76360ADB3B5F5 /* ChartViewBase.swift */; }; + 9A26C8DB1F87B01700367599 /* DataApproximator+N.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A26C8DA1F87B01700367599 /* DataApproximator+N.swift */; }; + 9C91C151608E2D6E19B1EAD1 /* Range.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F099502DA50C56204E7B744 /* Range.swift */; }; + 9F760570BCECB0BF5727AF90 /* BarLineChartViewBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45C6D3723C4E001B119CA0C8 /* BarLineChartViewBase.swift */; }; + A40ACF0CCE96EEE104B0463D /* IValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EAA8AA30C377D54D22A577A /* IValueFormatter.swift */; }; + A692D8BDE42717F69DB790BE /* HorizontalBarChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6021C9E424C36116AEA78CC9 /* HorizontalBarChartView.swift */; }; + AEE9C4E4AC02B8FB3CD21975 /* ZoomViewJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB3A4F5987E58F3E5BE855F9 /* ZoomViewJob.swift */; }; + AF4AAF3709ED9DDF6362EAE8 /* IBarLineScatterCandleBubbleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5649B272BF3EBFC8A1EF0C1 /* IBarLineScatterCandleBubbleChartDataSet.swift */; }; + B0D28C68BB9A958DC56EB214 /* DefaultValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 107D8F8163EE54D6D9E916B0 /* DefaultValueFormatter.swift */; }; + B13C74B4FF705D7B595D01EF /* IAxisValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BD9DF16AF59680A3BB49452 /* IAxisValueFormatter.swift */; }; + B539114951455C35BADAE3F3 /* PieChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4FB5E3761EF8B4D1E1E1014 /* PieChartDataSet.swift */; }; + B66817462241E3CC00017CF1 /* HorizontalBarChartTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B66817452241E3CC00017CF1 /* HorizontalBarChartTests.swift */; }; + B6BF9A561F91993A00E62A5D /* CombinedChartTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6BF9A551F91993A00E62A5D /* CombinedChartTests.swift */; }; + B6C9F450D937B87224D29D5C /* IFillFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 818AC6B12505B7C0A53D62F9 /* IFillFormatter.swift */; }; + B6DCC229615EFE706F64A37D /* LineScatterCandleRadarRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 923206233CA89FD03565FF87 /* LineScatterCandleRadarRenderer.swift */; }; + B85DEB06B4C1AFFC8A0E3295 /* CircleShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECE1B1623D3AF69CECAE8562 /* CircleShapeRenderer.swift */; }; + BEFD9518F3A74ACF8FA33308 /* Charts.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F9922F0641F7955DC6CD324 /* Charts.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C04D269AD4A373FD2B621C43 /* LineChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C978F31F23C7D21197DC2A1 /* LineChartData.swift */; }; + C09E91F67A4AC43C277E7D82 /* BubbleChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8ED233775EEC31243A6919 /* BubbleChartDataEntry.swift */; }; + C20A62D8CB9120523D5FB650 /* LegendEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7C673B9ED4340F550A9283 /* LegendEntry.swift */; }; + C2EFB4EC8C97FA9987F1B50D /* RadarChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91EEEDE2AB8F2DA3AFCF0733 /* RadarChartDataEntry.swift */; }; + C33E1AF5471A60BA42DAF52E /* RadarHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F368CF209744D8F3B85B1028 /* RadarHighlighter.swift */; }; + C3F0DDB7F0A922F0BB7EDB8A /* IBarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A53A9E42FC07FFDACA937C1 /* IBarChartDataSet.swift */; }; + C7B150D740255670DEB9F455 /* Charts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65AD9E95D9ED4DC0BD73A743 /* Charts.framework */; }; + CB785FE9B6B312408D17BC3B /* ChartUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FDA09EF973925A110506799 /* ChartUtils.swift */; }; + CC7F8198A13249B5DEBBF25E /* AnimatedViewPortJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 710D7C9B2F1DB4A331EE405A /* AnimatedViewPortJob.swift */; }; + CEF68F42A5390A73113F3663 /* Renderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F66B32AD8A878CBD6DB6ED2 /* Renderer.swift */; }; + D29BBEF55C9CC90114919CD2 /* BarChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E783CFB4889A767C76510917 /* BarChartView.swift */; }; + D326491E8BCDE54A0921E137 /* ChartHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5983826927D825EF5F855C28 /* ChartHighlighter.swift */; }; + D50B0EC2BB2245F32E757C50 /* CandleChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E698FF540029B70AC97AD7 /* CandleChartDataEntry.swift */; }; + D819331DA581C7E0AC5F8CEF /* Animator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3976E5F9D60E30CD94CE6156 /* Animator.swift */; }; + DBC9DB402CC9BB84B76968C4 /* Description.swift in Sources */ = {isa = PBXBuildFile; fileRef = B137428B41C143D5115726C4 /* Description.swift */; }; + DDE704689FDF2C0E0338488B /* CandleChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4785FEACAE4367F36FB8868 /* CandleChartData.swift */; }; + DE0F434FE8C24C52B023370F /* Transformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF475B9593B9898853814340 /* Transformer.swift */; }; + E3B28EA1E21279DF3889BCE8 /* RadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1BA6B21CBDF77A15848994F /* RadarChartDataSet.swift */; }; + E4B2F363414E84C4D4B8A885 /* BubbleChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EED352A98860E031F13AFB7 /* BubbleChartView.swift */; }; + E50D291A6B6E69BF0B56A67C /* ChartBaseDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9FE42E868A225C116537368 /* ChartBaseDataSet.swift */; }; + E68CA3DC66EB638C956E09B8 /* BubbleChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EDA3AD550AEFC93C8D15B9C /* BubbleChartData.swift */; }; + E8F0F4F47CD7D72B4EE5A794 /* IChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A32510073A303CBB38E094A /* IChartDataSet.swift */; }; + E9FF0ECB5E0CA92DBF4C1BC4 /* Platform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED23C354AFE81818D78E645 /* Platform.swift */; }; + EAEA60D22CA8C1B7E18D3F7D /* ChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = F22750328058DEC2F019646F /* ChartDataEntry.swift */; }; + EB56849433A76B08606B73EB /* ScatterChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB1DD1A0F64266A10EE94194 /* ScatterChartDataSet.swift */; }; + ECE7EAE7179A7F57CE9BBD8F /* Legend.swift in Sources */ = {isa = PBXBuildFile; fileRef = E64A75540C627E09080B402A /* Legend.swift */; }; + ECECC58CEF03B1718F8267E8 /* AxisRendererBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C75935E899183DDFA181E2CC /* AxisRendererBase.swift */; }; + F100D68395F169B93590FA96 /* HorizontalBarChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 539382766378B702660FDFB2 /* HorizontalBarChartRenderer.swift */; }; + F103D90FC5DEEA0D7BB4407E /* ChevronUpShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA70259ED16FF80D8EEB0F94 /* ChevronUpShapeRenderer.swift */; }; + F37B07008B8AE7F3909FFB9C /* ChartDataRendererBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0216EDC6A1FE272F4EB19FCF /* ChartDataRendererBase.swift */; }; + F5A209116FAC68F5903D0B46 /* ChartAnimationEasing.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB762958EE8E6521563665D /* ChartAnimationEasing.swift */; }; + F744C510DA9B85C228BBB335 /* DefaultFillFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6C1BEFDF17404666C7B6054 /* DefaultFillFormatter.swift */; }; + F941C88BF814DF51C465CB95 /* ILineChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 429E88F2729735DC092EE556 /* ILineChartDataSet.swift */; }; + FA07D034D9C3BC7795184ACA /* LineScatterCandleRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C58BD7B14BEA440783ED8D2B /* LineScatterCandleRadarChartDataSet.swift */; }; + FAAD9FF6565DED2652188584 /* IPieChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2AA6CC89F809DCCD7605B4 /* IPieChartDataSet.swift */; }; + FD37AAC0270F390FFC470A65 /* ChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62B73FCEDD3841E7B958F6A9 /* ChartDataProvider.swift */; }; + FDBDAFA7A5337C6E3992DACE /* ComponentBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8C9A105A7DB64F39DDA648B /* ComponentBase.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + C2005F425A98942473657ED2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 193FC8DF32D250560C5F5D77 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A58A4ED274A941CA248EA921; + remoteInfo = Charts; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 0108D5925E21A47DA36A66AA /* BarChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartData.swift; path = Source/Charts/Data/Implementations/Standard/BarChartData.swift; sourceTree = ""; }; + 0216EDC6A1FE272F4EB19FCF /* ChartDataRendererBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartDataRendererBase.swift; path = Source/Charts/Renderers/ChartDataRendererBase.swift; sourceTree = ""; }; + 04F7B9DF1F2D66E7279771D4 /* PieRadarHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieRadarHighlighter.swift; path = Source/Charts/Highlight/PieRadarHighlighter.swift; sourceTree = ""; }; + 0619A877C69A95ECCC440A44 /* LineChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineChartView.swift; path = Source/Charts/Charts/LineChartView.swift; sourceTree = ""; }; + 064989451F5C99C7006E8BB3 /* Snapshot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Snapshot.swift; path = Tests/Charts/Snapshot.swift; sourceTree = ""; }; + 0BD9DF16AF59680A3BB49452 /* IAxisValueFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IAxisValueFormatter.swift; path = Source/Charts/Formatters/IAxisValueFormatter.swift; sourceTree = ""; }; + 0DABDBBCCE6B3620C967F04A /* LineChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineChartRenderer.swift; path = Source/Charts/Renderers/LineChartRenderer.swift; sourceTree = ""; }; + 0DDE409E9ECF54D2C146A6F0 /* CombinedChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombinedChartData.swift; path = Source/Charts/Data/Implementations/Standard/CombinedChartData.swift; sourceTree = ""; }; + 0F099502DA50C56204E7B744 /* Range.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Range.swift; path = Source/Charts/Highlight/Range.swift; sourceTree = ""; }; + 105FFC9D3773A9C7A60A897F /* LineRadarRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineRadarRenderer.swift; path = Source/Charts/Renderers/LineRadarRenderer.swift; sourceTree = ""; }; + 107D8F8163EE54D6D9E916B0 /* DefaultValueFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultValueFormatter.swift; path = Source/Charts/Formatters/DefaultValueFormatter.swift; sourceTree = ""; }; + 10DD0A02E3CF611BD11EBA9B /* IndexAxisValueFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IndexAxisValueFormatter.swift; path = Source/Charts/Formatters/IndexAxisValueFormatter.swift; sourceTree = ""; }; + 11EF1FE22549E885C8F40738 /* CombinedChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombinedChartView.swift; path = Source/Charts/Charts/CombinedChartView.swift; sourceTree = ""; }; + 12409C3EA15787C11AF0D2BC /* ChartDataEntryBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartDataEntryBase.swift; path = Source/Charts/Data/Implementations/Standard/ChartDataEntryBase.swift; sourceTree = ""; }; + 135F11CD20425AF600D655A3 /* PieChartTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = PieChartTests.swift; path = Tests/Charts/PieChartTests.swift; sourceTree = ""; }; + 18462BFDD9DEE76D51D40503 /* ScatterChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScatterChartView.swift; path = Source/Charts/Charts/ScatterChartView.swift; sourceTree = ""; }; + 18BFB0A14A5C47A302A597D9 /* ICandleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ICandleChartDataSet.swift; path = Source/Charts/Data/Interfaces/ICandleChartDataSet.swift; sourceTree = ""; }; + 1C02C3AF5C92FCFC18224C35 /* XAxisRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XAxisRenderer.swift; path = Source/Charts/Renderers/XAxisRenderer.swift; sourceTree = ""; }; + 1CBBC58C6CE1EBEE9852CE41 /* ChartsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ChartsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 1F3D55A7E6176D52DC957D27 /* XAxisRendererHorizontalBarChart.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XAxisRendererHorizontalBarChart.swift; path = Source/Charts/Renderers/XAxisRendererHorizontalBarChart.swift; sourceTree = ""; }; + 2194AA554712E6BA2677F114 /* BubbleChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartRenderer.swift; path = Source/Charts/Renderers/BubbleChartRenderer.swift; sourceTree = ""; }; + 219BC9CEA037F897E92E45D1 /* IScatterChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IScatterChartDataSet.swift; path = Source/Charts/Data/Interfaces/IScatterChartDataSet.swift; sourceTree = ""; }; + 224EFF981FBAAC4700CF9B3B /* EquatableTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = EquatableTests.swift; path = Tests/Charts/EquatableTests.swift; sourceTree = ""; }; + 23D35CF6F9177D77B6B97AE1 /* XShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/XShapeRenderer.swift; sourceTree = ""; }; + 2440DB759AB93B4A928A3F6F /* RadarChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarChartView.swift; path = Source/Charts/Charts/RadarChartView.swift; sourceTree = ""; }; + 2465CB73738EBAFB46C57288 /* CombinedHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombinedHighlighter.swift; path = Source/Charts/Highlight/CombinedHighlighter.swift; sourceTree = ""; }; + 266E162DA8B29D9AEB6A9397 /* MoveViewJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MoveViewJob.swift; path = Source/Charts/Jobs/MoveViewJob.swift; sourceTree = ""; }; + 274116834B1B0345D622E027 /* CandleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/CandleChartDataSet.swift; sourceTree = ""; }; + 2EAD807534620E3B53327F04 /* IRadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IRadarChartDataSet.swift; path = Source/Charts/Data/Interfaces/IRadarChartDataSet.swift; sourceTree = ""; }; + 2FD37A55B4D85D883E29C744 /* ScatterChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScatterChartDataProvider.swift; path = Source/Charts/Interfaces/ScatterChartDataProvider.swift; sourceTree = ""; }; + 30EFAD7920F76360ADB3B5F5 /* ChartViewBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartViewBase.swift; path = Source/Charts/Charts/ChartViewBase.swift; sourceTree = ""; }; + 324C9127B53A8D39C8B49277 /* TransformerHorizontalBarChart.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformerHorizontalBarChart.swift; path = Source/Charts/Utils/TransformerHorizontalBarChart.swift; sourceTree = ""; }; + 32FC01A016DFF1BA73AF9182 /* SquareShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SquareShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/SquareShapeRenderer.swift; sourceTree = ""; }; + 33BE9A97FFA41D3D85CAFFC7 /* HorizontalBarHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HorizontalBarHighlighter.swift; path = Source/Charts/Highlight/HorizontalBarHighlighter.swift; sourceTree = ""; }; + 392AAEB02DD7B351D92907C2 /* MarkerImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MarkerImage.swift; path = Source/Charts/Components/MarkerImage.swift; sourceTree = ""; }; + 3976E5F9D60E30CD94CE6156 /* Animator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Animator.swift; path = Source/Charts/Animation/Animator.swift; sourceTree = ""; }; + 3A32510073A303CBB38E094A /* IChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IChartDataSet.swift; path = Source/Charts/Data/Interfaces/IChartDataSet.swift; sourceTree = ""; }; + 3D64616883374310C505EC39 /* Highlight.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Highlight.swift; path = Source/Charts/Highlight/Highlight.swift; sourceTree = ""; }; + 3ED23C354AFE81818D78E645 /* Platform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.swift; path = Source/Charts/Utils/Platform.swift; sourceTree = ""; }; + 3F8146ABC9FC311AF8CA699C /* CandleChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleChartDataProvider.swift; path = Source/Charts/Interfaces/CandleChartDataProvider.swift; sourceTree = ""; }; + 3FDA09EF973925A110506799 /* ChartUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartUtils.swift; path = Source/Charts/Utils/ChartUtils.swift; sourceTree = ""; }; + 41DDB768A1D033A34F0EF9E0 /* Media.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; name = Media.xcassets; path = "Tests/Supporting Files/Media.xcassets"; sourceTree = ""; }; + 429E88F2729735DC092EE556 /* ILineChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ILineChartDataSet.swift; path = Source/Charts/Data/Interfaces/ILineChartDataSet.swift; sourceTree = ""; }; + 45C6D3723C4E001B119CA0C8 /* BarLineChartViewBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarLineChartViewBase.swift; path = Source/Charts/Charts/BarLineChartViewBase.swift; sourceTree = ""; }; + 45E31A4356CC6F283C29954B /* LineRadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineRadarChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/LineRadarChartDataSet.swift; sourceTree = ""; }; + 46D8013D44629521B1746364 /* PieChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieChartRenderer.swift; path = Source/Charts/Renderers/PieChartRenderer.swift; sourceTree = ""; }; + 48164CCD83C51B496533CB77 /* MarkerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MarkerView.swift; path = Source/Charts/Components/MarkerView.swift; sourceTree = ""; }; + 4A6C9631C69B2D772BBD9232 /* PieRadarChartViewBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieRadarChartViewBase.swift; path = Source/Charts/Charts/PieRadarChartViewBase.swift; sourceTree = ""; }; + 4B7AEFBF4D85B9D2EAAB3071 /* AxisBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AxisBase.swift; path = Source/Charts/Components/AxisBase.swift; sourceTree = ""; }; + 4BBB57D6FA41029B08F26D7B /* RadarChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarChartData.swift; path = Source/Charts/Data/Implementations/Standard/RadarChartData.swift; sourceTree = ""; }; + 4C2EA58CB336967198D30D20 /* AnimatedZoomViewJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedZoomViewJob.swift; path = Source/Charts/Jobs/AnimatedZoomViewJob.swift; sourceTree = ""; }; + 4C978F31F23C7D21197DC2A1 /* LineChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineChartData.swift; path = Source/Charts/Data/Implementations/Standard/LineChartData.swift; sourceTree = ""; }; + 4EAA8AA30C377D54D22A577A /* IValueFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IValueFormatter.swift; path = Source/Charts/Formatters/IValueFormatter.swift; sourceTree = ""; }; + 4EED352A98860E031F13AFB7 /* BubbleChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartView.swift; path = Source/Charts/Charts/BubbleChartView.swift; sourceTree = ""; }; + 4F7E6A99D82E6AE3804D5A39 /* ILineRadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ILineRadarChartDataSet.swift; path = Source/Charts/Data/Interfaces/ILineRadarChartDataSet.swift; sourceTree = ""; }; + 4F9922F0641F7955DC6CD324 /* Charts.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Charts.h; path = "Source/Supporting Files/Charts.h"; sourceTree = ""; }; + 5225ABC3C0C2F65FC094EEBB /* XAxis.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XAxis.swift; path = Source/Charts/Components/XAxis.swift; sourceTree = ""; }; + 52265C1B343CCC41AF2300E3 /* CombinedChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombinedChartRenderer.swift; path = Source/Charts/Renderers/CombinedChartRenderer.swift; sourceTree = ""; }; + 539382766378B702660FDFB2 /* HorizontalBarChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HorizontalBarChartRenderer.swift; path = Source/Charts/Renderers/HorizontalBarChartRenderer.swift; sourceTree = ""; }; + 543729805D897CC03E5F78D3 /* BarHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarHighlighter.swift; path = Source/Charts/Highlight/BarHighlighter.swift; sourceTree = ""; }; + 559DB735FEA17AB90676D6CA /* BarLineScatterCandleBubbleChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarLineScatterCandleBubbleChartData.swift; path = Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartData.swift; sourceTree = ""; }; + 596963A429D485E3894C4666 /* IMarker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IMarker.swift; path = Source/Charts/Components/IMarker.swift; sourceTree = ""; }; + 5983826927D825EF5F855C28 /* ChartHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartHighlighter.swift; path = Source/Charts/Highlight/ChartHighlighter.swift; sourceTree = ""; }; + 5A4CFFFB65819121595F06F1 /* Fill.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Fill.swift; path = Source/Charts/Utils/Fill.swift; sourceTree = ""; }; + 5B1C588E9DF6FFD56D7ADF8E /* BarLineScatterCandleBubbleRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarLineScatterCandleBubbleRenderer.swift; path = Source/Charts/Renderers/BarLineScatterCandleBubbleRenderer.swift; sourceTree = ""; }; + 5C3F5E1A69EC06E86505F7B1 /* BarChartTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartTests.swift; path = Tests/Charts/BarChartTests.swift; sourceTree = ""; }; + 6021C9E424C36116AEA78CC9 /* HorizontalBarChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HorizontalBarChartView.swift; path = Source/Charts/Charts/HorizontalBarChartView.swift; sourceTree = ""; }; + 62B73FCEDD3841E7B958F6A9 /* ChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartDataProvider.swift; path = Source/Charts/Interfaces/ChartDataProvider.swift; sourceTree = ""; }; + 65AD9E95D9ED4DC0BD73A743 /* Charts.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Charts.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 688B80F1AA88AE54152BE768 /* YAxisRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = YAxisRenderer.swift; path = Source/Charts/Renderers/YAxisRenderer.swift; sourceTree = ""; }; + 6A4770E0F75EFFC30707A7C8 /* DefaultAxisValueFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultAxisValueFormatter.swift; path = Source/Charts/Formatters/DefaultAxisValueFormatter.swift; sourceTree = ""; }; + 6CEC0C69C89CE9B99F3B4409 /* ChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/ChartDataSet.swift; sourceTree = ""; }; + 6D717F0808DE7EC8A4AE9C2A /* BarLineScatterCandleBubbleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarLineScatterCandleBubbleChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartDataSet.swift; sourceTree = ""; }; + 6E03A4987F72414A02A0631B /* PieChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieChartData.swift; path = Source/Charts/Data/Implementations/Standard/PieChartData.swift; sourceTree = ""; }; + 6F66B32AD8A878CBD6DB6ED2 /* Renderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Renderer.swift; path = Source/Charts/Renderers/Renderer.swift; sourceTree = ""; }; + 7036F11832C017E26AC750A4 /* PieHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieHighlighter.swift; path = Source/Charts/Highlight/PieHighlighter.swift; sourceTree = ""; }; + 710D7C9B2F1DB4A331EE405A /* AnimatedViewPortJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedViewPortJob.swift; path = Source/Charts/Jobs/AnimatedViewPortJob.swift; sourceTree = ""; }; + 72EAEBB7CF73E33565FC2896 /* ViewPortHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewPortHandler.swift; path = Source/Charts/Utils/ViewPortHandler.swift; sourceTree = ""; }; + 75F279974FE650E57A061B09 /* BarChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartRenderer.swift; path = Source/Charts/Renderers/BarChartRenderer.swift; sourceTree = ""; }; + 7A53A9E42FC07FFDACA937C1 /* IBarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IBarChartDataSet.swift; path = Source/Charts/Data/Interfaces/IBarChartDataSet.swift; sourceTree = ""; }; + 7AB9062A28AAB9469752A954 /* ChartUtilsTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartUtilsTests.swift; path = Tests/Charts/ChartUtilsTests.swift; sourceTree = ""; }; + 7AC9C3D69ACB5BDE22421E15 /* RadarChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarChartRenderer.swift; path = Source/Charts/Renderers/RadarChartRenderer.swift; sourceTree = ""; }; + 7EDA3AD550AEFC93C8D15B9C /* BubbleChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartData.swift; path = Source/Charts/Data/Implementations/Standard/BubbleChartData.swift; sourceTree = ""; }; + 80D5B764EC0AE1E17E55DC67 /* ScatterChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScatterChartRenderer.swift; path = Source/Charts/Renderers/ScatterChartRenderer.swift; sourceTree = ""; }; + 818AC6B12505B7C0A53D62F9 /* IFillFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IFillFormatter.swift; path = Source/Charts/Formatters/IFillFormatter.swift; sourceTree = ""; }; + 823F7DB281C6C6F069A69605 /* CrossShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CrossShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/CrossShapeRenderer.swift; sourceTree = ""; }; + 8FF03960A871A092F5B54315 /* BarLineScatterCandleBubbleChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarLineScatterCandleBubbleChartDataProvider.swift; path = Source/Charts/Interfaces/BarLineScatterCandleBubbleChartDataProvider.swift; sourceTree = ""; }; + 910DBFE1DA1B2CA237A736DF /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = Info.plist; path = "Source/Supporting Files/Info.plist"; sourceTree = ""; }; + 91EEEDE2AB8F2DA3AFCF0733 /* RadarChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/RadarChartDataEntry.swift; sourceTree = ""; }; + 923206233CA89FD03565FF87 /* LineScatterCandleRadarRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineScatterCandleRadarRenderer.swift; path = Source/Charts/Renderers/LineScatterCandleRadarRenderer.swift; sourceTree = ""; }; + 9249AD9AEC8C85772365A128 /* ILineScatterCandleRadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ILineScatterCandleRadarChartDataSet.swift; path = Source/Charts/Data/Interfaces/ILineScatterCandleRadarChartDataSet.swift; sourceTree = ""; }; + 93EF9709CF635BEE70D1ABC5 /* DataApproximator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataApproximator.swift; path = Source/Charts/Filters/DataApproximator.swift; sourceTree = ""; }; + 97AD2D4520AF917100F9C24A /* Platform+Accessibility.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Platform+Accessibility.swift"; path = "Source/Charts/Utils/Platform+Accessibility.swift"; sourceTree = ""; }; + 998F2BFE318471AFC05B50AC /* IHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IHighlighter.swift; path = Source/Charts/Highlight/IHighlighter.swift; sourceTree = ""; }; + 9A26C8DA1F87B01700367599 /* DataApproximator+N.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "DataApproximator+N.swift"; path = "Source/Charts/Filters/DataApproximator+N.swift"; sourceTree = ""; }; + 9D7184C8A5A60A3522AB9B05 /* BarChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartDataProvider.swift; path = Source/Charts/Interfaces/BarChartDataProvider.swift; sourceTree = ""; }; + 9DCD13D558BA177D5952AD66 /* PieChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieChartView.swift; path = Source/Charts/Charts/PieChartView.swift; sourceTree = ""; }; + 9E7C673B9ED4340F550A9283 /* LegendEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LegendEntry.swift; path = Source/Charts/Components/LegendEntry.swift; sourceTree = ""; }; + A140F644332704916947B58C /* CombinedChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombinedChartDataProvider.swift; path = Source/Charts/Interfaces/CombinedChartDataProvider.swift; sourceTree = ""; }; + A4FB5E3761EF8B4D1E1E1014 /* PieChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/PieChartDataSet.swift; sourceTree = ""; }; + A5649B272BF3EBFC8A1EF0C1 /* IBarLineScatterCandleBubbleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IBarLineScatterCandleBubbleChartDataSet.swift; path = Source/Charts/Data/Interfaces/IBarLineScatterCandleBubbleChartDataSet.swift; sourceTree = ""; }; + A5A75AA73C5AA381DA517959 /* LineChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/LineChartDataSet.swift; sourceTree = ""; }; + AA5A16F4A382813C4FE8BDF9 /* YAxisRendererRadarChart.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = YAxisRendererRadarChart.swift; path = Source/Charts/Renderers/YAxisRendererRadarChart.swift; sourceTree = ""; }; + AA70259ED16FF80D8EEB0F94 /* ChevronUpShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChevronUpShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/ChevronUpShapeRenderer.swift; sourceTree = ""; }; + B137428B41C143D5115726C4 /* Description.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Description.swift; path = Source/Charts/Components/Description.swift; sourceTree = ""; }; + B1BA6B21CBDF77A15848994F /* RadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/RadarChartDataSet.swift; sourceTree = ""; }; + B44829AF0ADA583F1F0279B7 /* BubbleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/BubbleChartDataSet.swift; sourceTree = ""; }; + B66817452241E3CC00017CF1 /* HorizontalBarChartTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = HorizontalBarChartTests.swift; path = Tests/Charts/HorizontalBarChartTests.swift; sourceTree = ""; }; + B6BF9A551F91993A00E62A5D /* CombinedChartTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = CombinedChartTests.swift; path = Tests/Charts/CombinedChartTests.swift; sourceTree = ""; }; + BA157EFF2F952192C11DF937 /* AnimatedMoveViewJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedMoveViewJob.swift; path = Source/Charts/Jobs/AnimatedMoveViewJob.swift; sourceTree = ""; }; + BA1A58428DC4780BAB4EAADC /* CandleStickChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleStickChartView.swift; path = Source/Charts/Charts/CandleStickChartView.swift; sourceTree = ""; }; + BC19DC2434D65FFB446A61B7 /* XAxisRendererRadarChart.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XAxisRendererRadarChart.swift; path = Source/Charts/Renderers/XAxisRendererRadarChart.swift; sourceTree = ""; }; + BD02157CF8CEE1189BF681DA /* PieChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/PieChartDataEntry.swift; sourceTree = ""; }; + BD5C6D20243EC2F19069AACD /* CandleStickChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleStickChartRenderer.swift; path = Source/Charts/Renderers/CandleStickChartRenderer.swift; sourceTree = ""; }; + BFABD027DAF6851088F002AC /* LineChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineChartDataProvider.swift; path = Source/Charts/Interfaces/LineChartDataProvider.swift; sourceTree = ""; }; + C31AA65EA27776F8C653C7E8 /* BarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift; sourceTree = ""; }; + C52E8344160B5E689DA3C25C /* ChevronDownShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChevronDownShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/ChevronDownShapeRenderer.swift; sourceTree = ""; }; + C574E1BC7E12D937A5471EF8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = Info.plist; path = "Tests/Supporting Files/Info.plist"; sourceTree = ""; }; + C58BD7B14BEA440783ED8D2B /* LineScatterCandleRadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineScatterCandleRadarChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/LineScatterCandleRadarChartDataSet.swift; sourceTree = ""; }; + C75935E899183DDFA181E2CC /* AxisRendererBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AxisRendererBase.swift; path = Source/Charts/Renderers/AxisRendererBase.swift; sourceTree = ""; }; + C8C9A105A7DB64F39DDA648B /* ComponentBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ComponentBase.swift; path = Source/Charts/Components/ComponentBase.swift; sourceTree = ""; }; + C8FB6219B143F8F7DA762950 /* TriangleShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TriangleShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/TriangleShapeRenderer.swift; sourceTree = ""; }; + C9FE42E868A225C116537368 /* ChartBaseDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartBaseDataSet.swift; path = Source/Charts/Data/Implementations/ChartBaseDataSet.swift; sourceTree = ""; }; + CB1DD1A0F64266A10EE94194 /* ScatterChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScatterChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/ScatterChartDataSet.swift; sourceTree = ""; }; + D2E1819D72CD7B6C4A4E8048 /* LineChartTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineChartTests.swift; path = Tests/Charts/LineChartTests.swift; sourceTree = ""; }; + D2E698FF540029B70AC97AD7 /* CandleChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/CandleChartDataEntry.swift; sourceTree = ""; }; + D6C1BEFDF17404666C7B6054 /* DefaultFillFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultFillFormatter.swift; path = Source/Charts/Formatters/DefaultFillFormatter.swift; sourceTree = ""; }; + DA2AA6CC89F809DCCD7605B4 /* IPieChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IPieChartDataSet.swift; path = Source/Charts/Data/Interfaces/IPieChartDataSet.swift; sourceTree = ""; }; + DD8ED233775EEC31243A6919 /* BubbleChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/BubbleChartDataEntry.swift; sourceTree = ""; }; + DFB762958EE8E6521563665D /* ChartAnimationEasing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartAnimationEasing.swift; path = Source/Charts/Animation/ChartAnimationEasing.swift; sourceTree = ""; }; + E120E76C6F1B5877D56126DD /* ChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartData.swift; path = Source/Charts/Data/Implementations/Standard/ChartData.swift; sourceTree = ""; }; + E3F8BFF1CBC58D5B9DBFFB9B /* BarChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/BarChartDataEntry.swift; sourceTree = ""; }; + E64A75540C627E09080B402A /* Legend.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Legend.swift; path = Source/Charts/Components/Legend.swift; sourceTree = ""; }; + E783CFB4889A767C76510917 /* BarChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartView.swift; path = Source/Charts/Charts/BarChartView.swift; sourceTree = ""; }; + E7AD2FC320A16CA1EE0A52F4 /* ScatterChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScatterChartData.swift; path = Source/Charts/Data/Implementations/Standard/ScatterChartData.swift; sourceTree = ""; }; + EAE417AAA0FCA0DD00E77489 /* YAxisRendererHorizontalBarChart.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = YAxisRendererHorizontalBarChart.swift; path = Source/Charts/Renderers/YAxisRendererHorizontalBarChart.swift; sourceTree = ""; }; + ECE1B1623D3AF69CECAE8562 /* CircleShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CircleShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/CircleShapeRenderer.swift; sourceTree = ""; }; + EDEAF554FD0D68EA4C0E7E49 /* BubbleChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartDataProvider.swift; path = Source/Charts/Interfaces/BubbleChartDataProvider.swift; sourceTree = ""; }; + F22750328058DEC2F019646F /* ChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/ChartDataEntry.swift; sourceTree = ""; }; + F368CF209744D8F3B85B1028 /* RadarHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarHighlighter.swift; path = Source/Charts/Highlight/RadarHighlighter.swift; sourceTree = ""; }; + F3788EC55EF908B0805D7C2F /* IBubbleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IBubbleChartDataSet.swift; path = Source/Charts/Data/Interfaces/IBubbleChartDataSet.swift; sourceTree = ""; }; + F4785FEACAE4367F36FB8868 /* CandleChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleChartData.swift; path = Source/Charts/Data/Implementations/Standard/CandleChartData.swift; sourceTree = ""; }; + F6227A646166E248F90F86AD /* ChartColorTemplates.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartColorTemplates.swift; path = Source/Charts/Utils/ChartColorTemplates.swift; sourceTree = ""; }; + F6DEBFAB1D73E944ED430B4F /* ChartLimitLine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartLimitLine.swift; path = Source/Charts/Components/ChartLimitLine.swift; sourceTree = ""; }; + F715DB2C56C9E0615542625B /* LegendRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LegendRenderer.swift; path = Source/Charts/Renderers/LegendRenderer.swift; sourceTree = ""; }; + FA1D3D13180C2E3893A82546 /* IShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/IShapeRenderer.swift; sourceTree = ""; }; + FA7BDB22C97F39A4B33E38A7 /* ViewPortJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewPortJob.swift; path = Source/Charts/Jobs/ViewPortJob.swift; sourceTree = ""; }; + FB3A4F5987E58F3E5BE855F9 /* ZoomViewJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ZoomViewJob.swift; path = Source/Charts/Jobs/ZoomViewJob.swift; sourceTree = ""; }; + FB92A80F861C1362EED8D946 /* YAxis.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = YAxis.swift; path = Source/Charts/Components/YAxis.swift; sourceTree = ""; }; + FF475B9593B9898853814340 /* Transformer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Transformer.swift; path = Source/Charts/Utils/Transformer.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 77997192275C47C45A0A2E9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C7B150D740255670DEB9F455 /* Charts.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C16A09321DC2DCF289FF0E3B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 031D7C33F3BF172E30664862 /* Interfaces */ = { + isa = PBXGroup; + children = ( + 9D7184C8A5A60A3522AB9B05 /* BarChartDataProvider.swift */, + 8FF03960A871A092F5B54315 /* BarLineScatterCandleBubbleChartDataProvider.swift */, + EDEAF554FD0D68EA4C0E7E49 /* BubbleChartDataProvider.swift */, + 3F8146ABC9FC311AF8CA699C /* CandleChartDataProvider.swift */, + 62B73FCEDD3841E7B958F6A9 /* ChartDataProvider.swift */, + A140F644332704916947B58C /* CombinedChartDataProvider.swift */, + BFABD027DAF6851088F002AC /* LineChartDataProvider.swift */, + 2FD37A55B4D85D883E29C744 /* ScatterChartDataProvider.swift */, + ); + name = Interfaces; + sourceTree = ""; + }; + 033FD152BB2F906750106A85 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + 098621EDFBF928494B94BEA1 /* Data */ = { + isa = PBXGroup; + children = ( + 3B9DD76FCE8D873300A822C7 /* Implementations */, + DB2D9648877455028EBEAA8F /* Interfaces */, + ); + name = Data; + sourceTree = ""; + }; + 20C350D33133A4D89BB365B1 /* Source */ = { + isa = PBXGroup; + children = ( + E9F158C8C566B26AFD775911 /* Supporting Files */, + 2647844720BC6574A544A337 /* Charts */, + ); + name = Source; + sourceTree = ""; + }; + 2647844720BC6574A544A337 /* Charts */ = { + isa = PBXGroup; + children = ( + A49C1F0F9CCD6E5C143C29F4 /* Animation */, + 8C531E3F3C3DE5843C93C3DA /* Charts */, + 51EF1986C9884C25EED1C2CB /* Components */, + 098621EDFBF928494B94BEA1 /* Data */, + AA79AB82B0ADCA926510B73E /* Filters */, + 74A391010038924F637D6752 /* Formatters */, + 42824E1F334B0C484AF4C594 /* Highlight */, + 031D7C33F3BF172E30664862 /* Interfaces */, + AD1224C45A29A5C88D6B7450 /* Jobs */, + E7589D3E7C2BD2449960AD59 /* Renderers */, + D047819AB7170595896D6FE8 /* Utils */, + ); + name = Charts; + sourceTree = ""; + }; + 3B9DD76FCE8D873300A822C7 /* Implementations */ = { + isa = PBXGroup; + children = ( + C9FE42E868A225C116537368 /* ChartBaseDataSet.swift */, + 740017197A160047EBB8A9A0 /* Standard */, + ); + name = Implementations; + sourceTree = ""; + }; + 42824E1F334B0C484AF4C594 /* Highlight */ = { + isa = PBXGroup; + children = ( + 543729805D897CC03E5F78D3 /* BarHighlighter.swift */, + 5983826927D825EF5F855C28 /* ChartHighlighter.swift */, + 2465CB73738EBAFB46C57288 /* CombinedHighlighter.swift */, + 3D64616883374310C505EC39 /* Highlight.swift */, + 33BE9A97FFA41D3D85CAFFC7 /* HorizontalBarHighlighter.swift */, + 998F2BFE318471AFC05B50AC /* IHighlighter.swift */, + 7036F11832C017E26AC750A4 /* PieHighlighter.swift */, + 04F7B9DF1F2D66E7279771D4 /* PieRadarHighlighter.swift */, + F368CF209744D8F3B85B1028 /* RadarHighlighter.swift */, + 0F099502DA50C56204E7B744 /* Range.swift */, + ); + name = Highlight; + sourceTree = ""; + }; + 51EF1986C9884C25EED1C2CB /* Components */ = { + isa = PBXGroup; + children = ( + 4B7AEFBF4D85B9D2EAAB3071 /* AxisBase.swift */, + F6DEBFAB1D73E944ED430B4F /* ChartLimitLine.swift */, + C8C9A105A7DB64F39DDA648B /* ComponentBase.swift */, + B137428B41C143D5115726C4 /* Description.swift */, + 596963A429D485E3894C4666 /* IMarker.swift */, + E64A75540C627E09080B402A /* Legend.swift */, + 9E7C673B9ED4340F550A9283 /* LegendEntry.swift */, + 392AAEB02DD7B351D92907C2 /* MarkerImage.swift */, + 48164CCD83C51B496533CB77 /* MarkerView.swift */, + 5225ABC3C0C2F65FC094EEBB /* XAxis.swift */, + FB92A80F861C1362EED8D946 /* YAxis.swift */, + ); + name = Components; + sourceTree = ""; + }; + 740017197A160047EBB8A9A0 /* Standard */ = { + isa = PBXGroup; + children = ( + 0108D5925E21A47DA36A66AA /* BarChartData.swift */, + E3F8BFF1CBC58D5B9DBFFB9B /* BarChartDataEntry.swift */, + C31AA65EA27776F8C653C7E8 /* BarChartDataSet.swift */, + 559DB735FEA17AB90676D6CA /* BarLineScatterCandleBubbleChartData.swift */, + 6D717F0808DE7EC8A4AE9C2A /* BarLineScatterCandleBubbleChartDataSet.swift */, + 7EDA3AD550AEFC93C8D15B9C /* BubbleChartData.swift */, + DD8ED233775EEC31243A6919 /* BubbleChartDataEntry.swift */, + B44829AF0ADA583F1F0279B7 /* BubbleChartDataSet.swift */, + F4785FEACAE4367F36FB8868 /* CandleChartData.swift */, + D2E698FF540029B70AC97AD7 /* CandleChartDataEntry.swift */, + 274116834B1B0345D622E027 /* CandleChartDataSet.swift */, + E120E76C6F1B5877D56126DD /* ChartData.swift */, + F22750328058DEC2F019646F /* ChartDataEntry.swift */, + 12409C3EA15787C11AF0D2BC /* ChartDataEntryBase.swift */, + 6CEC0C69C89CE9B99F3B4409 /* ChartDataSet.swift */, + 0DDE409E9ECF54D2C146A6F0 /* CombinedChartData.swift */, + 4C978F31F23C7D21197DC2A1 /* LineChartData.swift */, + A5A75AA73C5AA381DA517959 /* LineChartDataSet.swift */, + 45E31A4356CC6F283C29954B /* LineRadarChartDataSet.swift */, + C58BD7B14BEA440783ED8D2B /* LineScatterCandleRadarChartDataSet.swift */, + 6E03A4987F72414A02A0631B /* PieChartData.swift */, + BD02157CF8CEE1189BF681DA /* PieChartDataEntry.swift */, + A4FB5E3761EF8B4D1E1E1014 /* PieChartDataSet.swift */, + 4BBB57D6FA41029B08F26D7B /* RadarChartData.swift */, + 91EEEDE2AB8F2DA3AFCF0733 /* RadarChartDataEntry.swift */, + B1BA6B21CBDF77A15848994F /* RadarChartDataSet.swift */, + E7AD2FC320A16CA1EE0A52F4 /* ScatterChartData.swift */, + CB1DD1A0F64266A10EE94194 /* ScatterChartDataSet.swift */, + ); + name = Standard; + sourceTree = ""; + }; + 74A391010038924F637D6752 /* Formatters */ = { + isa = PBXGroup; + children = ( + 6A4770E0F75EFFC30707A7C8 /* DefaultAxisValueFormatter.swift */, + D6C1BEFDF17404666C7B6054 /* DefaultFillFormatter.swift */, + 107D8F8163EE54D6D9E916B0 /* DefaultValueFormatter.swift */, + 0BD9DF16AF59680A3BB49452 /* IAxisValueFormatter.swift */, + 818AC6B12505B7C0A53D62F9 /* IFillFormatter.swift */, + 10DD0A02E3CF611BD11EBA9B /* IndexAxisValueFormatter.swift */, + 4EAA8AA30C377D54D22A577A /* IValueFormatter.swift */, + ); + name = Formatters; + sourceTree = ""; + }; + 865A1CF149F52850CAB7F177 = { + isa = PBXGroup; + children = ( + AB2D554102718F209377399E /* Products */, + 033FD152BB2F906750106A85 /* Frameworks */, + 20C350D33133A4D89BB365B1 /* Source */, + D2C26AC015E753014C7571E4 /* Tests */, + ); + sourceTree = ""; + }; + 8C531E3F3C3DE5843C93C3DA /* Charts */ = { + isa = PBXGroup; + children = ( + E783CFB4889A767C76510917 /* BarChartView.swift */, + 45C6D3723C4E001B119CA0C8 /* BarLineChartViewBase.swift */, + 4EED352A98860E031F13AFB7 /* BubbleChartView.swift */, + BA1A58428DC4780BAB4EAADC /* CandleStickChartView.swift */, + 30EFAD7920F76360ADB3B5F5 /* ChartViewBase.swift */, + 11EF1FE22549E885C8F40738 /* CombinedChartView.swift */, + 6021C9E424C36116AEA78CC9 /* HorizontalBarChartView.swift */, + 0619A877C69A95ECCC440A44 /* LineChartView.swift */, + 9DCD13D558BA177D5952AD66 /* PieChartView.swift */, + 4A6C9631C69B2D772BBD9232 /* PieRadarChartViewBase.swift */, + 2440DB759AB93B4A928A3F6F /* RadarChartView.swift */, + 18462BFDD9DEE76D51D40503 /* ScatterChartView.swift */, + ); + name = Charts; + sourceTree = ""; + }; + 9613A7C800C7F065A823D587 /* Charts */ = { + isa = PBXGroup; + children = ( + 5C3F5E1A69EC06E86505F7B1 /* BarChartTests.swift */, + B66817452241E3CC00017CF1 /* HorizontalBarChartTests.swift */, + 224EFF981FBAAC4700CF9B3B /* EquatableTests.swift */, + 7AB9062A28AAB9469752A954 /* ChartUtilsTests.swift */, + B6BF9A551F91993A00E62A5D /* CombinedChartTests.swift */, + D2E1819D72CD7B6C4A4E8048 /* LineChartTests.swift */, + 135F11CD20425AF600D655A3 /* PieChartTests.swift */, + 064989451F5C99C7006E8BB3 /* Snapshot.swift */, + ); + name = Charts; + sourceTree = ""; + }; + A49C1F0F9CCD6E5C143C29F4 /* Animation */ = { + isa = PBXGroup; + children = ( + 3976E5F9D60E30CD94CE6156 /* Animator.swift */, + DFB762958EE8E6521563665D /* ChartAnimationEasing.swift */, + ); + name = Animation; + sourceTree = ""; + }; + AA79AB82B0ADCA926510B73E /* Filters */ = { + isa = PBXGroup; + children = ( + 93EF9709CF635BEE70D1ABC5 /* DataApproximator.swift */, + 9A26C8DA1F87B01700367599 /* DataApproximator+N.swift */, + ); + name = Filters; + sourceTree = ""; + }; + AB2D554102718F209377399E /* Products */ = { + isa = PBXGroup; + children = ( + 65AD9E95D9ED4DC0BD73A743 /* Charts.framework */, + 1CBBC58C6CE1EBEE9852CE41 /* ChartsTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + AD1224C45A29A5C88D6B7450 /* Jobs */ = { + isa = PBXGroup; + children = ( + BA157EFF2F952192C11DF937 /* AnimatedMoveViewJob.swift */, + 710D7C9B2F1DB4A331EE405A /* AnimatedViewPortJob.swift */, + 4C2EA58CB336967198D30D20 /* AnimatedZoomViewJob.swift */, + 266E162DA8B29D9AEB6A9397 /* MoveViewJob.swift */, + FA7BDB22C97F39A4B33E38A7 /* ViewPortJob.swift */, + FB3A4F5987E58F3E5BE855F9 /* ZoomViewJob.swift */, + ); + name = Jobs; + sourceTree = ""; + }; + BF662941E21BC049994B2598 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + C574E1BC7E12D937A5471EF8 /* Info.plist */, + 41DDB768A1D033A34F0EF9E0 /* Media.xcassets */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + D047819AB7170595896D6FE8 /* Utils */ = { + isa = PBXGroup; + children = ( + F6227A646166E248F90F86AD /* ChartColorTemplates.swift */, + 3FDA09EF973925A110506799 /* ChartUtils.swift */, + 5A4CFFFB65819121595F06F1 /* Fill.swift */, + 3ED23C354AFE81818D78E645 /* Platform.swift */, + 97AD2D4520AF917100F9C24A /* Platform+Accessibility.swift */, + FF475B9593B9898853814340 /* Transformer.swift */, + 324C9127B53A8D39C8B49277 /* TransformerHorizontalBarChart.swift */, + 72EAEBB7CF73E33565FC2896 /* ViewPortHandler.swift */, + ); + name = Utils; + sourceTree = ""; + }; + D2C26AC015E753014C7571E4 /* Tests */ = { + isa = PBXGroup; + children = ( + BF662941E21BC049994B2598 /* Supporting Files */, + 9613A7C800C7F065A823D587 /* Charts */, + ); + name = Tests; + sourceTree = ""; + }; + DB2D9648877455028EBEAA8F /* Interfaces */ = { + isa = PBXGroup; + children = ( + 7A53A9E42FC07FFDACA937C1 /* IBarChartDataSet.swift */, + A5649B272BF3EBFC8A1EF0C1 /* IBarLineScatterCandleBubbleChartDataSet.swift */, + F3788EC55EF908B0805D7C2F /* IBubbleChartDataSet.swift */, + 18BFB0A14A5C47A302A597D9 /* ICandleChartDataSet.swift */, + 3A32510073A303CBB38E094A /* IChartDataSet.swift */, + 429E88F2729735DC092EE556 /* ILineChartDataSet.swift */, + 4F7E6A99D82E6AE3804D5A39 /* ILineRadarChartDataSet.swift */, + 9249AD9AEC8C85772365A128 /* ILineScatterCandleRadarChartDataSet.swift */, + DA2AA6CC89F809DCCD7605B4 /* IPieChartDataSet.swift */, + 2EAD807534620E3B53327F04 /* IRadarChartDataSet.swift */, + 219BC9CEA037F897E92E45D1 /* IScatterChartDataSet.swift */, + ); + name = Interfaces; + sourceTree = ""; + }; + E7589D3E7C2BD2449960AD59 /* Renderers */ = { + isa = PBXGroup; + children = ( + C75935E899183DDFA181E2CC /* AxisRendererBase.swift */, + 75F279974FE650E57A061B09 /* BarChartRenderer.swift */, + 5B1C588E9DF6FFD56D7ADF8E /* BarLineScatterCandleBubbleRenderer.swift */, + 2194AA554712E6BA2677F114 /* BubbleChartRenderer.swift */, + BD5C6D20243EC2F19069AACD /* CandleStickChartRenderer.swift */, + 0216EDC6A1FE272F4EB19FCF /* ChartDataRendererBase.swift */, + 52265C1B343CCC41AF2300E3 /* CombinedChartRenderer.swift */, + 539382766378B702660FDFB2 /* HorizontalBarChartRenderer.swift */, + F715DB2C56C9E0615542625B /* LegendRenderer.swift */, + 0DABDBBCCE6B3620C967F04A /* LineChartRenderer.swift */, + 105FFC9D3773A9C7A60A897F /* LineRadarRenderer.swift */, + 923206233CA89FD03565FF87 /* LineScatterCandleRadarRenderer.swift */, + 46D8013D44629521B1746364 /* PieChartRenderer.swift */, + 7AC9C3D69ACB5BDE22421E15 /* RadarChartRenderer.swift */, + 6F66B32AD8A878CBD6DB6ED2 /* Renderer.swift */, + F7059584CB30EF419CFB3335 /* Scatter */, + 80D5B764EC0AE1E17E55DC67 /* ScatterChartRenderer.swift */, + 1C02C3AF5C92FCFC18224C35 /* XAxisRenderer.swift */, + 1F3D55A7E6176D52DC957D27 /* XAxisRendererHorizontalBarChart.swift */, + BC19DC2434D65FFB446A61B7 /* XAxisRendererRadarChart.swift */, + 688B80F1AA88AE54152BE768 /* YAxisRenderer.swift */, + EAE417AAA0FCA0DD00E77489 /* YAxisRendererHorizontalBarChart.swift */, + AA5A16F4A382813C4FE8BDF9 /* YAxisRendererRadarChart.swift */, + ); + name = Renderers; + sourceTree = ""; + }; + E9F158C8C566B26AFD775911 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 910DBFE1DA1B2CA237A736DF /* Info.plist */, + 4F9922F0641F7955DC6CD324 /* Charts.h */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + F7059584CB30EF419CFB3335 /* Scatter */ = { + isa = PBXGroup; + children = ( + C52E8344160B5E689DA3C25C /* ChevronDownShapeRenderer.swift */, + AA70259ED16FF80D8EEB0F94 /* ChevronUpShapeRenderer.swift */, + ECE1B1623D3AF69CECAE8562 /* CircleShapeRenderer.swift */, + 823F7DB281C6C6F069A69605 /* CrossShapeRenderer.swift */, + FA1D3D13180C2E3893A82546 /* IShapeRenderer.swift */, + 32FC01A016DFF1BA73AF9182 /* SquareShapeRenderer.swift */, + C8FB6219B143F8F7DA762950 /* TriangleShapeRenderer.swift */, + 23D35CF6F9177D77B6B97AE1 /* XShapeRenderer.swift */, + ); + name = Scatter; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + B2B2DD73E237562739EE1F83 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + BEFD9518F3A74ACF8FA33308 /* Charts.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + A58A4ED274A941CA248EA921 /* Charts */ = { + isa = PBXNativeTarget; + buildConfigurationList = F1D4AA9E26EA32041FC0E3B6 /* Build configuration list for PBXNativeTarget "Charts" */; + buildPhases = ( + B2B2DD73E237562739EE1F83 /* Headers */, + B5996DB2D9B6F0DB0E9D3F3E /* Sources */, + E257C254E738A8AE047C6FB6 /* Resources */, + C16A09321DC2DCF289FF0E3B /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Charts; + productName = Charts; + productReference = 65AD9E95D9ED4DC0BD73A743 /* Charts.framework */; + productType = "com.apple.product-type.framework"; + }; + F2749BD5443C1CB5FE2080C2 /* ChartsTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = E61E9728E2BF9CC4048B13D5 /* Build configuration list for PBXNativeTarget "ChartsTests" */; + buildPhases = ( + D6BF00523905132F162A7710 /* Build Dependencies */, + E356A2384A2368AB3D2C7912 /* Sources */, + 5B102E31AA8399941CC6248D /* Resources */, + 77997192275C47C45A0A2E9A /* Frameworks */, + 6BA68666BDA3FCF79C2A6801 /* Copy Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 8676F8A013D87F9961E92465 /* PBXTargetDependency */, + ); + name = ChartsTests; + productName = ChartsTests; + productReference = 1CBBC58C6CE1EBEE9852CE41 /* ChartsTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 193FC8DF32D250560C5F5D77 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 1020; + TargetAttributes = { + A58A4ED274A941CA248EA921 = { + LastSwiftMigration = 0900; + }; + F2749BD5443C1CB5FE2080C2 = { + LastSwiftMigration = 0900; + }; + }; + }; + buildConfigurationList = 493FF4FB1D40FC7C51DDDA6B /* Build configuration list for PBXProject "Charts" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + en, + ); + mainGroup = 865A1CF149F52850CAB7F177; + productRefGroup = AB2D554102718F209377399E /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + A58A4ED274A941CA248EA921 /* Charts */, + F2749BD5443C1CB5FE2080C2 /* ChartsTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 5B102E31AA8399941CC6248D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 00B8BF5901C2D220357B0B2A /* Media.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E257C254E738A8AE047C6FB6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 6BA68666BDA3FCF79C2A6801 /* Copy Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + FBSnapshotTestCase.framework, + ); + name = "Copy Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = " exec \"${SRCROOT}/scripts/copy-carthage-frameworks.sh\""; + }; + D6BF00523905132F162A7710 /* Build Dependencies */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + name = "Build Dependencies"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "exec \"${SRCROOT}/scripts/build-dependencies.sh\""; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + B5996DB2D9B6F0DB0E9D3F3E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D819331DA581C7E0AC5F8CEF /* Animator.swift in Sources */, + F5A209116FAC68F5903D0B46 /* ChartAnimationEasing.swift in Sources */, + D29BBEF55C9CC90114919CD2 /* BarChartView.swift in Sources */, + 9F760570BCECB0BF5727AF90 /* BarLineChartViewBase.swift in Sources */, + E4B2F363414E84C4D4B8A885 /* BubbleChartView.swift in Sources */, + 60EDF735AAB7195DCFA5FE4D /* CandleStickChartView.swift in Sources */, + 98E2EEF45E8933E4AD182D58 /* ChartViewBase.swift in Sources */, + 0CAF514A280FF6A14E2A1A23 /* CombinedChartView.swift in Sources */, + A692D8BDE42717F69DB790BE /* HorizontalBarChartView.swift in Sources */, + 7E7561DE19DC7CABBE0B2D3A /* LineChartView.swift in Sources */, + 2876E17AEB1D92D7BBC4C38A /* PieChartView.swift in Sources */, + 0A772AEC08246FEC480673E5 /* PieRadarChartViewBase.swift in Sources */, + 6303DBDEE4FAB8E40D023BCE /* RadarChartView.swift in Sources */, + 5C457D9A50DA20869AD1739D /* ScatterChartView.swift in Sources */, + 48E875BBD6540BDE1C1B7D3D /* AxisBase.swift in Sources */, + 4390D74986A92DEF4F4F2BF0 /* ChartLimitLine.swift in Sources */, + FDBDAFA7A5337C6E3992DACE /* ComponentBase.swift in Sources */, + DBC9DB402CC9BB84B76968C4 /* Description.swift in Sources */, + 03960E8148C6AEDACE4B77CC /* IMarker.swift in Sources */, + ECE7EAE7179A7F57CE9BBD8F /* Legend.swift in Sources */, + C20A62D8CB9120523D5FB650 /* LegendEntry.swift in Sources */, + 369DEB23452CB436A3A1A644 /* MarkerImage.swift in Sources */, + 9360348A04723E653FBC8B18 /* MarkerView.swift in Sources */, + 78084A4F1D850D5775BC139E /* XAxis.swift in Sources */, + 2FBA7E982EB57932B9F3E9B5 /* YAxis.swift in Sources */, + E50D291A6B6E69BF0B56A67C /* ChartBaseDataSet.swift in Sources */, + 3395682A1E27756651FF6F4D /* BarChartData.swift in Sources */, + 45C459FA25DFCBE62FA6A06C /* BarChartDataEntry.swift in Sources */, + 17E994DA88777AA1D8CCFC58 /* BarChartDataSet.swift in Sources */, + 7C9CE6718D18859A35146098 /* BarLineScatterCandleBubbleChartData.swift in Sources */, + 53A91F6F86740E26FE733639 /* BarLineScatterCandleBubbleChartDataSet.swift in Sources */, + E68CA3DC66EB638C956E09B8 /* BubbleChartData.swift in Sources */, + C09E91F67A4AC43C277E7D82 /* BubbleChartDataEntry.swift in Sources */, + 63C0A21D145BFEDED5406E4D /* BubbleChartDataSet.swift in Sources */, + DDE704689FDF2C0E0338488B /* CandleChartData.swift in Sources */, + D50B0EC2BB2245F32E757C50 /* CandleChartDataEntry.swift in Sources */, + 383D68A13E1C3D6A251E5147 /* CandleChartDataSet.swift in Sources */, + 81892994002C0640AD858748 /* ChartData.swift in Sources */, + EAEA60D22CA8C1B7E18D3F7D /* ChartDataEntry.swift in Sources */, + 7D546013F3A14FF5BB7F3294 /* ChartDataEntryBase.swift in Sources */, + 66A18A8EEBAAAC2EDA31ABEC /* ChartDataSet.swift in Sources */, + 331AA2C4BC34F56C23012F02 /* CombinedChartData.swift in Sources */, + C04D269AD4A373FD2B621C43 /* LineChartData.swift in Sources */, + 95B6D6F35684292A62DBEA74 /* LineChartDataSet.swift in Sources */, + 7CB7F74752619B0270CCB0A9 /* LineRadarChartDataSet.swift in Sources */, + FA07D034D9C3BC7795184ACA /* LineScatterCandleRadarChartDataSet.swift in Sources */, + 2C879FC24D7A15D70BE4063F /* PieChartData.swift in Sources */, + 23649EFC635A76022F07FFA6 /* PieChartDataEntry.swift in Sources */, + B539114951455C35BADAE3F3 /* PieChartDataSet.swift in Sources */, + 0C52C70C6E6EA09BD7426386 /* RadarChartData.swift in Sources */, + C2EFB4EC8C97FA9987F1B50D /* RadarChartDataEntry.swift in Sources */, + E3B28EA1E21279DF3889BCE8 /* RadarChartDataSet.swift in Sources */, + 9A26C8DB1F87B01700367599 /* DataApproximator+N.swift in Sources */, + 2B791E64E7C4523B1A63F72A /* ScatterChartData.swift in Sources */, + EB56849433A76B08606B73EB /* ScatterChartDataSet.swift in Sources */, + C3F0DDB7F0A922F0BB7EDB8A /* IBarChartDataSet.swift in Sources */, + AF4AAF3709ED9DDF6362EAE8 /* IBarLineScatterCandleBubbleChartDataSet.swift in Sources */, + 2C40CFFC8D88BEA70E0A50B0 /* IBubbleChartDataSet.swift in Sources */, + 0D8A89398F9BD5DCC8D7F976 /* ICandleChartDataSet.swift in Sources */, + E8F0F4F47CD7D72B4EE5A794 /* IChartDataSet.swift in Sources */, + F941C88BF814DF51C465CB95 /* ILineChartDataSet.swift in Sources */, + 1311BEC21E9CC264E971EFAF /* ILineRadarChartDataSet.swift in Sources */, + 146EE16342C2BADC92E45BF2 /* ILineScatterCandleRadarChartDataSet.swift in Sources */, + FAAD9FF6565DED2652188584 /* IPieChartDataSet.swift in Sources */, + 83BBAF3EDC31FD452F8BF1DB /* IRadarChartDataSet.swift in Sources */, + 50476F8E6662CAFC1EFE0723 /* IScatterChartDataSet.swift in Sources */, + 97E033CC0ABEF0F448DAFA8E /* DataApproximator.swift in Sources */, + 779B46E9F13A087BFA47D539 /* DefaultAxisValueFormatter.swift in Sources */, + F744C510DA9B85C228BBB335 /* DefaultFillFormatter.swift in Sources */, + B0D28C68BB9A958DC56EB214 /* DefaultValueFormatter.swift in Sources */, + B13C74B4FF705D7B595D01EF /* IAxisValueFormatter.swift in Sources */, + B6C9F450D937B87224D29D5C /* IFillFormatter.swift in Sources */, + 967EE2EDDE3337C5C4337C59 /* IndexAxisValueFormatter.swift in Sources */, + A40ACF0CCE96EEE104B0463D /* IValueFormatter.swift in Sources */, + 3CBE95F1E9394FA08CDCF31E /* BarHighlighter.swift in Sources */, + D326491E8BCDE54A0921E137 /* ChartHighlighter.swift in Sources */, + 64FA1EDB4DC1F65727D52D10 /* CombinedHighlighter.swift in Sources */, + 758EB1C75063ED3373542F3B /* Highlight.swift in Sources */, + 4E98788ABEF6496C23F3E6C6 /* HorizontalBarHighlighter.swift in Sources */, + 203A39685CC96FC625F616E4 /* IHighlighter.swift in Sources */, + 73EDF662AD989E930D365B72 /* PieHighlighter.swift in Sources */, + 3097296AC7FFA994FE4AD312 /* PieRadarHighlighter.swift in Sources */, + C33E1AF5471A60BA42DAF52E /* RadarHighlighter.swift in Sources */, + 9C91C151608E2D6E19B1EAD1 /* Range.swift in Sources */, + 00BC23EF0E04E17188344403 /* BarChartDataProvider.swift in Sources */, + 28FEE609C5B22FD64C7E5D10 /* BarLineScatterCandleBubbleChartDataProvider.swift in Sources */, + 4272DA5D44AF7DA05A5A8287 /* BubbleChartDataProvider.swift in Sources */, + 30DCC4BAA5601B154ABADA13 /* CandleChartDataProvider.swift in Sources */, + FD37AAC0270F390FFC470A65 /* ChartDataProvider.swift in Sources */, + 65EA404AE098EBCE8D5DE04B /* CombinedChartDataProvider.swift in Sources */, + 2BA03CEC36BADCF682F1328B /* LineChartDataProvider.swift in Sources */, + 0511E43EF3FD2CDE7F7F15DB /* ScatterChartDataProvider.swift in Sources */, + 7EE6EFE70CF4D8B09CAFCD01 /* AnimatedMoveViewJob.swift in Sources */, + CC7F8198A13249B5DEBBF25E /* AnimatedViewPortJob.swift in Sources */, + 0577C2B38BCE4C871F262714 /* AnimatedZoomViewJob.swift in Sources */, + 02A6E6E1A82A27A66B8D08C4 /* MoveViewJob.swift in Sources */, + 9400725714D0DA707DDECD2E /* ViewPortJob.swift in Sources */, + AEE9C4E4AC02B8FB3CD21975 /* ZoomViewJob.swift in Sources */, + ECECC58CEF03B1718F8267E8 /* AxisRendererBase.swift in Sources */, + 23FA50B2730D8C7ACA091C4F /* BarChartRenderer.swift in Sources */, + 219192CA6B4895319AB49DCA /* BarLineScatterCandleBubbleRenderer.swift in Sources */, + 56E0F5EA9255B9B92876E040 /* BubbleChartRenderer.swift in Sources */, + 8BCCD709AACC565613D9DA68 /* CandleStickChartRenderer.swift in Sources */, + F37B07008B8AE7F3909FFB9C /* ChartDataRendererBase.swift in Sources */, + 05253AFC448C107DEF54C2FE /* CombinedChartRenderer.swift in Sources */, + F100D68395F169B93590FA96 /* HorizontalBarChartRenderer.swift in Sources */, + 2B821AAC3EBD60A73EACBCE6 /* LegendRenderer.swift in Sources */, + 5F96E95C7073D21EFE02BCF7 /* LineChartRenderer.swift in Sources */, + 24151B0729D77251A8494D70 /* LineRadarRenderer.swift in Sources */, + B6DCC229615EFE706F64A37D /* LineScatterCandleRadarRenderer.swift in Sources */, + 795E100895C24049509F1EDE /* PieChartRenderer.swift in Sources */, + 97AD2D4620AF917100F9C24A /* Platform+Accessibility.swift in Sources */, + 69EA073EDF75D49ABE1715D6 /* RadarChartRenderer.swift in Sources */, + CEF68F42A5390A73113F3663 /* Renderer.swift in Sources */, + 796D3E63A37A95FD9D1AB9A1 /* ChevronDownShapeRenderer.swift in Sources */, + F103D90FC5DEEA0D7BB4407E /* ChevronUpShapeRenderer.swift in Sources */, + B85DEB06B4C1AFFC8A0E3295 /* CircleShapeRenderer.swift in Sources */, + 0529DD51622C8769C1121F90 /* CrossShapeRenderer.swift in Sources */, + 8A9FF54E2075A9047CC8E953 /* IShapeRenderer.swift in Sources */, + 8EF7B3FBE37F72CC030CD865 /* SquareShapeRenderer.swift in Sources */, + 8F4B1A9060472764073DFA0B /* TriangleShapeRenderer.swift in Sources */, + 93A94E1FF55041A6032891FE /* XShapeRenderer.swift in Sources */, + 5DC9BC1B6C128B2C9995AB84 /* ScatterChartRenderer.swift in Sources */, + 41BEBF8BDB9DC403B5697D67 /* XAxisRenderer.swift in Sources */, + 2A94F1724FEA9E16A81A8E1F /* XAxisRendererHorizontalBarChart.swift in Sources */, + 4FACC6FD308AFB231EB4A93D /* XAxisRendererRadarChart.swift in Sources */, + 41B13F3179ACB5A3837C6E55 /* YAxisRenderer.swift in Sources */, + 846AC09831FA93F66732591B /* YAxisRendererHorizontalBarChart.swift in Sources */, + 11F68AA2EBF822D7208EE002 /* YAxisRendererRadarChart.swift in Sources */, + 40C82F2209E1BA9E41E8F3DA /* ChartColorTemplates.swift in Sources */, + CB785FE9B6B312408D17BC3B /* ChartUtils.swift in Sources */, + 8102A555DD6C93AC1290EA7C /* Fill.swift in Sources */, + E9FF0ECB5E0CA92DBF4C1BC4 /* Platform.swift in Sources */, + DE0F434FE8C24C52B023370F /* Transformer.swift in Sources */, + 8A463E2947F211C594CA5E95 /* TransformerHorizontalBarChart.swift in Sources */, + 515E286E6C47594D3FFA3DD1 /* ViewPortHandler.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E356A2384A2368AB3D2C7912 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3B11556EB7DC034E2FC958E4 /* BarChartTests.swift in Sources */, + 8E1192F7A7152E9DA92C56A9 /* ChartUtilsTests.swift in Sources */, + B6BF9A561F91993A00E62A5D /* CombinedChartTests.swift in Sources */, + 2BF85BEA981B359A65E9BF67 /* LineChartTests.swift in Sources */, + B66817462241E3CC00017CF1 /* HorizontalBarChartTests.swift in Sources */, + 135F11CE20425AF600D655A3 /* PieChartTests.swift in Sources */, + 064989461F5C99C7006E8BB3 /* Snapshot.swift in Sources */, + 224EFF991FBAAC4700CF9B3B /* EquatableTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 8676F8A013D87F9961E92465 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Charts; + target = A58A4ED274A941CA248EA921 /* Charts */; + targetProxy = C2005F425A98942473657ED2 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 0EF2164C35AB4D391B503317 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_VERSION = A; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Source/Supporting Files/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.dcg.Charts; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 4DD0BFDA94D4BC68192A1895 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + "FRAMEWORK_SEARCH_PATHS[sdk=appletv*]" = ( + "$(SRCROOT)/Carthage/Build/tvOS/", + "$(inherited)", + ); + "FRAMEWORK_SEARCH_PATHS[sdk=iphone*]" = ( + "$(SRCROOT)/Carthage/Build/iOS/", + "$(inherited)", + ); + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Tests/Supporting Files/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.dcg.ChartsTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator appletvos appletvsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TVOS_DEPLOYMENT_TARGET = 9.0; + }; + name = Debug; + }; + A17F60813C38081A2F1803D4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + SDKROOT = macosx; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + C5C79E736CA16C93F421E934 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + }; + name = Debug; + }; + D9365FBCFFEE9FCFC79EC4C7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_VERSION = A; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Source/Supporting Files/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = com.dcg.Charts; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + FA978B0A385680C0086D4D49 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + "FRAMEWORK_SEARCH_PATHS[sdk=appletv*]" = ( + "$(SRCROOT)/Carthage/Build/tvOS/", + "$(inherited)", + ); + "FRAMEWORK_SEARCH_PATHS[sdk=iphone*]" = ( + "$(SRCROOT)/Carthage/Build/iOS/", + "$(inherited)", + ); + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Tests/Supporting Files/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = com.dcg.ChartsTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator appletvos appletvsimulator"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TVOS_DEPLOYMENT_TARGET = 9.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 493FF4FB1D40FC7C51DDDA6B /* Build configuration list for PBXProject "Charts" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C5C79E736CA16C93F421E934 /* Debug */, + A17F60813C38081A2F1803D4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E61E9728E2BF9CC4048B13D5 /* Build configuration list for PBXNativeTarget "ChartsTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FA978B0A385680C0086D4D49 /* Release */, + 4DD0BFDA94D4BC68192A1895 /* Debug */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F1D4AA9E26EA32041FC0E3B6 /* Build configuration list for PBXNativeTarget "Charts" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D9365FBCFFEE9FCFC79EC4C7 /* Release */, + 0EF2164C35AB4D391B503317 /* Debug */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 193FC8DF32D250560C5F5D77 /* Project object */; +} diff --git a/Carthage/Checkouts/Charts/Charts.xcodeproj/xcshareddata/xcschemes/Charts.xcscheme b/Carthage/Checkouts/Charts/Charts.xcodeproj/xcshareddata/xcschemes/Charts.xcscheme new file mode 100644 index 00000000000..433e05112e4 --- /dev/null +++ b/Carthage/Checkouts/Charts/Charts.xcodeproj/xcshareddata/xcschemes/Charts.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/Charts/Charts.xcodeproj/xcshareddata/xcschemes/ChartsTests.xcscheme b/Carthage/Checkouts/Charts/Charts.xcodeproj/xcshareddata/xcschemes/ChartsTests.xcscheme new file mode 100644 index 00000000000..b3f7d608ae1 --- /dev/null +++ b/Carthage/Checkouts/Charts/Charts.xcodeproj/xcshareddata/xcschemes/ChartsTests.xcscheme @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/Charts/Charts.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/Charts/Charts.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000000..088d4b73294 --- /dev/null +++ b/Carthage/Checkouts/Charts/Charts.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Stats.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/Charts/Charts.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from Stats.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Carthage/Checkouts/Charts/Charts.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/ChartsDemo-iOS.xcodeproj/project.pbxproj b/Carthage/Checkouts/Charts/ChartsDemo-iOS/ChartsDemo-iOS.xcodeproj/project.pbxproj new file mode 100644 index 00000000000..bf95f7b8695 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/ChartsDemo-iOS.xcodeproj/project.pbxproj @@ -0,0 +1,1119 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 0439A3541C9FF95F00496F83 /* PiePolylineChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0439A3521C9FF95F00496F83 /* PiePolylineChartViewController.m */; }; + 0471CBFC1CA1090A00E52DBC /* PiePolylineChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0471CBFB1CA1090A00E52DBC /* PiePolylineChartViewController.xib */; }; + 0630AE511D81271B008859B0 /* Charts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0630AE411D8126C0008859B0 /* Charts.framework */; }; + 0630AE521D81271B008859B0 /* Charts.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0630AE411D8126C0008859B0 /* Charts.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 068A9B191FBBF351003CF1AD /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5B8EAF2F1AB32E15009697AA /* Images.xcassets */; }; + 068A9B1A1FBBF355003CF1AD /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B64D06EA1FB199130067418D /* Launch Screen.storyboard */; }; + 068A9B1B1FBBF366003CF1AD /* radar_marker@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5B613DA31D526AD5000F1E98 /* radar_marker@3x.png */; }; + 225B36201F6EB9A50005B3D5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B361F1F6EB9A50005B3D5 /* AppDelegate.swift */; }; + 225B36311F6EB9EE0005B3D5 /* DemoBaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B362F1F6EB9EE0005B3D5 /* DemoBaseViewController.swift */; }; + 225B36321F6EB9EE0005B3D5 /* DemoListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36301F6EB9EE0005B3D5 /* DemoListViewController.swift */; }; + 225B36381F6EBA040005B3D5 /* IntAxisValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36341F6EB9FE0005B3D5 /* IntAxisValueFormatter.swift */; }; + 225B36391F6EBA040005B3D5 /* DayAxisValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36351F6EB9FE0005B3D5 /* DayAxisValueFormatter.swift */; }; + 225B363A1F6EBA040005B3D5 /* DateValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36361F6EB9FE0005B3D5 /* DateValueFormatter.swift */; }; + 225B363B1F6EBA040005B3D5 /* LargeValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36371F6EB9FE0005B3D5 /* LargeValueFormatter.swift */; }; + 225B36401F6EBA1D0005B3D5 /* XYMarkerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B363D1F6EBA180005B3D5 /* XYMarkerView.swift */; }; + 225B36411F6EBA1D0005B3D5 /* BalloonMarker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B363E1F6EBA180005B3D5 /* BalloonMarker.swift */; }; + 225B36421F6EBA1D0005B3D5 /* RadarMarkerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B363F1F6EBA180005B3D5 /* RadarMarkerView.swift */; }; + 225B365B1F6EBA470005B3D5 /* MultipleLinesChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36441F6EBA410005B3D5 /* MultipleLinesChartViewController.swift */; }; + 225B365C1F6EBA470005B3D5 /* MultipleBarChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36451F6EBA410005B3D5 /* MultipleBarChartViewController.swift */; }; + 225B365D1F6EBA470005B3D5 /* HalfPieChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36461F6EBA410005B3D5 /* HalfPieChartViewController.swift */; }; + 225B365E1F6EBA470005B3D5 /* LineChartTimeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36471F6EBA410005B3D5 /* LineChartTimeViewController.swift */; }; + 225B365F1F6EBA470005B3D5 /* ColoredLineChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36481F6EBA410005B3D5 /* ColoredLineChartViewController.swift */; }; + 225B36601F6EBA470005B3D5 /* LineChart2ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36491F6EBA410005B3D5 /* LineChart2ViewController.swift */; }; + 225B36611F6EBA470005B3D5 /* LineChart1ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B364A1F6EBA410005B3D5 /* LineChart1ViewController.swift */; }; + 225B36621F6EBA470005B3D5 /* NegativeStackedBarChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B364B1F6EBA410005B3D5 /* NegativeStackedBarChartViewController.swift */; }; + 225B36631F6EBA470005B3D5 /* ScatterChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B364C1F6EBA410005B3D5 /* ScatterChartViewController.swift */; }; + 225B36641F6EBA470005B3D5 /* StackedBarChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B364D1F6EBA410005B3D5 /* StackedBarChartViewController.swift */; }; + 225B36651F6EBA470005B3D5 /* BubbleChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B364E1F6EBA410005B3D5 /* BubbleChartViewController.swift */; }; + 225B36661F6EBA470005B3D5 /* LineChartFilledViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B364F1F6EBA410005B3D5 /* LineChartFilledViewController.swift */; }; + 225B36671F6EBA470005B3D5 /* PositiveNegativeBarChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36501F6EBA410005B3D5 /* PositiveNegativeBarChartViewController.swift */; }; + 225B36681F6EBA470005B3D5 /* AnotherBarChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36511F6EBA410005B3D5 /* AnotherBarChartViewController.swift */; }; + 225B36691F6EBA470005B3D5 /* PieChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36521F6EBA410005B3D5 /* PieChartViewController.swift */; }; + 225B366A1F6EBA470005B3D5 /* CubicLineChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36531F6EBA410005B3D5 /* CubicLineChartViewController.swift */; }; + 225B366B1F6EBA470005B3D5 /* RadarChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36541F6EBA410005B3D5 /* RadarChartViewController.swift */; }; + 225B366C1F6EBA470005B3D5 /* HorizontalBarChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36551F6EBA410005B3D5 /* HorizontalBarChartViewController.swift */; }; + 225B366D1F6EBA470005B3D5 /* PiePolylineChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36561F6EBA410005B3D5 /* PiePolylineChartViewController.swift */; }; + 225B366E1F6EBA470005B3D5 /* CombinedChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36571F6EBA410005B3D5 /* CombinedChartViewController.swift */; }; + 225B366F1F6EBA470005B3D5 /* BarChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36581F6EBA410005B3D5 /* BarChartViewController.swift */; }; + 225B36701F6EBA470005B3D5 /* SinusBarChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B36591F6EBA410005B3D5 /* SinusBarChartViewController.swift */; }; + 225B36711F6EBA470005B3D5 /* CandleStickChartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225B365A1F6EBA410005B3D5 /* CandleStickChartViewController.swift */; }; + 225B36721F6EBA5E0005B3D5 /* DemoListViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B8EAF231AB3271B009697AA /* DemoListViewController.xib */; }; + 225B36731F6EBA5E0005B3D5 /* RadarMarkerView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B613DB41D526EA8000F1E98 /* RadarMarkerView.xib */; }; + 225B36741F6EBA640005B3D5 /* AnotherBarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED111ABBFB2B0013F194 /* AnotherBarChartViewController.xib */; }; + 225B36751F6EBA640005B3D5 /* BarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BD47E641ABB424E008FCEC6 /* BarChartViewController.xib */; }; + 225B36761F6EBA640005B3D5 /* BubbleChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 55E3564D1ADC638F00A57971 /* BubbleChartViewController.xib */; }; + 225B36771F6EBA640005B3D5 /* CandleStickChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED2B1ABC160F0013F194 /* CandleStickChartViewController.xib */; }; + 225B36781F6EBA640005B3D5 /* ColoredLineChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED3A1ABC199F0013F194 /* ColoredLineChartViewController.xib */; }; + 225B36791F6EBA640005B3D5 /* CombinedChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BDEDC461ABB871E007D3A60 /* CombinedChartViewController.xib */; }; + 225B367A1F6EBA640005B3D5 /* CubicLineChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED301ABC18F00013F194 /* CubicLineChartViewController.xib */; }; + 225B367B1F6EBA640005B3D5 /* HalfPieChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BE6737F1D5B496500A87BA2 /* HalfPieChartViewController.xib */; }; + 225B367C1F6EBA640005B3D5 /* HorizontalBarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BDEDC401ABB7F73007D3A60 /* HorizontalBarChartViewController.xib */; }; + 225B367D1F6EBA640005B3D5 /* LineChart1ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BD8F0731AB89CE500566E05 /* LineChart1ViewController.xib */; }; + 225B367E1F6EBA640005B3D5 /* LineChart2ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BD47E5F1ABB3C91008FCEC6 /* LineChart2ViewController.xib */; }; + 225B367F1F6EBA640005B3D5 /* LineChartFilledViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BE6738E1D5B4E0900A87BA2 /* LineChartFilledViewController.xib */; }; + 225B36801F6EBA640005B3D5 /* LineChartTimeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BE673911D5B4E0900A87BA2 /* LineChartTimeViewController.xib */; }; + 225B36811F6EBA640005B3D5 /* MultipleBarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED211ABC0BE20013F194 /* MultipleBarChartViewController.xib */; }; + 225B36821F6EBA640005B3D5 /* MultipleLinesChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED241ABC0BE20013F194 /* MultipleLinesChartViewController.xib */; }; + 225B36831F6EBA640005B3D5 /* NegativeStackedBarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B9624401B38608C007763E2 /* NegativeStackedBarChartViewController.xib */; }; + 225B36841F6EBA640005B3D5 /* PieChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B0CC7841ABB875400665592 /* PieChartViewController.xib */; }; + 225B36851F6EBA640005B3D5 /* PiePolylineChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0471CBFB1CA1090A00E52DBC /* PiePolylineChartViewController.xib */; }; + 225B36861F6EBA640005B3D5 /* PositiveNegativeBarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BE7E7611C693098000A0377 /* PositiveNegativeBarChartViewController.xib */; }; + 225B36871F6EBA640005B3D5 /* RadarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED351ABC192F0013F194 /* RadarChartViewController.xib */; }; + 225B36881F6EBA640005B3D5 /* RealmDemosViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B1B5DA91E911A15006D1375 /* RealmDemosViewController.xib */; }; + 225B36891F6EBA640005B3D5 /* ScatterChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED171ABBFB340013F194 /* ScatterChartViewController.xib */; }; + 225B368A1F6EBA640005B3D5 /* SinusBarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED3F1ABC1AC60013F194 /* SinusBarChartViewController.xib */; }; + 225B368B1F6EBA640005B3D5 /* StackedBarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED1A1ABBFB340013F194 /* StackedBarChartViewController.xib */; }; + 225B368C1F6EBBB00005B3D5 /* Charts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0630AE411D8126C0008859B0 /* Charts.framework */; }; + 225B368D1F6EBBB00005B3D5 /* Charts.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0630AE411D8126C0008859B0 /* Charts.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 55E356501ADC638F00A57971 /* BubbleChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 55E3564D1ADC638F00A57971 /* BubbleChartViewController.xib */; }; + 55E356511ADC638F00A57971 /* BubbleChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 55E3564F1ADC638F00A57971 /* BubbleChartViewController.m */; }; + 5B0CC7851ABB875400665592 /* PieChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B0CC7831ABB875400665592 /* PieChartViewController.m */; }; + 5B0CC7861ABB875400665592 /* PieChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B0CC7841ABB875400665592 /* PieChartViewController.xib */; }; + 5B1B5DAB1E911A15006D1375 /* RealmDemosViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B1B5DA91E911A15006D1375 /* RealmDemosViewController.xib */; }; + 5B57BBB51A9B26AA0036A6CC /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B57BBB41A9B26AA0036A6CC /* main.m */; }; + 5B57BBB81A9B26AA0036A6CC /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B57BBB71A9B26AA0036A6CC /* AppDelegate.m */; }; + 5B57BBBB1A9B26AA0036A6CC /* DemoListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B57BBBA1A9B26AA0036A6CC /* DemoListViewController.m */; }; + 5B613DA41D526AD5000F1E98 /* radar_marker@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5B613DA31D526AD5000F1E98 /* radar_marker@3x.png */; }; + 5B613DB31D526DED000F1E98 /* RadarMarkerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B613DB21D526DED000F1E98 /* RadarMarkerView.swift */; }; + 5B613DB51D526EA8000F1E98 /* RadarMarkerView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B613DB41D526EA8000F1E98 /* RadarMarkerView.xib */; }; + 5B613DF01D5A50B6000F1E98 /* XYMarkerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B613DEF1D5A50B6000F1E98 /* XYMarkerView.swift */; }; + 5B613DF21D5A60DF000F1E98 /* LargeValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B613DF11D5A60DF000F1E98 /* LargeValueFormatter.swift */; }; + 5B8EAF241AB3271B009697AA /* DemoListViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B8EAF231AB3271B009697AA /* DemoListViewController.xib */; }; + 5B8EAF281AB32CF5009697AA /* DemoBaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B8EAF261AB32CF5009697AA /* DemoBaseViewController.m */; }; + 5B8EAF301AB32E15009697AA /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5B8EAF2F1AB32E15009697AA /* Images.xcassets */; }; + 5B9624411B38608C007763E2 /* NegativeStackedBarChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B96243F1B38608C007763E2 /* NegativeStackedBarChartViewController.m */; }; + 5B9624421B38608C007763E2 /* NegativeStackedBarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B9624401B38608C007763E2 /* NegativeStackedBarChartViewController.xib */; }; + 5BD47E5B1ABB0263008FCEC6 /* BalloonMarker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD47E5A1ABB0263008FCEC6 /* BalloonMarker.swift */; }; + 5BD47E601ABB3C91008FCEC6 /* LineChart2ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BD47E5E1ABB3C91008FCEC6 /* LineChart2ViewController.m */; }; + 5BD47E611ABB3C91008FCEC6 /* LineChart2ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BD47E5F1ABB3C91008FCEC6 /* LineChart2ViewController.xib */; }; + 5BD47E651ABB424E008FCEC6 /* BarChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BD47E631ABB424E008FCEC6 /* BarChartViewController.m */; }; + 5BD47E661ABB424E008FCEC6 /* BarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BD47E641ABB424E008FCEC6 /* BarChartViewController.xib */; }; + 5BD8F0741AB89CE500566E05 /* LineChart1ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BD8F0721AB89CE500566E05 /* LineChart1ViewController.m */; }; + 5BD8F0751AB89CE500566E05 /* LineChart1ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BD8F0731AB89CE500566E05 /* LineChart1ViewController.xib */; }; + 5BDEDC411ABB7F73007D3A60 /* HorizontalBarChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BDEDC3F1ABB7F73007D3A60 /* HorizontalBarChartViewController.m */; }; + 5BDEDC421ABB7F73007D3A60 /* HorizontalBarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BDEDC401ABB7F73007D3A60 /* HorizontalBarChartViewController.xib */; }; + 5BDEDC471ABB871E007D3A60 /* CombinedChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BDEDC451ABB871E007D3A60 /* CombinedChartViewController.m */; }; + 5BDEDC481ABB871E007D3A60 /* CombinedChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BDEDC461ABB871E007D3A60 /* CombinedChartViewController.xib */; }; + 5BE377DE1D425151006EB34F /* DayAxisValueFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BE377DD1D425151006EB34F /* DayAxisValueFormatter.m */; }; + 5BE377F21D47FDF1006EB34F /* IntAxisValueFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BE377F11D47FDF1006EB34F /* IntAxisValueFormatter.m */; }; + 5BE673801D5B496500A87BA2 /* HalfPieChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BE6737E1D5B496500A87BA2 /* HalfPieChartViewController.m */; }; + 5BE673811D5B496500A87BA2 /* HalfPieChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BE6737F1D5B496500A87BA2 /* HalfPieChartViewController.xib */; }; + 5BE673921D5B4E0900A87BA2 /* LineChartFilledViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BE6738D1D5B4E0900A87BA2 /* LineChartFilledViewController.m */; }; + 5BE673931D5B4E0900A87BA2 /* LineChartFilledViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BE6738E1D5B4E0900A87BA2 /* LineChartFilledViewController.xib */; }; + 5BE673941D5B4E0900A87BA2 /* LineChartTimeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BE673901D5B4E0900A87BA2 /* LineChartTimeViewController.m */; }; + 5BE673951D5B4E0900A87BA2 /* LineChartTimeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BE673911D5B4E0900A87BA2 /* LineChartTimeViewController.xib */; }; + 5BE6739A1D5BAD7E00A87BA2 /* DateValueFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BE673991D5BAD7E00A87BA2 /* DateValueFormatter.m */; }; + 5BE7E7621C693098000A0377 /* PositiveNegativeBarChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BE7E7601C693098000A0377 /* PositiveNegativeBarChartViewController.m */; }; + 5BE7E7631C693098000A0377 /* PositiveNegativeBarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BE7E7611C693098000A0377 /* PositiveNegativeBarChartViewController.xib */; }; + 5BEAED121ABBFB2B0013F194 /* AnotherBarChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BEAED101ABBFB2B0013F194 /* AnotherBarChartViewController.m */; }; + 5BEAED131ABBFB2B0013F194 /* AnotherBarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED111ABBFB2B0013F194 /* AnotherBarChartViewController.xib */; }; + 5BEAED1B1ABBFB340013F194 /* ScatterChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BEAED161ABBFB340013F194 /* ScatterChartViewController.m */; }; + 5BEAED1C1ABBFB340013F194 /* ScatterChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED171ABBFB340013F194 /* ScatterChartViewController.xib */; }; + 5BEAED1D1ABBFB340013F194 /* StackedBarChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BEAED191ABBFB340013F194 /* StackedBarChartViewController.m */; }; + 5BEAED1E1ABBFB340013F194 /* StackedBarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED1A1ABBFB340013F194 /* StackedBarChartViewController.xib */; }; + 5BEAED251ABC0BE20013F194 /* MultipleBarChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BEAED201ABC0BE20013F194 /* MultipleBarChartViewController.m */; }; + 5BEAED261ABC0BE20013F194 /* MultipleBarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED211ABC0BE20013F194 /* MultipleBarChartViewController.xib */; }; + 5BEAED271ABC0BE20013F194 /* MultipleLinesChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BEAED231ABC0BE20013F194 /* MultipleLinesChartViewController.m */; }; + 5BEAED281ABC0BE20013F194 /* MultipleLinesChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED241ABC0BE20013F194 /* MultipleLinesChartViewController.xib */; }; + 5BEAED2C1ABC160F0013F194 /* CandleStickChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BEAED2A1ABC160F0013F194 /* CandleStickChartViewController.m */; }; + 5BEAED2D1ABC160F0013F194 /* CandleStickChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED2B1ABC160F0013F194 /* CandleStickChartViewController.xib */; }; + 5BEAED311ABC18F00013F194 /* CubicLineChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BEAED2F1ABC18F00013F194 /* CubicLineChartViewController.m */; }; + 5BEAED321ABC18F00013F194 /* CubicLineChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED301ABC18F00013F194 /* CubicLineChartViewController.xib */; }; + 5BEAED361ABC192F0013F194 /* RadarChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BEAED341ABC192F0013F194 /* RadarChartViewController.m */; }; + 5BEAED371ABC192F0013F194 /* RadarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED351ABC192F0013F194 /* RadarChartViewController.xib */; }; + 5BEAED3B1ABC199F0013F194 /* ColoredLineChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BEAED391ABC199F0013F194 /* ColoredLineChartViewController.m */; }; + 5BEAED3C1ABC199F0013F194 /* ColoredLineChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED3A1ABC199F0013F194 /* ColoredLineChartViewController.xib */; }; + 5BEAED401ABC1AC60013F194 /* SinusBarChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BEAED3E1ABC1AC60013F194 /* SinusBarChartViewController.m */; }; + 5BEAED411ABC1AC60013F194 /* SinusBarChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BEAED3F1ABC1AC60013F194 /* SinusBarChartViewController.xib */; }; + B64D06EB1FB199130067418D /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B64D06EA1FB199130067418D /* Launch Screen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 0630AE401D8126C0008859B0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0630AE391D8126C0008859B0 /* Charts.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 06165F241D8110E600722320; + remoteInfo = Charts; + }; + 0630AE421D8126C0008859B0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0630AE391D8126C0008859B0 /* Charts.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 06165F2E1D8110E600722320; + remoteInfo = ChartsTests; + }; + 0630AE531D81271B008859B0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0630AE391D8126C0008859B0 /* Charts.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = A58A4ED274A941CA248EA921; + remoteInfo = Charts; + }; + 225B368E1F6EBBB00005B3D5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0630AE391D8126C0008859B0 /* Charts.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = A58A4ED274A941CA248EA921; + remoteInfo = Charts; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 225B36901F6EBBB10005B3D5 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 225B368D1F6EBBB00005B3D5 /* Charts.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 5BB4B0751ACA710D00E2EF4D /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 0630AE521D81271B008859B0 /* Charts.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0439A3511C9FF95F00496F83 /* PiePolylineChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PiePolylineChartViewController.h; sourceTree = ""; }; + 0439A3521C9FF95F00496F83 /* PiePolylineChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PiePolylineChartViewController.m; sourceTree = ""; }; + 0471CBFB1CA1090A00E52DBC /* PiePolylineChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PiePolylineChartViewController.xib; sourceTree = ""; }; + 0630AE391D8126C0008859B0 /* Charts.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Charts.xcodeproj; path = ../Charts.xcodeproj; sourceTree = ""; }; + 225B361D1F6EB9A50005B3D5 /* ChartsDemo-iOS-Swift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ChartsDemo-iOS-Swift.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 225B361F1F6EB9A50005B3D5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 225B362F1F6EB9EE0005B3D5 /* DemoBaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoBaseViewController.swift; sourceTree = ""; }; + 225B36301F6EB9EE0005B3D5 /* DemoListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoListViewController.swift; sourceTree = ""; }; + 225B36341F6EB9FE0005B3D5 /* IntAxisValueFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntAxisValueFormatter.swift; sourceTree = ""; }; + 225B36351F6EB9FE0005B3D5 /* DayAxisValueFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DayAxisValueFormatter.swift; sourceTree = ""; }; + 225B36361F6EB9FE0005B3D5 /* DateValueFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateValueFormatter.swift; sourceTree = ""; }; + 225B36371F6EB9FE0005B3D5 /* LargeValueFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LargeValueFormatter.swift; sourceTree = ""; }; + 225B363D1F6EBA180005B3D5 /* XYMarkerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XYMarkerView.swift; sourceTree = ""; }; + 225B363E1F6EBA180005B3D5 /* BalloonMarker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BalloonMarker.swift; sourceTree = ""; }; + 225B363F1F6EBA180005B3D5 /* RadarMarkerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadarMarkerView.swift; sourceTree = ""; }; + 225B36441F6EBA410005B3D5 /* MultipleLinesChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultipleLinesChartViewController.swift; sourceTree = ""; }; + 225B36451F6EBA410005B3D5 /* MultipleBarChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultipleBarChartViewController.swift; sourceTree = ""; }; + 225B36461F6EBA410005B3D5 /* HalfPieChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HalfPieChartViewController.swift; sourceTree = ""; }; + 225B36471F6EBA410005B3D5 /* LineChartTimeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineChartTimeViewController.swift; sourceTree = ""; }; + 225B36481F6EBA410005B3D5 /* ColoredLineChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColoredLineChartViewController.swift; sourceTree = ""; }; + 225B36491F6EBA410005B3D5 /* LineChart2ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineChart2ViewController.swift; sourceTree = ""; }; + 225B364A1F6EBA410005B3D5 /* LineChart1ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineChart1ViewController.swift; sourceTree = ""; }; + 225B364B1F6EBA410005B3D5 /* NegativeStackedBarChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NegativeStackedBarChartViewController.swift; sourceTree = ""; }; + 225B364C1F6EBA410005B3D5 /* ScatterChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScatterChartViewController.swift; sourceTree = ""; }; + 225B364D1F6EBA410005B3D5 /* StackedBarChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackedBarChartViewController.swift; sourceTree = ""; }; + 225B364E1F6EBA410005B3D5 /* BubbleChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BubbleChartViewController.swift; sourceTree = ""; }; + 225B364F1F6EBA410005B3D5 /* LineChartFilledViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineChartFilledViewController.swift; sourceTree = ""; }; + 225B36501F6EBA410005B3D5 /* PositiveNegativeBarChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PositiveNegativeBarChartViewController.swift; sourceTree = ""; }; + 225B36511F6EBA410005B3D5 /* AnotherBarChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnotherBarChartViewController.swift; sourceTree = ""; }; + 225B36521F6EBA410005B3D5 /* PieChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PieChartViewController.swift; sourceTree = ""; }; + 225B36531F6EBA410005B3D5 /* CubicLineChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CubicLineChartViewController.swift; sourceTree = ""; }; + 225B36541F6EBA410005B3D5 /* RadarChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadarChartViewController.swift; sourceTree = ""; }; + 225B36551F6EBA410005B3D5 /* HorizontalBarChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HorizontalBarChartViewController.swift; sourceTree = ""; }; + 225B36561F6EBA410005B3D5 /* PiePolylineChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PiePolylineChartViewController.swift; sourceTree = ""; }; + 225B36571F6EBA410005B3D5 /* CombinedChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CombinedChartViewController.swift; sourceTree = ""; }; + 225B36581F6EBA410005B3D5 /* BarChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BarChartViewController.swift; sourceTree = ""; }; + 225B36591F6EBA410005B3D5 /* SinusBarChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SinusBarChartViewController.swift; sourceTree = ""; }; + 225B365A1F6EBA410005B3D5 /* CandleStickChartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CandleStickChartViewController.swift; sourceTree = ""; }; + 55E3564D1ADC638F00A57971 /* BubbleChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BubbleChartViewController.xib; sourceTree = ""; }; + 55E3564E1ADC638F00A57971 /* BubbleChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BubbleChartViewController.h; sourceTree = ""; }; + 55E3564F1ADC638F00A57971 /* BubbleChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BubbleChartViewController.m; sourceTree = ""; }; + 5B0CC7821ABB875400665592 /* PieChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PieChartViewController.h; sourceTree = ""; }; + 5B0CC7831ABB875400665592 /* PieChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PieChartViewController.m; sourceTree = ""; }; + 5B0CC7841ABB875400665592 /* PieChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PieChartViewController.xib; sourceTree = ""; }; + 5B1B5DA91E911A15006D1375 /* RealmDemosViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = RealmDemosViewController.xib; path = XIBs/Demos/RealmDemosViewController.xib; sourceTree = SOURCE_ROOT; }; + 5B57BBAF1A9B26AA0036A6CC /* ChartsDemo-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ChartsDemo-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 5B57BBB31A9B26AA0036A6CC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5B57BBB41A9B26AA0036A6CC /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 5B57BBB61A9B26AA0036A6CC /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 5B57BBB71A9B26AA0036A6CC /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 5B57BBB91A9B26AA0036A6CC /* DemoListViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DemoListViewController.h; sourceTree = ""; }; + 5B57BBBA1A9B26AA0036A6CC /* DemoListViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DemoListViewController.m; sourceTree = ""; }; + 5B613DA31D526AD5000F1E98 /* radar_marker@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "radar_marker@3x.png"; sourceTree = ""; }; + 5B613DB21D526DED000F1E98 /* RadarMarkerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RadarMarkerView.swift; sourceTree = ""; }; + 5B613DB41D526EA8000F1E98 /* RadarMarkerView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RadarMarkerView.xib; sourceTree = ""; }; + 5B613DEF1D5A50B6000F1E98 /* XYMarkerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XYMarkerView.swift; sourceTree = ""; }; + 5B613DF11D5A60DF000F1E98 /* LargeValueFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LargeValueFormatter.swift; sourceTree = ""; }; + 5B8EAF231AB3271B009697AA /* DemoListViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DemoListViewController.xib; sourceTree = ""; }; + 5B8EAF251AB32CF5009697AA /* DemoBaseViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoBaseViewController.h; sourceTree = ""; }; + 5B8EAF261AB32CF5009697AA /* DemoBaseViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoBaseViewController.m; sourceTree = ""; }; + 5B8EAF2F1AB32E15009697AA /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 5B96243E1B38608C007763E2 /* NegativeStackedBarChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NegativeStackedBarChartViewController.h; sourceTree = ""; }; + 5B96243F1B38608C007763E2 /* NegativeStackedBarChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NegativeStackedBarChartViewController.m; sourceTree = ""; }; + 5B9624401B38608C007763E2 /* NegativeStackedBarChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NegativeStackedBarChartViewController.xib; sourceTree = ""; }; + 5BD47E5A1ABB0263008FCEC6 /* BalloonMarker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BalloonMarker.swift; sourceTree = ""; }; + 5BD47E5C1ABB0273008FCEC6 /* ChartsDemo-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ChartsDemo-Bridging-Header.h"; sourceTree = ""; }; + 5BD47E5D1ABB3C91008FCEC6 /* LineChart2ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LineChart2ViewController.h; sourceTree = ""; }; + 5BD47E5E1ABB3C91008FCEC6 /* LineChart2ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LineChart2ViewController.m; sourceTree = ""; }; + 5BD47E5F1ABB3C91008FCEC6 /* LineChart2ViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LineChart2ViewController.xib; sourceTree = ""; }; + 5BD47E621ABB424E008FCEC6 /* BarChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BarChartViewController.h; sourceTree = ""; }; + 5BD47E631ABB424E008FCEC6 /* BarChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BarChartViewController.m; sourceTree = ""; }; + 5BD47E641ABB424E008FCEC6 /* BarChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BarChartViewController.xib; sourceTree = ""; }; + 5BD8F0711AB89CE500566E05 /* LineChart1ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LineChart1ViewController.h; sourceTree = ""; }; + 5BD8F0721AB89CE500566E05 /* LineChart1ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LineChart1ViewController.m; sourceTree = ""; }; + 5BD8F0731AB89CE500566E05 /* LineChart1ViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LineChart1ViewController.xib; sourceTree = ""; }; + 5BDEDC3E1ABB7F73007D3A60 /* HorizontalBarChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HorizontalBarChartViewController.h; sourceTree = ""; }; + 5BDEDC3F1ABB7F73007D3A60 /* HorizontalBarChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HorizontalBarChartViewController.m; sourceTree = ""; }; + 5BDEDC401ABB7F73007D3A60 /* HorizontalBarChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = HorizontalBarChartViewController.xib; sourceTree = ""; }; + 5BDEDC441ABB871E007D3A60 /* CombinedChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CombinedChartViewController.h; sourceTree = ""; }; + 5BDEDC451ABB871E007D3A60 /* CombinedChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CombinedChartViewController.m; sourceTree = ""; }; + 5BDEDC461ABB871E007D3A60 /* CombinedChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CombinedChartViewController.xib; sourceTree = ""; }; + 5BE377DC1D425151006EB34F /* DayAxisValueFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DayAxisValueFormatter.h; sourceTree = ""; }; + 5BE377DD1D425151006EB34F /* DayAxisValueFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DayAxisValueFormatter.m; sourceTree = ""; }; + 5BE377F01D47FDF1006EB34F /* IntAxisValueFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IntAxisValueFormatter.h; sourceTree = ""; }; + 5BE377F11D47FDF1006EB34F /* IntAxisValueFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IntAxisValueFormatter.m; sourceTree = ""; }; + 5BE6737D1D5B496500A87BA2 /* HalfPieChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HalfPieChartViewController.h; sourceTree = ""; }; + 5BE6737E1D5B496500A87BA2 /* HalfPieChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HalfPieChartViewController.m; sourceTree = ""; }; + 5BE6737F1D5B496500A87BA2 /* HalfPieChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = HalfPieChartViewController.xib; sourceTree = ""; }; + 5BE6738C1D5B4E0900A87BA2 /* LineChartFilledViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LineChartFilledViewController.h; sourceTree = ""; }; + 5BE6738D1D5B4E0900A87BA2 /* LineChartFilledViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LineChartFilledViewController.m; sourceTree = ""; }; + 5BE6738E1D5B4E0900A87BA2 /* LineChartFilledViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LineChartFilledViewController.xib; sourceTree = ""; }; + 5BE6738F1D5B4E0900A87BA2 /* LineChartTimeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LineChartTimeViewController.h; sourceTree = ""; }; + 5BE673901D5B4E0900A87BA2 /* LineChartTimeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LineChartTimeViewController.m; sourceTree = ""; }; + 5BE673911D5B4E0900A87BA2 /* LineChartTimeViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LineChartTimeViewController.xib; sourceTree = ""; }; + 5BE673981D5BAD7E00A87BA2 /* DateValueFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DateValueFormatter.h; sourceTree = ""; }; + 5BE673991D5BAD7E00A87BA2 /* DateValueFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DateValueFormatter.m; sourceTree = ""; }; + 5BE7E75F1C693098000A0377 /* PositiveNegativeBarChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PositiveNegativeBarChartViewController.h; sourceTree = ""; }; + 5BE7E7601C693098000A0377 /* PositiveNegativeBarChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PositiveNegativeBarChartViewController.m; sourceTree = ""; }; + 5BE7E7611C693098000A0377 /* PositiveNegativeBarChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PositiveNegativeBarChartViewController.xib; sourceTree = ""; }; + 5BEAED0F1ABBFB2B0013F194 /* AnotherBarChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnotherBarChartViewController.h; sourceTree = ""; }; + 5BEAED101ABBFB2B0013F194 /* AnotherBarChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AnotherBarChartViewController.m; sourceTree = ""; }; + 5BEAED111ABBFB2B0013F194 /* AnotherBarChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AnotherBarChartViewController.xib; sourceTree = ""; }; + 5BEAED151ABBFB340013F194 /* ScatterChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScatterChartViewController.h; sourceTree = ""; }; + 5BEAED161ABBFB340013F194 /* ScatterChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScatterChartViewController.m; sourceTree = ""; }; + 5BEAED171ABBFB340013F194 /* ScatterChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ScatterChartViewController.xib; sourceTree = ""; }; + 5BEAED181ABBFB340013F194 /* StackedBarChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StackedBarChartViewController.h; sourceTree = ""; }; + 5BEAED191ABBFB340013F194 /* StackedBarChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StackedBarChartViewController.m; sourceTree = ""; }; + 5BEAED1A1ABBFB340013F194 /* StackedBarChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = StackedBarChartViewController.xib; sourceTree = ""; }; + 5BEAED1F1ABC0BE20013F194 /* MultipleBarChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultipleBarChartViewController.h; sourceTree = ""; }; + 5BEAED201ABC0BE20013F194 /* MultipleBarChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MultipleBarChartViewController.m; sourceTree = ""; }; + 5BEAED211ABC0BE20013F194 /* MultipleBarChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MultipleBarChartViewController.xib; sourceTree = ""; }; + 5BEAED221ABC0BE20013F194 /* MultipleLinesChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultipleLinesChartViewController.h; sourceTree = ""; }; + 5BEAED231ABC0BE20013F194 /* MultipleLinesChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MultipleLinesChartViewController.m; sourceTree = ""; }; + 5BEAED241ABC0BE20013F194 /* MultipleLinesChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MultipleLinesChartViewController.xib; sourceTree = ""; }; + 5BEAED291ABC160F0013F194 /* CandleStickChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CandleStickChartViewController.h; sourceTree = ""; }; + 5BEAED2A1ABC160F0013F194 /* CandleStickChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CandleStickChartViewController.m; sourceTree = ""; }; + 5BEAED2B1ABC160F0013F194 /* CandleStickChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CandleStickChartViewController.xib; sourceTree = ""; }; + 5BEAED2E1ABC18F00013F194 /* CubicLineChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CubicLineChartViewController.h; sourceTree = ""; }; + 5BEAED2F1ABC18F00013F194 /* CubicLineChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CubicLineChartViewController.m; sourceTree = ""; }; + 5BEAED301ABC18F00013F194 /* CubicLineChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CubicLineChartViewController.xib; sourceTree = ""; }; + 5BEAED331ABC192F0013F194 /* RadarChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RadarChartViewController.h; sourceTree = ""; }; + 5BEAED341ABC192F0013F194 /* RadarChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RadarChartViewController.m; sourceTree = ""; }; + 5BEAED351ABC192F0013F194 /* RadarChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RadarChartViewController.xib; sourceTree = ""; }; + 5BEAED381ABC199F0013F194 /* ColoredLineChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ColoredLineChartViewController.h; sourceTree = ""; }; + 5BEAED391ABC199F0013F194 /* ColoredLineChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ColoredLineChartViewController.m; sourceTree = ""; }; + 5BEAED3A1ABC199F0013F194 /* ColoredLineChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ColoredLineChartViewController.xib; sourceTree = ""; }; + 5BEAED3D1ABC1AC60013F194 /* SinusBarChartViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SinusBarChartViewController.h; sourceTree = ""; }; + 5BEAED3E1ABC1AC60013F194 /* SinusBarChartViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SinusBarChartViewController.m; sourceTree = ""; }; + 5BEAED3F1ABC1AC60013F194 /* SinusBarChartViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SinusBarChartViewController.xib; sourceTree = ""; }; + B64D06EA1FB199130067418D /* Launch Screen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 225B361A1F6EB9A50005B3D5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 225B368C1F6EBBB00005B3D5 /* Charts.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5B57BBAC1A9B26AA0036A6CC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0630AE511D81271B008859B0 /* Charts.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0630AE3A1D8126C0008859B0 /* Products */ = { + isa = PBXGroup; + children = ( + 0630AE411D8126C0008859B0 /* Charts.framework */, + 0630AE431D8126C0008859B0 /* ChartsTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 225B361E1F6EB9A50005B3D5 /* Swift */ = { + isa = PBXGroup; + children = ( + 225B361F1F6EB9A50005B3D5 /* AppDelegate.swift */, + 225B362F1F6EB9EE0005B3D5 /* DemoBaseViewController.swift */, + 225B36301F6EB9EE0005B3D5 /* DemoListViewController.swift */, + 225B363C1F6EBA180005B3D5 /* Components */, + 225B36331F6EB9FE0005B3D5 /* Formatters */, + 225B36431F6EBA410005B3D5 /* Demos */, + ); + path = Swift; + sourceTree = ""; + }; + 225B36331F6EB9FE0005B3D5 /* Formatters */ = { + isa = PBXGroup; + children = ( + 225B36351F6EB9FE0005B3D5 /* DayAxisValueFormatter.swift */, + 225B36361F6EB9FE0005B3D5 /* DateValueFormatter.swift */, + 225B36341F6EB9FE0005B3D5 /* IntAxisValueFormatter.swift */, + 225B36371F6EB9FE0005B3D5 /* LargeValueFormatter.swift */, + ); + path = Formatters; + sourceTree = ""; + }; + 225B363C1F6EBA180005B3D5 /* Components */ = { + isa = PBXGroup; + children = ( + 225B363E1F6EBA180005B3D5 /* BalloonMarker.swift */, + 225B363F1F6EBA180005B3D5 /* RadarMarkerView.swift */, + 225B363D1F6EBA180005B3D5 /* XYMarkerView.swift */, + ); + path = Components; + sourceTree = ""; + }; + 225B36431F6EBA410005B3D5 /* Demos */ = { + isa = PBXGroup; + children = ( + 225B36511F6EBA410005B3D5 /* AnotherBarChartViewController.swift */, + 225B36581F6EBA410005B3D5 /* BarChartViewController.swift */, + 225B364E1F6EBA410005B3D5 /* BubbleChartViewController.swift */, + 225B365A1F6EBA410005B3D5 /* CandleStickChartViewController.swift */, + 225B36481F6EBA410005B3D5 /* ColoredLineChartViewController.swift */, + 225B36571F6EBA410005B3D5 /* CombinedChartViewController.swift */, + 225B36531F6EBA410005B3D5 /* CubicLineChartViewController.swift */, + 225B36461F6EBA410005B3D5 /* HalfPieChartViewController.swift */, + 225B36551F6EBA410005B3D5 /* HorizontalBarChartViewController.swift */, + 225B364A1F6EBA410005B3D5 /* LineChart1ViewController.swift */, + 225B36491F6EBA410005B3D5 /* LineChart2ViewController.swift */, + 225B364F1F6EBA410005B3D5 /* LineChartFilledViewController.swift */, + 225B36471F6EBA410005B3D5 /* LineChartTimeViewController.swift */, + 225B36441F6EBA410005B3D5 /* MultipleLinesChartViewController.swift */, + 225B36451F6EBA410005B3D5 /* MultipleBarChartViewController.swift */, + 225B364B1F6EBA410005B3D5 /* NegativeStackedBarChartViewController.swift */, + 225B36521F6EBA410005B3D5 /* PieChartViewController.swift */, + 225B36561F6EBA410005B3D5 /* PiePolylineChartViewController.swift */, + 225B36501F6EBA410005B3D5 /* PositiveNegativeBarChartViewController.swift */, + 225B36541F6EBA410005B3D5 /* RadarChartViewController.swift */, + 225B364C1F6EBA410005B3D5 /* ScatterChartViewController.swift */, + 225B36591F6EBA410005B3D5 /* SinusBarChartViewController.swift */, + 225B364D1F6EBA410005B3D5 /* StackedBarChartViewController.swift */, + ); + path = Demos; + sourceTree = ""; + }; + 227136F41F6EB665006D2A11 /* XIBs */ = { + isa = PBXGroup; + children = ( + 5B8EAF231AB3271B009697AA /* DemoListViewController.xib */, + 5B613DB41D526EA8000F1E98 /* RadarMarkerView.xib */, + 227136F61F6EB69D006D2A11 /* Demos */, + ); + path = XIBs; + sourceTree = ""; + }; + 227136F61F6EB69D006D2A11 /* Demos */ = { + isa = PBXGroup; + children = ( + 5BEAED111ABBFB2B0013F194 /* AnotherBarChartViewController.xib */, + 5BD47E641ABB424E008FCEC6 /* BarChartViewController.xib */, + 55E3564D1ADC638F00A57971 /* BubbleChartViewController.xib */, + 5BEAED2B1ABC160F0013F194 /* CandleStickChartViewController.xib */, + 5BEAED3A1ABC199F0013F194 /* ColoredLineChartViewController.xib */, + 5BDEDC461ABB871E007D3A60 /* CombinedChartViewController.xib */, + 5BEAED301ABC18F00013F194 /* CubicLineChartViewController.xib */, + 5BE6737F1D5B496500A87BA2 /* HalfPieChartViewController.xib */, + 5BDEDC401ABB7F73007D3A60 /* HorizontalBarChartViewController.xib */, + 5BD8F0731AB89CE500566E05 /* LineChart1ViewController.xib */, + 5BD47E5F1ABB3C91008FCEC6 /* LineChart2ViewController.xib */, + 5BE6738E1D5B4E0900A87BA2 /* LineChartFilledViewController.xib */, + 5BE673911D5B4E0900A87BA2 /* LineChartTimeViewController.xib */, + 5BEAED211ABC0BE20013F194 /* MultipleBarChartViewController.xib */, + 5BEAED241ABC0BE20013F194 /* MultipleLinesChartViewController.xib */, + 5B9624401B38608C007763E2 /* NegativeStackedBarChartViewController.xib */, + 5B0CC7841ABB875400665592 /* PieChartViewController.xib */, + 0471CBFB1CA1090A00E52DBC /* PiePolylineChartViewController.xib */, + 5BE7E7611C693098000A0377 /* PositiveNegativeBarChartViewController.xib */, + 5BEAED351ABC192F0013F194 /* RadarChartViewController.xib */, + 5B1B5DA91E911A15006D1375 /* RealmDemosViewController.xib */, + 5BEAED171ABBFB340013F194 /* ScatterChartViewController.xib */, + 5BEAED3F1ABC1AC60013F194 /* SinusBarChartViewController.xib */, + 5BEAED1A1ABBFB340013F194 /* StackedBarChartViewController.xib */, + ); + path = Demos; + sourceTree = ""; + }; + 5B57BBA61A9B26AA0036A6CC = { + isa = PBXGroup; + children = ( + 5B57BBB11A9B26AA0036A6CC /* Objective-C */, + 225B361E1F6EB9A50005B3D5 /* Swift */, + 227136F41F6EB665006D2A11 /* XIBs */, + 5B8EAF2E1AB32E15009697AA /* Resources */, + 5B57BBB21A9B26AA0036A6CC /* Supporting Files */, + 5B57BBB01A9B26AA0036A6CC /* Products */, + 0630AE391D8126C0008859B0 /* Charts.xcodeproj */, + ); + sourceTree = ""; + }; + 5B57BBB01A9B26AA0036A6CC /* Products */ = { + isa = PBXGroup; + children = ( + 5B57BBAF1A9B26AA0036A6CC /* ChartsDemo-iOS.app */, + 225B361D1F6EB9A50005B3D5 /* ChartsDemo-iOS-Swift.app */, + ); + name = Products; + sourceTree = ""; + }; + 5B57BBB11A9B26AA0036A6CC /* Objective-C */ = { + isa = PBXGroup; + children = ( + 5B57BBB61A9B26AA0036A6CC /* AppDelegate.h */, + 5B57BBB71A9B26AA0036A6CC /* AppDelegate.m */, + 5B57BBB91A9B26AA0036A6CC /* DemoListViewController.h */, + 5B57BBBA1A9B26AA0036A6CC /* DemoListViewController.m */, + 5B8EAF251AB32CF5009697AA /* DemoBaseViewController.h */, + 5B8EAF261AB32CF5009697AA /* DemoBaseViewController.m */, + 5BE377D41D42511A006EB34F /* Formatters */, + 5BD47E541ABB0177008FCEC6 /* Components */, + 5BD8F06F1AB89C7100566E05 /* Demos */, + ); + path = "Objective-C"; + sourceTree = ""; + }; + 5B57BBB21A9B26AA0036A6CC /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 5B57BBB31A9B26AA0036A6CC /* Info.plist */, + 5B57BBB41A9B26AA0036A6CC /* main.m */, + 5BD47E5C1ABB0273008FCEC6 /* ChartsDemo-Bridging-Header.h */, + ); + path = "Supporting Files"; + sourceTree = ""; + }; + 5B613DA21D526AD5000F1E98 /* markers */ = { + isa = PBXGroup; + children = ( + 5B613DA31D526AD5000F1E98 /* radar_marker@3x.png */, + ); + path = markers; + sourceTree = ""; + }; + 5B8EAF2E1AB32E15009697AA /* Resources */ = { + isa = PBXGroup; + children = ( + B64D06EA1FB199130067418D /* Launch Screen.storyboard */, + 5B8EAF2F1AB32E15009697AA /* Images.xcassets */, + 5B613DA21D526AD5000F1E98 /* markers */, + ); + path = Resources; + sourceTree = ""; + }; + 5BD47E541ABB0177008FCEC6 /* Components */ = { + isa = PBXGroup; + children = ( + 5BD47E5A1ABB0263008FCEC6 /* BalloonMarker.swift */, + 5B613DB21D526DED000F1E98 /* RadarMarkerView.swift */, + 5B613DEF1D5A50B6000F1E98 /* XYMarkerView.swift */, + ); + path = Components; + sourceTree = ""; + }; + 5BD8F06F1AB89C7100566E05 /* Demos */ = { + isa = PBXGroup; + children = ( + 5BEAED0F1ABBFB2B0013F194 /* AnotherBarChartViewController.h */, + 5BEAED101ABBFB2B0013F194 /* AnotherBarChartViewController.m */, + 5BD47E621ABB424E008FCEC6 /* BarChartViewController.h */, + 5BD47E631ABB424E008FCEC6 /* BarChartViewController.m */, + 55E3564E1ADC638F00A57971 /* BubbleChartViewController.h */, + 55E3564F1ADC638F00A57971 /* BubbleChartViewController.m */, + 5BEAED291ABC160F0013F194 /* CandleStickChartViewController.h */, + 5BEAED2A1ABC160F0013F194 /* CandleStickChartViewController.m */, + 5BEAED381ABC199F0013F194 /* ColoredLineChartViewController.h */, + 5BEAED391ABC199F0013F194 /* ColoredLineChartViewController.m */, + 5BDEDC441ABB871E007D3A60 /* CombinedChartViewController.h */, + 5BDEDC451ABB871E007D3A60 /* CombinedChartViewController.m */, + 5BEAED2E1ABC18F00013F194 /* CubicLineChartViewController.h */, + 5BEAED2F1ABC18F00013F194 /* CubicLineChartViewController.m */, + 5BE6737D1D5B496500A87BA2 /* HalfPieChartViewController.h */, + 5BE6737E1D5B496500A87BA2 /* HalfPieChartViewController.m */, + 5BDEDC3E1ABB7F73007D3A60 /* HorizontalBarChartViewController.h */, + 5BDEDC3F1ABB7F73007D3A60 /* HorizontalBarChartViewController.m */, + 5BD8F0711AB89CE500566E05 /* LineChart1ViewController.h */, + 5BD8F0721AB89CE500566E05 /* LineChart1ViewController.m */, + 5BD47E5D1ABB3C91008FCEC6 /* LineChart2ViewController.h */, + 5BD47E5E1ABB3C91008FCEC6 /* LineChart2ViewController.m */, + 5BE6738C1D5B4E0900A87BA2 /* LineChartFilledViewController.h */, + 5BE6738D1D5B4E0900A87BA2 /* LineChartFilledViewController.m */, + 5BE6738F1D5B4E0900A87BA2 /* LineChartTimeViewController.h */, + 5BE673901D5B4E0900A87BA2 /* LineChartTimeViewController.m */, + 5BEAED1F1ABC0BE20013F194 /* MultipleBarChartViewController.h */, + 5BEAED201ABC0BE20013F194 /* MultipleBarChartViewController.m */, + 5BEAED221ABC0BE20013F194 /* MultipleLinesChartViewController.h */, + 5BEAED231ABC0BE20013F194 /* MultipleLinesChartViewController.m */, + 5B96243E1B38608C007763E2 /* NegativeStackedBarChartViewController.h */, + 5B96243F1B38608C007763E2 /* NegativeStackedBarChartViewController.m */, + 5B0CC7821ABB875400665592 /* PieChartViewController.h */, + 5B0CC7831ABB875400665592 /* PieChartViewController.m */, + 0439A3511C9FF95F00496F83 /* PiePolylineChartViewController.h */, + 0439A3521C9FF95F00496F83 /* PiePolylineChartViewController.m */, + 5BE7E75F1C693098000A0377 /* PositiveNegativeBarChartViewController.h */, + 5BE7E7601C693098000A0377 /* PositiveNegativeBarChartViewController.m */, + 5BEAED331ABC192F0013F194 /* RadarChartViewController.h */, + 5BEAED341ABC192F0013F194 /* RadarChartViewController.m */, + 5BEAED151ABBFB340013F194 /* ScatterChartViewController.h */, + 5BEAED161ABBFB340013F194 /* ScatterChartViewController.m */, + 5BEAED3D1ABC1AC60013F194 /* SinusBarChartViewController.h */, + 5BEAED3E1ABC1AC60013F194 /* SinusBarChartViewController.m */, + 5BEAED181ABBFB340013F194 /* StackedBarChartViewController.h */, + 5BEAED191ABBFB340013F194 /* StackedBarChartViewController.m */, + ); + path = Demos; + sourceTree = ""; + }; + 5BE377D41D42511A006EB34F /* Formatters */ = { + isa = PBXGroup; + children = ( + 5BE377DC1D425151006EB34F /* DayAxisValueFormatter.h */, + 5BE377DD1D425151006EB34F /* DayAxisValueFormatter.m */, + 5BE377F01D47FDF1006EB34F /* IntAxisValueFormatter.h */, + 5BE377F11D47FDF1006EB34F /* IntAxisValueFormatter.m */, + 5B613DF11D5A60DF000F1E98 /* LargeValueFormatter.swift */, + 5BE673981D5BAD7E00A87BA2 /* DateValueFormatter.h */, + 5BE673991D5BAD7E00A87BA2 /* DateValueFormatter.m */, + ); + path = Formatters; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 225B361C1F6EB9A50005B3D5 /* ChartsDemo-iOS-Swift */ = { + isa = PBXNativeTarget; + buildConfigurationList = 225B362C1F6EB9A50005B3D5 /* Build configuration list for PBXNativeTarget "ChartsDemo-iOS-Swift" */; + buildPhases = ( + 225B36191F6EB9A50005B3D5 /* Sources */, + 225B361A1F6EB9A50005B3D5 /* Frameworks */, + 225B361B1F6EB9A50005B3D5 /* Resources */, + 225B36901F6EBBB10005B3D5 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 225B368F1F6EBBB00005B3D5 /* PBXTargetDependency */, + ); + name = "ChartsDemo-iOS-Swift"; + productName = "ChartsDemo-Swift"; + productReference = 225B361D1F6EB9A50005B3D5 /* ChartsDemo-iOS-Swift.app */; + productType = "com.apple.product-type.application"; + }; + 5B57BBAE1A9B26AA0036A6CC /* ChartsDemo-iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5B57BBD21A9B26AA0036A6CC /* Build configuration list for PBXNativeTarget "ChartsDemo-iOS" */; + buildPhases = ( + 5B57BBAB1A9B26AA0036A6CC /* Sources */, + 5B57BBAC1A9B26AA0036A6CC /* Frameworks */, + 5B57BBAD1A9B26AA0036A6CC /* Resources */, + 5BB4B0751ACA710D00E2EF4D /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 0630AE541D81271B008859B0 /* PBXTargetDependency */, + ); + name = "ChartsDemo-iOS"; + productName = chartstest; + productReference = 5B57BBAF1A9B26AA0036A6CC /* ChartsDemo-iOS.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 5B57BBA71A9B26AA0036A6CC /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftMigration = 0700; + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = dcg; + TargetAttributes = { + 225B361C1F6EB9A50005B3D5 = { + CreatedOnToolsVersion = 9.0; + LastSwiftMigration = 1000; + }; + 5B57BBAE1A9B26AA0036A6CC = { + CreatedOnToolsVersion = 6.1.1; + LastSwiftMigration = 0900; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 5B57BBAA1A9B26AA0036A6CC /* Build configuration list for PBXProject "ChartsDemo-iOS" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + en, + Base, + ); + mainGroup = 5B57BBA61A9B26AA0036A6CC; + productRefGroup = 5B57BBB01A9B26AA0036A6CC /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 0630AE3A1D8126C0008859B0 /* Products */; + ProjectRef = 0630AE391D8126C0008859B0 /* Charts.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 5B57BBAE1A9B26AA0036A6CC /* ChartsDemo-iOS */, + 225B361C1F6EB9A50005B3D5 /* ChartsDemo-iOS-Swift */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 0630AE411D8126C0008859B0 /* Charts.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = Charts.framework; + remoteRef = 0630AE401D8126C0008859B0 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0630AE431D8126C0008859B0 /* ChartsTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = ChartsTests.xctest; + remoteRef = 0630AE421D8126C0008859B0 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 225B361B1F6EB9A50005B3D5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 225B367C1F6EBA640005B3D5 /* HorizontalBarChartViewController.xib in Resources */, + 225B36841F6EBA640005B3D5 /* PieChartViewController.xib in Resources */, + 225B36741F6EBA640005B3D5 /* AnotherBarChartViewController.xib in Resources */, + 225B36781F6EBA640005B3D5 /* ColoredLineChartViewController.xib in Resources */, + 225B36791F6EBA640005B3D5 /* CombinedChartViewController.xib in Resources */, + 225B367B1F6EBA640005B3D5 /* HalfPieChartViewController.xib in Resources */, + 068A9B1A1FBBF355003CF1AD /* Launch Screen.storyboard in Resources */, + 225B367A1F6EBA640005B3D5 /* CubicLineChartViewController.xib in Resources */, + 225B368B1F6EBA640005B3D5 /* StackedBarChartViewController.xib in Resources */, + 225B36821F6EBA640005B3D5 /* MultipleLinesChartViewController.xib in Resources */, + 068A9B191FBBF351003CF1AD /* Images.xcassets in Resources */, + 225B36751F6EBA640005B3D5 /* BarChartViewController.xib in Resources */, + 225B367F1F6EBA640005B3D5 /* LineChartFilledViewController.xib in Resources */, + 225B36801F6EBA640005B3D5 /* LineChartTimeViewController.xib in Resources */, + 225B36811F6EBA640005B3D5 /* MultipleBarChartViewController.xib in Resources */, + 225B367D1F6EBA640005B3D5 /* LineChart1ViewController.xib in Resources */, + 068A9B1B1FBBF366003CF1AD /* radar_marker@3x.png in Resources */, + 225B36721F6EBA5E0005B3D5 /* DemoListViewController.xib in Resources */, + 225B36891F6EBA640005B3D5 /* ScatterChartViewController.xib in Resources */, + 225B36851F6EBA640005B3D5 /* PiePolylineChartViewController.xib in Resources */, + 225B36771F6EBA640005B3D5 /* CandleStickChartViewController.xib in Resources */, + 225B36871F6EBA640005B3D5 /* RadarChartViewController.xib in Resources */, + 225B368A1F6EBA640005B3D5 /* SinusBarChartViewController.xib in Resources */, + 225B36731F6EBA5E0005B3D5 /* RadarMarkerView.xib in Resources */, + 225B367E1F6EBA640005B3D5 /* LineChart2ViewController.xib in Resources */, + 225B36881F6EBA640005B3D5 /* RealmDemosViewController.xib in Resources */, + 225B36861F6EBA640005B3D5 /* PositiveNegativeBarChartViewController.xib in Resources */, + 225B36831F6EBA640005B3D5 /* NegativeStackedBarChartViewController.xib in Resources */, + 225B36761F6EBA640005B3D5 /* BubbleChartViewController.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5B57BBAD1A9B26AA0036A6CC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5B8EAF301AB32E15009697AA /* Images.xcassets in Resources */, + 5BE673931D5B4E0900A87BA2 /* LineChartFilledViewController.xib in Resources */, + 5BEAED2D1ABC160F0013F194 /* CandleStickChartViewController.xib in Resources */, + 5B613DB51D526EA8000F1E98 /* RadarMarkerView.xib in Resources */, + 5BD47E611ABB3C91008FCEC6 /* LineChart2ViewController.xib in Resources */, + 5BEAED131ABBFB2B0013F194 /* AnotherBarChartViewController.xib in Resources */, + 5BEAED411ABC1AC60013F194 /* SinusBarChartViewController.xib in Resources */, + 5BEAED371ABC192F0013F194 /* RadarChartViewController.xib in Resources */, + 5B8EAF241AB3271B009697AA /* DemoListViewController.xib in Resources */, + 5BEAED261ABC0BE20013F194 /* MultipleBarChartViewController.xib in Resources */, + 5BEAED3C1ABC199F0013F194 /* ColoredLineChartViewController.xib in Resources */, + 5BEAED321ABC18F00013F194 /* CubicLineChartViewController.xib in Resources */, + 5BEAED281ABC0BE20013F194 /* MultipleLinesChartViewController.xib in Resources */, + 5B9624421B38608C007763E2 /* NegativeStackedBarChartViewController.xib in Resources */, + 5B613DA41D526AD5000F1E98 /* radar_marker@3x.png in Resources */, + 5BE7E7631C693098000A0377 /* PositiveNegativeBarChartViewController.xib in Resources */, + 5B0CC7861ABB875400665592 /* PieChartViewController.xib in Resources */, + 5BEAED1C1ABBFB340013F194 /* ScatterChartViewController.xib in Resources */, + 0471CBFC1CA1090A00E52DBC /* PiePolylineChartViewController.xib in Resources */, + 5BD8F0751AB89CE500566E05 /* LineChart1ViewController.xib in Resources */, + 5BE673811D5B496500A87BA2 /* HalfPieChartViewController.xib in Resources */, + B64D06EB1FB199130067418D /* Launch Screen.storyboard in Resources */, + 5BD47E661ABB424E008FCEC6 /* BarChartViewController.xib in Resources */, + 5BDEDC421ABB7F73007D3A60 /* HorizontalBarChartViewController.xib in Resources */, + 5BDEDC481ABB871E007D3A60 /* CombinedChartViewController.xib in Resources */, + 5BE673951D5B4E0900A87BA2 /* LineChartTimeViewController.xib in Resources */, + 5BEAED1E1ABBFB340013F194 /* StackedBarChartViewController.xib in Resources */, + 5B1B5DAB1E911A15006D1375 /* RealmDemosViewController.xib in Resources */, + 55E356501ADC638F00A57971 /* BubbleChartViewController.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 225B36191F6EB9A50005B3D5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 225B365E1F6EBA470005B3D5 /* LineChartTimeViewController.swift in Sources */, + 225B36311F6EB9EE0005B3D5 /* DemoBaseViewController.swift in Sources */, + 225B36391F6EBA040005B3D5 /* DayAxisValueFormatter.swift in Sources */, + 225B36661F6EBA470005B3D5 /* LineChartFilledViewController.swift in Sources */, + 225B366A1F6EBA470005B3D5 /* CubicLineChartViewController.swift in Sources */, + 225B36671F6EBA470005B3D5 /* PositiveNegativeBarChartViewController.swift in Sources */, + 225B363A1F6EBA040005B3D5 /* DateValueFormatter.swift in Sources */, + 225B366D1F6EBA470005B3D5 /* PiePolylineChartViewController.swift in Sources */, + 225B366F1F6EBA470005B3D5 /* BarChartViewController.swift in Sources */, + 225B36601F6EBA470005B3D5 /* LineChart2ViewController.swift in Sources */, + 225B36411F6EBA1D0005B3D5 /* BalloonMarker.swift in Sources */, + 225B366C1F6EBA470005B3D5 /* HorizontalBarChartViewController.swift in Sources */, + 225B36401F6EBA1D0005B3D5 /* XYMarkerView.swift in Sources */, + 225B36421F6EBA1D0005B3D5 /* RadarMarkerView.swift in Sources */, + 225B366B1F6EBA470005B3D5 /* RadarChartViewController.swift in Sources */, + 225B36611F6EBA470005B3D5 /* LineChart1ViewController.swift in Sources */, + 225B36691F6EBA470005B3D5 /* PieChartViewController.swift in Sources */, + 225B365B1F6EBA470005B3D5 /* MultipleLinesChartViewController.swift in Sources */, + 225B365F1F6EBA470005B3D5 /* ColoredLineChartViewController.swift in Sources */, + 225B36201F6EB9A50005B3D5 /* AppDelegate.swift in Sources */, + 225B36321F6EB9EE0005B3D5 /* DemoListViewController.swift in Sources */, + 225B36711F6EBA470005B3D5 /* CandleStickChartViewController.swift in Sources */, + 225B36631F6EBA470005B3D5 /* ScatterChartViewController.swift in Sources */, + 225B365C1F6EBA470005B3D5 /* MultipleBarChartViewController.swift in Sources */, + 225B366E1F6EBA470005B3D5 /* CombinedChartViewController.swift in Sources */, + 225B36641F6EBA470005B3D5 /* StackedBarChartViewController.swift in Sources */, + 225B36651F6EBA470005B3D5 /* BubbleChartViewController.swift in Sources */, + 225B36381F6EBA040005B3D5 /* IntAxisValueFormatter.swift in Sources */, + 225B365D1F6EBA470005B3D5 /* HalfPieChartViewController.swift in Sources */, + 225B36701F6EBA470005B3D5 /* SinusBarChartViewController.swift in Sources */, + 225B36681F6EBA470005B3D5 /* AnotherBarChartViewController.swift in Sources */, + 225B36621F6EBA470005B3D5 /* NegativeStackedBarChartViewController.swift in Sources */, + 225B363B1F6EBA040005B3D5 /* LargeValueFormatter.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5B57BBAB1A9B26AA0036A6CC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5B613DF21D5A60DF000F1E98 /* LargeValueFormatter.swift in Sources */, + 5BEAED1B1ABBFB340013F194 /* ScatterChartViewController.m in Sources */, + 5B0CC7851ABB875400665592 /* PieChartViewController.m in Sources */, + 0439A3541C9FF95F00496F83 /* PiePolylineChartViewController.m in Sources */, + 5B57BBBB1A9B26AA0036A6CC /* DemoListViewController.m in Sources */, + 5BD47E651ABB424E008FCEC6 /* BarChartViewController.m in Sources */, + 5BDEDC471ABB871E007D3A60 /* CombinedChartViewController.m in Sources */, + 5BE377F21D47FDF1006EB34F /* IntAxisValueFormatter.m in Sources */, + 5BD8F0741AB89CE500566E05 /* LineChart1ViewController.m in Sources */, + 5BE377DE1D425151006EB34F /* DayAxisValueFormatter.m in Sources */, + 5BEAED401ABC1AC60013F194 /* SinusBarChartViewController.m in Sources */, + 5BE7E7621C693098000A0377 /* PositiveNegativeBarChartViewController.m in Sources */, + 5B613DB31D526DED000F1E98 /* RadarMarkerView.swift in Sources */, + 5BEAED251ABC0BE20013F194 /* MultipleBarChartViewController.m in Sources */, + 5B57BBB81A9B26AA0036A6CC /* AppDelegate.m in Sources */, + 55E356511ADC638F00A57971 /* BubbleChartViewController.m in Sources */, + 5BD47E5B1ABB0263008FCEC6 /* BalloonMarker.swift in Sources */, + 5BEAED2C1ABC160F0013F194 /* CandleStickChartViewController.m in Sources */, + 5BEAED271ABC0BE20013F194 /* MultipleLinesChartViewController.m in Sources */, + 5BE6739A1D5BAD7E00A87BA2 /* DateValueFormatter.m in Sources */, + 5BE673801D5B496500A87BA2 /* HalfPieChartViewController.m in Sources */, + 5BE673921D5B4E0900A87BA2 /* LineChartFilledViewController.m in Sources */, + 5B8EAF281AB32CF5009697AA /* DemoBaseViewController.m in Sources */, + 5BE673941D5B4E0900A87BA2 /* LineChartTimeViewController.m in Sources */, + 5B613DF01D5A50B6000F1E98 /* XYMarkerView.swift in Sources */, + 5BEAED3B1ABC199F0013F194 /* ColoredLineChartViewController.m in Sources */, + 5BDEDC411ABB7F73007D3A60 /* HorizontalBarChartViewController.m in Sources */, + 5BEAED121ABBFB2B0013F194 /* AnotherBarChartViewController.m in Sources */, + 5BEAED311ABC18F00013F194 /* CubicLineChartViewController.m in Sources */, + 5BEAED1D1ABBFB340013F194 /* StackedBarChartViewController.m in Sources */, + 5BD47E601ABB3C91008FCEC6 /* LineChart2ViewController.m in Sources */, + 5B57BBB51A9B26AA0036A6CC /* main.m in Sources */, + 5BEAED361ABC192F0013F194 /* RadarChartViewController.m in Sources */, + 5B9624411B38608C007763E2 /* NegativeStackedBarChartViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 0630AE541D81271B008859B0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Charts; + targetProxy = 0630AE531D81271B008859B0 /* PBXContainerItemProxy */; + }; + 225B368F1F6EBBB00005B3D5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Charts; + targetProxy = 225B368E1F6EBBB00005B3D5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 225B362D1F6EB9A50005B3D5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.dcg.ChartsDemo-Swift"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 225B362E1F6EB9A50005B3D5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.dcg.ChartsDemo-Swift"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; + 5B57BBD01A9B26AA0036A6CC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 5B57BBD11A9B26AA0036A6CC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 5B57BBD31A9B26AA0036A6CC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + FRAMEWORK_SEARCH_PATHS = "$(SOURCE_ROOT)/../Carthage/Build/iOS"; + INFOPLIST_FILE = "Supporting Files/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.dcg.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "ChartsDemo-iOS"; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos appletvsimulator appletvos"; + SWIFT_OBJC_BRIDGING_HEADER = "Supporting Files/ChartsDemo-Bridging-Header.h"; + SWIFT_OBJC_INTERFACE_HEADER_NAME = "$(SWIFT_MODULE_NAME)-Swift.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 5B57BBD41A9B26AA0036A6CC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + FRAMEWORK_SEARCH_PATHS = "$(SOURCE_ROOT)/../Carthage/Build/iOS"; + INFOPLIST_FILE = "Supporting Files/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.dcg.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "ChartsDemo-iOS"; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos appletvsimulator appletvos"; + SWIFT_OBJC_BRIDGING_HEADER = "Supporting Files/ChartsDemo-Bridging-Header.h"; + SWIFT_OBJC_INTERFACE_HEADER_NAME = "$(SWIFT_MODULE_NAME)-Swift.h"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 225B362C1F6EB9A50005B3D5 /* Build configuration list for PBXNativeTarget "ChartsDemo-iOS-Swift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 225B362D1F6EB9A50005B3D5 /* Debug */, + 225B362E1F6EB9A50005B3D5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5B57BBAA1A9B26AA0036A6CC /* Build configuration list for PBXProject "ChartsDemo-iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5B57BBD01A9B26AA0036A6CC /* Debug */, + 5B57BBD11A9B26AA0036A6CC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5B57BBD21A9B26AA0036A6CC /* Build configuration list for PBXNativeTarget "ChartsDemo-iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5B57BBD31A9B26AA0036A6CC /* Debug */, + 5B57BBD41A9B26AA0036A6CC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 5B57BBA71A9B26AA0036A6CC /* Project object */; +} diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/AppDelegate.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/AppDelegate.h new file mode 100644 index 00000000000..f519086a1a4 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/AppDelegate.h @@ -0,0 +1,20 @@ +// +// AppDelegate.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + + +@end + diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/AppDelegate.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/AppDelegate.m new file mode 100644 index 00000000000..35ffcc3c072 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/AppDelegate.m @@ -0,0 +1,56 @@ +// +// AppDelegate.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "AppDelegate.h" +#import "DemoListViewController.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + + DemoListViewController *vc = [[DemoListViewController alloc] init]; + UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:vc]; + + _window.rootViewController = nvc; + [_window makeKeyAndVisible]; + + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. +} + +- (void)applicationDidEnterBackground:(UIApplication *)application { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + +- (void)applicationWillEnterForeground:(UIApplication *)application { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. +} + +- (void)applicationDidBecomeActive:(UIApplication *)application { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. +} + +- (void)applicationWillTerminate:(UIApplication *)application { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Components/BalloonMarker.swift b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Components/BalloonMarker.swift new file mode 100644 index 00000000000..9965b893240 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Components/BalloonMarker.swift @@ -0,0 +1,207 @@ +// +// BalloonMarker.swift +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +import Foundation +import Charts + + +open class BalloonMarker: MarkerImage +{ + @objc open var color: UIColor + @objc open var arrowSize = CGSize(width: 15, height: 11) + @objc open var font: UIFont + @objc open var textColor: UIColor + @objc open var insets: UIEdgeInsets + @objc open var minimumSize = CGSize() + + fileprivate var label: String? + fileprivate var _labelSize: CGSize = CGSize() + fileprivate var _paragraphStyle: NSMutableParagraphStyle? + fileprivate var _drawAttributes = [NSAttributedString.Key : Any]() + + @objc public init(color: UIColor, font: UIFont, textColor: UIColor, insets: UIEdgeInsets) + { + self.color = color + self.font = font + self.textColor = textColor + self.insets = insets + + _paragraphStyle = NSParagraphStyle.default.mutableCopy() as? NSMutableParagraphStyle + _paragraphStyle?.alignment = .center + super.init() + } + + open override func offsetForDrawing(atPoint point: CGPoint) -> CGPoint + { + var offset = self.offset + var size = self.size + + if size.width == 0.0 && image != nil + { + size.width = image!.size.width + } + if size.height == 0.0 && image != nil + { + size.height = image!.size.height + } + + let width = size.width + let height = size.height + let padding: CGFloat = 8.0 + + var origin = point + origin.x -= width / 2 + origin.y -= height + + if origin.x + offset.x < 0.0 + { + offset.x = -origin.x + padding + } + else if let chart = chartView, + origin.x + width + offset.x > chart.bounds.size.width + { + offset.x = chart.bounds.size.width - origin.x - width - padding + } + + if origin.y + offset.y < 0 + { + offset.y = height + padding; + } + else if let chart = chartView, + origin.y + height + offset.y > chart.bounds.size.height + { + offset.y = chart.bounds.size.height - origin.y - height - padding + } + + return offset + } + + open override func draw(context: CGContext, point: CGPoint) + { + guard let label = label else { return } + + let offset = self.offsetForDrawing(atPoint: point) + let size = self.size + + var rect = CGRect( + origin: CGPoint( + x: point.x + offset.x, + y: point.y + offset.y), + size: size) + rect.origin.x -= size.width / 2.0 + rect.origin.y -= size.height + + context.saveGState() + + context.setFillColor(color.cgColor) + + if offset.y > 0 + { + context.beginPath() + context.move(to: CGPoint( + x: rect.origin.x, + y: rect.origin.y + arrowSize.height)) + context.addLine(to: CGPoint( + x: rect.origin.x + (rect.size.width - arrowSize.width) / 2.0, + y: rect.origin.y + arrowSize.height)) + //arrow vertex + context.addLine(to: CGPoint( + x: point.x, + y: point.y)) + context.addLine(to: CGPoint( + x: rect.origin.x + (rect.size.width + arrowSize.width) / 2.0, + y: rect.origin.y + arrowSize.height)) + context.addLine(to: CGPoint( + x: rect.origin.x + rect.size.width, + y: rect.origin.y + arrowSize.height)) + context.addLine(to: CGPoint( + x: rect.origin.x + rect.size.width, + y: rect.origin.y + rect.size.height)) + context.addLine(to: CGPoint( + x: rect.origin.x, + y: rect.origin.y + rect.size.height)) + context.addLine(to: CGPoint( + x: rect.origin.x, + y: rect.origin.y + arrowSize.height)) + context.fillPath() + } + else + { + context.beginPath() + context.move(to: CGPoint( + x: rect.origin.x, + y: rect.origin.y)) + context.addLine(to: CGPoint( + x: rect.origin.x + rect.size.width, + y: rect.origin.y)) + context.addLine(to: CGPoint( + x: rect.origin.x + rect.size.width, + y: rect.origin.y + rect.size.height - arrowSize.height)) + context.addLine(to: CGPoint( + x: rect.origin.x + (rect.size.width + arrowSize.width) / 2.0, + y: rect.origin.y + rect.size.height - arrowSize.height)) + //arrow vertex + context.addLine(to: CGPoint( + x: point.x, + y: point.y)) + context.addLine(to: CGPoint( + x: rect.origin.x + (rect.size.width - arrowSize.width) / 2.0, + y: rect.origin.y + rect.size.height - arrowSize.height)) + context.addLine(to: CGPoint( + x: rect.origin.x, + y: rect.origin.y + rect.size.height - arrowSize.height)) + context.addLine(to: CGPoint( + x: rect.origin.x, + y: rect.origin.y)) + context.fillPath() + } + + if offset.y > 0 { + rect.origin.y += self.insets.top + arrowSize.height + } else { + rect.origin.y += self.insets.top + } + + rect.size.height -= self.insets.top + self.insets.bottom + + UIGraphicsPushContext(context) + + label.draw(in: rect, withAttributes: _drawAttributes) + + UIGraphicsPopContext() + + context.restoreGState() + } + + open override func refreshContent(entry: ChartDataEntry, highlight: Highlight) + { + setLabel(String(entry.y)) + } + + @objc open func setLabel(_ newLabel: String) + { + label = newLabel + + _drawAttributes.removeAll() + _drawAttributes[.font] = self.font + _drawAttributes[.paragraphStyle] = _paragraphStyle + _drawAttributes[.foregroundColor] = self.textColor + + _labelSize = label?.size(withAttributes: _drawAttributes) ?? CGSize.zero + + var size = CGSize() + size.width = _labelSize.width + self.insets.left + self.insets.right + size.height = _labelSize.height + self.insets.top + self.insets.bottom + size.width = max(minimumSize.width, size.width) + size.height = max(minimumSize.height, size.height) + self.size = size + } +} diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Components/RadarMarkerView.swift b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Components/RadarMarkerView.swift new file mode 100644 index 00000000000..6f286bf0134 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Components/RadarMarkerView.swift @@ -0,0 +1,30 @@ +// +// RadarMarkerView.swift +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +import Foundation +import Charts + +open class RadarMarkerView: MarkerView +{ + @IBOutlet var label: UILabel? + + open override func awakeFromNib() + { + self.offset.x = -self.frame.size.width / 2.0 + self.offset.y = -self.frame.size.height - 7.0 + } + + open override func refreshContent(entry: ChartDataEntry, highlight: Highlight) + { + label?.text = String.init(format: "%d %%", Int(round(entry.y))) + layoutIfNeeded() + } +} diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Components/XYMarkerView.swift b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Components/XYMarkerView.swift new file mode 100644 index 00000000000..bc77c822061 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Components/XYMarkerView.swift @@ -0,0 +1,29 @@ +// +// XYMarkerView.swift +// ChartsDemo +// Copyright © 2016 dcg. All rights reserved. +// + +import Foundation +import Charts + +open class XYMarkerView: BalloonMarker +{ + @objc open var xAxisValueFormatter: IAxisValueFormatter? + fileprivate var yFormatter = NumberFormatter() + + @objc public init(color: UIColor, font: UIFont, textColor: UIColor, insets: UIEdgeInsets, + xAxisValueFormatter: IAxisValueFormatter) + { + super.init(color: color, font: font, textColor: textColor, insets: insets) + self.xAxisValueFormatter = xAxisValueFormatter + yFormatter.minimumFractionDigits = 1 + yFormatter.maximumFractionDigits = 1 + } + + open override func refreshContent(entry: ChartDataEntry, highlight: Highlight) + { + setLabel("x: " + xAxisValueFormatter!.stringForValue(entry.x, axis: nil) + ", y: " + yFormatter.string(from: NSNumber(floatLiteral: entry.y))!) + } + +} diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/DemoBaseViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/DemoBaseViewController.h new file mode 100644 index 00000000000..fd31bfd7da9 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/DemoBaseViewController.h @@ -0,0 +1,34 @@ +// +// DemoBaseViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "ChartsDemo_iOS-Swift.h" + +@interface DemoBaseViewController : UIViewController +{ +@protected + NSArray *parties; +} + +@property (nonatomic, strong) IBOutlet UIButton *optionsButton; +@property (nonatomic, strong) IBOutlet NSArray *options; + +@property (nonatomic, assign) BOOL shouldHideData; + +- (void)handleOption:(NSString *)key forChartView:(ChartViewBase *)chartView; + +- (void)updateChartData; + +- (void)setupPieChartView:(PieChartView *)chartView; +- (void)setupRadarChartView:(RadarChartView *)chartView; +- (void)setupBarLineChartView:(BarLineChartViewBase *)chartView; + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/DemoBaseViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/DemoBaseViewController.m new file mode 100644 index 00000000000..4e6392a91de --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/DemoBaseViewController.m @@ -0,0 +1,329 @@ +// +// DemoBaseViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "DemoBaseViewController.h" + +@interface DemoBaseViewController () + +@property (nonatomic, strong) UITableView *optionsTableView; + +@end + +@implementation DemoBaseViewController + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) + { + [self initialize]; + } + return self; +} + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) + { + [self initialize]; + } + return self; +} + +- (void)initialize +{ + self.edgesForExtendedLayout = UIRectEdgeNone; + + parties = @[ + @"Party A", @"Party B", @"Party C", @"Party D", @"Party E", @"Party F", + @"Party G", @"Party H", @"Party I", @"Party J", @"Party K", @"Party L", + @"Party M", @"Party N", @"Party O", @"Party P", @"Party Q", @"Party R", + @"Party S", @"Party T", @"Party U", @"Party V", @"Party W", @"Party X", + @"Party Y", @"Party Z" + ]; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + // Do any additional setup after loading the view from its nib. +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)optionTapped:(NSString *)key +{ + +} + +#pragma mark - Common option actions + +- (void)handleOption:(NSString *)key forChartView:(ChartViewBase *)chartView +{ + if ([key isEqualToString:@"toggleValues"]) + { + for (id set in chartView.data.dataSets) + { + set.drawValuesEnabled = !set.isDrawValuesEnabled; + } + + [chartView setNeedsDisplay]; + } + + if ([key isEqualToString:@"toggleIcons"]) + { + for (id set in chartView.data.dataSets) + { + set.drawIconsEnabled = !set.isDrawIconsEnabled; + } + + [chartView setNeedsDisplay]; + } + + if ([key isEqualToString:@"toggleHighlight"]) + { + chartView.data.highlightEnabled = !chartView.data.isHighlightEnabled; + [chartView setNeedsDisplay]; + } + + if ([key isEqualToString:@"animateX"]) + { + [chartView animateWithXAxisDuration:3.0]; + } + + if ([key isEqualToString:@"animateY"]) + { + [chartView animateWithYAxisDuration:3.0]; + } + + if ([key isEqualToString:@"animateXY"]) + { + [chartView animateWithXAxisDuration:3.0 yAxisDuration:3.0]; + } + + if ([key isEqualToString:@"saveToGallery"]) + { + UIImageWriteToSavedPhotosAlbum([chartView getChartImageWithTransparent:NO], nil, nil, nil); + } + + if ([key isEqualToString:@"togglePinchZoom"]) + { + BarLineChartViewBase *barLineChart = (BarLineChartViewBase *)chartView; + barLineChart.pinchZoomEnabled = !barLineChart.isPinchZoomEnabled; + + [chartView setNeedsDisplay]; + } + + if ([key isEqualToString:@"toggleAutoScaleMinMax"]) + { + BarLineChartViewBase *barLineChart = (BarLineChartViewBase *)chartView; + barLineChart.autoScaleMinMaxEnabled = !barLineChart.isAutoScaleMinMaxEnabled; + + [chartView notifyDataSetChanged]; + } + + if ([key isEqualToString:@"toggleData"]) + { + _shouldHideData = !_shouldHideData; + [self updateChartData]; + } + + if ([key isEqualToString:@"toggleBarBorders"]) + { + for (id set in chartView.data.dataSets) + { + if ([set conformsToProtocol:@protocol(IBarChartDataSet)]) + { + set.barBorderWidth = set.barBorderWidth == 1.0 ? 0.0 : 1.0; + } + } + + [chartView setNeedsDisplay]; + } +} + +#pragma mark - Actions + +- (IBAction)optionsButtonTapped:(id)sender +{ + if (_optionsTableView) + { + [_optionsTableView removeFromSuperview]; + self.optionsTableView = nil; + return; + } + + self.optionsTableView = [[UITableView alloc] init]; + _optionsTableView.backgroundColor = [UIColor colorWithWhite:0.f alpha:0.9f]; + _optionsTableView.delegate = self; + _optionsTableView.dataSource = self; + [_optionsTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"]; + + _optionsTableView.translatesAutoresizingMaskIntoConstraints = NO; + + NSMutableArray *constraints = [[NSMutableArray alloc] init]; + + [constraints addObject:[NSLayoutConstraint constraintWithItem:_optionsTableView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.f constant:40.f]]; + + [constraints addObject:[NSLayoutConstraint constraintWithItem:_optionsTableView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:sender attribute:NSLayoutAttributeTrailing multiplier:1.f constant:0]]; + + [constraints addObject:[NSLayoutConstraint constraintWithItem:_optionsTableView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:sender attribute:NSLayoutAttributeBottom multiplier:1.f constant:5.f]]; + + [self.view addSubview:_optionsTableView]; + + [self.view addConstraints:constraints]; + + [_optionsTableView addConstraints:@[ + [NSLayoutConstraint constraintWithItem:_optionsTableView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1.f constant:220.f] + ]]; +} + +#pragma mark - UITableViewDelegate, UITableViewDataSource + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + if (tableView == _optionsTableView) + { + return 1; + } + + return 0; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + if (tableView == _optionsTableView) + { + return self.options.count; + } + + return 0; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath +{ + if (tableView == _optionsTableView) + { + return 40.0; + } + + return 44.0; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; + cell.backgroundView = nil; + cell.backgroundColor = UIColor.clearColor; + cell.textLabel.textColor = UIColor.whiteColor; + + cell.textLabel.text = self.options[indexPath.row][@"label"]; + + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + if (tableView == _optionsTableView) + { + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + + if (_optionsTableView) + { + [_optionsTableView removeFromSuperview]; + self.optionsTableView = nil; + } + + [self optionTapped:self.options[indexPath.row][@"key"]]; + } +} + +#pragma mark - Stubs for chart view + +- (void)updateChartData +{ + // Override this +} + +- (void)setupPieChartView:(PieChartView *)chartView +{ + chartView.usePercentValuesEnabled = YES; + chartView.drawSlicesUnderHoleEnabled = NO; + chartView.holeRadiusPercent = 0.58; + chartView.transparentCircleRadiusPercent = 0.61; + chartView.chartDescription.enabled = NO; + [chartView setExtraOffsetsWithLeft:5.f top:10.f right:5.f bottom:5.f]; + + chartView.drawCenterTextEnabled = YES; + + NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; + paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail; + paragraphStyle.alignment = NSTextAlignmentCenter; + + NSMutableAttributedString *centerText = [[NSMutableAttributedString alloc] initWithString:@"Charts\nby Daniel Cohen Gindi"]; + [centerText setAttributes:@{ + NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue-Light" size:13.f], + NSParagraphStyleAttributeName: paragraphStyle + } range:NSMakeRange(0, centerText.length)]; + [centerText addAttributes:@{ + NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue-Light" size:11.f], + NSForegroundColorAttributeName: UIColor.grayColor + } range:NSMakeRange(10, centerText.length - 10)]; + [centerText addAttributes:@{ + NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue-LightItalic" size:11.f], + NSForegroundColorAttributeName: [UIColor colorWithRed:51/255.f green:181/255.f blue:229/255.f alpha:1.f] + } range:NSMakeRange(centerText.length - 19, 19)]; + chartView.centerAttributedText = centerText; + + chartView.drawHoleEnabled = YES; + chartView.rotationAngle = 0.0; + chartView.rotationEnabled = YES; + chartView.highlightPerTapEnabled = YES; + + ChartLegend *l = chartView.legend; + l.horizontalAlignment = ChartLegendHorizontalAlignmentRight; + l.verticalAlignment = ChartLegendVerticalAlignmentTop; + l.orientation = ChartLegendOrientationVertical; + l.drawInside = NO; + l.xEntrySpace = 7.0; + l.yEntrySpace = 0.0; + l.yOffset = 0.0; +} + +- (void)setupRadarChartView:(RadarChartView *)chartView +{ + chartView.chartDescription.enabled = NO; +} + +- (void)setupBarLineChartView:(BarLineChartViewBase *)chartView +{ + chartView.chartDescription.enabled = NO; + + chartView.drawGridBackgroundEnabled = NO; + + chartView.dragEnabled = YES; + [chartView setScaleEnabled:YES]; + chartView.pinchZoomEnabled = NO; + + // ChartYAxis *leftAxis = chartView.leftAxis; + + ChartXAxis *xAxis = chartView.xAxis; + xAxis.labelPosition = XAxisLabelPositionBottom; + + chartView.rightAxis.enabled = NO; +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/DemoListViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/DemoListViewController.h new file mode 100644 index 00000000000..3f119de0711 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/DemoListViewController.h @@ -0,0 +1,18 @@ +// +// DemoListViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import + +@interface DemoListViewController : UIViewController + + +@end + diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/DemoListViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/DemoListViewController.m new file mode 100644 index 00000000000..77576d0321f --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/DemoListViewController.m @@ -0,0 +1,227 @@ +// +// DemoListViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "DemoListViewController.h" +#import "LineChart1ViewController.h" +#import "LineChart2ViewController.h" +#import "BarChartViewController.h" +#import "HorizontalBarChartViewController.h" +#import "CombinedChartViewController.h" +#import "PieChartViewController.h" +#import "PiePolylineChartViewController.h" +#import "ScatterChartViewController.h" +#import "StackedBarChartViewController.h" +#import "NegativeStackedBarChartViewController.h" +#import "AnotherBarChartViewController.h" +#import "MultipleLinesChartViewController.h" +#import "MultipleBarChartViewController.h" +#import "CandleStickChartViewController.h" +#import "CubicLineChartViewController.h" +#import "RadarChartViewController.h" +#import "ColoredLineChartViewController.h" +#import "SinusBarChartViewController.h" +#import "PositiveNegativeBarChartViewController.h" +#import "BubbleChartViewController.h" +#import "LineChartTimeViewController.h" +#import "LineChartFilledViewController.h" +#import "HalfPieChartViewController.h" + +@interface DemoListViewController () + +@property (nonatomic, strong) IBOutlet UITableView *tableView; +@property (nonatomic, strong) NSArray *itemDefs; +@end + +@implementation DemoListViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Charts Demonstration"; + + self.itemDefs = @[ + @{ + @"title": @"Line Chart", + @"subtitle": @"A simple demonstration of the linechart.", + @"class": LineChart1ViewController.class + }, + @{ + @"title": @"Line Chart (Dual YAxis)", + @"subtitle": @"Demonstration of the linechart with dual y-axis.", + @"class": LineChart2ViewController.class + }, + @{ + @"title": @"Bar Chart", + @"subtitle": @"A simple demonstration of the bar chart.", + @"class": BarChartViewController.class + }, + @{ + @"title": @"Horizontal Bar Chart", + @"subtitle": @"A simple demonstration of the horizontal bar chart.", + @"class": HorizontalBarChartViewController.class + }, + @{ + @"title": @"Combined Chart", + @"subtitle": @"Demonstrates how to create a combined chart (bar and line in this case).", + @"class": CombinedChartViewController.class + }, + @{ + @"title": @"Pie Chart", + @"subtitle": @"A simple demonstration of the pie chart.", + @"class": PieChartViewController.class + }, + @{ + @"title": @"Pie Chart with value lines", + @"subtitle": @"A simple demonstration of the pie chart with polyline notes.", + @"class": PiePolylineChartViewController.class + }, + @{ + @"title": @"Scatter Chart", + @"subtitle": @"A simple demonstration of the scatter chart.", + @"class": ScatterChartViewController.class + }, + @{ + @"title": @"Bubble Chart", + @"subtitle": @"A simple demonstration of the bubble chart.", + @"class": BubbleChartViewController.class + }, + @{ + @"title": @"Stacked Bar Chart", + @"subtitle": @"A simple demonstration of a bar chart with stacked bars.", + @"class": StackedBarChartViewController.class + }, + @{ + @"title": @"Stacked Bar Chart Negative", + @"subtitle": @"A simple demonstration of stacked bars with negative and positive values.", + @"class": NegativeStackedBarChartViewController.class + }, + @{ + @"title": @"Another Bar Chart", + @"subtitle": @"Implementation of a BarChart that only shows values at the bottom.", + @"class": AnotherBarChartViewController.class + }, + @{ + @"title": @"Multiple Lines Chart", + @"subtitle": @"A line chart with multiple DataSet objects. One color per DataSet.", + @"class": MultipleLinesChartViewController.class + }, + @{ + @"title": @"Multiple Bars Chart", + @"subtitle": @"A bar chart with multiple DataSet objects. One multiple colors per DataSet.", + @"class": MultipleBarChartViewController.class + }, + @{ + @"title": @"Candle Stick Chart", + @"subtitle": @"Demonstrates usage of the CandleStickChart.", + @"class": CandleStickChartViewController.class + }, + @{ + @"title": @"Cubic Line Chart", + @"subtitle": @"Demonstrates cubic lines in a LineChart.", + @"class": CubicLineChartViewController.class + }, + @{ + @"title": @"Radar Chart", + @"subtitle": @"Demonstrates the use of a spider-web like (net) chart.", + @"class": RadarChartViewController.class + }, + @{ + @"title": @"Colored Line Chart", + @"subtitle": @"Shows a LineChart with different background and line color.", + @"class": ColoredLineChartViewController.class + }, + @{ + @"title": @"Sinus Bar Chart", + @"subtitle": @"A Bar Chart plotting the sinus function with 8.000 values.", + @"class": SinusBarChartViewController.class + }, + @{ + + @"title": @"BarChart positive / negative", + @"subtitle": @"This demonstrates how to create a BarChart with positive and negative values in different colors.", + @"class": PositiveNegativeBarChartViewController.class + }, + @{ + + @"title": @"Time Line Chart", + @"subtitle": @"Simple demonstration of a time-chart. This chart draws one line entry per hour originating from the current time in milliseconds.", + @"class": LineChartTimeViewController.class + }, + @{ + + @"title": @"Filled Line Chart", + @"subtitle": @"This demonstrates how to fill an area between two LineDataSets.", + @"class": LineChartFilledViewController.class + }, + @{ + + @"title": @"Half Pie Chart", + @"subtitle": @"This demonstrates how to create a 180 degree PieChart.", + @"class": HalfPieChartViewController.class + } + ]; + //FIXME: Add TimeLineChart +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +#pragma mark - UITableViewDataSource, UITableViewDelegate + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + return self.itemDefs.count; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath +{ + return 70.f; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + NSDictionary *def = self.itemDefs[indexPath.row]; + + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; + if (!cell) + { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Cell"]; + } + + cell.textLabel.text = def[@"title"]; + cell.detailTextLabel.text = def[@"subtitle"]; + cell.detailTextLabel.numberOfLines = 0; + + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + NSDictionary *def = self.itemDefs[indexPath.row]; + + Class vcClass = def[@"class"]; + UIViewController *vc = [[vcClass alloc] init]; + + [self.navigationController pushViewController:vc animated:YES]; + + [tableView deselectRowAtIndexPath:indexPath animated:YES]; +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/AnotherBarChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/AnotherBarChartViewController.h new file mode 100644 index 00000000000..cc5374f6ca6 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/AnotherBarChartViewController.h @@ -0,0 +1,18 @@ +// +// AnotherBarChartViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface AnotherBarChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/AnotherBarChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/AnotherBarChartViewController.m new file mode 100644 index 00000000000..65439bc914f --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/AnotherBarChartViewController.m @@ -0,0 +1,149 @@ +// +// AnotherBarChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "AnotherBarChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface AnotherBarChartViewController () + +@property (nonatomic, strong) IBOutlet BarChartView *chartView; +@property (nonatomic, strong) IBOutlet UISlider *sliderX; +@property (nonatomic, strong) IBOutlet UISlider *sliderY; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextX; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextY; + +@end + +@implementation AnotherBarChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Another Bar Chart"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Values"}, + @{@"key": @"toggleHighlight", @"label": @"Toggle Highlight"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"togglePinchZoom", @"label": @"Toggle PinchZoom"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + @{@"key": @"toggleBarBorders", @"label": @"Show Bar Borders"}, + ]; + + _chartView.delegate = self; + + _chartView.chartDescription.enabled = NO; + + _chartView.maxVisibleCount = 60; + _chartView.pinchZoomEnabled = NO; + _chartView.drawBarShadowEnabled = NO; + _chartView.drawGridBackgroundEnabled = NO; + + ChartXAxis *xAxis = _chartView.xAxis; + xAxis.labelPosition = XAxisLabelPositionBottom; + xAxis.drawGridLinesEnabled = NO; + + _chartView.leftAxis.drawGridLinesEnabled = NO; + _chartView.rightAxis.drawGridLinesEnabled = NO; + + _chartView.legend.enabled = NO; + + _sliderX.value = 10.0; + _sliderY.value = 100.0; + [self slidersValueChanged:nil]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:_sliderX.value + 1 range:_sliderY.value]; +} + +- (void)setDataCount:(int)count range:(double)range +{ + NSMutableArray *yVals = [[NSMutableArray alloc] init]; + + for (int i = 0; i < count; i++) + { + double mult = (range + 1); + double val = (double) (arc4random_uniform(mult)) + mult / 3.0; + [yVals addObject:[[BarChartDataEntry alloc] initWithX:i y:val]]; + } + + BarChartDataSet *set1 = nil; + if (_chartView.data.dataSetCount > 0) + { + set1 = (BarChartDataSet *)_chartView.data.dataSets[0]; + [set1 replaceEntries:yVals]; + [_chartView.data notifyDataChanged]; + [_chartView notifyDataSetChanged]; + } + else + { + set1 = [[BarChartDataSet alloc] initWithEntries:yVals label:@"DataSet"]; + set1.colors = ChartColorTemplates.vordiplom; + set1.drawValuesEnabled = NO; + + NSMutableArray *dataSets = [[NSMutableArray alloc] init]; + [dataSets addObject:set1]; + + BarChartData *data = [[BarChartData alloc] initWithDataSets:dataSets]; + + _chartView.data = data; + _chartView.fitBars = YES; + } + + [_chartView setNeedsDisplay]; +} + +- (void)optionTapped:(NSString *)key +{ + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - Actions + +- (IBAction)slidersValueChanged:(id)sender +{ + _sliderTextX.text = [@((int)_sliderX.value) stringValue]; + _sliderTextY.text = [@((int)_sliderY.value) stringValue]; + + [self updateChartData]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/BarChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/BarChartViewController.h new file mode 100644 index 00000000000..05b7c8c96cd --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/BarChartViewController.h @@ -0,0 +1,18 @@ +// +// BarChartViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface BarChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/BarChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/BarChartViewController.m new file mode 100644 index 00000000000..5e1567c088e --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/BarChartViewController.m @@ -0,0 +1,200 @@ +// +// BarChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "BarChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" +#import "DayAxisValueFormatter.h" + +@interface BarChartViewController () + +@property (nonatomic, strong) IBOutlet BarChartView *chartView; +@property (nonatomic, strong) IBOutlet UISlider *sliderX; +@property (nonatomic, strong) IBOutlet UISlider *sliderY; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextX; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextY; + +@end + +@implementation BarChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Bar Chart"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Values"}, + @{@"key": @"toggleIcons", @"label": @"Toggle Icons"}, + @{@"key": @"toggleHighlight", @"label": @"Toggle Highlight"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"togglePinchZoom", @"label": @"Toggle PinchZoom"}, + @{@"key": @"toggleAutoScaleMinMax", @"label": @"Toggle auto scale min/max"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + @{@"key": @"toggleBarBorders", @"label": @"Show Bar Borders"}, + ]; + + [self setupBarLineChartView:_chartView]; + + _chartView.delegate = self; + + _chartView.drawBarShadowEnabled = NO; + _chartView.drawValueAboveBarEnabled = YES; + + _chartView.maxVisibleCount = 60; + + ChartXAxis *xAxis = _chartView.xAxis; + xAxis.labelPosition = XAxisLabelPositionBottom; + xAxis.labelFont = [UIFont systemFontOfSize:10.f]; + xAxis.drawGridLinesEnabled = NO; + xAxis.granularity = 1.0; // only intervals of 1 day + xAxis.labelCount = 7; + xAxis.valueFormatter = [[DayAxisValueFormatter alloc] initForChart:_chartView]; + + NSNumberFormatter *leftAxisFormatter = [[NSNumberFormatter alloc] init]; + leftAxisFormatter.minimumFractionDigits = 0; + leftAxisFormatter.maximumFractionDigits = 1; + leftAxisFormatter.negativeSuffix = @" $"; + leftAxisFormatter.positiveSuffix = @" $"; + + ChartYAxis *leftAxis = _chartView.leftAxis; + leftAxis.labelFont = [UIFont systemFontOfSize:10.f]; + leftAxis.labelCount = 8; + leftAxis.valueFormatter = [[ChartDefaultAxisValueFormatter alloc] initWithFormatter:leftAxisFormatter]; + leftAxis.labelPosition = YAxisLabelPositionOutsideChart; + leftAxis.spaceTop = 0.15; + leftAxis.axisMinimum = 0.0; // this replaces startAtZero = YES + + ChartYAxis *rightAxis = _chartView.rightAxis; + rightAxis.enabled = YES; + rightAxis.drawGridLinesEnabled = NO; + rightAxis.labelFont = [UIFont systemFontOfSize:10.f]; + rightAxis.labelCount = 8; + rightAxis.valueFormatter = leftAxis.valueFormatter; + rightAxis.spaceTop = 0.15; + rightAxis.axisMinimum = 0.0; // this replaces startAtZero = YES + + ChartLegend *l = _chartView.legend; + l.horizontalAlignment = ChartLegendHorizontalAlignmentLeft; + l.verticalAlignment = ChartLegendVerticalAlignmentBottom; + l.orientation = ChartLegendOrientationHorizontal; + l.drawInside = NO; + l.form = ChartLegendFormSquare; + l.formSize = 9.0; + l.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:11.f]; + l.xEntrySpace = 4.0; + + XYMarkerView *marker = [[XYMarkerView alloc] + initWithColor: [UIColor colorWithWhite:180/255. alpha:1.0] + font: [UIFont systemFontOfSize:12.0] + textColor: UIColor.whiteColor + insets: UIEdgeInsetsMake(8.0, 8.0, 20.0, 8.0) + xAxisValueFormatter: _chartView.xAxis.valueFormatter]; + marker.chartView = _chartView; + marker.minimumSize = CGSizeMake(80.f, 40.f); + _chartView.marker = marker; + + _sliderX.value = 12.0; + _sliderY.value = 50.0; + [self slidersValueChanged:nil]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:_sliderX.value + 1 range:_sliderY.value]; +} + +- (void)setDataCount:(int)count range:(double)range +{ + double start = 1.0; + + NSMutableArray *yVals = [[NSMutableArray alloc] init]; + + for (int i = start; i < start + count + 1; i++) + { + double mult = (range + 1); + double val = (double) (arc4random_uniform(mult)); + if (arc4random_uniform(100) < 25) { + [yVals addObject:[[BarChartDataEntry alloc] initWithX:i y:val icon: [UIImage imageNamed:@"icon"]]]; + } else { + [yVals addObject:[[BarChartDataEntry alloc] initWithX:i y:val]]; + } + } + + BarChartDataSet *set1 = nil; + if (_chartView.data.dataSetCount > 0) + { + set1 = (BarChartDataSet *)_chartView.data.dataSets[0]; + [set1 replaceEntries: yVals]; + [_chartView.data notifyDataChanged]; + [_chartView notifyDataSetChanged]; + } + else + { + set1 = [[BarChartDataSet alloc] initWithEntries:yVals label:@"The year 2017"]; + [set1 setColors:ChartColorTemplates.material]; + set1.drawIconsEnabled = NO; + + NSMutableArray *dataSets = [[NSMutableArray alloc] init]; + [dataSets addObject:set1]; + + BarChartData *data = [[BarChartData alloc] initWithDataSets:dataSets]; + [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]]; + + data.barWidth = 0.9f; + + _chartView.data = data; + } +} + +- (void)optionTapped:(NSString *)key +{ + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - Actions + +- (IBAction)slidersValueChanged:(id)sender +{ + _sliderTextX.text = [@((int)_sliderX.value + 2) stringValue]; + _sliderTextY.text = [@((int)_sliderY.value) stringValue]; + + [self updateChartData]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/BubbleChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/BubbleChartViewController.h new file mode 100644 index 00000000000..e09eef79626 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/BubbleChartViewController.h @@ -0,0 +1,18 @@ +// +// BubbleChartViewController.h +// ChartsDemo +// +// Bubble chart implementation: +// Copyright 2015 Pierre-Marc Airoldi +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface BubbleChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/BubbleChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/BubbleChartViewController.m new file mode 100644 index 00000000000..9d325966745 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/BubbleChartViewController.m @@ -0,0 +1,173 @@ +// +// BubbleChartViewController.m +// ChartsDemo +// +// Bubble chart implementation: +// Copyright 2015 Pierre-Marc Airoldi +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "BubbleChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface BubbleChartViewController () + +@property (nonatomic, strong) IBOutlet BubbleChartView *chartView; +@property (nonatomic, strong) IBOutlet UISlider *sliderX; +@property (nonatomic, strong) IBOutlet UISlider *sliderY; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextX; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextY; + +@end + +@implementation BubbleChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Bubble Chart"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Values"}, + @{@"key": @"toggleIcons", @"label": @"Toggle Icons"}, + @{@"key": @"toggleHighlight", @"label": @"Toggle Highlight"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"togglePinchZoom", @"label": @"Toggle PinchZoom"}, + @{@"key": @"toggleAutoScaleMinMax", @"label": @"Toggle auto scale min/max"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + ]; + + _chartView.delegate = self; + + _chartView.chartDescription.enabled = NO; + + _chartView.drawGridBackgroundEnabled = NO; + _chartView.dragEnabled = YES; + [_chartView setScaleEnabled:YES]; + _chartView.maxVisibleCount = 200; + _chartView.pinchZoomEnabled = YES; + + ChartLegend *l = _chartView.legend; + l.horizontalAlignment = ChartLegendHorizontalAlignmentRight; + l.verticalAlignment = ChartLegendVerticalAlignmentTop; + l.orientation = ChartLegendOrientationVertical; + l.drawInside = NO; + l.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]; + + ChartYAxis *yl = _chartView.leftAxis; + yl.labelFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]; + yl.spaceTop = 0.3; + yl.spaceBottom = 0.3; + yl.axisMinimum = 0.0; // this replaces startAtZero = YES + + _chartView.rightAxis.enabled = NO; + + ChartXAxis *xl = _chartView.xAxis; + xl.labelPosition = XAxisLabelPositionBottom; + xl.labelFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]; + + _sliderX.value = 10.0; + _sliderY.value = 50.0; + [self slidersValueChanged:nil]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:_sliderX.value range:_sliderY.value]; +} + +- (void)setDataCount:(int)count range:(double)range +{ + NSMutableArray *yVals1 = [[NSMutableArray alloc] init]; + NSMutableArray *yVals2 = [[NSMutableArray alloc] init]; + NSMutableArray *yVals3 = [[NSMutableArray alloc] init]; + + for (int i = 0; i < count; i++) + { + double val = (double) (arc4random_uniform(range)); + double size = (double) (arc4random_uniform(range)); + [yVals1 addObject:[[BubbleChartDataEntry alloc] initWithX:i y:val size:size icon: [UIImage imageNamed:@"icon"]]]; + + val = (double) (arc4random_uniform(range)); + size = (double) (arc4random_uniform(range)); + [yVals2 addObject:[[BubbleChartDataEntry alloc] initWithX:i y:val size:size icon: [UIImage imageNamed:@"icon"]]]; + + val = (double) (arc4random_uniform(range)); + size = (double) (arc4random_uniform(range)); + [yVals3 addObject:[[BubbleChartDataEntry alloc] initWithX:i y:val size:size]]; + } + + BubbleChartDataSet *set1 = [[BubbleChartDataSet alloc] initWithEntries:yVals1 label:@"DS 1"]; + set1.drawIconsEnabled = NO; + [set1 setColor:ChartColorTemplates.colorful[0] alpha:0.50f]; + [set1 setDrawValuesEnabled:YES]; + + BubbleChartDataSet *set2 = [[BubbleChartDataSet alloc] initWithEntries:yVals2 label:@"DS 2"]; + set2.iconsOffset = CGPointMake(0, 15); + [set2 setColor:ChartColorTemplates.colorful[1] alpha:0.50f]; + [set2 setDrawValuesEnabled:YES]; + + BubbleChartDataSet *set3 = [[BubbleChartDataSet alloc] initWithEntries:yVals3 label:@"DS 3"]; + [set3 setColor:ChartColorTemplates.colorful[2] alpha:0.50f]; + [set3 setDrawValuesEnabled:YES]; + + NSMutableArray *dataSets = [[NSMutableArray alloc] init]; + [dataSets addObject:set1]; + [dataSets addObject:set2]; + [dataSets addObject:set3]; + + BubbleChartData *data = [[BubbleChartData alloc] initWithDataSets:dataSets]; + [data setDrawValues:NO]; + [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:7.f]]; + [data setHighlightCircleWidth: 1.5]; + [data setValueTextColor:UIColor.whiteColor]; + + _chartView.data = data; +} + +- (void)optionTapped:(NSString *)key +{ + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - Actions + +- (IBAction)slidersValueChanged:(id)sender +{ + _sliderTextX.text = [@((int)_sliderX.value) stringValue]; + _sliderTextY.text = [@((int)_sliderY.value) stringValue]; + + [self updateChartData]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull )entry dataSetIndex:(NSInteger)dataSetIndex highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CandleStickChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CandleStickChartViewController.h new file mode 100644 index 00000000000..fc3d2f66b27 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CandleStickChartViewController.h @@ -0,0 +1,18 @@ +// +// CandleStickChartViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface CandleStickChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CandleStickChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CandleStickChartViewController.m new file mode 100644 index 00000000000..25a0e73ca34 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CandleStickChartViewController.m @@ -0,0 +1,174 @@ +// +// CandleStickChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "CandleStickChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface CandleStickChartViewController () + +@property (nonatomic, strong) IBOutlet CandleStickChartView *chartView; +@property (nonatomic, strong) IBOutlet UISlider *sliderX; +@property (nonatomic, strong) IBOutlet UISlider *sliderY; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextX; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextY; + +@end + +@implementation CandleStickChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Candle Stick Chart"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Values"}, + @{@"key": @"toggleIcons", @"label": @"Toggle Icons"}, + @{@"key": @"toggleHighlight", @"label": @"Toggle Highlight"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"togglePinchZoom", @"label": @"Toggle PinchZoom"}, + @{@"key": @"toggleAutoScaleMinMax", @"label": @"Toggle auto scale min/max"}, + @{@"key": @"toggleShadowColorSameAsCandle", @"label": @"Toggle shadow same color"}, + @{@"key": @"toggleShowCandleBar", @"label": @"Toggle show candle bar"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + ]; + + _chartView.delegate = self; + + _chartView.chartDescription.enabled = NO; + + _chartView.maxVisibleCount = 60; + _chartView.pinchZoomEnabled = NO; + _chartView.drawGridBackgroundEnabled = NO; + + ChartXAxis *xAxis = _chartView.xAxis; + xAxis.labelPosition = XAxisLabelPositionBottom; + xAxis.drawGridLinesEnabled = NO; + + ChartYAxis *leftAxis = _chartView.leftAxis; + leftAxis.labelCount = 7; + leftAxis.drawGridLinesEnabled = NO; + leftAxis.drawAxisLineEnabled = NO; + + ChartYAxis *rightAxis = _chartView.rightAxis; + rightAxis.enabled = NO; + + _chartView.legend.enabled = NO; + + _sliderX.value = 40.0; + _sliderY.value = 100.0; + [self slidersValueChanged:nil]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:_sliderX.value + 1 range:_sliderY.value]; +} + +- (void)setDataCount:(int)count range:(double)range +{ + NSMutableArray *yVals1 = [[NSMutableArray alloc] init]; + + for (int i = 0; i < count; i++) + { + double mult = (range + 1); + double val = (double) (arc4random_uniform(40)) + mult; + double high = (double) (arc4random_uniform(9)) + 8.0; + double low = (double) (arc4random_uniform(9)) + 8.0; + double open = (double) (arc4random_uniform(6)) + 1.0; + double close = (double) (arc4random_uniform(6)) + 1.0; + BOOL even = i % 2 == 0; + [yVals1 addObject:[[CandleChartDataEntry alloc] initWithX:i shadowH:val + high shadowL:val - low open:even ? val + open : val - open close:even ? val - close : val + close icon: [UIImage imageNamed:@"icon"]]]; + } + + CandleChartDataSet *set1 = [[CandleChartDataSet alloc] initWithEntries:yVals1 label:@"Data Set"]; + set1.axisDependency = AxisDependencyLeft; + [set1 setColor:[UIColor colorWithWhite:80/255.f alpha:1.f]]; + + set1.drawIconsEnabled = NO; + + set1.shadowColor = UIColor.darkGrayColor; + set1.shadowWidth = 0.7; + set1.decreasingColor = UIColor.redColor; + set1.decreasingFilled = YES; + set1.increasingColor = [UIColor colorWithRed:122/255.f green:242/255.f blue:84/255.f alpha:1.f]; + set1.increasingFilled = NO; + set1.neutralColor = UIColor.blueColor; + + CandleChartData *data = [[CandleChartData alloc] initWithDataSet:set1]; + + _chartView.data = data; +} + +- (void)optionTapped:(NSString *)key +{ + if ([key isEqualToString:@"toggleShadowColorSameAsCandle"]) + { + for (id set in _chartView.data.dataSets) + { + set.shadowColorSameAsCandle = !set.shadowColorSameAsCandle; + } + + [_chartView notifyDataSetChanged]; + return; + } else if ([key isEqualToString:@"toggleShowCandleBar"]) + { + for (id set in _chartView.data.dataSets) + { + set.showCandleBar = !set.showCandleBar; + } + + [_chartView notifyDataSetChanged]; + return; + } + + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - Actions + +- (IBAction)slidersValueChanged:(id)sender +{ + _sliderTextX.text = [@((int)_sliderX.value) stringValue]; + _sliderTextY.text = [@((int)_sliderY.value) stringValue]; + + [self updateChartData]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/ColoredLineChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/ColoredLineChartViewController.h new file mode 100644 index 00000000000..c79e3cf3146 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/ColoredLineChartViewController.h @@ -0,0 +1,18 @@ +// +// ColoredLineChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface ColoredLineChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/ColoredLineChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/ColoredLineChartViewController.m new file mode 100644 index 00000000000..520770f2068 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/ColoredLineChartViewController.m @@ -0,0 +1,114 @@ +// +// ColoredLineChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "ColoredLineChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface ColoredLineChartViewController () + +@property (nonatomic, strong) IBOutletCollection(LineChartView) NSArray *chartViews; + +@end + +@implementation ColoredLineChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Colored Line Chart"; + + for (int i = 0; i < _chartViews.count; i++) + { + LineChartData *data = [self dataWithCount:36 range:100]; + [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:7.f]]; + + NSArray *colors = @[ + [UIColor colorWithRed:137/255.f green:230/255.f blue:81/255.f alpha:1.f], + [UIColor colorWithRed:240/255.f green:240/255.f blue:30/255.f alpha:1.f], + [UIColor colorWithRed:89/255.f green:199/255.f blue:250/255.f alpha:1.f], + [UIColor colorWithRed:250/255.f green:104/255.f blue:104/255.f alpha:1.f], + ]; + + [self setupChart:_chartViews[i] data:data color:colors[i % colors.count]]; + } +} + +- (void)setupChart:(LineChartView *)chart data:(LineChartData *)data color:(UIColor *)color +{ + [(LineChartDataSet *)[data getDataSetByIndex:0] setCircleHoleColor:color]; + + chart.delegate = self; + chart.backgroundColor = color; + + chart.chartDescription.enabled = NO; + + chart.drawGridBackgroundEnabled = NO; + chart.dragEnabled = YES; + [chart setScaleEnabled:YES]; + chart.pinchZoomEnabled = NO; + [chart setViewPortOffsetsWithLeft:10.0 top:0.0 right:10.0 bottom:0.0]; + + chart.legend.enabled = NO; + + chart.leftAxis.enabled = NO; + chart.leftAxis.spaceTop = 0.4; + chart.leftAxis.spaceBottom = 0.4; + chart.rightAxis.enabled = NO; + chart.xAxis.enabled = NO; + + chart.data = data; + + [chart animateWithXAxisDuration:2.5]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (LineChartData *)dataWithCount:(int)count range:(double)range +{ + NSMutableArray *yVals = [[NSMutableArray alloc] init]; + + for (int i = 0; i < count; i++) + { + double val = (double) (arc4random_uniform(range)) + 3; + [yVals addObject:[[ChartDataEntry alloc] initWithX:i y:val]]; + } + + LineChartDataSet *set1 = [[LineChartDataSet alloc] initWithEntries:yVals label:@"DataSet 1"]; + + set1.lineWidth = 1.75; + set1.circleRadius = 5.0; + set1.circleHoleRadius = 2.5f; + [set1 setColor:UIColor.whiteColor]; + [set1 setCircleColor:UIColor.whiteColor]; + set1.highlightColor = UIColor.whiteColor; + set1.drawValuesEnabled = NO; + + return [[LineChartData alloc] initWithDataSet:set1]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CombinedChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CombinedChartViewController.h new file mode 100644 index 00000000000..c6de2899e8f --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CombinedChartViewController.h @@ -0,0 +1,18 @@ +// +// CombinedChartViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface CombinedChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CombinedChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CombinedChartViewController.m new file mode 100644 index 00000000000..995c419210a --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CombinedChartViewController.m @@ -0,0 +1,324 @@ +// +// CombinedChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "CombinedChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +#define ITEM_COUNT 12 + +@interface CombinedChartViewController () +{ + NSArray *months; +} + +@property (nonatomic, strong) IBOutlet CombinedChartView *chartView; + +@end + +@implementation CombinedChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Combined Chart"; + + self.options = @[ + @{@"key": @"toggleLineValues", @"label": @"Toggle Line Values"}, + @{@"key": @"toggleBarValues", @"label": @"Toggle Bar Values"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + @{@"key": @"toggleBarBorders", @"label": @"Show Bar Borders"}, + @{@"key": @"removeDataSet", @"label": @"Remove random set"}, + ]; + + months = @[ + @"Jan", @"Feb", @"Mar", + @"Apr", @"May", @"Jun", + @"Jul", @"Aug", @"Sep", + @"Oct", @"Nov", @"Dec" + ]; + + _chartView.delegate = self; + + _chartView.chartDescription.enabled = NO; + + _chartView.drawGridBackgroundEnabled = NO; + _chartView.drawBarShadowEnabled = NO; + _chartView.highlightFullBarEnabled = NO; + + _chartView.drawOrder = @[ + @(CombinedChartDrawOrderBar), + @(CombinedChartDrawOrderBubble), + @(CombinedChartDrawOrderCandle), + @(CombinedChartDrawOrderLine), + @(CombinedChartDrawOrderScatter) + ]; + + ChartLegend *l = _chartView.legend; + l.wordWrapEnabled = YES; + l.horizontalAlignment = ChartLegendHorizontalAlignmentCenter; + l.verticalAlignment = ChartLegendVerticalAlignmentBottom; + l.orientation = ChartLegendOrientationHorizontal; + l.drawInside = NO; + + ChartYAxis *rightAxis = _chartView.rightAxis; + rightAxis.drawGridLinesEnabled = NO; + rightAxis.axisMinimum = 0.0; // this replaces startAtZero = YES + + ChartYAxis *leftAxis = _chartView.leftAxis; + leftAxis.drawGridLinesEnabled = NO; + leftAxis.axisMinimum = 0.0; // this replaces startAtZero = YES + + ChartXAxis *xAxis = _chartView.xAxis; + xAxis.labelPosition = XAxisLabelPositionBothSided; + xAxis.axisMinimum = 0.0; + xAxis.granularity = 1.0; + xAxis.valueFormatter = self; + + [self updateChartData]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setChartData]; +} + +- (void)setChartData +{ + CombinedChartData *data = [[CombinedChartData alloc] init]; + data.lineData = [self generateLineData]; + data.barData = [self generateBarData]; + data.bubbleData = [self generateBubbleData]; + data.scatterData = [self generateScatterData]; + data.candleData = [self generateCandleData]; + + _chartView.xAxis.axisMaximum = data.xMax + 0.25; + + _chartView.data = data; +} + +- (void)optionTapped:(NSString *)key +{ + if ([key isEqualToString:@"toggleLineValues"]) + { + for (NSObject *set in _chartView.data.dataSets) + { + if ([set isKindOfClass:LineChartDataSet.class]) + { + set.drawValuesEnabled = !set.isDrawValuesEnabled; + } + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleBarValues"]) + { + for (NSObject *set in _chartView.data.dataSets) + { + if ([set isKindOfClass:BarChartDataSet.class]) + { + set.drawValuesEnabled = !set.isDrawValuesEnabled; + } + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"removeDataSet"]) + { + int rnd = (int)arc4random_uniform((float)_chartView.data.dataSetCount); + [_chartView.data removeDataSet:[_chartView.data getDataSetByIndex:rnd]]; + [_chartView.data notifyDataChanged]; + [_chartView notifyDataSetChanged]; + } + + [super handleOption:key forChartView:_chartView]; +} + +- (LineChartData *)generateLineData +{ + LineChartData *d = [[LineChartData alloc] init]; + + NSMutableArray *entries = [[NSMutableArray alloc] init]; + + for (int index = 0; index < ITEM_COUNT; index++) + { + [entries addObject:[[ChartDataEntry alloc] initWithX:index + 0.5 y:(arc4random_uniform(15) + 5)]]; + } + + LineChartDataSet *set = [[LineChartDataSet alloc] initWithEntries:entries label:@"Line DataSet"]; + [set setColor:[UIColor colorWithRed:240/255.f green:238/255.f blue:70/255.f alpha:1.f]]; + set.lineWidth = 2.5; + [set setCircleColor:[UIColor colorWithRed:240/255.f green:238/255.f blue:70/255.f alpha:1.f]]; + set.circleRadius = 5.0; + set.circleHoleRadius = 2.5; + set.fillColor = [UIColor colorWithRed:240/255.f green:238/255.f blue:70/255.f alpha:1.f]; + set.mode = LineChartModeCubicBezier; + set.drawValuesEnabled = YES; + set.valueFont = [UIFont systemFontOfSize:10.f]; + set.valueTextColor = [UIColor colorWithRed:240/255.f green:238/255.f blue:70/255.f alpha:1.f]; + + set.axisDependency = AxisDependencyLeft; + + [d addDataSet:set]; + + return d; +} + +- (BarChartData *)generateBarData +{ + NSMutableArray *entries1 = [[NSMutableArray alloc] init]; + NSMutableArray *entries2 = [[NSMutableArray alloc] init]; + + for (int index = 0; index < ITEM_COUNT; index++) + { + [entries1 addObject:[[BarChartDataEntry alloc] initWithX:0.0 y:(arc4random_uniform(25) + 25)]]; + + // stacked + [entries2 addObject:[[BarChartDataEntry alloc] initWithX:0.0 yValues:@[@(arc4random_uniform(13) + 12), @(arc4random_uniform(13) + 12)]]]; + } + + BarChartDataSet *set1 = [[BarChartDataSet alloc] initWithEntries:entries1 label:@"Bar 1"]; + [set1 setColor:[UIColor colorWithRed:60/255.f green:220/255.f blue:78/255.f alpha:1.f]]; + set1.valueTextColor = [UIColor colorWithRed:60/255.f green:220/255.f blue:78/255.f alpha:1.f]; + set1.valueFont = [UIFont systemFontOfSize:10.f]; + set1.axisDependency = AxisDependencyRight; + + BarChartDataSet *set2 = [[BarChartDataSet alloc] initWithEntries:entries2 label:@""]; + set2.stackLabels = @[@"Stack 1", @"Stack 2"]; + set2.colors = @[ + [UIColor colorWithRed:61/255.f green:165/255.f blue:255/255.f alpha:1.f], + [UIColor colorWithRed:23/255.f green:197/255.f blue:255/255.f alpha:1.f] + ]; + set2.valueTextColor = [UIColor colorWithRed:61/255.f green:165/255.f blue:255/255.f alpha:1.f]; + set2.valueFont = [UIFont systemFontOfSize:10.f]; + set2.axisDependency = AxisDependencyRight; + + float groupSpace = 0.06f; + float barSpace = 0.02f; // x2 dataset + float barWidth = 0.45f; // x2 dataset + // (0.45 + 0.02) * 2 + 0.06 = 1.00 -> interval per "group" + + BarChartData *d = [[BarChartData alloc] initWithDataSets:@[set1, set2]]; + d.barWidth = barWidth; + + // make this BarData object grouped + [d groupBarsFromX:0.0 groupSpace:groupSpace barSpace:barSpace]; // start at x = 0 + + return d; +} + +- (ScatterChartData *)generateScatterData +{ + ScatterChartData *d = [[ScatterChartData alloc] init]; + + NSMutableArray *entries = [[NSMutableArray alloc] init]; + + for (double index = 0; index < ITEM_COUNT; index += 0.5) + { + [entries addObject:[[ChartDataEntry alloc] initWithX:index + 0.25 y:(arc4random_uniform(10) + 55)]]; + } + + ScatterChartDataSet *set = [[ScatterChartDataSet alloc] initWithEntries:entries label:@"Scatter DataSet"]; + set.colors = ChartColorTemplates.material; + set.scatterShapeSize = 4.5; + [set setDrawValuesEnabled:NO]; + set.valueFont = [UIFont systemFontOfSize:10.f]; + + [d addDataSet:set]; + + return d; +} + +- (CandleChartData *)generateCandleData +{ + CandleChartData *d = [[CandleChartData alloc] init]; + + NSMutableArray *entries = [[NSMutableArray alloc] init]; + + for (int index = 0; index < ITEM_COUNT; index += 2) + { + [entries addObject:[[CandleChartDataEntry alloc] initWithX:index + 1 shadowH:90.0 shadowL:70.0 open:85.0 close:75.0]]; + } + + CandleChartDataSet *set = [[CandleChartDataSet alloc] initWithEntries:entries label:@"Candle DataSet"]; + [set setColor:[UIColor colorWithRed:80/255.f green:80/255.f blue:80/255.f alpha:1.f]]; + set.decreasingColor = [UIColor colorWithRed:142/255.0 green:150/255.0 blue:175/255.0 alpha:1.0]; + set.shadowColor = UIColor.darkGrayColor; + set.valueFont = [UIFont systemFontOfSize:10.f]; + [set setDrawValuesEnabled:NO]; + + [d addDataSet:set]; + + return d; +} + +- (BubbleChartData *)generateBubbleData +{ + BubbleChartData *bd = [[BubbleChartData alloc] init]; + + NSMutableArray *entries = [[NSMutableArray alloc] init]; + + for (int index = 0; index < ITEM_COUNT; index++) + { + double y = arc4random_uniform(10) + 105.0; + double size = arc4random_uniform(50) + 105.0; + [entries addObject:[[BubbleChartDataEntry alloc] initWithX:index + 0.5 y:y size:size]]; + } + + BubbleChartDataSet *set = [[BubbleChartDataSet alloc] initWithEntries:entries label:@"Bubble DataSet"]; + [set setColors:ChartColorTemplates.vordiplom]; + set.valueTextColor = UIColor.whiteColor; + set.valueFont = [UIFont systemFontOfSize:10.f]; + [set setDrawValuesEnabled:YES]; + + [bd addDataSet:set]; + + return bd; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +#pragma mark - IAxisValueFormatter + +- (NSString *)stringForValue:(double)value + axis:(ChartAxisBase *)axis +{ + return months[(int)value % months.count]; +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CubicLineChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CubicLineChartViewController.h new file mode 100644 index 00000000000..658570aaabf --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CubicLineChartViewController.h @@ -0,0 +1,18 @@ +// +// CubicLineChartViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface CubicLineChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CubicLineChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CubicLineChartViewController.m new file mode 100644 index 00000000000..0d590fbf1c1 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/CubicLineChartViewController.m @@ -0,0 +1,238 @@ +// +// CubicLineChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "CubicLineChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface CubicLineSampleFillFormatter : NSObject +{ +} +@end + +@implementation CubicLineSampleFillFormatter + +- (CGFloat)getFillLinePositionWithDataSet:(LineChartDataSet *)dataSet dataProvider:(id)dataProvider +{ + return -10.f; +} + +@end + +@interface CubicLineChartViewController () + +@property (nonatomic, strong) IBOutlet LineChartView *chartView; +@property (nonatomic, strong) IBOutlet UISlider *sliderX; +@property (nonatomic, strong) IBOutlet UISlider *sliderY; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextX; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextY; + +@end + +@implementation CubicLineChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Cubic Line Chart"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Values"}, + @{@"key": @"toggleFilled", @"label": @"Toggle Filled"}, + @{@"key": @"toggleCircles", @"label": @"Toggle Circles"}, + @{@"key": @"toggleCubic", @"label": @"Toggle Cubic"}, + @{@"key": @"toggleHorizontalCubic", @"label": @"Toggle Horizontal Cubic"}, + @{@"key": @"toggleStepped", @"label": @"Toggle Stepped"}, + @{@"key": @"toggleHighlight", @"label": @"Toggle Highlight"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"togglePinchZoom", @"label": @"Toggle PinchZoom"}, + @{@"key": @"toggleAutoScaleMinMax", @"label": @"Toggle auto scale min/max"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + ]; + + _chartView.delegate = self; + + [_chartView setViewPortOffsetsWithLeft:0.f top:20.f right:0.f bottom:0.f]; + _chartView.backgroundColor = [UIColor colorWithRed:104/255.f green:241/255.f blue:175/255.f alpha:1.f]; + + _chartView.chartDescription.enabled = NO; + + _chartView.dragEnabled = YES; + [_chartView setScaleEnabled:YES]; + _chartView.pinchZoomEnabled = NO; + _chartView.drawGridBackgroundEnabled = NO; + _chartView.maxHighlightDistance = 300.0; + + _chartView.xAxis.enabled = NO; + + ChartYAxis *yAxis = _chartView.leftAxis; + yAxis.labelFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:12.f]; + [yAxis setLabelCount:6 force:NO]; + yAxis.labelTextColor = UIColor.whiteColor; + yAxis.labelPosition = YAxisLabelPositionInsideChart; + yAxis.drawGridLinesEnabled = NO; + yAxis.axisLineColor = UIColor.whiteColor; + + _chartView.rightAxis.enabled = NO; + _chartView.legend.enabled = NO; + + _sliderX.value = 45.0; + _sliderY.value = 100.0; + [self slidersValueChanged:nil]; + + [_chartView animateWithXAxisDuration:2.0 yAxisDuration:2.0]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:_sliderX.value + 1 range:_sliderY.value]; +} + +- (void)setDataCount:(int)count range:(double)range +{ + NSMutableArray *yVals1 = [[NSMutableArray alloc] init]; + + for (int i = 0; i < count; i++) + { + double mult = (range + 1); + double val = (double) (arc4random_uniform(mult)) + 20; + [yVals1 addObject:[[ChartDataEntry alloc] initWithX:i y:val]]; + } + + LineChartDataSet *set1 = nil; + if (_chartView.data.dataSetCount > 0) + { + set1 = (LineChartDataSet *)_chartView.data.dataSets[0]; + [set1 replaceEntries:yVals1]; + [_chartView.data notifyDataChanged]; + [_chartView notifyDataSetChanged]; + } + else + { + set1 = [[LineChartDataSet alloc] initWithEntries:yVals1 label:@"DataSet 1"]; + set1.mode = LineChartModeCubicBezier; + set1.cubicIntensity = 0.2; + set1.drawCirclesEnabled = NO; + set1.lineWidth = 1.8; + set1.circleRadius = 4.0; + [set1 setCircleColor:UIColor.whiteColor]; + set1.highlightColor = [UIColor colorWithRed:244/255.f green:117/255.f blue:117/255.f alpha:1.f]; + [set1 setColor:UIColor.whiteColor]; + set1.fillColor = UIColor.whiteColor; + set1.fillAlpha = 1.f; + set1.drawHorizontalHighlightIndicatorEnabled = NO; + set1.fillFormatter = [[CubicLineSampleFillFormatter alloc] init]; + + LineChartData *data = [[LineChartData alloc] initWithDataSet:set1]; + [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:9.f]]; + [data setDrawValues:NO]; + + _chartView.data = data; + } +} + +- (void)optionTapped:(NSString *)key +{ + if ([key isEqualToString:@"toggleFilled"]) + { + for (id set in _chartView.data.dataSets) + { + set.drawFilledEnabled = !set.isDrawFilledEnabled; + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleCircles"]) + { + for (id set in _chartView.data.dataSets) + { + set.drawCirclesEnabled = !set.isDrawCirclesEnabled; + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleCubic"]) + { + for (id set in _chartView.data.dataSets) + { + set.mode = set.mode == LineChartModeCubicBezier ? LineChartModeLinear : LineChartModeCubicBezier; + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleStepped"]) + { + for (id set in _chartView.data.dataSets) + { + set.mode = set.mode == LineChartModeStepped ? LineChartModeLinear : LineChartModeStepped; + } + + [_chartView setNeedsDisplay]; + } + + if ([key isEqualToString:@"toggleHorizontalCubic"]) + { + for (id set in _chartView.data.dataSets) + { + set.mode = set.mode == LineChartModeCubicBezier ? LineChartModeHorizontalBezier : LineChartModeCubicBezier; + } + + [_chartView setNeedsDisplay]; + return; + } + + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - Actions + +- (IBAction)slidersValueChanged:(id)sender +{ + _sliderTextX.text = [@((int)_sliderX.value) stringValue]; + _sliderTextY.text = [@((int)_sliderY.value) stringValue]; + + [self updateChartData]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/HalfPieChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/HalfPieChartViewController.h new file mode 100644 index 00000000000..5f3ab1b1a43 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/HalfPieChartViewController.h @@ -0,0 +1,18 @@ +// +// HalfPieChartViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface HalfPieChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/HalfPieChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/HalfPieChartViewController.m new file mode 100644 index 00000000000..e66840c48e1 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/HalfPieChartViewController.m @@ -0,0 +1,202 @@ +// +// HalfPieChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "HalfPieChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface HalfPieChartViewController () + +@property (nonatomic, strong) IBOutlet PieChartView *chartView; + +@end + +@implementation HalfPieChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Half Pie Chart"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Y-Values"}, + @{@"key": @"toggleXValues", @"label": @"Toggle X-Values"}, + @{@"key": @"togglePercent", @"label": @"Toggle Percent"}, + @{@"key": @"toggleHole", @"label": @"Toggle Hole"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"spin", @"label": @"Spin"}, + @{@"key": @"drawCenter", @"label": @"Draw CenterText"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + ]; + + [self setupPieChartView:_chartView]; + + _chartView.delegate = self; + + _chartView.holeColor = UIColor.whiteColor; + _chartView.transparentCircleColor = [UIColor.whiteColor colorWithAlphaComponent:0.43]; + _chartView.holeRadiusPercent = 0.58; + _chartView.rotationEnabled = NO; + _chartView.highlightPerTapEnabled = YES; + + _chartView.maxAngle = 180.0; // Half chart + _chartView.rotationAngle = 180.0; // Rotate to make the half on the upper side + _chartView.centerTextOffset = CGPointMake(0.0, -20.0); + + ChartLegend *l = _chartView.legend; + l.horizontalAlignment = ChartLegendHorizontalAlignmentCenter; + l.verticalAlignment = ChartLegendVerticalAlignmentTop; + l.orientation = ChartLegendOrientationHorizontal; + l.drawInside = NO; + l.xEntrySpace = 7.0; + l.yEntrySpace = 0.0; + l.yOffset = 0.0; + + // entry label styling + _chartView.entryLabelColor = UIColor.whiteColor; + _chartView.entryLabelFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:12.f]; + + [self updateChartData]; + + [_chartView animateWithXAxisDuration:1.4 easingOption:ChartEasingOptionEaseOutBack]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:4 range:100]; +} + +- (void)setDataCount:(int)count range:(double)range +{ + double mult = range; + + NSMutableArray *values = [[NSMutableArray alloc] init]; + + // IMPORTANT: In a PieChart, no values (Entry) should have the same xIndex (even if from different DataSets), since no values can be drawn above each other. + for (int i = 0; i < count; i++) + { + [values addObject:[[PieChartDataEntry alloc] initWithValue:(arc4random_uniform(mult) + mult / 5) label:parties[i % parties.count]]]; + } + + PieChartDataSet *dataSet = [[PieChartDataSet alloc] initWithEntries:values label:@"Election Results"]; + dataSet.sliceSpace = 3.0; + dataSet.selectionShift = 5.0; + + dataSet.colors = ChartColorTemplates.material; + + PieChartData *data = [[PieChartData alloc] initWithDataSet:dataSet]; + + NSNumberFormatter *pFormatter = [[NSNumberFormatter alloc] init]; + pFormatter.numberStyle = NSNumberFormatterPercentStyle; + pFormatter.maximumFractionDigits = 1; + pFormatter.multiplier = @1.f; + pFormatter.percentSymbol = @" %"; + [data setValueFormatter:[[ChartDefaultValueFormatter alloc] initWithFormatter:pFormatter]]; + + [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:11.f]]; + [data setValueTextColor:UIColor.whiteColor]; + + _chartView.data = data; + + [_chartView setNeedsDisplay]; +} + +- (void)optionTapped:(NSString *)key +{ + if ([key isEqualToString:@"toggleXValues"]) + { + _chartView.drawEntryLabelsEnabled = !_chartView.drawEntryLabelsEnabled; + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"togglePercent"]) + { + _chartView.usePercentValuesEnabled = !_chartView.isUsePercentValuesEnabled; + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleHole"]) + { + _chartView.drawHoleEnabled = !_chartView.isDrawHoleEnabled; + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"drawCenter"]) + { + _chartView.drawCenterTextEnabled = !_chartView.isDrawCenterTextEnabled; + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"animateX"]) + { + [_chartView animateWithXAxisDuration:1.4]; + return; + } + + if ([key isEqualToString:@"animateY"]) + { + [_chartView animateWithYAxisDuration:1.4]; + return; + } + + if ([key isEqualToString:@"animateXY"]) + { + [_chartView animateWithXAxisDuration:1.4 yAxisDuration:1.4]; + return; + } + + if ([key isEqualToString:@"spin"]) + { + [_chartView spinWithDuration:2.0 fromAngle:_chartView.rotationAngle toAngle:_chartView.rotationAngle + 360.f easingOption:ChartEasingOptionEaseInCubic]; + return; + } + + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - Action + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/HorizontalBarChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/HorizontalBarChartViewController.h new file mode 100644 index 00000000000..4db77ab9452 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/HorizontalBarChartViewController.h @@ -0,0 +1,18 @@ +// +// HorizontalBarChartViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface HorizontalBarChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/HorizontalBarChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/HorizontalBarChartViewController.m new file mode 100644 index 00000000000..54899281f19 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/HorizontalBarChartViewController.m @@ -0,0 +1,178 @@ +// +// HorizontalBarChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "HorizontalBarChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface HorizontalBarChartViewController () + +@property (nonatomic, strong) IBOutlet HorizontalBarChartView *chartView; +@property (nonatomic, strong) IBOutlet UISlider *sliderX; +@property (nonatomic, strong) IBOutlet UISlider *sliderY; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextX; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextY; + +@end + +@implementation HorizontalBarChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Horizontal Bar Chart"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Values"}, + @{@"key": @"toggleIcons", @"label": @"Toggle Icons"}, + @{@"key": @"toggleHighlight", @"label": @"Toggle Highlight"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"togglePinchZoom", @"label": @"Toggle PinchZoom"}, + @{@"key": @"toggleAutoScaleMinMax", @"label": @"Toggle auto scale min/max"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + @{@"key": @"toggleBarBorders", @"label": @"Show Bar Borders"}, + ]; + + [self setupBarLineChartView:_chartView]; + + _chartView.delegate = self; + + _chartView.drawBarShadowEnabled = NO; + _chartView.drawValueAboveBarEnabled = YES; + + _chartView.maxVisibleCount = 60; + + ChartXAxis *xAxis = _chartView.xAxis; + xAxis.labelPosition = XAxisLabelPositionBottom; + xAxis.labelFont = [UIFont systemFontOfSize:10.f]; + xAxis.drawAxisLineEnabled = YES; + xAxis.drawGridLinesEnabled = NO; + xAxis.granularity = 10.0; + + ChartYAxis *leftAxis = _chartView.leftAxis; + leftAxis.labelFont = [UIFont systemFontOfSize:10.f]; + leftAxis.drawAxisLineEnabled = YES; + leftAxis.drawGridLinesEnabled = YES; + leftAxis.axisMinimum = 0.0; // this replaces startAtZero = YES + + ChartYAxis *rightAxis = _chartView.rightAxis; + rightAxis.enabled = YES; + rightAxis.labelFont = [UIFont systemFontOfSize:10.f]; + rightAxis.drawAxisLineEnabled = YES; + rightAxis.drawGridLinesEnabled = NO; + rightAxis.axisMinimum = 0.0; // this replaces startAtZero = YES + + ChartLegend *l = _chartView.legend; + l.horizontalAlignment = ChartLegendHorizontalAlignmentLeft; + l.verticalAlignment = ChartLegendVerticalAlignmentBottom; + l.orientation = ChartLegendOrientationHorizontal; + l.drawInside = NO; + l.form = ChartLegendFormSquare; + l.formSize = 8.0; + l.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:11.f]; + l.xEntrySpace = 4.0; + + _chartView.fitBars = YES; + + _sliderX.value = 12.0; + _sliderY.value = 50.0; + [self slidersValueChanged:nil]; + + [_chartView animateWithYAxisDuration:2.5]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:_sliderX.value + 1 range:_sliderY.value]; +} + +- (void)setDataCount:(int)count range:(double)range +{ + double barWidth = 9.0; + double spaceForBar = 10.0; + + NSMutableArray *yVals = [[NSMutableArray alloc] init]; + + for (int i = 0; i < count; i++) + { + double mult = (range + 1); + double val = (double) (arc4random_uniform(mult)); + [yVals addObject:[[BarChartDataEntry alloc] initWithX:i * spaceForBar y:val icon: [UIImage imageNamed:@"icon"]]]; + } + + BarChartDataSet *set1 = nil; + if (_chartView.data.dataSetCount > 0) + { + set1 = (BarChartDataSet *)_chartView.data.dataSets[0]; + [set1 replaceEntries:yVals]; + [_chartView.data notifyDataChanged]; + [_chartView notifyDataSetChanged]; + } + else + { + set1 = [[BarChartDataSet alloc] initWithEntries:yVals label:@"DataSet"]; + + set1.drawIconsEnabled = NO; + + NSMutableArray *dataSets = [[NSMutableArray alloc] init]; + [dataSets addObject:set1]; + + BarChartData *data = [[BarChartData alloc] initWithDataSets:dataSets]; + [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]]; + data.barWidth = barWidth; + + _chartView.data = data; + } +} + +- (void)optionTapped:(NSString *)key +{ + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - Actions + +- (IBAction)slidersValueChanged:(id)sender +{ + _sliderTextX.text = [@((int)_sliderX.value) stringValue]; + _sliderTextY.text = [@((int)_sliderY.value) stringValue]; + + [self updateChartData]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChart1ViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChart1ViewController.h new file mode 100644 index 00000000000..3519fd40546 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChart1ViewController.h @@ -0,0 +1,18 @@ +// +// LineChart1ViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface LineChart1ViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChart1ViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChart1ViewController.m new file mode 100644 index 00000000000..40297febdbb --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChart1ViewController.m @@ -0,0 +1,279 @@ +// +// LineChart1ViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "LineChart1ViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface LineChart1ViewController () + +@property (nonatomic, strong) IBOutlet LineChartView *chartView; +@property (nonatomic, strong) IBOutlet UISlider *sliderX; +@property (nonatomic, strong) IBOutlet UISlider *sliderY; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextX; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextY; + +@end + +@implementation LineChart1ViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Line Chart 1"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Values"}, + @{@"key": @"toggleFilled", @"label": @"Toggle Filled"}, + @{@"key": @"toggleCircles", @"label": @"Toggle Circles"}, + @{@"key": @"toggleCubic", @"label": @"Toggle Cubic"}, + @{@"key": @"toggleHorizontalCubic", @"label": @"Toggle Horizontal Cubic"}, + @{@"key": @"toggleIcons", @"label": @"Toggle Icons"}, + @{@"key": @"toggleStepped", @"label": @"Toggle Stepped"}, + @{@"key": @"toggleHighlight", @"label": @"Toggle Highlight"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"togglePinchZoom", @"label": @"Toggle PinchZoom"}, + @{@"key": @"toggleAutoScaleMinMax", @"label": @"Toggle auto scale min/max"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + ]; + + _chartView.delegate = self; + + _chartView.chartDescription.enabled = NO; + + _chartView.dragEnabled = YES; + [_chartView setScaleEnabled:YES]; + _chartView.pinchZoomEnabled = YES; + _chartView.drawGridBackgroundEnabled = NO; + + // x-axis limit line + ChartLimitLine *llXAxis = [[ChartLimitLine alloc] initWithLimit:10.0 label:@"Index 10"]; + llXAxis.lineWidth = 4.0; + llXAxis.lineDashLengths = @[@(10.f), @(10.f), @(0.f)]; + llXAxis.labelPosition = ChartLimitLabelPositionBottomRight; + llXAxis.valueFont = [UIFont systemFontOfSize:10.f]; + + //[_chartView.xAxis addLimitLine:llXAxis]; + + _chartView.xAxis.gridLineDashLengths = @[@10.0, @10.0]; + _chartView.xAxis.gridLineDashPhase = 0.f; + + ChartLimitLine *ll1 = [[ChartLimitLine alloc] initWithLimit:150.0 label:@"Upper Limit"]; + ll1.lineWidth = 4.0; + ll1.lineDashLengths = @[@5.f, @5.f]; + ll1.labelPosition = ChartLimitLabelPositionTopRight; + ll1.valueFont = [UIFont systemFontOfSize:10.0]; + + ChartLimitLine *ll2 = [[ChartLimitLine alloc] initWithLimit:-30.0 label:@"Lower Limit"]; + ll2.lineWidth = 4.0; + ll2.lineDashLengths = @[@5.f, @5.f]; + ll2.labelPosition = ChartLimitLabelPositionBottomRight; + ll2.valueFont = [UIFont systemFontOfSize:10.0]; + + ChartYAxis *leftAxis = _chartView.leftAxis; + [leftAxis removeAllLimitLines]; + [leftAxis addLimitLine:ll1]; + [leftAxis addLimitLine:ll2]; + leftAxis.axisMaximum = 200.0; + leftAxis.axisMinimum = -50.0; + leftAxis.gridLineDashLengths = @[@5.f, @5.f]; + leftAxis.drawZeroLineEnabled = NO; + leftAxis.drawLimitLinesBehindDataEnabled = YES; + + _chartView.rightAxis.enabled = NO; + + //[_chartView.viewPortHandler setMaximumScaleY: 2.f]; + //[_chartView.viewPortHandler setMaximumScaleX: 2.f]; + + BalloonMarker *marker = [[BalloonMarker alloc] + initWithColor: [UIColor colorWithWhite:180/255. alpha:1.0] + font: [UIFont systemFontOfSize:12.0] + textColor: UIColor.whiteColor + insets: UIEdgeInsetsMake(8.0, 8.0, 20.0, 8.0)]; + marker.chartView = _chartView; + marker.minimumSize = CGSizeMake(80.f, 40.f); + _chartView.marker = marker; + + _chartView.legend.form = ChartLegendFormLine; + + _sliderX.value = 45.0; + _sliderY.value = 100.0; + [self slidersValueChanged:nil]; + + [_chartView animateWithXAxisDuration:2.5]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:_sliderX.value range:_sliderY.value]; +} + +- (void)setDataCount:(int)count range:(double)range +{ + NSMutableArray *values = [[NSMutableArray alloc] init]; + + for (int i = 0; i < count; i++) + { + double val = arc4random_uniform(range) + 3; + [values addObject:[[ChartDataEntry alloc] initWithX:i y:val icon: [UIImage imageNamed:@"icon"]]]; + } + + LineChartDataSet *set1 = nil; + if (_chartView.data.dataSetCount > 0) + { + set1 = (LineChartDataSet *)_chartView.data.dataSets[0]; + [set1 replaceEntries: values]; + [_chartView.data notifyDataChanged]; + [_chartView notifyDataSetChanged]; + } + else + { + set1 = [[LineChartDataSet alloc] initWithEntries:values label:@"DataSet 1"]; + + set1.drawIconsEnabled = NO; + + set1.lineDashLengths = @[@5.f, @2.5f]; + set1.highlightLineDashLengths = @[@5.f, @2.5f]; + [set1 setColor:UIColor.blackColor]; + [set1 setCircleColor:UIColor.blackColor]; + set1.lineWidth = 1.0; + set1.circleRadius = 3.0; + set1.drawCircleHoleEnabled = NO; + set1.valueFont = [UIFont systemFontOfSize:9.f]; + set1.formLineDashLengths = @[@5.f, @2.5f]; + set1.formLineWidth = 1.0; + set1.formSize = 15.0; + + NSArray *gradientColors = @[ + (id)[ChartColorTemplates colorFromString:@"#00ff0000"].CGColor, + (id)[ChartColorTemplates colorFromString:@"#ffff0000"].CGColor + ]; + CGGradientRef gradient = CGGradientCreateWithColors(nil, (CFArrayRef)gradientColors, nil); + + set1.fillAlpha = 1.f; + set1.fill = [ChartFill fillWithLinearGradient:gradient angle:90.f]; + set1.drawFilledEnabled = YES; + + CGGradientRelease(gradient); + + NSMutableArray *dataSets = [[NSMutableArray alloc] init]; + [dataSets addObject:set1]; + + LineChartData *data = [[LineChartData alloc] initWithDataSets:dataSets]; + + _chartView.data = data; + } +} + +- (void)optionTapped:(NSString *)key +{ + if ([key isEqualToString:@"toggleFilled"]) + { + for (id set in _chartView.data.dataSets) + { + set.drawFilledEnabled = !set.isDrawFilledEnabled; + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleCircles"]) + { + for (id set in _chartView.data.dataSets) + { + set.drawCirclesEnabled = !set.isDrawCirclesEnabled; + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleCubic"]) + { + for (id set in _chartView.data.dataSets) + { + set.mode = set.mode == LineChartModeCubicBezier ? LineChartModeLinear : LineChartModeCubicBezier; + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleStepped"]) + { + for (id set in _chartView.data.dataSets) + { + switch (set.mode) { + case LineChartModeLinear: + case LineChartModeCubicBezier: + case LineChartModeHorizontalBezier: + set.mode = LineChartModeStepped; + break; + case LineChartModeStepped: set.mode = LineChartModeLinear; + } + } + + [_chartView setNeedsDisplay]; + } + + if ([key isEqualToString:@"toggleHorizontalCubic"]) + { + for (id set in _chartView.data.dataSets) + { + set.mode = set.mode == LineChartModeHorizontalBezier ? LineChartModeCubicBezier : LineChartModeHorizontalBezier; + } + + [_chartView setNeedsDisplay]; + return; + } + + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - Actions + +- (IBAction)slidersValueChanged:(id)sender +{ + _sliderTextX.text = [@((int)_sliderX.value) stringValue]; + _sliderTextY.text = [@((int)_sliderY.value) stringValue]; + + [self updateChartData]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChart2ViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChart2ViewController.h new file mode 100644 index 00000000000..0c8e6d3712c --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChart2ViewController.h @@ -0,0 +1,18 @@ +// +// LineChart2ViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface LineChart2ViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChart2ViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChart2ViewController.m new file mode 100644 index 00000000000..75eceadef6f --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChart2ViewController.m @@ -0,0 +1,296 @@ +// +// LineChart2ViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "LineChart2ViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface LineChart2ViewController () + +@property (nonatomic, strong) IBOutlet LineChartView *chartView; +@property (nonatomic, strong) IBOutlet UISlider *sliderX; +@property (nonatomic, strong) IBOutlet UISlider *sliderY; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextX; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextY; + +@end + +@implementation LineChart2ViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Line Chart 2"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Values"}, + @{@"key": @"toggleFilled", @"label": @"Toggle Filled"}, + @{@"key": @"toggleCircles", @"label": @"Toggle Circles"}, + @{@"key": @"toggleCubic", @"label": @"Toggle Cubic"}, + @{@"key": @"toggleHorizontalCubic", @"label": @"Toggle Horizontal Cubic"}, + @{@"key": @"toggleStepped", @"label": @"Toggle Stepped"}, + @{@"key": @"toggleHighlight", @"label": @"Toggle Highlight"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"togglePinchZoom", @"label": @"Toggle PinchZoom"}, + @{@"key": @"toggleAutoScaleMinMax", @"label": @"Toggle auto scale min/max"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + ]; + + _chartView.delegate = self; + + _chartView.chartDescription.enabled = NO; + + _chartView.dragEnabled = YES; + [_chartView setScaleEnabled:YES]; + _chartView.drawGridBackgroundEnabled = NO; + _chartView.pinchZoomEnabled = YES; + + _chartView.backgroundColor = [UIColor colorWithWhite:204/255.f alpha:1.f]; + + ChartLegend *l = _chartView.legend; + l.form = ChartLegendFormLine; + l.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:11.f]; + l.textColor = UIColor.whiteColor; + l.horizontalAlignment = ChartLegendHorizontalAlignmentLeft; + l.verticalAlignment = ChartLegendVerticalAlignmentBottom; + l.orientation = ChartLegendOrientationHorizontal; + l.drawInside = NO; + + ChartXAxis *xAxis = _chartView.xAxis; + xAxis.labelFont = [UIFont systemFontOfSize:11.f]; + xAxis.labelTextColor = UIColor.whiteColor; + xAxis.drawGridLinesEnabled = NO; + xAxis.drawAxisLineEnabled = NO; + + ChartYAxis *leftAxis = _chartView.leftAxis; + leftAxis.labelTextColor = [UIColor colorWithRed:51/255.f green:181/255.f blue:229/255.f alpha:1.f]; + leftAxis.axisMaximum = 200.0; + leftAxis.axisMinimum = 0.0; + leftAxis.drawGridLinesEnabled = YES; + leftAxis.drawZeroLineEnabled = NO; + leftAxis.granularityEnabled = YES; + + ChartYAxis *rightAxis = _chartView.rightAxis; + rightAxis.labelTextColor = UIColor.redColor; + rightAxis.axisMaximum = 900.0; + rightAxis.axisMinimum = -200.0; + rightAxis.drawGridLinesEnabled = NO; + rightAxis.granularityEnabled = NO; + + _sliderX.value = 20.0; + _sliderY.value = 30.0; + [self slidersValueChanged:nil]; + + [_chartView animateWithXAxisDuration:2.5]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:_sliderX.value + 1 range:_sliderY.value]; +} + +- (void)setDataCount:(int)count range:(double)range +{ + NSMutableArray *yVals1 = [[NSMutableArray alloc] init]; + NSMutableArray *yVals2 = [[NSMutableArray alloc] init]; + NSMutableArray *yVals3 = [[NSMutableArray alloc] init]; + + for (int i = 0; i < count; i++) + { + double mult = range / 2.0; + double val = (double) (arc4random_uniform(mult)) + 50; + [yVals1 addObject:[[ChartDataEntry alloc] initWithX:i y:val]]; + } + + for (int i = 0; i < count - 1; i++) + { + double mult = range; + double val = (double) (arc4random_uniform(mult)) + 450; + [yVals2 addObject:[[ChartDataEntry alloc] initWithX:i y:val]]; + } + + for (int i = 0; i < count; i++) + { + double mult = range; + double val = (double) (arc4random_uniform(mult)) + 500; + [yVals3 addObject:[[ChartDataEntry alloc] initWithX:i y:val]]; + } + + LineChartDataSet *set1 = nil, *set2 = nil, *set3 = nil; + + if (_chartView.data.dataSetCount > 0) + { + set1 = (LineChartDataSet *)_chartView.data.dataSets[0]; + set2 = (LineChartDataSet *)_chartView.data.dataSets[1]; + set3 = (LineChartDataSet *)_chartView.data.dataSets[2]; + [set1 replaceEntries:yVals1]; + [set2 replaceEntries:yVals2]; + [set3 replaceEntries:yVals3]; + [_chartView.data notifyDataChanged]; + [_chartView notifyDataSetChanged]; + } + else + { + set1 = [[LineChartDataSet alloc] initWithEntries:yVals1 label:@"DataSet 1"]; + set1.axisDependency = AxisDependencyLeft; + [set1 setColor:[UIColor colorWithRed:51/255.f green:181/255.f blue:229/255.f alpha:1.f]]; + [set1 setCircleColor:UIColor.whiteColor]; + set1.lineWidth = 2.0; + set1.circleRadius = 3.0; + set1.fillAlpha = 65/255.0; + set1.fillColor = [UIColor colorWithRed:51/255.f green:181/255.f blue:229/255.f alpha:1.f]; + set1.highlightColor = [UIColor colorWithRed:244/255.f green:117/255.f blue:117/255.f alpha:1.f]; + set1.drawCircleHoleEnabled = NO; + + set2 = [[LineChartDataSet alloc] initWithEntries:yVals2 label:@"DataSet 2"]; + set2.axisDependency = AxisDependencyRight; + [set2 setColor:UIColor.redColor]; + [set2 setCircleColor:UIColor.whiteColor]; + set2.lineWidth = 2.0; + set2.circleRadius = 3.0; + set2.fillAlpha = 65/255.0; + set2.fillColor = UIColor.redColor; + set2.highlightColor = [UIColor colorWithRed:244/255.f green:117/255.f blue:117/255.f alpha:1.f]; + set2.drawCircleHoleEnabled = NO; + + set3 = [[LineChartDataSet alloc] initWithEntries:yVals3 label:@"DataSet 3"]; + set3.axisDependency = AxisDependencyRight; + [set3 setColor:UIColor.yellowColor]; + [set3 setCircleColor:UIColor.whiteColor]; + set3.lineWidth = 2.0; + set3.circleRadius = 3.0; + set3.fillAlpha = 65/255.0; + set3.fillColor = [UIColor.yellowColor colorWithAlphaComponent:200/255.f]; + set3.highlightColor = [UIColor colorWithRed:244/255.f green:117/255.f blue:117/255.f alpha:1.f]; + set3.drawCircleHoleEnabled = NO; + + NSMutableArray *dataSets = [[NSMutableArray alloc] init]; + [dataSets addObject:set1]; + [dataSets addObject:set2]; + [dataSets addObject:set3]; + + LineChartData *data = [[LineChartData alloc] initWithDataSets:dataSets]; + [data setValueTextColor:UIColor.whiteColor]; + [data setValueFont:[UIFont systemFontOfSize:9.f]]; + + _chartView.data = data; + } +} + +- (void)optionTapped:(NSString *)key +{ + if ([key isEqualToString:@"toggleFilled"]) + { + for (id set in _chartView.data.dataSets) + { + set.drawFilledEnabled = !set.isDrawFilledEnabled; + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleCircles"]) + { + for (id set in _chartView.data.dataSets) + { + set.drawCirclesEnabled = !set.isDrawCirclesEnabled; + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleCubic"]) + { + for (id set in _chartView.data.dataSets) + { + set.mode = set.mode == LineChartModeCubicBezier ? LineChartModeLinear : LineChartModeCubicBezier; + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleStepped"]) + { + for (id set in _chartView.data.dataSets) + { + switch (set.mode) { + case LineChartModeLinear: + case LineChartModeCubicBezier: + case LineChartModeHorizontalBezier: + set.mode = LineChartModeStepped; + break; + case LineChartModeStepped: set.mode = LineChartModeLinear; + } + } + + [_chartView setNeedsDisplay]; + } + + if ([key isEqualToString:@"toggleHorizontalCubic"]) + { + for (id set in _chartView.data.dataSets) + { + set.mode = set.mode == LineChartModeCubicBezier ? LineChartModeHorizontalBezier : LineChartModeCubicBezier; + } + + [_chartView setNeedsDisplay]; + return; + } + + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - Actions + +- (IBAction)slidersValueChanged:(id)sender +{ + _sliderTextX.text = [@((int)_sliderX.value) stringValue]; + _sliderTextY.text = [@((int)_sliderY.value) stringValue]; + + [self updateChartData]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); + + [_chartView centerViewToAnimatedWithXValue:entry.x yValue:entry.y axis:[_chartView.data getDataSetByIndex:highlight.dataSetIndex].axisDependency duration:1.0]; + //[_chartView moveViewToAnimatedWithXValue:entry.x yValue:entry.y axis:[_chartView.data getDataSetByIndex:dataSetIndex].axisDependency duration:1.0]; + //[_chartView zoomAndCenterViewAnimatedWithScaleX:1.8 scaleY:1.8 xValue:entry.x yValue:entry.y axis:[_chartView.data getDataSetByIndex:dataSetIndex].axisDependency duration:1.0]; + +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChartFilledViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChartFilledViewController.h new file mode 100644 index 00000000000..d62d9443edc --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChartFilledViewController.h @@ -0,0 +1,18 @@ +// +// LineChartFilledViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface LineChartFilledViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChartFilledViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChartFilledViewController.m new file mode 100644 index 00000000000..f6ec793465f --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChartFilledViewController.m @@ -0,0 +1,178 @@ +// +// LineChartFilledViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "LineChartFilledViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface LineChartFilledViewController () + +@property (nonatomic, strong) IBOutlet LineChartView *chartView; +@property (nonatomic, strong) IBOutlet UISlider *sliderX; +@property (nonatomic, strong) IBOutlet UISlider *sliderY; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextX; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextY; + +@end + +@implementation LineChartFilledViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Filled Line Chart"; + + _chartView.delegate = self; + + _chartView.backgroundColor = UIColor.whiteColor; + _chartView.gridBackgroundColor = [UIColor colorWithRed:51/255.0 green:181/255.0 blue:229/255.0 alpha:150/255.0]; + _chartView.drawGridBackgroundEnabled = YES; + + _chartView.drawBordersEnabled = YES; + + _chartView.chartDescription.enabled = NO; + + _chartView.pinchZoomEnabled = NO; + _chartView.dragEnabled = YES; + [_chartView setScaleEnabled:YES]; + + ChartLegend *l = _chartView.legend; + l.enabled = NO; + + ChartXAxis *xAxis = _chartView.xAxis; + xAxis.enabled = NO; + + ChartYAxis *leftAxis = _chartView.leftAxis; + leftAxis.axisMaximum = 900.0; + leftAxis.axisMinimum = -250.0; + leftAxis.drawAxisLineEnabled = NO; + leftAxis.drawZeroLineEnabled = NO; + leftAxis.drawGridLinesEnabled = NO; + + _chartView.rightAxis.enabled = NO; + + _sliderX.value = 100.0; + _sliderY.value = 60.0; + [self slidersValueChanged:nil]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:_sliderX.value range:_sliderY.value]; +} + +- (void)setDataCount:(int)count range:(double)range +{ + NSMutableArray *yVals1 = [NSMutableArray array]; + NSMutableArray *yVals2 = [NSMutableArray array]; + + for (int i = 0; i < count; i++) + { + double val = arc4random_uniform(range) + 50; + [yVals1 addObject:[[ChartDataEntry alloc] initWithX:i y:val]]; + } + + for (int i = 0; i < count; i++) + { + double val = arc4random_uniform(range) + 450; + [yVals2 addObject:[[ChartDataEntry alloc] initWithX:i y:val]]; + } + + LineChartDataSet *set1 = nil; + LineChartDataSet *set2 = nil; + + if (_chartView.data.dataSetCount > 0) + { + set1 = (LineChartDataSet *)_chartView.data.dataSets[0]; + set2 = (LineChartDataSet *)_chartView.data.dataSets[1]; + [set1 replaceEntries:yVals1]; + [set2 replaceEntries:yVals2]; + [_chartView.data notifyDataChanged]; + [_chartView notifyDataSetChanged]; + } + else + { + set1 = [[LineChartDataSet alloc] initWithEntries:yVals1 label:@"DataSet 1"]; + set1.axisDependency = AxisDependencyLeft; + [set1 setColor:[UIColor colorWithRed:255/255.0 green:241/255.0 blue:46/255.0 alpha:1.0]]; + set1.drawCirclesEnabled = NO; + set1.lineWidth = 2.0; + set1.circleRadius = 3.0; + set1.fillAlpha = 1.0; + set1.drawFilledEnabled = YES; + set1.fillColor = UIColor.whiteColor; + set1.highlightColor = [UIColor colorWithRed:244/255.0 green:117/255.0 blue:117/255.0 alpha:1.0]; + set1.drawCircleHoleEnabled = NO; + set1.fillFormatter = [ChartDefaultFillFormatter withBlock:^CGFloat(id _Nonnull dataSet, id _Nonnull dataProvider) { + return self.chartView.leftAxis.axisMinimum; + }]; + + set2 = [[LineChartDataSet alloc] initWithEntries:yVals2 label:@"DataSet 2"]; + set2.axisDependency = AxisDependencyLeft; + [set2 setColor:[UIColor colorWithRed:255/255.0 green:241/255.0 blue:46/255.0 alpha:1.0]]; + set2.drawCirclesEnabled = NO; + set2.lineWidth = 2.0; + set2.circleRadius = 3.0; + set2.fillAlpha = 1.0; + set2.drawFilledEnabled = YES; + set2.fillColor = UIColor.whiteColor; + set2.highlightColor = [UIColor colorWithRed:244/255.0 green:117/255.0 blue:117/255.0 alpha:1.0]; + set2.drawCircleHoleEnabled = NO; + set2.fillFormatter = [ChartDefaultFillFormatter withBlock:^CGFloat(id _Nonnull dataSet, id _Nonnull dataProvider) { + return self.chartView.leftAxis.axisMaximum; + }]; + + NSMutableArray *dataSets = [[NSMutableArray alloc] init]; + [dataSets addObject:set1]; + [dataSets addObject:set2]; + + LineChartData *data = [[LineChartData alloc] initWithDataSets:dataSets]; + [data setDrawValues:NO]; + + _chartView.data = data; + } +} + +#pragma mark - Actions + +- (IBAction)slidersValueChanged:(id)sender +{ + _sliderTextX.text = [@((int)_sliderX.value) stringValue]; + _sliderTextY.text = [@((int)_sliderY.value) stringValue]; + + [self updateChartData]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChartTimeViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChartTimeViewController.h new file mode 100644 index 00000000000..6edfb1ff859 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChartTimeViewController.h @@ -0,0 +1,18 @@ +// +// LineChartTimeViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface LineChartTimeViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChartTimeViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChartTimeViewController.m new file mode 100644 index 00000000000..06e6808f4fc --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/LineChartTimeViewController.m @@ -0,0 +1,244 @@ +// +// LineChartTimeViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "LineChartTimeViewController.h" +#import "ChartsDemo_iOS-Swift.h" +#import "DateValueFormatter.h" + +@interface LineChartTimeViewController () + +@property (nonatomic, strong) IBOutlet LineChartView *chartView; +@property (nonatomic, strong) IBOutlet UISlider *sliderX; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextX; + +@end + +@implementation LineChartTimeViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Time Line Chart"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Values"}, + @{@"key": @"toggleFilled", @"label": @"Toggle Filled"}, + @{@"key": @"toggleCircles", @"label": @"Toggle Circles"}, + @{@"key": @"toggleCubic", @"label": @"Toggle Cubic"}, + @{@"key": @"toggleHorizontalCubic", @"label": @"Toggle Horizontal Cubic"}, + @{@"key": @"toggleStepped", @"label": @"Toggle Stepped"}, + @{@"key": @"toggleHighlight", @"label": @"Toggle Highlight"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"togglePinchZoom", @"label": @"Toggle PinchZoom"}, + @{@"key": @"toggleAutoScaleMinMax", @"label": @"Toggle auto scale min/max"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + ]; + + _chartView.delegate = self; + + _chartView.chartDescription.enabled = NO; + + _chartView.dragEnabled = YES; + [_chartView setScaleEnabled:YES]; + _chartView.pinchZoomEnabled = NO; + _chartView.drawGridBackgroundEnabled = NO; + _chartView.highlightPerDragEnabled = YES; + + _chartView.backgroundColor = UIColor.whiteColor; + + _chartView.legend.enabled = NO; + + ChartXAxis *xAxis = _chartView.xAxis; + xAxis.labelPosition = XAxisLabelPositionTopInside; + xAxis.labelFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]; + xAxis.labelTextColor = [UIColor colorWithRed:255/255.0 green:192/255.0 blue:56/255.0 alpha:1.0]; + xAxis.drawAxisLineEnabled = NO; + xAxis.drawGridLinesEnabled = YES; + xAxis.centerAxisLabelsEnabled = YES; + xAxis.granularity = 3600.0; + xAxis.valueFormatter = [[DateValueFormatter alloc] init]; + + ChartYAxis *leftAxis = _chartView.leftAxis; + leftAxis.labelPosition = YAxisLabelPositionInsideChart; + leftAxis.labelFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:12.f]; + leftAxis.labelTextColor = [UIColor colorWithRed:51/255.0 green:181/255.0 blue:229/255.0 alpha:1.0]; + leftAxis.drawGridLinesEnabled = YES; + leftAxis.granularityEnabled = YES; + leftAxis.axisMinimum = 0.0; + leftAxis.axisMaximum = 170.0; + leftAxis.yOffset = -9.0; + leftAxis.labelTextColor = [UIColor colorWithRed:255/255.0 green:192/255.0 blue:56/255.0 alpha:1.0]; + + _chartView.rightAxis.enabled = NO; + + _chartView.legend.form = ChartLegendFormLine; + + _sliderX.value = 100.0; + [self slidersValueChanged:nil]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:_sliderX.value range:30.0]; +} + +- (void)setDataCount:(int)count range:(double)range +{ + NSTimeInterval now = [[NSDate date] timeIntervalSince1970]; + NSTimeInterval hourSeconds = 3600.0; + + NSMutableArray *values = [[NSMutableArray alloc] init]; + + NSTimeInterval from = now - (count / 2.0) * hourSeconds; + NSTimeInterval to = now + (count / 2.0) * hourSeconds; + + for (NSTimeInterval x = from; x < to; x += hourSeconds) + { + double y = arc4random_uniform(range) + 50; + [values addObject:[[ChartDataEntry alloc] initWithX:x y:y]]; + } + + LineChartDataSet *set1 = nil; + if (_chartView.data.dataSetCount > 0) + { + set1 = (LineChartDataSet *)_chartView.data.dataSets[0]; + [set1 replaceEntries: values]; + [_chartView.data notifyDataChanged]; + [_chartView notifyDataSetChanged]; + } + else + { + set1 = [[LineChartDataSet alloc] initWithEntries:values label:@"DataSet 1"]; + set1.axisDependency = AxisDependencyLeft; + set1.valueTextColor = [UIColor colorWithRed:51/255.0 green:181/255.0 blue:229/255.0 alpha:1.0]; + set1.lineWidth = 1.5; + set1.drawCirclesEnabled = NO; + set1.drawValuesEnabled = NO; + set1.fillAlpha = 0.26; + set1.fillColor = [UIColor colorWithRed:51/255.0 green:181/255.0 blue:229/255.0 alpha:1.0]; + set1.highlightColor = [UIColor colorWithRed:224/255.0 green:117/255.0 blue:117/255.0 alpha:1.0]; + set1.drawCircleHoleEnabled = NO; + + NSMutableArray *dataSets = [[NSMutableArray alloc] init]; + [dataSets addObject:set1]; + + LineChartData *data = [[LineChartData alloc] initWithDataSets:dataSets]; + [data setValueTextColor:UIColor.whiteColor]; + [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:9.0]]; + + _chartView.data = data; + } +} + +- (void)optionTapped:(NSString *)key +{ + if ([key isEqualToString:@"toggleFilled"]) + { + for (id set in _chartView.data.dataSets) + { + set.drawFilledEnabled = !set.isDrawFilledEnabled; + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleCircles"]) + { + for (id set in _chartView.data.dataSets) + { + set.drawCirclesEnabled = !set.isDrawCirclesEnabled; + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleCubic"]) + { + for (id set in _chartView.data.dataSets) + { + set.mode = set.mode == LineChartModeCubicBezier ? LineChartModeLinear : LineChartModeCubicBezier; + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleStepped"]) + { + for (id set in _chartView.data.dataSets) + { + switch (set.mode) { + case LineChartModeLinear: + case LineChartModeCubicBezier: + case LineChartModeHorizontalBezier: + set.mode = LineChartModeStepped; + break; + case LineChartModeStepped: set.mode = LineChartModeLinear; + } + } + + [_chartView setNeedsDisplay]; + } + + if ([key isEqualToString:@"toggleHorizontalCubic"]) + { + for (id set in _chartView.data.dataSets) + { + set.mode = set.mode == LineChartModeCubicBezier ? LineChartModeHorizontalBezier : LineChartModeCubicBezier; + } + + [_chartView setNeedsDisplay]; + return; + } + + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - Actions + +- (IBAction)slidersValueChanged:(id)sender +{ + _sliderTextX.text = [@((int)_sliderX.value) stringValue]; + + [self updateChartData]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/MultipleBarChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/MultipleBarChartViewController.h new file mode 100644 index 00000000000..63b820c5ef8 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/MultipleBarChartViewController.h @@ -0,0 +1,18 @@ +// +// MultipleBarChartViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface MultipleBarChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/MultipleBarChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/MultipleBarChartViewController.m new file mode 100644 index 00000000000..ec748b8d243 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/MultipleBarChartViewController.m @@ -0,0 +1,241 @@ +// +// MultipleBarChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "MultipleBarChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" +#import "IntAxisValueFormatter.h" + +@interface MultipleBarChartViewController () + +@property (nonatomic, strong) IBOutlet BarChartView *chartView; +@property (nonatomic, strong) IBOutlet UISlider *sliderX; +@property (nonatomic, strong) IBOutlet UISlider *sliderY; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextX; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextY; + +@end + +@implementation MultipleBarChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Multiple Bar Chart"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Values"}, + @{@"key": @"toggleHighlight", @"label": @"Toggle Highlight"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"togglePinchZoom", @"label": @"Toggle PinchZoom"}, + @{@"key": @"toggleAutoScaleMinMax", @"label": @"Toggle auto scale min/max"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + @{@"key": @"toggleBarBorders", @"label": @"Show Bar Borders"}, + ]; + + _chartView.delegate = self; + + _chartView.chartDescription.enabled = NO; + + _chartView.pinchZoomEnabled = NO; + _chartView.drawBarShadowEnabled = NO; + _chartView.drawGridBackgroundEnabled = NO; + + BalloonMarker *marker = [[BalloonMarker alloc] + initWithColor: [UIColor colorWithWhite:180/255. alpha:1.0] + font: [UIFont systemFontOfSize:12.0] + textColor: UIColor.whiteColor + insets: UIEdgeInsetsMake(8.0, 8.0, 20.0, 8.0)]; + marker.chartView = _chartView; + marker.minimumSize = CGSizeMake(80.f, 40.f); + _chartView.marker = marker; + + ChartLegend *legend = _chartView.legend; + legend.horizontalAlignment = ChartLegendHorizontalAlignmentRight; + legend.verticalAlignment = ChartLegendVerticalAlignmentTop; + legend.orientation = ChartLegendOrientationVertical; + legend.drawInside = YES; + legend.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:8.f]; + legend.yOffset = 10.0; + legend.xOffset = 10.0; + legend.yEntrySpace = 0.0; + + ChartXAxis *xAxis = _chartView.xAxis; + xAxis.labelFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]; + xAxis.granularity = 1.f; + xAxis.centerAxisLabelsEnabled = YES; + xAxis.valueFormatter = [[IntAxisValueFormatter alloc] init]; + + NSNumberFormatter *leftAxisFormatter = [[NSNumberFormatter alloc] init]; + leftAxisFormatter.maximumFractionDigits = 1; + + ChartYAxis *leftAxis = _chartView.leftAxis; + leftAxis.labelFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]; + leftAxis.valueFormatter = [[LargeValueFormatter alloc] init]; + leftAxis.drawGridLinesEnabled = NO; + leftAxis.spaceTop = 0.35; + leftAxis.axisMinimum = 0; + + _chartView.rightAxis.enabled = NO; + + _sliderX.value = 10.0; + _sliderY.value = 100.0; + [self slidersValueChanged:nil]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:_sliderX.value range:_sliderY.value]; +} + +- (void)setDataCount:(int)count range:(double)range +{ + float groupSpace = 0.08f; + float barSpace = 0.03f; + float barWidth = 0.2f; + // (0.2 + 0.03) * 4 + 0.08 = 1.00 -> interval per "group" + + NSMutableArray *yVals1 = [[NSMutableArray alloc] init]; + NSMutableArray *yVals2 = [[NSMutableArray alloc] init]; + NSMutableArray *yVals3 = [[NSMutableArray alloc] init]; + NSMutableArray *yVals4 = [[NSMutableArray alloc] init]; + + double randomMultiplier = range * 100000.f; + + int groupCount = count + 1; + int startYear = 1980; + int endYear = startYear + groupCount; + + for (int i = startYear; i < endYear; i++) + { + [yVals1 addObject:[[BarChartDataEntry alloc] + initWithX:i + y:(double) (arc4random_uniform(randomMultiplier))]]; + + [yVals2 addObject:[[BarChartDataEntry alloc] + initWithX:i + y:(double) (arc4random_uniform(randomMultiplier))]]; + + [yVals3 addObject:[[BarChartDataEntry alloc] + initWithX:i + y:(double) (arc4random_uniform(randomMultiplier))]]; + + [yVals4 addObject:[[BarChartDataEntry alloc] + initWithX:i + y:(double) (arc4random_uniform(randomMultiplier))]]; + } + + BarChartDataSet *set1 = nil, *set2 = nil, *set3 = nil, *set4 = nil; + if (_chartView.data.dataSetCount > 0) + { + set1 = (BarChartDataSet *)_chartView.data.dataSets[0]; + set2 = (BarChartDataSet *)_chartView.data.dataSets[1]; + set3 = (BarChartDataSet *)_chartView.data.dataSets[2]; + set4 = (BarChartDataSet *)_chartView.data.dataSets[3]; + [set1 replaceEntries:yVals1]; + [set2 replaceEntries:yVals2]; + [set3 replaceEntries:yVals3]; + [set4 replaceEntries:yVals4]; + + BarChartData *data = _chartView.barData; + + _chartView.xAxis.axisMinimum = startYear; + _chartView.xAxis.axisMaximum = [data groupWidthWithGroupSpace:groupSpace barSpace: barSpace] * _sliderX.value + startYear; + [data groupBarsFromX: startYear groupSpace: groupSpace barSpace: barSpace]; + + [_chartView.data notifyDataChanged]; + [_chartView notifyDataSetChanged]; + } + else + { + set1 = [[BarChartDataSet alloc] initWithEntries:yVals1 label:@"Company A"]; + [set1 setColor:[UIColor colorWithRed:104/255.f green:241/255.f blue:175/255.f alpha:1.f]]; + + set2 = [[BarChartDataSet alloc] initWithEntries:yVals2 label:@"Company B"]; + [set2 setColor:[UIColor colorWithRed:164/255.f green:228/255.f blue:251/255.f alpha:1.f]]; + + set3 = [[BarChartDataSet alloc] initWithEntries:yVals3 label:@"Company C"]; + [set3 setColor:[UIColor colorWithRed:242/255.f green:247/255.f blue:158/255.f alpha:1.f]]; + + set4 = [[BarChartDataSet alloc] initWithEntries:yVals4 label:@"Company D"]; + [set4 setColor:[UIColor colorWithRed:255/255.f green:102/255.f blue:0/255.f alpha:1.f]]; + + NSMutableArray *dataSets = [[NSMutableArray alloc] init]; + [dataSets addObject:set1]; + [dataSets addObject:set2]; + [dataSets addObject:set3]; + [dataSets addObject:set4]; + + BarChartData *data = [[BarChartData alloc] initWithDataSets:dataSets]; + [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]]; + [data setValueFormatter:[[LargeValueFormatter alloc] init]]; + + // specify the width each bar should have + data.barWidth = barWidth; + + // restrict the x-axis range + _chartView.xAxis.axisMinimum = startYear; + + // groupWidthWithGroupSpace(...) is a helper that calculates the width each group needs based on the provided parameters + _chartView.xAxis.axisMaximum = startYear + [data groupWidthWithGroupSpace:groupSpace barSpace: barSpace] * groupCount; + + [data groupBarsFromX: startYear groupSpace: groupSpace barSpace: barSpace]; + + _chartView.data = data; + } +} + +- (void)optionTapped:(NSString *)key +{ + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - Actions + +- (IBAction)slidersValueChanged:(id)sender +{ + int startYear = 1980; + int endYear = startYear + _sliderX.value; + + _sliderTextX.text = [NSString stringWithFormat:@"%d-%d", startYear, endYear]; + _sliderTextY.text = [@((int)_sliderY.value) stringValue]; + + [self updateChartData]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/MultipleLinesChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/MultipleLinesChartViewController.h new file mode 100644 index 00000000000..f2cc35ab9dd --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/MultipleLinesChartViewController.h @@ -0,0 +1,18 @@ +// +// MultipleLinesChartViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface MultipleLinesChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/MultipleLinesChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/MultipleLinesChartViewController.m new file mode 100644 index 00000000000..358a7e21eb5 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/MultipleLinesChartViewController.m @@ -0,0 +1,206 @@ +// +// MultipleLinesChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "MultipleLinesChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface MultipleLinesChartViewController () + +@property (nonatomic, strong) IBOutlet LineChartView *chartView; +@property (nonatomic, strong) IBOutlet UISlider *sliderX; +@property (nonatomic, strong) IBOutlet UISlider *sliderY; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextX; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextY; + +@end + +@implementation MultipleLinesChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Multiple Lines Chart"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Values"}, + @{@"key": @"toggleFilled", @"label": @"Toggle Filled"}, + @{@"key": @"toggleCircles", @"label": @"Toggle Circles"}, + @{@"key": @"toggleCubic", @"label": @"Toggle Cubic"}, + @{@"key": @"toggleStepped", @"label": @"Toggle Stepped"}, + @{@"key": @"toggleHighlight", @"label": @"Toggle Highlight"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"togglePinchZoom", @"label": @"Toggle PinchZoom"}, + @{@"key": @"toggleAutoScaleMinMax", @"label": @"Toggle auto scale min/max"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + ]; + + _chartView.delegate = self; + + _chartView.chartDescription.enabled = NO; + + _chartView.leftAxis.enabled = NO; + _chartView.rightAxis.drawAxisLineEnabled = NO; + _chartView.rightAxis.drawGridLinesEnabled = NO; + _chartView.xAxis.drawAxisLineEnabled = NO; + _chartView.xAxis.drawGridLinesEnabled = NO; + + _chartView.drawGridBackgroundEnabled = NO; + _chartView.drawBordersEnabled = NO; + _chartView.dragEnabled = YES; + [_chartView setScaleEnabled:YES]; + _chartView.pinchZoomEnabled = NO; + + ChartLegend *l = _chartView.legend; + l.horizontalAlignment = ChartLegendHorizontalAlignmentRight; + l.verticalAlignment = ChartLegendVerticalAlignmentTop; + l.orientation = ChartLegendOrientationVertical; + l.drawInside = NO; + + _sliderX.value = 20.0; + _sliderY.value = 100.0; + [self slidersValueChanged:nil]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:_sliderX.value range:_sliderY.value]; +} + +- (void)setDataCount:(int)count range:(double)range +{ + NSArray *colors = @[ChartColorTemplates.vordiplom[0], ChartColorTemplates.vordiplom[1], ChartColorTemplates.vordiplom[2]]; + + NSMutableArray *dataSets = [[NSMutableArray alloc] init]; + + for (int z = 0; z < 3; z++) + { + NSMutableArray *values = [[NSMutableArray alloc] init]; + + for (int i = 0; i < count; i++) + { + double val = (double) (arc4random_uniform(range) + 3); + [values addObject:[[ChartDataEntry alloc] initWithX:i y:val]]; + } + + LineChartDataSet *d = [[LineChartDataSet alloc] initWithEntries:values label:[NSString stringWithFormat:@"DataSet %d", z + 1]]; + d.lineWidth = 2.5; + d.circleRadius = 4.0; + d.circleHoleRadius = 2.0; + + UIColor *color = colors[z % colors.count]; + [d setColor:color]; + [d setCircleColor:color]; + [dataSets addObject:d]; + } + + ((LineChartDataSet *)dataSets[0]).lineDashLengths = @[@5.f, @5.f]; + ((LineChartDataSet *)dataSets[0]).colors = ChartColorTemplates.vordiplom; + ((LineChartDataSet *)dataSets[0]).circleColors = ChartColorTemplates.vordiplom; + + LineChartData *data = [[LineChartData alloc] initWithDataSets:dataSets]; + [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:7.f]]; + _chartView.data = data; +} + +- (void)optionTapped:(NSString *)key +{ + if ([key isEqualToString:@"toggleFilled"]) + { + for (id set in _chartView.data.dataSets) + { + set.drawFilledEnabled = !set.isDrawFilledEnabled; + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleCircles"]) + { + for (id set in _chartView.data.dataSets) + { + set.drawCirclesEnabled = !set.isDrawCirclesEnabled; + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleCubic"]) + { + for (id set in _chartView.data.dataSets) + { + set.mode = set.mode == LineChartModeCubicBezier ? LineChartModeLinear : LineChartModeCubicBezier; + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleStepped"]) + { + for (id set in _chartView.data.dataSets) + { + switch (set.mode) { + case LineChartModeLinear: + case LineChartModeCubicBezier: + case LineChartModeHorizontalBezier: + set.mode = LineChartModeStepped; + break; + case LineChartModeStepped: set.mode = LineChartModeLinear; + } + } + + [_chartView setNeedsDisplay]; + } + + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - Actions + +- (IBAction)slidersValueChanged:(id)sender +{ + _sliderTextX.text = [@((int)_sliderX.value) stringValue]; + _sliderTextY.text = [@((int)_sliderY.value) stringValue]; + + [self updateChartData]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/NegativeStackedBarChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/NegativeStackedBarChartViewController.h new file mode 100644 index 00000000000..610c3ecdad2 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/NegativeStackedBarChartViewController.h @@ -0,0 +1,18 @@ +// +// NegativeStackedBarChartViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface NegativeStackedBarChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/NegativeStackedBarChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/NegativeStackedBarChartViewController.m new file mode 100644 index 00000000000..b87ef62a132 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/NegativeStackedBarChartViewController.m @@ -0,0 +1,195 @@ +// +// NegativeStackedBarChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "NegativeStackedBarChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface NegativeStackedBarChartViewController () + +@property (nonatomic, strong) IBOutlet HorizontalBarChartView *chartView; + +@end + +@implementation NegativeStackedBarChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Stacked Bar Chart Negative"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Values"}, + @{@"key": @"toggleIcons", @"label": @"Toggle Icons"}, + @{@"key": @"toggleHighlight", @"label": @"Toggle Highlight"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"togglePinchZoom", @"label": @"Toggle PinchZoom"}, + @{@"key": @"toggleAutoScaleMinMax", @"label": @"Toggle auto scale min/max"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + @{@"key": @"toggleBarBorders", @"label": @"Show Bar Borders"}, + ]; + + NSNumberFormatter *customFormatter = [[NSNumberFormatter alloc] init]; + customFormatter.negativePrefix = @""; + customFormatter.positiveSuffix = @"m"; + customFormatter.negativeSuffix = @"m"; + customFormatter.minimumSignificantDigits = 1; + customFormatter.minimumFractionDigits = 1; + + _chartView.delegate = self; + + _chartView.chartDescription.enabled = NO; + + _chartView.drawBarShadowEnabled = NO; + _chartView.drawValueAboveBarEnabled = YES; + _chartView.highlightFullBarEnabled = NO; + + // scaling can now only be done on x- and y-axis separately + _chartView.pinchZoomEnabled = NO; + + _chartView.drawBarShadowEnabled = NO; + + _chartView.leftAxis.enabled = NO; + _chartView.rightAxis.axisMaximum = 25.0; + _chartView.rightAxis.axisMinimum = -25.0; + _chartView.rightAxis.drawGridLinesEnabled = NO; + _chartView.rightAxis.drawZeroLineEnabled = YES; + _chartView.rightAxis.labelCount = 7; + _chartView.rightAxis.valueFormatter = [[ChartDefaultAxisValueFormatter alloc] initWithFormatter:customFormatter]; + _chartView.rightAxis.labelFont = [UIFont systemFontOfSize:9.f]; + + ChartXAxis *xAxis = _chartView.xAxis; + xAxis.labelPosition = XAxisLabelPositionBothSided; + xAxis.drawGridLinesEnabled = NO; + xAxis.drawAxisLineEnabled = NO; + xAxis.axisMinimum = 0.0; + xAxis.axisMaximum = 110.0; + xAxis.centerAxisLabelsEnabled = YES; + xAxis.labelCount = 12; + xAxis.granularity = 10.0; + xAxis.valueFormatter = self; + + _chartView.rightAxis.labelFont = [UIFont systemFontOfSize:9.f]; + + ChartLegend *l = _chartView.legend; + l.horizontalAlignment = ChartLegendHorizontalAlignmentRight; + l.verticalAlignment = ChartLegendVerticalAlignmentBottom; + l.orientation = ChartLegendOrientationHorizontal; + l.drawInside = NO; + l.formSize = 8.f; + l.formToTextSpace = 4.f; + l.xEntrySpace = 6.f; + + [self updateChartData]; +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setChartData]; +} + +- (void)setChartData +{ + NSMutableArray *yValues = [NSMutableArray array]; + [yValues addObject:[[BarChartDataEntry alloc] initWithX:5 yValues:@[ @-10, @10 ]]]; + [yValues addObject:[[BarChartDataEntry alloc] initWithX:15 yValues:@[ @-12, @13 ]]]; + [yValues addObject:[[BarChartDataEntry alloc] initWithX:25 yValues:@[ @-15, @15 ]]]; + [yValues addObject:[[BarChartDataEntry alloc] initWithX:35 yValues:@[ @-17, @17 ]]]; + [yValues addObject:[[BarChartDataEntry alloc] initWithX:45 yValues:@[ @-19, @20 ] icon: [UIImage imageNamed:@"icon"]]]; + [yValues addObject:[[BarChartDataEntry alloc] initWithX:55 yValues:@[ @-19, @19 ]]]; + [yValues addObject:[[BarChartDataEntry alloc] initWithX:65 yValues:@[ @-16, @16 ]]]; + [yValues addObject:[[BarChartDataEntry alloc] initWithX:75 yValues:@[ @-13, @14 ]]]; + [yValues addObject:[[BarChartDataEntry alloc] initWithX:85 yValues:@[ @-10, @11 ]]]; + [yValues addObject:[[BarChartDataEntry alloc] initWithX:95 yValues:@[ @-5, @6 ]]]; + [yValues addObject:[[BarChartDataEntry alloc] initWithX:105 yValues:@[ @-1, @2 ]]]; + + BarChartDataSet *set = nil; + if (_chartView.data.dataSetCount > 0) + { + set = (BarChartDataSet *)_chartView.data.dataSets[0]; + [set replaceEntries: yValues]; + [_chartView.data notifyDataChanged]; + [_chartView notifyDataSetChanged]; + } + else + { + NSNumberFormatter *customFormatter = [[NSNumberFormatter alloc] init]; + customFormatter.negativePrefix = @""; + customFormatter.positiveSuffix = @"m"; + customFormatter.negativeSuffix = @"m"; + customFormatter.minimumSignificantDigits = 1; + customFormatter.minimumFractionDigits = 1; + + set = [[BarChartDataSet alloc] initWithEntries:yValues label:@"Age Distribution"]; + + set.drawIconsEnabled = NO; + + set.valueFormatter = [[ChartDefaultValueFormatter alloc] initWithFormatter:customFormatter]; + set.valueFont = [UIFont systemFontOfSize:7.f]; + set.axisDependency = AxisDependencyRight; + set.colors = @[ + [UIColor colorWithRed:67/255.f green:67/255.f blue:72/255.f alpha:1.f], + [UIColor colorWithRed:124/255.f green:181/255.f blue:236/255.f alpha:1.f] + ]; + set.stackLabels = @[ + @"Men", @"Women" + ]; + + BarChartData *data = [[BarChartData alloc] initWithDataSet:set]; + + data.barWidth = 8.5; + + _chartView.data = data; + [_chartView setNeedsDisplay]; + } +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)optionTapped:(NSString *)key +{ + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected, stack-index %ld", (long)highlight.stackIndex); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +#pragma mark - IAxisValueFormatter + +- (NSString *)stringForValue:(double)value + axis:(ChartAxisBase *)axis +{ + return [NSString stringWithFormat:@"%03.0f-%03.0f", value, value + 10.0]; +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PieChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PieChartViewController.h new file mode 100644 index 00000000000..098d12b7333 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PieChartViewController.h @@ -0,0 +1,18 @@ +// +// PieChartViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface PieChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PieChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PieChartViewController.m new file mode 100644 index 00000000000..5bc3a9d6651 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PieChartViewController.m @@ -0,0 +1,217 @@ +// +// PieChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "PieChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface PieChartViewController () + +@property (nonatomic, strong) IBOutlet PieChartView *chartView; +@property (nonatomic, strong) IBOutlet UISlider *sliderX; +@property (nonatomic, strong) IBOutlet UISlider *sliderY; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextX; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextY; + +@end + +@implementation PieChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Pie Chart"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Y-Values"}, + @{@"key": @"toggleXValues", @"label": @"Toggle X-Values"}, + @{@"key": @"togglePercent", @"label": @"Toggle Percent"}, + @{@"key": @"toggleHole", @"label": @"Toggle Hole"}, + @{@"key": @"toggleIcons", @"label": @"Toggle Icons"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"spin", @"label": @"Spin"}, + @{@"key": @"drawCenter", @"label": @"Draw CenterText"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + ]; + + [self setupPieChartView:_chartView]; + + _chartView.delegate = self; + + ChartLegend *l = _chartView.legend; + l.horizontalAlignment = ChartLegendHorizontalAlignmentRight; + l.verticalAlignment = ChartLegendVerticalAlignmentTop; + l.orientation = ChartLegendOrientationVertical; + l.drawInside = NO; + l.xEntrySpace = 7.0; + l.yEntrySpace = 0.0; + l.yOffset = 0.0; + + // entry label styling + _chartView.entryLabelColor = UIColor.whiteColor; + _chartView.entryLabelFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:12.f]; + + _sliderX.value = 4.0; + _sliderY.value = 100.0; + [self slidersValueChanged:nil]; + + [_chartView animateWithXAxisDuration:1.4 easingOption:ChartEasingOptionEaseOutBack]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:_sliderX.value range:_sliderY.value]; +} + +- (void)setDataCount:(int)count range:(double)range +{ + double mult = range; + + NSMutableArray *values = [[NSMutableArray alloc] init]; + + for (int i = 0; i < count; i++) + { + [values addObject:[[PieChartDataEntry alloc] initWithValue:(arc4random_uniform(mult) + mult / 5) label:parties[i % parties.count] icon: [UIImage imageNamed:@"icon"]]]; + } + + PieChartDataSet *dataSet = [[PieChartDataSet alloc] initWithEntries:values label:@"Election Results"]; + + dataSet.drawIconsEnabled = NO; + + dataSet.sliceSpace = 2.0; + dataSet.iconsOffset = CGPointMake(0, 40); + + // add a lot of colors + + NSMutableArray *colors = [[NSMutableArray alloc] init]; + [colors addObjectsFromArray:ChartColorTemplates.vordiplom]; + [colors addObjectsFromArray:ChartColorTemplates.joyful]; + [colors addObjectsFromArray:ChartColorTemplates.colorful]; + [colors addObjectsFromArray:ChartColorTemplates.liberty]; + [colors addObjectsFromArray:ChartColorTemplates.pastel]; + [colors addObject:[UIColor colorWithRed:51/255.f green:181/255.f blue:229/255.f alpha:1.f]]; + + dataSet.colors = colors; + + PieChartData *data = [[PieChartData alloc] initWithDataSet:dataSet]; + + NSNumberFormatter *pFormatter = [[NSNumberFormatter alloc] init]; + pFormatter.numberStyle = NSNumberFormatterPercentStyle; + pFormatter.maximumFractionDigits = 1; + pFormatter.multiplier = @1.f; + pFormatter.percentSymbol = @" %"; + [data setValueFormatter:[[ChartDefaultValueFormatter alloc] initWithFormatter:pFormatter]]; + [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:11.f]]; + [data setValueTextColor:UIColor.whiteColor]; + + _chartView.data = data; + [_chartView highlightValues:nil]; +} + +- (void)optionTapped:(NSString *)key +{ + if ([key isEqualToString:@"toggleXValues"]) + { + _chartView.drawEntryLabelsEnabled = !_chartView.drawEntryLabelsEnabled; + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"togglePercent"]) + { + _chartView.usePercentValuesEnabled = !_chartView.isUsePercentValuesEnabled; + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleHole"]) + { + _chartView.drawHoleEnabled = !_chartView.isDrawHoleEnabled; + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"drawCenter"]) + { + _chartView.drawCenterTextEnabled = !_chartView.isDrawCenterTextEnabled; + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"animateX"]) + { + [_chartView animateWithXAxisDuration:1.4]; + return; + } + + if ([key isEqualToString:@"animateY"]) + { + [_chartView animateWithYAxisDuration:1.4]; + return; + } + + if ([key isEqualToString:@"animateXY"]) + { + [_chartView animateWithXAxisDuration:1.4 yAxisDuration:1.4]; + return; + } + + if ([key isEqualToString:@"spin"]) + { + [_chartView spinWithDuration:2.0 fromAngle:_chartView.rotationAngle toAngle:_chartView.rotationAngle + 360.f easingOption:ChartEasingOptionEaseInCubic]; + return; + } + + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - Actions + +- (IBAction)slidersValueChanged:(id)sender +{ + _sliderTextX.text = [@((int)_sliderX.value) stringValue]; + _sliderTextY.text = [@((int)_sliderY.value) stringValue]; + + [self updateChartData]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PiePolylineChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PiePolylineChartViewController.h new file mode 100644 index 00000000000..1ee0f4d1b59 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PiePolylineChartViewController.h @@ -0,0 +1,13 @@ +// +// PiePolylineChartViewController.h +// ChartsDemo +// +// Created by Jack Wang on 3/21/16. +// Copyright © 2016 Jack Wang +// + +#import "PieChartViewController.h" + +@interface PiePolylineChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PiePolylineChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PiePolylineChartViewController.m new file mode 100644 index 00000000000..81f092e9be2 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PiePolylineChartViewController.m @@ -0,0 +1,205 @@ +// +// PiePolylineChartViewController.h +// ChartsDemo +// +// Created by Jack Wang on 3/21/16. +// Copyright © 2016 Jack Wang +// + +#import "PiePolylineChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface PiePolylineChartViewController () + +@property (nonatomic, strong) IBOutlet PieChartView *chartView; +@property (nonatomic, strong) IBOutlet UISlider *sliderX; +@property (nonatomic, strong) IBOutlet UISlider *sliderY; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextX; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextY; +@end + +@implementation PiePolylineChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Pie Poly Line Chart"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Y-Values"}, + @{@"key": @"toggleXValues", @"label": @"Toggle X-Values"}, + @{@"key": @"togglePercent", @"label": @"Toggle Percent"}, + @{@"key": @"toggleHole", @"label": @"Toggle Hole"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"spin", @"label": @"Spin"}, + @{@"key": @"drawCenter", @"label": @"Draw CenterText"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + ]; + + [self setupPieChartView:_chartView]; + + _chartView.legend.enabled = NO; + _chartView.delegate = self; + + [_chartView setExtraOffsetsWithLeft:20.f top:0.f right:20.f bottom:0.f]; + + _sliderX.value = 4.0; + _sliderY.value = 100.0; + [self slidersValueChanged:nil]; + + [_chartView animateWithYAxisDuration:1.4 easingOption:ChartEasingOptionEaseOutBack]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:_sliderX.value range:_sliderY.value]; +} + +- (void)setDataCount:(int)count range:(double)range +{ + double mult = range; + + NSMutableArray *entries = [[NSMutableArray alloc] init]; + + for (int i = 0; i < count; i++) + { + [entries addObject:[[PieChartDataEntry alloc] initWithValue:(arc4random_uniform(mult) + mult / 5) label:parties[i % parties.count]]]; + } + + PieChartDataSet *dataSet = [[PieChartDataSet alloc] initWithEntries:entries label:@"Election Results"]; + dataSet.sliceSpace = 2.0; + + // add a lot of colors + + NSMutableArray *colors = [[NSMutableArray alloc] init]; + [colors addObjectsFromArray:ChartColorTemplates.vordiplom]; + [colors addObjectsFromArray:ChartColorTemplates.joyful]; + [colors addObjectsFromArray:ChartColorTemplates.colorful]; + [colors addObjectsFromArray:ChartColorTemplates.liberty]; + [colors addObjectsFromArray:ChartColorTemplates.pastel]; + [colors addObject:[UIColor colorWithRed:51/255.f green:181/255.f blue:229/255.f alpha:1.f]]; + + dataSet.colors = colors; + + dataSet.valueLinePart1OffsetPercentage = 0.8; + dataSet.valueLinePart1Length = 0.2; + dataSet.valueLinePart2Length = 0.4; + //dataSet.xValuePosition = PieChartValuePositionOutsideSlice; + dataSet.yValuePosition = PieChartValuePositionOutsideSlice; + + PieChartData *data = [[PieChartData alloc] initWithDataSet:dataSet]; + + NSNumberFormatter *pFormatter = [[NSNumberFormatter alloc] init]; + pFormatter.numberStyle = NSNumberFormatterPercentStyle; + pFormatter.maximumFractionDigits = 1; + pFormatter.multiplier = @1.f; + pFormatter.percentSymbol = @" %"; + [data setValueFormatter:[[ChartDefaultValueFormatter alloc] initWithFormatter:pFormatter]]; + [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:11.f]]; + [data setValueTextColor:UIColor.blackColor]; + + _chartView.data = data; + [_chartView highlightValues:nil]; +} + +- (void)optionTapped:(NSString *)key +{ + if ([key isEqualToString:@"toggleXValues"]) + { + _chartView.drawEntryLabelsEnabled = !_chartView.isDrawEntryLabelsEnabled; + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"togglePercent"]) + { + _chartView.usePercentValuesEnabled = !_chartView.isUsePercentValuesEnabled; + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleHole"]) + { + _chartView.drawHoleEnabled = !_chartView.isDrawHoleEnabled; + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"drawCenter"]) + { + _chartView.drawCenterTextEnabled = !_chartView.isDrawCenterTextEnabled; + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"animateX"]) + { + [_chartView animateWithXAxisDuration:1.4]; + return; + } + + if ([key isEqualToString:@"animateY"]) + { + [_chartView animateWithYAxisDuration:1.4]; + return; + } + + if ([key isEqualToString:@"animateXY"]) + { + [_chartView animateWithXAxisDuration:1.4 yAxisDuration:1.4]; + return; + } + + if ([key isEqualToString:@"spin"]) + { + [_chartView spinWithDuration:2.0 fromAngle:_chartView.rotationAngle toAngle:_chartView.rotationAngle + 360.f]; + return; + } + + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - Actions + +- (IBAction)slidersValueChanged:(id)sender +{ + _sliderTextX.text = [@((int)_sliderX.value) stringValue]; + _sliderTextY.text = [@((int)_sliderY.value) stringValue]; + + [self updateChartData]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end + diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PositiveNegativeBarChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PositiveNegativeBarChartViewController.h new file mode 100644 index 00000000000..a566badb86a --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PositiveNegativeBarChartViewController.h @@ -0,0 +1,18 @@ +// +// PositiveNegativeBarChartViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface PositiveNegativeBarChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PositiveNegativeBarChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PositiveNegativeBarChartViewController.m new file mode 100644 index 00000000000..2440fe9e1ab --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/PositiveNegativeBarChartViewController.m @@ -0,0 +1,194 @@ +// +// PositiveNegativeBarChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "PositiveNegativeBarChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface PositiveNegativeBarChartViewController () +{ + NSArray *dataList; +} + +@property (nonatomic, strong) IBOutlet BarChartView *chartView; + +@end + +@implementation PositiveNegativeBarChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Positive/Negative Bar Chart"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Values"}, + @{@"key": @"toggleHighlight", @"label": @"Toggle Highlight"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"togglePinchZoom", @"label": @"Toggle PinchZoom"}, + @{@"key": @"toggleAutoScaleMinMax", @"label": @"Toggle auto scale min/max"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + @{@"key": @"toggleBarBorders", @"label": @"Show Bar Borders"}, + ]; + + [self setupBarLineChartView:_chartView]; + + _chartView.delegate = self; + + _chartView.extraTopOffset = -30.f; + _chartView.extraBottomOffset = 10.f; + _chartView.extraLeftOffset = 70.f; + _chartView.extraRightOffset = 70.f; + + _chartView.drawBarShadowEnabled = NO; + _chartView.drawValueAboveBarEnabled = YES; + + _chartView.chartDescription.enabled = NO; + + // scaling can now only be done on x- and y-axis separately + _chartView.pinchZoomEnabled = NO; + + _chartView.drawGridBackgroundEnabled = NO; + + ChartXAxis *xAxis = _chartView.xAxis; + xAxis.labelPosition = XAxisLabelPositionBottom; + xAxis.labelFont = [UIFont systemFontOfSize:13.f]; + xAxis.drawGridLinesEnabled = NO; + xAxis.drawAxisLineEnabled = NO; + xAxis.labelTextColor = [UIColor lightGrayColor]; + xAxis.labelCount = 5; + xAxis.centerAxisLabelsEnabled = YES; + xAxis.granularity = 1.0; + xAxis.valueFormatter = self; + + ChartYAxis *leftAxis = _chartView.leftAxis; + leftAxis.drawLabelsEnabled = NO; + leftAxis.spaceTop = 0.25; + leftAxis.spaceBottom = 0.25; + leftAxis.drawAxisLineEnabled = NO; + leftAxis.drawGridLinesEnabled = NO; + leftAxis.drawZeroLineEnabled = YES; + leftAxis.zeroLineColor = UIColor.grayColor; + leftAxis.zeroLineWidth = 0.7f; + + _chartView.rightAxis.enabled = NO; + _chartView.legend.enabled = NO; + + [self updateChartData]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setChartData]; +} + +- (void)setChartData +{ + // THIS IS THE ORIGINAL DATA YOU WANT TO PLOT + dataList = @[ + @{@"xValue": @(0), + @"yValue": @(-224.1f), + @"xLabel": @"12-19"}, + @{@"xValue": @(1), + @"yValue": @(238.5f), + @"xLabel": @"12-30"}, + @{@"xValue": @(2), + @"yValue": @(1280.1f), + @"xLabel": @"12-31"}, + @{@"xValue": @(3), + @"yValue": @(-442.3f), + @"xLabel": @"01-01"}, + @{@"xValue": @(4), + @"yValue": @(-2280.1f), + @"xLabel": @"01-02"}, + ]; + + NSMutableArray *values = [[NSMutableArray alloc] init]; + NSMutableArray *colors = [[NSMutableArray alloc] init]; + + UIColor *green = [UIColor colorWithRed:110/255.f green:190/255.f blue:102/255.f alpha:1.f]; + UIColor *red = [UIColor colorWithRed:211/255.f green:74/255.f blue:88/255.f alpha:1.f]; + + for (int i = 0; i < dataList.count; i++) + { + NSDictionary *d = dataList[i]; + BarChartDataEntry *entry = [[BarChartDataEntry alloc] initWithX:[d[@"xValue"] doubleValue] y:[d[@"yValue"] doubleValue]]; + [values addObject:entry]; + + // specific colors + if ([d[@"yValue"] doubleValue] >= 0.f) + { + [colors addObject:red]; + } + else + { + [colors addObject:green]; + } + } + + BarChartDataSet *set = set = [[BarChartDataSet alloc] initWithEntries:values label:@"Values"]; + set.colors = colors; + set.valueColors = colors; + + BarChartData *data = [[BarChartData alloc] initWithDataSet:set]; + [data setValueFont:[UIFont systemFontOfSize:13.f]]; + + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + formatter.maximumFractionDigits = 1; + [data setValueFormatter:[[ChartDefaultValueFormatter alloc] initWithFormatter:formatter]]; + + data.barWidth = 0.8; + + _chartView.data = data; +} + +- (void)optionTapped:(NSString *)key +{ + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +#pragma mark - IAxisValueFormatter + +- (NSString *)stringForValue:(double)value + axis:(ChartAxisBase *)axis +{ + return dataList[MIN(MAX((int) value, 0), dataList.count - 1)][@"xLabel"]; + +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/RadarChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/RadarChartViewController.h new file mode 100644 index 00000000000..b9e13507e29 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/RadarChartViewController.h @@ -0,0 +1,18 @@ +// +// RadarChartViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface RadarChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/RadarChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/RadarChartViewController.m new file mode 100644 index 00000000000..24cfea5b58e --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/RadarChartViewController.m @@ -0,0 +1,274 @@ +// +// RadarChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "RadarChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface RadarChartViewController () + +@property (nonatomic, strong) IBOutlet RadarChartView *chartView; +@property (nonatomic, strong) NSArray *activities; +@property (nonatomic, strong) UIColor *originalBarBgColor; +@property (nonatomic, strong) UIColor *originalBarTintColor; +@property (nonatomic) UIBarStyle originalBarStyle; + +@end + +@implementation RadarChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.activities = @[ @"Burger", @"Steak", @"Salad", @"Pasta", @"Pizza" ]; + + self.title = @"Radar Chart"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Values"}, + @{@"key": @"toggleHighlight", @"label": @"Toggle Highlight"}, + @{@"key": @"toggleHighlightCircle", @"label": @"Toggle highlight circle"}, + @{@"key": @"toggleXLabels", @"label": @"Toggle X-Values"}, + @{@"key": @"toggleYLabels", @"label": @"Toggle Y-Values"}, + @{@"key": @"toggleRotate", @"label": @"Toggle Rotate"}, + @{@"key": @"toggleFill", @"label": @"Toggle Fill"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"spin", @"label": @"Spin"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + ]; + + _chartView.delegate = self; + + _chartView.chartDescription.enabled = NO; + _chartView.webLineWidth = 1.0; + _chartView.innerWebLineWidth = 1.0; + _chartView.webColor = UIColor.lightGrayColor; + _chartView.innerWebColor = UIColor.lightGrayColor; + _chartView.webAlpha = 1.0; + + RadarMarkerView *marker = (RadarMarkerView *)[RadarMarkerView viewFromXibIn:[NSBundle mainBundle]]; + marker.chartView = _chartView; + _chartView.marker = marker; + + ChartXAxis *xAxis = _chartView.xAxis; + xAxis.labelFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:9.f]; + xAxis.xOffset = 0.0; + xAxis.yOffset = 0.0; + xAxis.valueFormatter = self; + xAxis.labelTextColor = UIColor.whiteColor; + + ChartYAxis *yAxis = _chartView.yAxis; + yAxis.labelFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:9.f]; + yAxis.labelCount = 5; + yAxis.axisMinimum = 0.0; + yAxis.axisMaximum = 80.0; + yAxis.drawLabelsEnabled = NO; + + ChartLegend *l = _chartView.legend; + l.horizontalAlignment = ChartLegendHorizontalAlignmentCenter; + l.verticalAlignment = ChartLegendVerticalAlignmentTop; + l.orientation = ChartLegendOrientationHorizontal; + l.drawInside = NO; + l.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]; + l.xEntrySpace = 7.0; + l.yEntrySpace = 5.0; + l.textColor = UIColor.whiteColor; + + [self updateChartData]; + + [_chartView animateWithXAxisDuration:1.4 yAxisDuration:1.4 easingOption:ChartEasingOptionEaseOutBack]; +} + +- (void)viewWillAppear:(BOOL)animated +{ + [super viewWillAppear:animated]; + + [UIView animateWithDuration:0.15 animations:^{ + UINavigationBar *navigationBar = self.navigationController.navigationBar; + self.originalBarBgColor = navigationBar.barTintColor; + self.originalBarTintColor = navigationBar.tintColor; + self.originalBarStyle = navigationBar.barStyle; + + navigationBar.barTintColor = self.view.backgroundColor; + navigationBar.tintColor = UIColor.whiteColor; + navigationBar.barStyle = UIBarStyleBlack; + }]; +} + +- (void)viewWillDisappear:(BOOL)animated +{ + [super viewWillDisappear:animated]; + + [UIView animateWithDuration:0.15 animations:^{ + UINavigationBar *navigationBar = self.navigationController.navigationBar; + navigationBar.barTintColor = self.originalBarBgColor; + navigationBar.tintColor = self.originalBarTintColor; + navigationBar.barStyle = self.originalBarStyle; + }]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setChartData]; +} + +- (void)setChartData +{ + double mult = 80; + double min = 20; + int cnt = 5; + + NSMutableArray *entries1 = [[NSMutableArray alloc] init]; + NSMutableArray *entries2 = [[NSMutableArray alloc] init]; + + // NOTE: The order of the entries when being added to the entries array determines their position around the center of the chart. + for (int i = 0; i < cnt; i++) + { + [entries1 addObject:[[RadarChartDataEntry alloc] initWithValue:(arc4random_uniform(mult) + min)]]; + [entries2 addObject:[[RadarChartDataEntry alloc] initWithValue:(arc4random_uniform(mult) + min)]]; + } + + RadarChartDataSet *set1 = [[RadarChartDataSet alloc] initWithEntries:entries1 label:@"Last Week"]; + [set1 setColor:[UIColor colorWithRed:103/255.0 green:110/255.0 blue:129/255.0 alpha:1.0]]; + set1.fillColor = [UIColor colorWithRed:103/255.0 green:110/255.0 blue:129/255.0 alpha:1.0]; + set1.drawFilledEnabled = YES; + set1.fillAlpha = 0.7; + set1.lineWidth = 2.0; + set1.drawHighlightCircleEnabled = YES; + [set1 setDrawHighlightIndicators:NO]; + + RadarChartDataSet *set2 = [[RadarChartDataSet alloc] initWithEntries:entries2 label:@"This Week"]; + [set2 setColor:[UIColor colorWithRed:121/255.0 green:162/255.0 blue:175/255.0 alpha:1.0]]; + set2.fillColor = [UIColor colorWithRed:121/255.0 green:162/255.0 blue:175/255.0 alpha:1.0]; + set2.drawFilledEnabled = YES; + set2.fillAlpha = 0.7; + set2.lineWidth = 2.0; + set2.drawHighlightCircleEnabled = YES; + [set2 setDrawHighlightIndicators:NO]; + + RadarChartData *data = [[RadarChartData alloc] initWithDataSets:@[set1, set2]]; + [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:8.f]]; + [data setDrawValues:NO]; + data.valueTextColor = UIColor.whiteColor; + + _chartView.data = data; +} + +- (void)optionTapped:(NSString *)key +{ + if ([key isEqualToString:@"toggleXLabels"]) + { + _chartView.xAxis.drawLabelsEnabled = !_chartView.xAxis.isDrawLabelsEnabled; + + [_chartView.data notifyDataChanged]; + [_chartView notifyDataSetChanged]; + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleYLabels"]) + { + _chartView.yAxis.drawLabelsEnabled = !_chartView.yAxis.isDrawLabelsEnabled; + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleRotate"]) + { + _chartView.rotationEnabled = !_chartView.isRotationEnabled; + return; + } + + if ([key isEqualToString:@"toggleFill"]) + { + for (RadarChartDataSet *set in _chartView.data.dataSets) + { + set.drawFilledEnabled = !set.isDrawFilledEnabled; + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"toggleHighlightCircle"]) + { + for (RadarChartDataSet *set in _chartView.data.dataSets) + { + set.drawHighlightCircleEnabled = !set.drawHighlightCircleEnabled; + } + + [_chartView setNeedsDisplay]; + return; + } + + if ([key isEqualToString:@"animateX"]) + { + [_chartView animateWithXAxisDuration:1.4]; + return; + } + + if ([key isEqualToString:@"animateY"]) + { + [_chartView animateWithYAxisDuration:1.4]; + return; + } + + if ([key isEqualToString:@"animateXY"]) + { + [_chartView animateWithXAxisDuration:1.4 yAxisDuration:1.4]; + return; + } + + if ([key isEqualToString:@"spin"]) + { + [_chartView spinWithDuration:2.0 fromAngle:_chartView.rotationAngle toAngle:_chartView.rotationAngle + 360.f easingOption:ChartEasingOptionEaseInCubic]; + return; + } + + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +#pragma mark - IAxisValueFormatter + +- (NSString *)stringForValue:(double)value + axis:(ChartAxisBase *)axis +{ + return self.activities[(int) value % self.activities.count]; +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/ScatterChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/ScatterChartViewController.h new file mode 100644 index 00000000000..2989d22d8ff --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/ScatterChartViewController.h @@ -0,0 +1,18 @@ +// +// ScatterChartViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface ScatterChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/ScatterChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/ScatterChartViewController.m new file mode 100644 index 00000000000..19a158f640f --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/ScatterChartViewController.m @@ -0,0 +1,167 @@ +// +// ScatterChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "ScatterChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface ScatterChartViewController () + +@property (nonatomic, strong) IBOutlet ScatterChartView *chartView; +@property (nonatomic, strong) IBOutlet UISlider *sliderX; +@property (nonatomic, strong) IBOutlet UISlider *sliderY; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextX; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextY; + +@end + +@implementation ScatterChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Scatter Chart"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Values"}, + @{@"key": @"toggleHighlight", @"label": @"Toggle Highlight"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"togglePinchZoom", @"label": @"Toggle PinchZoom"}, + @{@"key": @"toggleAutoScaleMinMax", @"label": @"Toggle auto scale min/max"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + ]; + + _chartView.delegate = self; + + _chartView.chartDescription.enabled = NO; + + _chartView.drawGridBackgroundEnabled = NO; + _chartView.dragEnabled = YES; + [_chartView setScaleEnabled:YES]; + _chartView.maxVisibleCount = 200; + _chartView.pinchZoomEnabled = YES; + + ChartLegend *l = _chartView.legend; + l.horizontalAlignment = ChartLegendHorizontalAlignmentRight; + l.verticalAlignment = ChartLegendVerticalAlignmentTop; + l.orientation = ChartLegendOrientationVertical; + l.drawInside = NO; + l.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]; + l.xOffset = 5.0; + + ChartYAxis *yl = _chartView.leftAxis; + yl.labelFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]; + yl.axisMinimum = 0.0; // this replaces startAtZero = YES + + _chartView.rightAxis.enabled = NO; + + ChartXAxis *xl = _chartView.xAxis; + xl.labelFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]; + xl.drawGridLinesEnabled = NO; + + _sliderX.value = 45.0; + _sliderY.value = 100.0; + [self slidersValueChanged:nil]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:_sliderX.value + 1 range:_sliderY.value]; +} + +- (void)setDataCount:(int)count range:(double)range +{ + NSMutableArray *yVals1 = [[NSMutableArray alloc] init]; + NSMutableArray *yVals2 = [[NSMutableArray alloc] init]; + NSMutableArray *yVals3 = [[NSMutableArray alloc] init]; + + for (int i = 0; i < count; i++) + { + double val = (double) (arc4random_uniform(range)) + 3; + [yVals1 addObject:[[ChartDataEntry alloc] initWithX:(double)i y:val]]; + + val = (double) (arc4random_uniform(range)) + 3; + [yVals2 addObject:[[ChartDataEntry alloc] initWithX:(double)i + 0.33 y:val]]; + + val = (double) (arc4random_uniform(range)) + 3; + [yVals3 addObject:[[ChartDataEntry alloc] initWithX:(double)i + 0.66 y:val]]; + } + + ScatterChartDataSet *set1 = [[ScatterChartDataSet alloc] initWithEntries:yVals1 label:@"DS 1"]; + [set1 setScatterShape:ScatterShapeSquare]; + [set1 setColor:ChartColorTemplates.colorful[0]]; + ScatterChartDataSet *set2 = [[ScatterChartDataSet alloc] initWithEntries:yVals2 label:@"DS 2"]; + [set2 setScatterShape:ScatterShapeCircle]; + set2.scatterShapeHoleColor = ChartColorTemplates.colorful[3]; + set2.scatterShapeHoleRadius = 3.5f; + [set2 setColor:ChartColorTemplates.colorful[1]]; + ScatterChartDataSet *set3 = [[ScatterChartDataSet alloc] initWithEntries:yVals3 label:@"DS 3"]; + [set3 setScatterShape:ScatterShapeCross]; + [set3 setColor:ChartColorTemplates.colorful[2]]; + + set1.scatterShapeSize = 8.0; + set2.scatterShapeSize = 8.0; + set3.scatterShapeSize = 8.0; + + NSMutableArray *dataSets = [[NSMutableArray alloc] init]; + [dataSets addObject:set1]; + [dataSets addObject:set2]; + [dataSets addObject:set3]; + + ScatterChartData *data = [[ScatterChartData alloc] initWithDataSets:dataSets]; + [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:7.f]]; + + _chartView.data = data; +} + +- (void)optionTapped:(NSString *)key +{ + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - Actions + +- (IBAction)slidersValueChanged:(id)sender +{ + _sliderTextX.text = [@((int)_sliderX.value) stringValue]; + _sliderTextY.text = [@((int)_sliderY.value) stringValue]; + + [self updateChartData]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull )entry dataSetIndex:(NSInteger)dataSetIndex highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/SinusBarChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/SinusBarChartViewController.h new file mode 100644 index 00000000000..aa94a9fd646 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/SinusBarChartViewController.h @@ -0,0 +1,18 @@ +// +// SinusBarChartViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface SinusBarChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/SinusBarChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/SinusBarChartViewController.m new file mode 100644 index 00000000000..e64bf3388b5 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/SinusBarChartViewController.m @@ -0,0 +1,166 @@ +// +// SinusBarChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "SinusBarChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface SinusBarChartViewController () + +@property (nonatomic, strong) IBOutlet BarChartView *chartView; +@property (nonatomic, strong) IBOutlet UISlider *sliderX; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextX; + +@end + +@implementation SinusBarChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Sinus Bar Chart"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Values"}, + @{@"key": @"toggleHighlight", @"label": @"Toggle Highlight"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"togglePinchZoom", @"label": @"Toggle PinchZoom"}, + @{@"key": @"toggleAutoScaleMinMax", @"label": @"Toggle auto scale min/max"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + ]; + + _chartView.delegate = self; + + _chartView.chartDescription.enabled = NO; + + _chartView.drawBarShadowEnabled = NO; + _chartView.drawValueAboveBarEnabled = YES; + _chartView.maxVisibleCount = 60; + _chartView.pinchZoomEnabled = NO; + _chartView.drawGridBackgroundEnabled = NO; + + ChartXAxis *xAxis = _chartView.xAxis; + xAxis.labelPosition = XAxisLabelPositionBottom; + xAxis.labelFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]; + xAxis.drawGridLinesEnabled = NO; + xAxis.enabled = NO; + + ChartYAxis *leftAxis = _chartView.leftAxis; + leftAxis.labelFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]; + leftAxis.labelCount = 6; + leftAxis.axisMinimum = -2.5; + leftAxis.axisMaximum = 2.5; + leftAxis.granularityEnabled = true; + leftAxis.granularity = 0.1; + + ChartYAxis *rightAxis = _chartView.rightAxis; + rightAxis.drawGridLinesEnabled = NO; + rightAxis.labelFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]; + rightAxis.labelCount = 6; + rightAxis.axisMinimum = -2.5; + rightAxis.axisMaximum = 2.5; + rightAxis.granularity = 0.1; + + ChartLegend *l = _chartView.legend; + l.horizontalAlignment = ChartLegendHorizontalAlignmentLeft; + l.verticalAlignment = ChartLegendVerticalAlignmentBottom; + l.orientation = ChartLegendOrientationHorizontal; + l.drawInside = NO; + l.form = ChartLegendFormSquare; + l.formSize = 9.0; + l.font = [UIFont systemFontOfSize:11.f]; + l.xEntrySpace = 4.0; + + _sliderX.value = 150.0; + [self slidersValueChanged:nil]; + + [_chartView animateWithXAxisDuration:2.0 yAxisDuration:2.0]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:(_sliderX.value)]; +} + +- (void)setDataCount:(int)count +{ + NSMutableArray *entries = [[NSMutableArray alloc] init]; + + for (int i = 0; i < count; i++) + { + [entries addObject:[[BarChartDataEntry alloc] initWithX:(double)i y:sinf(M_PI * (i % 128) / 64.0)]]; + } + + BarChartDataSet *set = nil; + if (_chartView.data.dataSetCount > 0) + { + set = (BarChartDataSet *)_chartView.data.dataSets[0]; + [set replaceEntries: entries]; + [_chartView.data notifyDataChanged]; + [_chartView notifyDataSetChanged]; + } + else + { + set = [[BarChartDataSet alloc] initWithEntries:entries label:@"Sinus Function"]; + [set setColor:[UIColor colorWithRed:240/255.f green:120/255.f blue:124/255.f alpha:1.f]]; + + BarChartData *data = [[BarChartData alloc] initWithDataSet:set]; + [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]]; + [data setDrawValues:NO]; + + data.barWidth = 0.8; + + _chartView.data = data; + } +} + +- (void)optionTapped:(NSString *)key +{ + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - Actions + +- (IBAction)slidersValueChanged:(id)sender +{ + _sliderTextX.text = [@((int)_sliderX.value) stringValue]; + + [self updateChartData]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected"); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/StackedBarChartViewController.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/StackedBarChartViewController.h new file mode 100644 index 00000000000..5ef6f2797b1 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/StackedBarChartViewController.h @@ -0,0 +1,18 @@ +// +// StackedBarChartViewController.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "DemoBaseViewController.h" +#import + +@interface StackedBarChartViewController : DemoBaseViewController + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/StackedBarChartViewController.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/StackedBarChartViewController.m new file mode 100644 index 00000000000..69fb1053bf7 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Demos/StackedBarChartViewController.m @@ -0,0 +1,180 @@ +// +// StackedBarChartViewController.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import "StackedBarChartViewController.h" +#import "ChartsDemo_iOS-Swift.h" + +@interface StackedBarChartViewController () + +@property (nonatomic, strong) IBOutlet BarChartView *chartView; +@property (nonatomic, strong) IBOutlet UISlider *sliderX; +@property (nonatomic, strong) IBOutlet UISlider *sliderY; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextX; +@property (nonatomic, strong) IBOutlet UITextField *sliderTextY; + +@end + +@implementation StackedBarChartViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Stacked Bar Chart"; + + self.options = @[ + @{@"key": @"toggleValues", @"label": @"Toggle Values"}, + @{@"key": @"toggleIcons", @"label": @"Toggle Icons"}, + @{@"key": @"toggleHighlight", @"label": @"Toggle Highlight"}, + @{@"key": @"animateX", @"label": @"Animate X"}, + @{@"key": @"animateY", @"label": @"Animate Y"}, + @{@"key": @"animateXY", @"label": @"Animate XY"}, + @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}, + @{@"key": @"togglePinchZoom", @"label": @"Toggle PinchZoom"}, + @{@"key": @"toggleAutoScaleMinMax", @"label": @"Toggle auto scale min/max"}, + @{@"key": @"toggleData", @"label": @"Toggle Data"}, + @{@"key": @"toggleBarBorders", @"label": @"Show Bar Borders"}, + ]; + + _chartView.delegate = self; + + _chartView.chartDescription.enabled = NO; + + _chartView.maxVisibleCount = 40; + _chartView.pinchZoomEnabled = NO; + _chartView.drawGridBackgroundEnabled = NO; + _chartView.drawBarShadowEnabled = NO; + _chartView.drawValueAboveBarEnabled = NO; + _chartView.highlightFullBarEnabled = NO; + + NSNumberFormatter *leftAxisFormatter = [[NSNumberFormatter alloc] init]; + leftAxisFormatter.maximumFractionDigits = 1; + leftAxisFormatter.negativeSuffix = @" $"; + leftAxisFormatter.positiveSuffix = @" $"; + + ChartYAxis *leftAxis = _chartView.leftAxis; + leftAxis.valueFormatter = [[ChartDefaultAxisValueFormatter alloc] initWithFormatter:leftAxisFormatter]; + leftAxis.axisMinimum = 0.0; // this replaces startAtZero = YES + + _chartView.rightAxis.enabled = NO; + + ChartXAxis *xAxis = _chartView.xAxis; + xAxis.labelPosition = XAxisLabelPositionTop; + + ChartLegend *l = _chartView.legend; + l.horizontalAlignment = ChartLegendHorizontalAlignmentRight; + l.verticalAlignment = ChartLegendVerticalAlignmentBottom; + l.orientation = ChartLegendOrientationHorizontal; + l.drawInside = NO; + l.form = ChartLegendFormSquare; + l.formSize = 8.0; + l.formToTextSpace = 4.0; + l.xEntrySpace = 6.0; + + _sliderX.value = 12.0; + _sliderY.value = 100.0; + [self slidersValueChanged:nil]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (void)updateChartData +{ + if (self.shouldHideData) + { + _chartView.data = nil; + return; + } + + [self setDataCount:_sliderX.value + 1 range:_sliderY.value]; +} + +- (void)setDataCount:(int)count range:(double)range +{ + NSMutableArray *yVals = [[NSMutableArray alloc] init]; + + for (int i = 0; i < count; i++) + { + double mult = (range + 1); + double val1 = (double) (arc4random_uniform(mult) + mult / 3); + double val2 = (double) (arc4random_uniform(mult) + mult / 3); + double val3 = (double) (arc4random_uniform(mult) + mult / 3); + + [yVals addObject:[[BarChartDataEntry alloc] initWithX:i yValues:@[@(val1), @(val2), @(val3)] icon: [UIImage imageNamed:@"icon"]]]; + } + + BarChartDataSet *set1 = nil; + if (_chartView.data.dataSetCount > 0) + { + set1 = (BarChartDataSet *)_chartView.data.dataSets[0]; + [set1 replaceEntries: yVals]; + [_chartView.data notifyDataChanged]; + [_chartView notifyDataSetChanged]; + } + else + { + set1 = [[BarChartDataSet alloc] initWithEntries:yVals label:@"Statistics Vienna 2014"]; + + set1.drawIconsEnabled = NO; + + set1.colors = @[ChartColorTemplates.material[0], ChartColorTemplates.material[1], ChartColorTemplates.material[2]]; + set1.stackLabels = @[@"Births", @"Divorces", @"Marriages"]; + + NSMutableArray *dataSets = [[NSMutableArray alloc] init]; + [dataSets addObject:set1]; + + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + formatter.maximumFractionDigits = 1; + formatter.negativeSuffix = @" $"; + formatter.positiveSuffix = @" $"; + + BarChartData *data = [[BarChartData alloc] initWithDataSets:dataSets]; + [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:7.f]]; + [data setValueFormatter:[[ChartDefaultValueFormatter alloc] initWithFormatter:formatter]]; + [data setValueTextColor:UIColor.whiteColor]; + + _chartView.fitBars = YES; + _chartView.data = data; + } +} + +- (void)optionTapped:(NSString *)key +{ + [super handleOption:key forChartView:_chartView]; +} + +#pragma mark - Actions + +- (IBAction)slidersValueChanged:(id)sender +{ + _sliderTextX.text = [@((int)_sliderX.value) stringValue]; + _sliderTextY.text = [@((int)_sliderY.value) stringValue]; + + [self updateChartData]; +} + +#pragma mark - ChartViewDelegate + +- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight +{ + NSLog(@"chartValueSelected, stack-index %ld", (long)highlight.stackIndex); +} + +- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView +{ + NSLog(@"chartValueNothingSelected"); +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/DateValueFormatter.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/DateValueFormatter.h new file mode 100644 index 00000000000..2e94536aa75 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/DateValueFormatter.h @@ -0,0 +1,17 @@ +// +// DateValueFormatter.h +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + +#import +#import "ChartsDemo_iOS-Swift.h" + +@interface DateValueFormatter : NSObject + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/DateValueFormatter.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/DateValueFormatter.m new file mode 100644 index 00000000000..27a8cfa8ffb --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/DateValueFormatter.m @@ -0,0 +1,39 @@ +// +// DateValueFormatter.m +// ChartsDemo +// +// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda +// A port of MPAndroidChart for iOS +// Licensed under Apache License 2.0 +// +// https://github.com/danielgindi/Charts +// + + +#import "DateValueFormatter.h" + +@interface DateValueFormatter () +{ + NSDateFormatter *_dateFormatter; +} +@end + +@implementation DateValueFormatter + +- (id)init +{ + self = [super init]; + if (self) + { + _dateFormatter = [[NSDateFormatter alloc] init]; + _dateFormatter.dateFormat = @"dd MMM HH:mm"; + } + return self; +} + +- (NSString *)stringForValue:(double)value axis:(ChartAxisBase *)axis +{ + return [_dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:value]]; +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/DayAxisValueFormatter.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/DayAxisValueFormatter.h new file mode 100644 index 00000000000..4de193d0c59 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/DayAxisValueFormatter.h @@ -0,0 +1,14 @@ +// +// DayAxisValueFormatter.h +// ChartsDemo +// Copyright © 2016 dcg. All rights reserved. +// + +#import +#import "ChartsDemo_iOS-Swift.h" + +@interface DayAxisValueFormatter : NSObject + +- (id)initForChart:(BarLineChartViewBase *)chart; + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/DayAxisValueFormatter.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/DayAxisValueFormatter.m new file mode 100644 index 00000000000..814456cc59d --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/DayAxisValueFormatter.m @@ -0,0 +1,166 @@ +// +// DayAxisValueFormatter.m +// ChartsDemo +// Copyright © 2016 dcg. All rights reserved. +// + +#import "DayAxisValueFormatter.h" + +@implementation DayAxisValueFormatter +{ + NSArray *months; + __weak BarLineChartViewBase *_chart; +} + +- (id)initForChart:(BarLineChartViewBase *)chart +{ + self = [super init]; + if (self) + { + self->_chart = chart; + + months = @[ + @"Jan", @"Feb", @"Mar", + @"Apr", @"May", @"Jun", + @"Jul", @"Aug", @"Sep", + @"Oct", @"Nov", @"Dec" + ]; + } + return self; +} + +- (NSString *)stringForValue:(double)value + axis:(ChartAxisBase *)axis +{ + int days = (int)value; + int year = [self determineYearForDays:days]; + int month = [self determineMonthForDayOfYear:days]; + + NSString *monthName = months[month % months.count]; + NSString *yearName = [@(year) stringValue]; + + if (_chart.visibleXRange > 30 * 6) + { + return [NSString stringWithFormat:@"%@ %@", monthName, yearName]; + } + else + { + int dayOfMonth = [self determineDayOfMonthForDays:days month:month + 12 * (year - 2016)]; + + NSString *appendix = @"th"; + + switch (dayOfMonth) + { + case 1: + appendix = @"st"; + break; + case 2: + appendix = @"nd"; + break; + case 3: + appendix = @"rd"; + break; + case 21: + appendix = @"st"; + break; + case 22: + appendix = @"nd"; + break; + case 23: + appendix = @"rd"; + break; + case 31: + appendix = @"st"; + break; + } + + return dayOfMonth == 0 ? @"" : [NSString stringWithFormat:@"%d%@ %@", dayOfMonth, appendix, monthName]; + } +} + +- (int)daysForMonth:(int)month year:(int)year +{ + // month is 0-based + + if (month == 1) + { + BOOL is29Feb = NO; + + if (year < 1582) + { + is29Feb = (year < 1 ? year + 1 : year) % 4 == 0; + } + else if (year > 1582) + { + is29Feb = year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); + } + + return is29Feb ? 29 : 28; + } + + if (month == 3 || month == 5 || month == 8 || month == 10) + { + return 30; + } + + return 31; +} + +- (int)determineMonthForDayOfYear:(int)dayOfYear +{ + int month = -1; + int days = 0; + + while (days < dayOfYear) + { + month = month + 1; + + if (month >= 12) + month = 0; + + int year = [self determineYearForDays:days]; + days += [self daysForMonth:month year:year]; + } + + return MAX(month, 0); +} + + +- (int)determineDayOfMonthForDays:(int)days month:(int)month +{ + int count = 0; + int daysForMonths = 0; + + while (count < month) + { + int year = [self determineYearForDays:days]; + daysForMonths += [self daysForMonth:count % 12 year:year]; + count++; + } + + return days - daysForMonths; +} + +- (int)determineYearForDays:(int)days +{ + if (days <= 366) + { + return 2016; + } + else if (days <= 730) + { + return 2017; + } + else if (days <= 1094) + { + return 2018; + } + else if (days <= 1458) + { + return 2019; + } + + return 2020; +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/IntAxisValueFormatter.h b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/IntAxisValueFormatter.h new file mode 100644 index 00000000000..6401ed07d47 --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/IntAxisValueFormatter.h @@ -0,0 +1,12 @@ +// +// IntAxisValueFormatter.h +// ChartsDemo +// Copyright © 2016 dcg. All rights reserved. +// + +#import +#import "ChartsDemo_iOS-Swift.h" + +@interface IntAxisValueFormatter : NSObject + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/IntAxisValueFormatter.m b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/IntAxisValueFormatter.m new file mode 100644 index 00000000000..227a5f2806c --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/IntAxisValueFormatter.m @@ -0,0 +1,19 @@ +// +// IntAxisValueFormatter.m +// ChartsDemo +// Copyright © 2016 dcg. All rights reserved. +// + +#import "IntAxisValueFormatter.h" + +@implementation IntAxisValueFormatter +{ +} + +- (NSString *)stringForValue:(double)value + axis:(ChartAxisBase *)axis +{ + return [@((NSInteger)value) stringValue]; +} + +@end diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/LargeValueFormatter.swift b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/LargeValueFormatter.swift new file mode 100644 index 00000000000..47ca78fd5eb --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Objective-C/Formatters/LargeValueFormatter.swift @@ -0,0 +1,68 @@ +// +// LargeValueFormatter.swift +// ChartsDemo +// Copyright © 2016 dcg. All rights reserved. +// + +import Foundation +import Charts + +open class LargeValueFormatter: NSObject, IValueFormatter, IAxisValueFormatter +{ + fileprivate static let MAX_LENGTH = 5 + + /// Suffix to be appended after the values. + /// + /// **default**: suffix: ["", "k", "m", "b", "t"] + @objc open var suffix = ["", "k", "m", "b", "t"] + + /// An appendix text to be added at the end of the formatted value. + @objc open var appendix: String? + + public override init() + { + + } + + @objc public init(appendix: String?) + { + self.appendix = appendix + } + + fileprivate func format(value: Double) -> String + { + var sig = value + var length = 0 + let maxLength = suffix.count - 1 + + while sig >= 1000.0 && length < maxLength + { + sig /= 1000.0 + length += 1 + } + + var r = String(format: "%2.f", sig) + suffix[length] + + if appendix != nil + { + r += appendix! + } + + return r + } + + open func stringForValue( + _ value: Double, axis: AxisBase?) -> String + { + return format(value: value) + } + + open func stringForValue( + _ value: Double, + entry: ChartDataEntry, + dataSetIndex: Int, + viewPortHandler: ViewPortHandler?) -> String + { + return format(value: value) + } +} diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/AppIcon.appiconset/Contents.json b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000000..7c780dbcb5c --- /dev/null +++ b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,60 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@3x.png", + "scale" : "3x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "iTunesArtwork@2x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon-29@2x.png b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon-29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..33b2e63ab491d39425e104e7ef5916dd41cf6bcb GIT binary patch literal 5677 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 IIm^g@0c)79&;S4c literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon-29@3x.png b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon-29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ef18aba824097d907faf79251338789f90356692 GIT binary patch literal 10210 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 Wi~3w&#sBk@?u(@Sr!sMUzyATj7qnOa literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png b/Carthage/Checkouts/Charts/ChartsDemo-iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..775e7277c87f33e5894daa86b314de4fd2e4b07a GIT binary patch literal 9266 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%0DepW05lu`xJDL1w*df8ZUA7{8~_l>1OUif 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