From bf191684baa0e703b9d9aa1c657078dd5f15cb61 Mon Sep 17 00:00:00 2001 From: RCCoop Date: Sat, 18 Mar 2023 07:20:37 -0400 Subject: [PATCH 1/3] Fixed potential failure in MarkerView.viewFromXib --- Source/Charts/Components/MarkerView.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Source/Charts/Components/MarkerView.swift b/Source/Charts/Components/MarkerView.swift index d80ad535b3..45c79fc1a5 100644 --- a/Source/Charts/Components/MarkerView.swift +++ b/Source/Charts/Components/MarkerView.swift @@ -72,14 +72,16 @@ open class MarkerView: NSUIView, Marker } @objc - open class func viewFromXib(in bundle: Bundle = .main) -> MarkerView? + open class func viewFromXib(in bundle: Bundle = .main) -> Self? { #if !os(OSX) return bundle.loadNibNamed( String(describing: self), owner: nil, - options: nil)?[0] as? MarkerView + options: nil)? + .compactMap { $0 as? Self } + .first #else var loadedObjects: NSArray? = NSArray() @@ -89,7 +91,7 @@ open class MarkerView: NSUIView, Marker owner: nil, topLevelObjects: &loadedObjects) { - return loadedObjects?[0] as? MarkerView + return loadedObjects?.compactMap({ $0 as? Self }).first } return nil From 64848600686b3e6470eb8d6f8d61de8d8d276572 Mon Sep 17 00:00:00 2001 From: RCCoop Date: Sat, 18 Mar 2023 11:43:19 -0400 Subject: [PATCH 2/3] Fixed layer drawing failure in MarkerView for OSX --- Source/Charts/Components/MarkerView.swift | 36 +++++++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/Source/Charts/Components/MarkerView.swift b/Source/Charts/Components/MarkerView.swift index 45c79fc1a5..3001ea5539 100644 --- a/Source/Charts/Components/MarkerView.swift +++ b/Source/Charts/Components/MarkerView.swift @@ -21,7 +21,11 @@ open class MarkerView: NSUIView, Marker { open var offset: CGPoint = CGPoint() - @objc open weak var chartView: ChartViewBase? + @objc open weak var chartView: ChartViewBase? { + didSet { + didAddToChart(chartView) + } + } open func offsetForDrawing(atPoint point: CGPoint) -> CGPoint { @@ -89,13 +93,39 @@ open class MarkerView: NSUIView, Marker if bundle.loadNibNamed( NSNib.Name(String(describing: self)), owner: nil, - topLevelObjects: &loadedObjects) + topLevelObjects: &loadedObjects), + let view = loadedObjects?.compactMap({ $0 as? Self }).first { - return loadedObjects?.compactMap({ $0 as? Self }).first + view.wantsLayer = true + return view } return nil #endif } + @objc + open func didAddToChart(_ chartView: ChartViewBase?) { + #if os(OSX) + removeFromSuperview() + + // Need to add MarkerView to a view in order to allow it to render out of visible area + guard let chartView else { return } + + var parentView: NSView = chartView + while let grandparentView = parentView.superview { + parentView = grandparentView + } + parentView.addSubview(self) + + // Constrain MarkerView to off-screen, since it's only being used to render in `draw()` function + // and not to display directly as NSView + translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + leadingAnchor.constraint(equalTo: parentView.trailingAnchor, constant: 100.0), + topAnchor.constraint(equalTo: parentView.bottomAnchor, constant: 100.0) + ]) + + #endif + } } From b42e0c1cf04da30051a1875a697ebe41d85df1fe Mon Sep 17 00:00:00 2001 From: RCCoop Date: Sat, 18 Mar 2023 11:43:31 -0400 Subject: [PATCH 3/3] Added sample MarkerView to MacOS project --- .../project.pbxproj | 37 +++++++++++++ .../Components/RadarMarkerViewMac.swift | 30 ++++++++++ .../Demos/RadarDemoViewController.swift | 3 + .../Resources/radar_marker@3x.png | Bin 0 -> 9753 bytes .../XIBs/RadarMarkerViewMac.xib | 52 ++++++++++++++++++ 5 files changed, 122 insertions(+) create mode 100644 ChartsDemo-macOS/ChartsDemo-macOS/Components/RadarMarkerViewMac.swift create mode 100644 ChartsDemo-macOS/ChartsDemo-macOS/Resources/radar_marker@3x.png create mode 100644 ChartsDemo-macOS/ChartsDemo-macOS/XIBs/RadarMarkerViewMac.xib diff --git a/ChartsDemo-macOS/ChartsDemo-macOS.xcodeproj/project.pbxproj b/ChartsDemo-macOS/ChartsDemo-macOS.xcodeproj/project.pbxproj index 10e89b3554..d0faaa9a4f 100644 --- a/ChartsDemo-macOS/ChartsDemo-macOS.xcodeproj/project.pbxproj +++ b/ChartsDemo-macOS/ChartsDemo-macOS.xcodeproj/project.pbxproj @@ -16,6 +16,9 @@ 65B3F6421C73B4F5000983D0 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65B3F6411C73B4F5000983D0 /* AppDelegate.swift */; }; 65B3F6461C73B4F5000983D0 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 65B3F6451C73B4F5000983D0 /* Assets.xcassets */; }; 65B3F6491C73B4F5000983D0 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 65B3F6471C73B4F5000983D0 /* Main.storyboard */; }; + 9406FF8D29C4AF1800AC466A /* RadarMarkerViewMac.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9406FF8C29C4AF1800AC466A /* RadarMarkerViewMac.swift */; }; + 9406FF9129C4AF5900AC466A /* RadarMarkerViewMac.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9406FF9029C4AF5900AC466A /* RadarMarkerViewMac.xib */; }; + 9406FF9429C4B1C300AC466A /* radar_marker@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9406FF9329C4B1C300AC466A /* radar_marker@3x.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -68,6 +71,9 @@ 65B3F6451C73B4F5000983D0 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 65B3F6481C73B4F5000983D0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 65B3F64A1C73B4F5000983D0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9406FF8C29C4AF1800AC466A /* RadarMarkerViewMac.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RadarMarkerViewMac.swift; sourceTree = ""; }; + 9406FF9029C4AF5900AC466A /* RadarMarkerViewMac.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RadarMarkerViewMac.xib; sourceTree = ""; }; + 9406FF9329C4B1C300AC466A /* radar_marker@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "radar_marker@3x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -98,6 +104,7 @@ 5B9A0C3B1C83AB2100ED8ED8 /* LineDemoViewController.swift */, 5B9A0C3D1C83AB2B00ED8ED8 /* RadarDemoViewController.swift */, 5B9A0C3F1C83AB3400ED8ED8 /* PieDemoViewController.swift */, + 9406FF9229C4B1C300AC466A /* Resources */, ); path = Demos; sourceTree = ""; @@ -123,6 +130,8 @@ 65B3F6401C73B4F5000983D0 /* ChartsDemo-macOS */ = { isa = PBXGroup; children = ( + 9406FF8B29C4AEE800AC466A /* Components */, + 9406FF8929C4AEC900AC466A /* XIBs */, 5B9A0C381C83AB0600ED8ED8 /* Demos */, 65B3F6411C73B4F5000983D0 /* AppDelegate.swift */, 65B3F6451C73B4F5000983D0 /* Assets.xcassets */, @@ -132,6 +141,31 @@ path = "ChartsDemo-macOS"; sourceTree = ""; }; + 9406FF8929C4AEC900AC466A /* XIBs */ = { + isa = PBXGroup; + children = ( + 9406FF9029C4AF5900AC466A /* RadarMarkerViewMac.xib */, + ); + path = XIBs; + sourceTree = ""; + }; + 9406FF8B29C4AEE800AC466A /* Components */ = { + isa = PBXGroup; + children = ( + 9406FF8C29C4AF1800AC466A /* RadarMarkerViewMac.swift */, + ); + path = Components; + sourceTree = ""; + }; + 9406FF9229C4B1C300AC466A /* Resources */ = { + isa = PBXGroup; + children = ( + 9406FF9329C4B1C300AC466A /* radar_marker@3x.png */, + ); + name = Resources; + path = "ChartsDemo-macOS/Resources"; + sourceTree = SOURCE_ROOT; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -217,8 +251,10 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 9406FF9429C4B1C300AC466A /* radar_marker@3x.png in Resources */, 65B3F6461C73B4F5000983D0 /* Assets.xcassets in Resources */, 65B3F6491C73B4F5000983D0 /* Main.storyboard in Resources */, + 9406FF9129C4AF5900AC466A /* RadarMarkerViewMac.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -232,6 +268,7 @@ 65B3F6421C73B4F5000983D0 /* AppDelegate.swift in Sources */, 5B9A0C3E1C83AB2B00ED8ED8 /* RadarDemoViewController.swift in Sources */, 5B9A0C3A1C83AB1800ED8ED8 /* BarDemoViewController.swift in Sources */, + 9406FF8D29C4AF1800AC466A /* RadarMarkerViewMac.swift in Sources */, 5B9A0C401C83AB3400ED8ED8 /* PieDemoViewController.swift in Sources */, 5B9A0C3C1C83AB2100ED8ED8 /* LineDemoViewController.swift in Sources */, ); diff --git a/ChartsDemo-macOS/ChartsDemo-macOS/Components/RadarMarkerViewMac.swift b/ChartsDemo-macOS/ChartsDemo-macOS/Components/RadarMarkerViewMac.swift new file mode 100644 index 0000000000..6d2fa7fa42 --- /dev/null +++ b/ChartsDemo-macOS/ChartsDemo-macOS/Components/RadarMarkerViewMac.swift @@ -0,0 +1,30 @@ +// +// RadarMarkerViewMac.swift +// ChartsDemo-OSX +// +// 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 +#if canImport(AppKit) + import AppKit +#endif + +public class RadarMarkerViewMac: MarkerView { + @IBOutlet var label: NSTextField! + + public override func awakeFromNib() { + self.offset.x = -self.frame.size.width / 2.0 + self.offset.y = -self.frame.size.height - 7.0 + } + + public override func refreshContent(entry: ChartDataEntry, highlight: Highlight) { + label.stringValue = String.init(format: "%.1f %%", (entry.y * 100)) + needsLayout = true + } +} diff --git a/ChartsDemo-macOS/ChartsDemo-macOS/Demos/RadarDemoViewController.swift b/ChartsDemo-macOS/ChartsDemo-macOS/Demos/RadarDemoViewController.swift index 3eecf73224..c9558bd486 100644 --- a/ChartsDemo-macOS/ChartsDemo-macOS/Demos/RadarDemoViewController.swift +++ b/ChartsDemo-macOS/ChartsDemo-macOS/Demos/RadarDemoViewController.swift @@ -38,6 +38,9 @@ open class RadarDemoViewController: NSViewController self.radarChartView.data = data self.radarChartView.chartDescription.text = "Radarchart Demo" + let marker = RadarMarkerViewMac.viewFromXib()! + marker.chartView = radarChartView + radarChartView.marker = marker } override open func viewWillAppear() diff --git a/ChartsDemo-macOS/ChartsDemo-macOS/Resources/radar_marker@3x.png b/ChartsDemo-macOS/ChartsDemo-macOS/Resources/radar_marker@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a84b93b5391a4d54c448ac12ab3998dac1206954 GIT binary patch literal 9753 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 literal 0 HcmV?d00001 diff --git a/ChartsDemo-macOS/ChartsDemo-macOS/XIBs/RadarMarkerViewMac.xib b/ChartsDemo-macOS/ChartsDemo-macOS/XIBs/RadarMarkerViewMac.xib new file mode 100644 index 0000000000..2d2964c418 --- /dev/null +++ b/ChartsDemo-macOS/ChartsDemo-macOS/XIBs/RadarMarkerViewMac.xib @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +