From 88f1811cc9b574f9d22ac259b1d9455f2ffa3674 Mon Sep 17 00:00:00 2001 From: Dennis Franke Date: Mon, 18 Dec 2017 17:58:05 +0100 Subject: [PATCH 01/15] Fixed using wrong axis (Issue #2257) --- Source/Charts/Renderers/XAxisRendererHorizontalBarChart.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Charts/Renderers/XAxisRendererHorizontalBarChart.swift b/Source/Charts/Renderers/XAxisRendererHorizontalBarChart.swift index 8faf863771..4f09402120 100644 --- a/Source/Charts/Renderers/XAxisRendererHorizontalBarChart.swift +++ b/Source/Charts/Renderers/XAxisRendererHorizontalBarChart.swift @@ -35,7 +35,7 @@ open class XAxisRendererHorizontalBarChart: XAxisRenderer { // calculate the starting and entry point of the y-labels (depending on // zoom / contentrect bounds) - if viewPortHandler.contentWidth > 10 && !viewPortHandler.isFullyZoomedOutX + if viewPortHandler.contentWidth > 10 && !viewPortHandler.isFullyZoomedOutY { let p1 = transformer.valueForTouchPoint(CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentBottom)) let p2 = transformer.valueForTouchPoint(CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentTop)) From 7238ba91fd3c50cd645cb116a8e19cdaa474b19a Mon Sep 17 00:00:00 2001 From: Xuan Date: Mon, 25 Dec 2017 09:10:23 +0800 Subject: [PATCH 02/15] fix #1830. credit from https://github.com/danielgindi/Charts/pull/2049 (#2874) * fix #1830. credit from https://github.com/danielgindi/Charts/pull/2049 * add combined chart unit tests for iOS, tvOS (macOS only have build process) * use iterater rather than index --- Charts.xcodeproj/project.pbxproj | 4 + .../Demos/CombinedChartViewController.m | 4 +- .../Standard/CombinedChartData.swift | 42 ++++--- Tests/Charts/CombinedChartTests.swift | 104 ++++++++++++++++++ ...RightAxisDependency_iOS_375.0_667.0@2x.png | Bin 0 -> 104196 bytes ...RightAxisDependency_tvOS_1920.0_1080.0.png | Bin 0 -> 40166 bytes ...faultAxisDependency_iOS_375.0_667.0@2x.png | Bin 0 -> 104196 bytes ...faultAxisDependency_tvOS_1920.0_1080.0.png | Bin 0 -> 40166 bytes ...RightAxisDependency_iOS_375.0_667.0@2x.png | Bin 0 -> 102654 bytes ...RightAxisDependency_tvOS_1920.0_1080.0.png | Bin 0 -> 40624 bytes 10 files changed, 134 insertions(+), 20 deletions(-) create mode 100644 Tests/Charts/CombinedChartTests.swift create mode 100644 Tests/ReferenceImages_64/ChartsTests.CombinedChartTests/testAllRightAxisDependency_iOS_375.0_667.0@2x.png create mode 100644 Tests/ReferenceImages_64/ChartsTests.CombinedChartTests/testAllRightAxisDependency_tvOS_1920.0_1080.0.png create mode 100644 Tests/ReferenceImages_64/ChartsTests.CombinedChartTests/testDefaultAxisDependency_iOS_375.0_667.0@2x.png create mode 100644 Tests/ReferenceImages_64/ChartsTests.CombinedChartTests/testDefaultAxisDependency_tvOS_1920.0_1080.0.png create mode 100644 Tests/ReferenceImages_64/ChartsTests.CombinedChartTests/testLeftRightAxisDependency_iOS_375.0_667.0@2x.png create mode 100644 Tests/ReferenceImages_64/ChartsTests.CombinedChartTests/testLeftRightAxisDependency_tvOS_1920.0_1080.0.png diff --git a/Charts.xcodeproj/project.pbxproj b/Charts.xcodeproj/project.pbxproj index 1a61360a76..f28679dde2 100644 --- a/Charts.xcodeproj/project.pbxproj +++ b/Charts.xcodeproj/project.pbxproj @@ -108,6 +108,7 @@ 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 */; }; + 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 */; }; @@ -266,6 +267,7 @@ 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 = ""; }; + 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 = ""; }; @@ -514,6 +516,7 @@ 5C3F5E1A69EC06E86505F7B1 /* BarChartTests.swift */, 224EFF981FBAAC4700CF9B3B /* EquatableTests.swift */, 7AB9062A28AAB9469752A954 /* ChartUtilsTests.swift */, + B6BF9A551F91993A00E62A5D /* CombinedChartTests.swift */, D2E1819D72CD7B6C4A4E8048 /* LineChartTests.swift */, 064989451F5C99C7006E8BB3 /* Snapshot.swift */, ); @@ -946,6 +949,7 @@ files = ( 3B11556EB7DC034E2FC958E4 /* BarChartTests.swift in Sources */, 8E1192F7A7152E9DA92C56A9 /* ChartUtilsTests.swift in Sources */, + B6BF9A561F91993A00E62A5D /* CombinedChartTests.swift in Sources */, 2BF85BEA981B359A65E9BF67 /* LineChartTests.swift in Sources */, 064989461F5C99C7006E8BB3 /* Snapshot.swift in Sources */, 224EFF991FBAAC4700CF9B3B /* EquatableTests.swift in Sources */, diff --git a/ChartsDemo/Objective-C/Demos/CombinedChartViewController.m b/ChartsDemo/Objective-C/Demos/CombinedChartViewController.m index fa65aec940..c0eb2fa2a4 100644 --- a/ChartsDemo/Objective-C/Demos/CombinedChartViewController.m +++ b/ChartsDemo/Objective-C/Demos/CombinedChartViewController.m @@ -206,7 +206,7 @@ - (BarChartData *)generateBarData [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 = AxisDependencyLeft; + set1.axisDependency = AxisDependencyRight; BarChartDataSet *set2 = [[BarChartDataSet alloc] initWithValues:entries2 label:@""]; set2.stackLabels = @[@"Stack 1", @"Stack 2"]; @@ -216,7 +216,7 @@ - (BarChartData *)generateBarData ]; 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 = AxisDependencyLeft; + set2.axisDependency = AxisDependencyRight; float groupSpace = 0.06f; float barSpace = 0.02f; // x2 dataset diff --git a/Source/Charts/Data/Implementations/Standard/CombinedChartData.swift b/Source/Charts/Data/Implementations/Standard/CombinedChartData.swift index 9e2342a200..8d269edf66 100644 --- a/Source/Charts/Data/Implementations/Standard/CombinedChartData.swift +++ b/Source/Charts/Data/Implementations/Standard/CombinedChartData.swift @@ -136,25 +136,31 @@ open class CombinedChartData: BarLineScatterCandleBubbleChartData { _xMin = data.xMin } - - if data.yMax > _leftAxisMax - { - _leftAxisMax = data.yMax - } - - if data.yMin < _leftAxisMin - { - _leftAxisMin = data.yMin - } - - if data.yMax > _rightAxisMax - { - _rightAxisMax = data.yMax - } - - if data.yMin < _rightAxisMin + + for dataset in sets { - _rightAxisMin = data.yMin + if dataset.axisDependency == .left + { + if dataset.yMax > _leftAxisMax + { + _leftAxisMax = dataset.yMax + } + if dataset.yMin < _leftAxisMin + { + _leftAxisMin = dataset.yMin + } + } + else + { + if dataset.yMax > _rightAxisMax + { + _rightAxisMax = dataset.yMax + } + if dataset.yMin < _rightAxisMin + { + _rightAxisMin = dataset.yMin + } + } } } } diff --git a/Tests/Charts/CombinedChartTests.swift b/Tests/Charts/CombinedChartTests.swift new file mode 100644 index 0000000000..269ced6880 --- /dev/null +++ b/Tests/Charts/CombinedChartTests.swift @@ -0,0 +1,104 @@ +// +// CombinedChartTests.swift +// ChartsTests +// +// Created by Xuan Liu on 14/10/2017. +// + +import XCTest +import FBSnapshotTestCase +@testable import Charts + +class CombinedChartTests: FBSnapshotTestCase +{ + var chart: CombinedChartView! + var lineDataSet: LineChartDataSet! + var barDataSet: BarChartDataSet! + + override func setUp() + { + super.setUp() + + // Set to `true` to re-capture all snapshots + self.recordMode = false + + // Sample data + let combinedData = CombinedChartData() + combinedData.barData = generateBarData() + combinedData.lineData = generateLineData() + chart = CombinedChartView(frame: CGRect(x: 0, y: 0, width: 480, height: 350)) + chart.backgroundColor = NSUIColor.clear + chart.leftAxis.axisMinimum = 0.0 + chart.rightAxis.axisMinimum = 0.0 + chart.data = combinedData + } + + func generateBarData() -> BarChartData + { + let values: [Double] = [8, 104, 81, 93, 52, 44, 97, 101, 75, 28, + 76, 25, 20, 13, 52, 44, 57, 23, 45, 91, + 99, 14, 84, 48, 40, 71, 106, 41, 45, 61] + + var entries: [ChartDataEntry] = Array() + + for (i, value) in values.enumerated() + { + entries.append(BarChartDataEntry(x: Double(i), y: value, icon: UIImage(named: "icon", in: Bundle(for: self.classForCoder), compatibleWith: nil))) + } + + barDataSet = BarChartDataSet(values: entries, label: "Bar chart unit test data") + barDataSet.drawIconsEnabled = false + + let data = BarChartData(dataSet: barDataSet) + data.barWidth = 0.85 + return data + } + + func generateLineData() -> LineChartData + { + let values: [Double] = [0, 254, 81, 93, 52, 44, 97, 101, 75, 28, + 76, 25, 20, 13, 52, 44, 57, 23, 45, 91, + 99, 14, 84, 48, 40, 71, 106, 41, 45, 61] + + var entries: [ChartDataEntry] = Array() + + for (i, value) in values.enumerated() + { + entries.append(ChartDataEntry(x: Double(i), y: value, icon: UIImage(named: "icon", in: Bundle(for: self.classForCoder), compatibleWith: nil))) + } + + lineDataSet = LineChartDataSet(values: entries, label: "Line chart unit test data") + lineDataSet.drawIconsEnabled = false + return LineChartData(dataSet: lineDataSet) + } + + override func tearDown() + { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testDefaultAxisDependency() + { + FBSnapshotVerifyView(chart, identifier: Snapshot.identifier(UIScreen.main.bounds.size), tolerance: Snapshot.tolerance) + } + + func testLeftRightAxisDependency() + { + lineDataSet.axisDependency = .left + barDataSet.axisDependency = .right + chart.data?.notifyDataChanged() + chart.notifyDataSetChanged() + FBSnapshotVerifyView(chart, identifier: Snapshot.identifier(UIScreen.main.bounds.size), tolerance: Snapshot.tolerance) + } + + func testAllRightAxisDependency() + { + lineDataSet.axisDependency = .right + barDataSet.axisDependency = .right + chart.data?.notifyDataChanged() + chart.notifyDataSetChanged() + FBSnapshotVerifyView(chart, identifier: Snapshot.identifier(UIScreen.main.bounds.size), tolerance: Snapshot.tolerance) + } +} + diff --git a/Tests/ReferenceImages_64/ChartsTests.CombinedChartTests/testAllRightAxisDependency_iOS_375.0_667.0@2x.png b/Tests/ReferenceImages_64/ChartsTests.CombinedChartTests/testAllRightAxisDependency_iOS_375.0_667.0@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4dfe1df093846433068f1f4d98b467c9fabe07a GIT binary patch literal 104196 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

KQ!M+F&he36Mje%{+mW0O$D( zj1oq;M6wb9EP@q-WnH^XwrmwZut)>xtkSrgXQCB#|#s_`)d0j!5T1g_sE7|-y-PEjbTyOs*@W&F~^hyr{@${coosKQ-b1@#P zJk=U$g}V^Ku+8N6RpyX;N^4$qtifhSW?Zb#GA|GNSnkfQ|*4-6*Wa{t2NPTuwc-c6B@>c%`p0+0<)^_nlnG z?dEHE%*6+_?jN4rO=oYu68aho^`$TZMlrwXULRQmCE@`;+h>tbendj@NnLkB`T)kJ z*Lg&P0-L->bbH<3aCxyFj4*$c-SOe(fpL}isn(5>X_L{T6WeRFL{fpe zd)}L>JcUB~U;fYTM-^;-_}`Lny9*+SPZ(SB&X=r(dDBmY>SP4yU|96` zyQ`1di^d$0JD+E7>AX~&Mmvi5b)>#-iCJAo(30#dFND07ebW&0H=MvwBF>XoKVP0v z);?*6fdCc-0zefA0LQK3CxL)GfG7su2vRd=YYp6EuN{5;L+2b!yVHY|bM9dD(T`uJ z(g!T*5%J-_cy{D=>Ow(^2jw#&*{wmWm8KNdiR=r0V8)4CZleG&M%?rG24Ktt`-hV+ zK+hBl4Ymd#fP4Q4x%ykAvv{v=kN?A74Uqf&evi6(xv!>chNGmE(}fRMcfIHsNosn` z2qa4%+3LtaKZ$-yIJX=@PC6DUKD_R5E|`qTtRPYEkpip=2BWM{r4 zJ2!|k9*>^O^O1^`LDt8M!t6RB)%CRzxOM!mOTr3>t@Fn5CDvQshMAc=*F{bH3UyHi z7T{xehZj)ac}bq#-K~egGs02Gg~nIiJo{K--9~#NSaNy`IFq!udJj~3(ZLGyIj_1` zNQD6s9^JhA{g~Hr;$FWZeAhg>mz5TqyJN+@cB8!}JiBN2V~PmiSn-|DDr!1jz@_+< zN{uwx-J4&k214SiRCmQyS2s^^%m zCI-Jp27I$;4w&n>J$7}e46~OFtmpWX3_r%+GsiDrWoZ@aqi;hM>Gm+$2w)4mJXAl;b%8i&BBC~d@!<3 z#cu!H{hQ+D*=#3zRE^=+jN=K}?}mz(=VZg1DN!k_jk7zi6?a#h2zRoYF9)7Fct|00haR~b-X)ywG!S5UTh-EY%iWw@>hnbqnL+{S0F_1T7Ihh%K+fN? z+0OB=rJDjfYA{T}zJGCm2i1s^3kv*s=&4Le48Qtl*&;}60Tb=J4x*P`2>LTBQ!XZ^ zkERXO>xMa@IfxDvm~P6$+Mcu3T0EAcC7YX%m}{EXQx^-038DStQ1&K2u;HXyU$HvX zJXu6WR4mD<)6Ej7;B@6%HW)UoI2t9;GNaOH$$u_JfLt@W^@M#30FM@E!U#+<`0MeUXU6HrM6$nUU)ZkNcGnyxMimu z{&eq05{kc*DD3^6QR&xz|JP~CSEFp~)WwhG!6v4$r~kG8z-g$^MLn4hkGkS2S9?_`gQc4$cz)z7-HQCrt%y

i8WFhr@xn(Zhl93lhq)NF8qNP=;eR^k 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

cV4A7`mRc=RdN6_T-94}AaxkXED=3X! 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

KQ!M+F&he36Mje%{+mW0O$D( zj1oq;M6wb9EP@q-WnH^XwrmwZut)>xtkSrgXQCB#|#s_`)d0j!5T1g_sE7|-y-PEjbTyOs*@W&F~^hyr{@${coosKQ-b1@#P zJk=U$g}V^Ku+8N6RpyX;N^4$qtifhSW?Zb#GA|GNSnkfQ|*4-6*Wa{t2NPTuwc-c6B@>c%`p0+0<)^_nlnG z?dEHE%*6+_?jN4rO=oYu68aho^`$TZMlrwXULRQmCE@`;+h>tbendj@NnLkB`T)kJ z*Lg&P0-L->bbH<3aCxyFj4*$c-SOe(fpL}isn(5>X_L{T6WeRFL{fpe zd)}L>JcUB~U;fYTM-^;-_}`Lny9*+SPZ(SB&X=r(dDBmY>SP4yU|96` zyQ`1di^d$0JD+E7>AX~&Mmvi5b)>#-iCJAo(30#dFND07ebW&0H=MvwBF>XoKVP0v z);?*6fdCc-0zefA0LQK3CxL)GfG7su2vRd=YYp6EuN{5;L+2b!yVHY|bM9dD(T`uJ z(g!T*5%J-_cy{D=>Ow(^2jw#&*{wmWm8KNdiR=r0V8)4CZleG&M%?rG24Ktt`-hV+ zK+hBl4Ymd#fP4Q4x%ykAvv{v=kN?A74Uqf&evi6(xv!>chNGmE(}fRMcfIHsNosn` z2qa4%+3LtaKZ$-yIJX=@PC6DUKD_R5E|`qTtRPYEkpip=2BWM{r4 zJ2!|k9*>^O^O1^`LDt8M!t6RB)%CRzxOM!mOTr3>t@Fn5CDvQshMAc=*F{bH3UyHi z7T{xehZj)ac}bq#-K~egGs02Gg~nIiJo{K--9~#NSaNy`IFq!udJj~3(ZLGyIj_1` zNQD6s9^JhA{g~Hr;$FWZeAhg>mz5TqyJN+@cB8!}JiBN2V~PmiSn-|DDr!1jz@_+< zN{uwx-J4&k214SiRCmQyS2s^^%m zCI-Jp27I$;4w&n>J$7}e46~OFtmpWX3_r%+GsiDrWoZ@aqi;hM>Gm+$2w)4mJXAl;b%8i&BBC~d@!<3 z#cu!H{hQ+D*=#3zRE^=+jN=K}?}mz(=VZg1DN!k_jk7zi6?a#h2zRoYF9)7Fct|00haR~b-X)ywG!S5UTh-EY%iWw@>hnbqnL+{S0F_1T7Ihh%K+fN? z+0OB=rJDjfYA{T}zJGCm2i1s^3kv*s=&4Le48Qtl*&;}60Tb=J4x*P`2>LTBQ!XZ^ zkERXO>xMa@IfxDvm~P6$+Mcu3T0EAcC7YX%m}{EXQx^-038DStQ1&K2u;HXyU$HvX zJXu6WR4mD<)6Ej7;B@6%HW)UoI2t9;GNaOH$$u_JfLt@W^@M#30FM@E!U#+<`0MeUXU6HrM6$nUU)ZkNcGnyxMimu z{&eq05{kc*DD3^6QR&xz|JP~CSEFp~)WwhG!6v4$r~kG8z-g$^MLn4hkGkS2S9?_`gQc4$cz)z7-HQCrt%y

i8WFhr@xn(Zhl93lhq)NF8qNP=;eR^k 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

cV4A7`mRc=RdN6_T-94}AaxkXED=3X! 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৸SG97D_^jRdnxkv5Isc5;BS7y8lx(xf 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ⅈ3iX)yaQgFcMS3wlsQAOyxB60^qr#m+9o9M4^J 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

^UDzP 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 JA^#yN;6IMCUuOUS literal 0 HcmV?d00001 From c8ae3ea2f5c844a6778efed685768105a6d06b39 Mon Sep 17 00:00:00 2001 From: jjatie Date: Mon, 25 Dec 2017 10:39:00 -0400 Subject: [PATCH 03/15] Removed redundant ivars in BarLineChartViewBase (#3043) * Removed redundant ivars in favour of proper access control * Moved initialization of axes to their declaration to keep the same optionality exposed. --- Source/Charts/Charts/BarChartView.swift | 4 +- .../Charts/Charts/BarLineChartViewBase.swift | 171 +++++++----------- .../Charts/HorizontalBarChartView.swift | 18 +- 3 files changed, 78 insertions(+), 115 deletions(-) diff --git a/Source/Charts/Charts/BarChartView.swift b/Source/Charts/Charts/BarChartView.swift index 16d7ed1674..ec4c019f1f 100644 --- a/Source/Charts/Charts/BarChartView.swift +++ b/Source/Charts/Charts/BarChartView.swift @@ -50,10 +50,10 @@ open class BarChartView: BarLineChartViewBase, BarChartDataProvider } // calculate axis range (min / max) according to provided data - _leftAxis.calculate( + leftAxis.calculate( min: data.getYMin(axis: .left), max: data.getYMax(axis: .left)) - _rightAxis.calculate( + rightAxis.calculate( min: data.getYMin(axis: .right), max: data.getYMax(axis: .right)) } diff --git a/Source/Charts/Charts/BarLineChartViewBase.swift b/Source/Charts/Charts/BarLineChartViewBase.swift index 5c11209d50..7d4f5a49c3 100644 --- a/Source/Charts/Charts/BarLineChartViewBase.swift +++ b/Source/Charts/Charts/BarLineChartViewBase.swift @@ -57,19 +57,28 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// **default**: false @objc open var keepPositionOnRotation: Bool = false - /// the object representing the left y-axis - internal var _leftAxis: YAxis! + /// The left y-axis object. In the horizontal bar-chart, this is the + /// top axis. + @objc open internal(set) var leftAxis = YAxis(position: .left) - /// the object representing the right y-axis - internal var _rightAxis: YAxis! + /// The right y-axis object. In the horizontal bar-chart, this is the + /// bottom axis. + @objc open internal(set) var rightAxis = YAxis(position: .right) + + /// The left Y axis renderer. This is a read-write property so you can set your own custom renderer here. + /// **default**: An instance of YAxisRenderer + @objc open lazy var leftYAxisRenderer = YAxisRenderer(viewPortHandler: _viewPortHandler, yAxis: leftAxis, transformer: _leftAxisTransformer) - internal var _leftYAxisRenderer: YAxisRenderer! - internal var _rightYAxisRenderer: YAxisRenderer! + /// The right Y axis renderer. This is a read-write property so you can set your own custom renderer here. + /// **default**: An instance of YAxisRenderer + @objc open lazy var rightYAxisRenderer = YAxisRenderer(viewPortHandler: _viewPortHandler, yAxis: rightAxis, transformer: _rightAxisTransformer) internal var _leftAxisTransformer: Transformer! internal var _rightAxisTransformer: Transformer! - internal var _xAxisRenderer: XAxisRenderer! + /// The X axis renderer. This is a read-write property so you can set your own custom renderer here. + /// **default**: An instance of XAxisRenderer + @objc open lazy var xAxisRenderer = XAxisRenderer(viewPortHandler: _viewPortHandler, xAxis: _xAxis, transformer: _leftAxisTransformer) internal var _tapGestureRecognizer: NSUITapGestureRecognizer! internal var _doubleTapGestureRecognizer: NSUITapGestureRecognizer! @@ -99,18 +108,10 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD internal override func initialize() { super.initialize() - - _leftAxis = YAxis(position: .left) - _rightAxis = YAxis(position: .right) - + _leftAxisTransformer = Transformer(viewPortHandler: _viewPortHandler) _rightAxisTransformer = Transformer(viewPortHandler: _viewPortHandler) - _leftYAxisRenderer = YAxisRenderer(viewPortHandler: _viewPortHandler, yAxis: _leftAxis, transformer: _leftAxisTransformer) - _rightYAxisRenderer = YAxisRenderer(viewPortHandler: _viewPortHandler, yAxis: _rightAxis, transformer: _rightAxisTransformer) - - _xAxisRenderer = XAxisRenderer(viewPortHandler: _viewPortHandler, xAxis: _xAxis, transformer: _leftAxisTransformer) - self.highlighter = ChartHighlighter(chart: self) _tapGestureRecognizer = NSUITapGestureRecognizer(target: self, action: #selector(tapGestureRecognized(_:))) @@ -178,43 +179,43 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD autoScale() } - if _leftAxis.isEnabled + if leftAxis.isEnabled { - _leftYAxisRenderer?.computeAxis(min: _leftAxis._axisMinimum, max: _leftAxis._axisMaximum, inverted: _leftAxis.isInverted) + leftYAxisRenderer.computeAxis(min: leftAxis._axisMinimum, max: leftAxis._axisMaximum, inverted: leftAxis.isInverted) } - if _rightAxis.isEnabled + if rightAxis.isEnabled { - _rightYAxisRenderer?.computeAxis(min: _rightAxis._axisMinimum, max: _rightAxis._axisMaximum, inverted: _rightAxis.isInverted) + rightYAxisRenderer.computeAxis(min: rightAxis._axisMinimum, max: rightAxis._axisMaximum, inverted: rightAxis.isInverted) } if _xAxis.isEnabled { - _xAxisRenderer?.computeAxis(min: _xAxis._axisMinimum, max: _xAxis._axisMaximum, inverted: false) + xAxisRenderer.computeAxis(min: _xAxis._axisMinimum, max: _xAxis._axisMaximum, inverted: false) } - _xAxisRenderer?.renderAxisLine(context: context) - _leftYAxisRenderer?.renderAxisLine(context: context) - _rightYAxisRenderer?.renderAxisLine(context: context) + xAxisRenderer.renderAxisLine(context: context) + leftYAxisRenderer.renderAxisLine(context: context) + rightYAxisRenderer.renderAxisLine(context: context) // The renderers are responsible for clipping, to account for line-width center etc. - _xAxisRenderer?.renderGridLines(context: context) - _leftYAxisRenderer?.renderGridLines(context: context) - _rightYAxisRenderer?.renderGridLines(context: context) + xAxisRenderer.renderGridLines(context: context) + leftYAxisRenderer.renderGridLines(context: context) + rightYAxisRenderer.renderGridLines(context: context) if _xAxis.isEnabled && _xAxis.isDrawLimitLinesBehindDataEnabled { - _xAxisRenderer?.renderLimitLines(context: context) + xAxisRenderer.renderLimitLines(context: context) } - if _leftAxis.isEnabled && _leftAxis.isDrawLimitLinesBehindDataEnabled + if leftAxis.isEnabled && leftAxis.isDrawLimitLinesBehindDataEnabled { - _leftYAxisRenderer?.renderLimitLines(context: context) + leftYAxisRenderer.renderLimitLines(context: context) } - if _rightAxis.isEnabled && _rightAxis.isDrawLimitLinesBehindDataEnabled + if rightAxis.isEnabled && rightAxis.isDrawLimitLinesBehindDataEnabled { - _rightYAxisRenderer?.renderLimitLines(context: context) + rightYAxisRenderer.renderLimitLines(context: context) } // make sure the data cannot be drawn outside the content-rect @@ -234,22 +235,22 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD if _xAxis.isEnabled && !_xAxis.isDrawLimitLinesBehindDataEnabled { - _xAxisRenderer?.renderLimitLines(context: context) + xAxisRenderer.renderLimitLines(context: context) } - if _leftAxis.isEnabled && !_leftAxis.isDrawLimitLinesBehindDataEnabled + if leftAxis.isEnabled && !leftAxis.isDrawLimitLinesBehindDataEnabled { - _leftYAxisRenderer?.renderLimitLines(context: context) + leftYAxisRenderer.renderLimitLines(context: context) } - if _rightAxis.isEnabled && !_rightAxis.isDrawLimitLinesBehindDataEnabled + if rightAxis.isEnabled && !rightAxis.isDrawLimitLinesBehindDataEnabled { - _rightYAxisRenderer?.renderLimitLines(context: context) + rightYAxisRenderer.renderLimitLines(context: context) } - _xAxisRenderer.renderAxisLabels(context: context) - _leftYAxisRenderer.renderAxisLabels(context: context) - _rightYAxisRenderer.renderAxisLabels(context: context) + xAxisRenderer.renderAxisLabels(context: context) + leftYAxisRenderer.renderAxisLabels(context: context) + rightYAxisRenderer.renderAxisLabels(context: context) if clipValuesToContentEnabled { @@ -287,14 +288,14 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD // calculate axis range (min / max) according to provided data - if _leftAxis.isEnabled + if leftAxis.isEnabled { - _leftAxis.calculate(min: data.getYMin(axis: .left), max: data.getYMax(axis: .left)) + leftAxis.calculate(min: data.getYMin(axis: .left), max: data.getYMax(axis: .left)) } - if _rightAxis.isEnabled + if rightAxis.isEnabled { - _rightAxis.calculate(min: data.getYMin(axis: .right), max: data.getYMax(axis: .right)) + rightAxis.calculate(min: data.getYMin(axis: .right), max: data.getYMax(axis: .right)) } calculateOffsets() @@ -302,14 +303,14 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD internal func prepareValuePxMatrix() { - _rightAxisTransformer.prepareMatrixValuePx(chartXMin: _xAxis._axisMinimum, deltaX: CGFloat(xAxis.axisRange), deltaY: CGFloat(_rightAxis.axisRange), chartYMin: _rightAxis._axisMinimum) - _leftAxisTransformer.prepareMatrixValuePx(chartXMin: xAxis._axisMinimum, deltaX: CGFloat(xAxis.axisRange), deltaY: CGFloat(_leftAxis.axisRange), chartYMin: _leftAxis._axisMinimum) + _rightAxisTransformer.prepareMatrixValuePx(chartXMin: _xAxis._axisMinimum, deltaX: CGFloat(xAxis.axisRange), deltaY: CGFloat(rightAxis.axisRange), chartYMin: rightAxis._axisMinimum) + _leftAxisTransformer.prepareMatrixValuePx(chartXMin: xAxis._axisMinimum, deltaX: CGFloat(xAxis.axisRange), deltaY: CGFloat(leftAxis.axisRange), chartYMin: leftAxis._axisMinimum) } internal func prepareOffsetMatrix() { - _rightAxisTransformer.prepareMatrixOffset(inverted: _rightAxis.isInverted) - _leftAxisTransformer.prepareMatrixOffset(inverted: _leftAxis.isInverted) + _rightAxisTransformer.prepareMatrixOffset(inverted: rightAxis.isInverted) + _leftAxisTransformer.prepareMatrixOffset(inverted: leftAxis.isInverted) } open override func notifyDataSetChanged() @@ -318,12 +319,12 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD calcMinMax() - _leftYAxisRenderer?.computeAxis(min: _leftAxis._axisMinimum, max: _leftAxis._axisMaximum, inverted: _leftAxis.isInverted) - _rightYAxisRenderer?.computeAxis(min: _rightAxis._axisMinimum, max: _rightAxis._axisMaximum, inverted: _rightAxis.isInverted) + leftYAxisRenderer.computeAxis(min: leftAxis._axisMinimum, max: leftAxis._axisMaximum, inverted: leftAxis.isInverted) + rightYAxisRenderer.computeAxis(min: rightAxis._axisMinimum, max: rightAxis._axisMaximum, inverted: rightAxis.isInverted) if let data = _data { - _xAxisRenderer?.computeAxis( + xAxisRenderer.computeAxis( min: _xAxis._axisMinimum, max: _xAxis._axisMaximum, inverted: false) @@ -345,8 +346,8 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD _xAxis.calculate(min: _data?.xMin ?? 0.0, max: _data?.xMax ?? 0.0) // calculate axis range (min / max) according to provided data - _leftAxis.calculate(min: _data?.getYMin(axis: .left) ?? 0.0, max: _data?.getYMax(axis: .left) ?? 0.0) - _rightAxis.calculate(min: _data?.getYMin(axis: .right) ?? 0.0, max: _data?.getYMax(axis: .right) ?? 0.0) + leftAxis.calculate(min: _data?.getYMin(axis: .left) ?? 0.0, max: _data?.getYMax(axis: .left) ?? 0.0) + rightAxis.calculate(min: _data?.getYMin(axis: .right) ?? 0.0, max: _data?.getYMax(axis: .right) ?? 0.0) } internal func calculateLegendOffsets(offsetLeft: inout CGFloat, offsetTop: inout CGFloat, offsetRight: inout CGFloat, offsetBottom: inout CGFloat) @@ -1716,28 +1717,17 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// if the chart is fully zoomed out, return true @objc open var isFullyZoomedOut: Bool { return _viewPortHandler.isFullyZoomedOut } - /// - returns: The left y-axis object. In the horizontal bar-chart, this is the - /// top axis. - @objc open var leftAxis: YAxis - { - return _leftAxis - } - - /// - returns: The right y-axis object. In the horizontal bar-chart, this is the - /// bottom axis. - @objc open var rightAxis: YAxis { return _rightAxis } - /// - returns: The y-axis object to the corresponding AxisDependency. In the /// horizontal bar-chart, LEFT == top, RIGHT == BOTTOM @objc open func getAxis(_ axis: YAxis.AxisDependency) -> YAxis { if axis == .left { - return _leftAxis + return leftAxis } else { - return _rightAxis + return rightAxis } } @@ -1781,33 +1771,6 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// - returns: `true` if both drag offsets (x and y) are zero or smaller. @objc open var hasNoDragOffset: Bool { return _viewPortHandler.hasNoDragOffset } - /// The X axis renderer. This is a read-write property so you can set your own custom renderer here. - /// **default**: An instance of XAxisRenderer - /// - returns: The current set X axis renderer - @objc open var xAxisRenderer: XAxisRenderer - { - get { return _xAxisRenderer } - set { _xAxisRenderer = newValue } - } - - /// The left Y axis renderer. This is a read-write property so you can set your own custom renderer here. - /// **default**: An instance of YAxisRenderer - /// - returns: The current set left Y axis renderer - @objc open var leftYAxisRenderer: YAxisRenderer - { - get { return _leftYAxisRenderer } - set { _leftYAxisRenderer = newValue } - } - - /// The right Y axis renderer. This is a read-write property so you can set your own custom renderer here. - /// **default**: An instance of YAxisRenderer - /// - returns: The current set right Y axis renderer - @objc open var rightYAxisRenderer: YAxisRenderer - { - get { return _rightYAxisRenderer } - set { _rightYAxisRenderer = newValue } - } - open override var chartYMax: Double { return max(leftAxis._axisMaximum, rightAxis._axisMaximum) @@ -1821,7 +1784,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// - returns: `true` if either the left or the right or both axes are inverted. @objc open var isAnyAxisInverted: Bool { - return _leftAxis.isInverted || _rightAxis.isInverted + return leftAxis.isInverted || rightAxis.isInverted } /// flag that indicates if auto scaling on the y axis is enabled. @@ -1841,11 +1804,11 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD { if axis == .left { - _leftAxis.minWidth = width + leftAxis.minWidth = width } else { - _rightAxis.minWidth = width + rightAxis.minWidth = width } } @@ -1855,11 +1818,11 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD { if axis == .left { - return _leftAxis.minWidth + return leftAxis.minWidth } else { - return _rightAxis.minWidth + return rightAxis.minWidth } } /// Sets a maximum width to the specified y axis. @@ -1868,11 +1831,11 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD { if axis == .left { - _leftAxis.maxWidth = width + leftAxis.maxWidth = width } else { - _rightAxis.maxWidth = width + rightAxis.maxWidth = width } } @@ -1884,11 +1847,11 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD { if axis == .left { - return _leftAxis.maxWidth + return leftAxis.maxWidth } else { - return _rightAxis.maxWidth + return rightAxis.maxWidth } } @@ -1897,11 +1860,11 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD { if axis == .left { - return _leftAxis.requiredSize().width + return leftAxis.requiredSize().width } else { - return _rightAxis.requiredSize().width + return rightAxis.requiredSize().width } } diff --git a/Source/Charts/Charts/HorizontalBarChartView.swift b/Source/Charts/Charts/HorizontalBarChartView.swift index 06863ee619..13131942b7 100644 --- a/Source/Charts/Charts/HorizontalBarChartView.swift +++ b/Source/Charts/Charts/HorizontalBarChartView.swift @@ -27,9 +27,9 @@ open class HorizontalBarChartView: BarChartView _rightAxisTransformer = TransformerHorizontalBarChart(viewPortHandler: _viewPortHandler) renderer = HorizontalBarChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: _viewPortHandler) - _leftYAxisRenderer = YAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, yAxis: _leftAxis, transformer: _leftAxisTransformer) - _rightYAxisRenderer = YAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, yAxis: _rightAxis, transformer: _rightAxisTransformer) - _xAxisRenderer = XAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, xAxis: _xAxis, transformer: _leftAxisTransformer, chart: self) + leftYAxisRenderer = YAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, yAxis: leftAxis, transformer: _leftAxisTransformer) + rightYAxisRenderer = YAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, yAxis: rightAxis, transformer: _rightAxisTransformer) + xAxisRenderer = XAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, xAxis: _xAxis, transformer: _leftAxisTransformer, chart: self) self.highlighter = HorizontalBarHighlighter(chart: self) } @@ -47,14 +47,14 @@ open class HorizontalBarChartView: BarChartView offsetBottom: &offsetBottom) // offsets for y-labels - if _leftAxis.needsOffset + if leftAxis.needsOffset { - offsetTop += _leftAxis.getRequiredHeightSpace() + offsetTop += leftAxis.getRequiredHeightSpace() } - if _rightAxis.needsOffset + if rightAxis.needsOffset { - offsetBottom += _rightAxis.getRequiredHeightSpace() + offsetBottom += rightAxis.getRequiredHeightSpace() } let xlabelwidth = _xAxis.labelRotatedWidth @@ -94,8 +94,8 @@ open class HorizontalBarChartView: BarChartView internal override func prepareValuePxMatrix() { - _rightAxisTransformer.prepareMatrixValuePx(chartXMin: _rightAxis._axisMinimum, deltaX: CGFloat(_rightAxis.axisRange), deltaY: CGFloat(_xAxis.axisRange), chartYMin: _xAxis._axisMinimum) - _leftAxisTransformer.prepareMatrixValuePx(chartXMin: _leftAxis._axisMinimum, deltaX: CGFloat(_leftAxis.axisRange), deltaY: CGFloat(_xAxis.axisRange), chartYMin: _xAxis._axisMinimum) + _rightAxisTransformer.prepareMatrixValuePx(chartXMin: rightAxis._axisMinimum, deltaX: CGFloat(rightAxis.axisRange), deltaY: CGFloat(_xAxis.axisRange), chartYMin: _xAxis._axisMinimum) + _leftAxisTransformer.prepareMatrixValuePx(chartXMin: leftAxis._axisMinimum, deltaX: CGFloat(leftAxis.axisRange), deltaY: CGFloat(_xAxis.axisRange), chartYMin: _xAxis._axisMinimum) } open override func getMarkerPosition(highlight: Highlight) -> CGPoint From bbeb88df6928c4361e9e2c382230b9ae6b42e991 Mon Sep 17 00:00:00 2001 From: jjatie Date: Mon, 25 Dec 2017 11:11:28 -0400 Subject: [PATCH 04/15] Update 4.0.0 with master (#3135) From 1658a639165536519181424bae15bfaf0b5bd50b Mon Sep 17 00:00:00 2001 From: jjatie Date: Wed, 27 Dec 2017 21:29:57 -0400 Subject: [PATCH 05/15] Replaced relevant `ChartUtils` methods with `Double` extensions (#2994) * Replaced relevant `ChartUtils` methods with `Double` extensions Improves readability. `nextUp` is built in and provides the same functionality. * Updated `ChartUtilsTests` to match changes --- Source/Charts/Charts/ChartViewBase.swift | 2 +- .../Charts/Renderers/AxisRendererBase.swift | 6 +- .../Renderers/YAxisRendererRadarChart.swift | 6 +- Source/Charts/Utils/ChartUtils.swift | 73 ++++++++----------- Tests/Charts/ChartUtilsTests.swift | 12 +-- 5 files changed, 45 insertions(+), 54 deletions(-) diff --git a/Source/Charts/Charts/ChartViewBase.swift b/Source/Charts/Charts/ChartViewBase.swift index 8763174608..61b4491f30 100644 --- a/Source/Charts/Charts/ChartViewBase.swift +++ b/Source/Charts/Charts/ChartViewBase.swift @@ -290,7 +290,7 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate if _defaultValueFormatter is DefaultValueFormatter { // setup the formatter with a new number of digits - let digits = ChartUtils.decimals(reference) + let digits = reference.decimalPlaces (_defaultValueFormatter as? DefaultValueFormatter)?.decimals = digits diff --git a/Source/Charts/Renderers/AxisRendererBase.swift b/Source/Charts/Renderers/AxisRendererBase.swift index bd1c6aa466..19ebf9527e 100644 --- a/Source/Charts/Renderers/AxisRendererBase.swift +++ b/Source/Charts/Renderers/AxisRendererBase.swift @@ -104,7 +104,7 @@ open class AxisRendererBase: Renderer // Find out how much spacing (in y value space) between axis values let rawInterval = range / Double(labelCount) - var interval = ChartUtils.roundToNextSignificant(number: Double(rawInterval)) + var interval = rawInterval.roundedToNextSignficant() // If granularity is enabled, then do not allow the interval to go below specified granularity. // This is used to avoid repeated values when rounding values for display. @@ -114,7 +114,7 @@ open class AxisRendererBase: Renderer } // Normalize interval - let intervalMagnitude = ChartUtils.roundToNextSignificant(number: pow(10.0, Double(Int(log10(interval))))) + let intervalMagnitude = pow(10.0, Double(Int(log10(interval)))).roundedToNextSignficant() let intervalSigDigit = Int(interval / intervalMagnitude) if intervalSigDigit > 5 { @@ -154,7 +154,7 @@ open class AxisRendererBase: Renderer first -= interval } - let last = interval == 0.0 ? 0.0 : ChartUtils.nextUp(floor(yMax / interval) * interval) + let last = interval == 0.0 ? 0.0 : (floor(yMax / interval) * interval).nextUp if interval != 0.0 && last != first { diff --git a/Source/Charts/Renderers/YAxisRendererRadarChart.swift b/Source/Charts/Renderers/YAxisRendererRadarChart.swift index b23b987556..a1afd0135d 100644 --- a/Source/Charts/Renderers/YAxisRendererRadarChart.swift +++ b/Source/Charts/Renderers/YAxisRendererRadarChart.swift @@ -45,7 +45,7 @@ open class YAxisRendererRadarChart: YAxisRenderer // Find out how much spacing (in yValue space) between axis values let rawInterval = range / Double(labelCount) - var interval = ChartUtils.roundToNextSignificant(number: Double(rawInterval)) + var interval = rawInterval.roundedToNextSignficant() // If granularity is enabled, then do not allow the interval to go below specified granularity. // This is used to avoid repeated values when rounding values for display. @@ -55,7 +55,7 @@ open class YAxisRendererRadarChart: YAxisRenderer } // Normalize interval - let intervalMagnitude = ChartUtils.roundToNextSignificant(number: pow(10.0, floor(log10(interval)))) + let intervalMagnitude = pow(10.0, floor(log10(interval))).roundedToNextSignficant() let intervalSigDigit = Int(interval / intervalMagnitude) if intervalSigDigit > 5 @@ -98,7 +98,7 @@ open class YAxisRendererRadarChart: YAxisRenderer first -= interval } - let last = interval == 0.0 ? 0.0 : ChartUtils.nextUp(floor(yMax / interval) * interval) + let last = interval == 0.0 ? 0.0 : (floor(yMax / interval) * interval).nextUp if interval != 0.0 { diff --git a/Source/Charts/Utils/ChartUtils.swift b/Source/Charts/Utils/ChartUtils.swift index 8b0cec179c..38603a5c60 100644 --- a/Source/Charts/Utils/ChartUtils.swift +++ b/Source/Charts/Utils/ChartUtils.swift @@ -47,53 +47,44 @@ extension CGSize { } } -open class ChartUtils -{ - private static var _defaultValueFormatter: IValueFormatter = ChartUtils.generateDefaultValueFormatter() +extension Double { + /// Rounds the number to the nearest multiple of it's order of magnitude, rounding away from zero if halfway. + func roundedToNextSignficant() -> Double { + guard + !isInfinite, + !isNaN, + self != 0 + else { return self } - internal class func roundToNextSignificant(number: Double) -> Double - { - if number.isInfinite || number.isNaN || number == 0 - { - return number - } - - let d = ceil(log10(number < 0.0 ? -number : number)) + let d = ceil(log10(self < 0 ? -self : self)) let pw = 1 - Int(d) - let magnitude = pow(Double(10.0), Double(pw)) - let shifted = round(number * magnitude) + let magnitude = pow(10.0, Double(pw)) + let shifted = (self * magnitude).rounded() return shifted / magnitude } - - internal class func decimals(_ number: Double) -> Int - { - if number.isNaN || number.isInfinite || number == 0.0 - { - return 0 - } - - let i = roundToNextSignificant(number: Double(number)) - - if i.isInfinite || i.isNaN - { - return 0 - } - + + var decimalPlaces: Int { + guard + !isNaN, + !isInfinite, + self != 0.0 + else { return 0 } + + let i = self.roundedToNextSignficant() + + guard + !i.isInfinite, + !i.isNaN + else { return 0 } + return Int(ceil(-log10(i))) + 2 } - - internal class func nextUp(_ number: Double) -> Double - { - if number.isInfinite || number.isNaN - { - return number - } - else - { - return number + Double.ulpOfOne - } - } - +} + +open class ChartUtils +{ + private static var _defaultValueFormatter: IValueFormatter = ChartUtils.generateDefaultValueFormatter() + /// Calculates the position around a center point, depending on the distance from the center, and the angle of the position around the center. internal class func getPosition(center: CGPoint, dist: CGFloat, angle: CGFloat) -> CGPoint { diff --git a/Tests/Charts/ChartUtilsTests.swift b/Tests/Charts/ChartUtilsTests.swift index d464a25220..9e5da3a07b 100644 --- a/Tests/Charts/ChartUtilsTests.swift +++ b/Tests/Charts/ChartUtilsTests.swift @@ -17,7 +17,7 @@ class ChartUtilsTests: XCTestCase { let number = Double.nan - let actual = ChartUtils.decimals(number) + let actual = number.decimalPlaces let expected = 0 XCTAssertEqual(expected, actual) @@ -27,7 +27,7 @@ class ChartUtilsTests: XCTestCase { let number = Double.infinity - let actual = ChartUtils.decimals(number) + let actual = number.decimalPlaces let expected = 0 XCTAssertEqual(expected, actual) @@ -37,7 +37,7 @@ class ChartUtilsTests: XCTestCase { let number = 0.0 - let actual = ChartUtils.decimals(number) + let actual = number.decimalPlaces let expected = 0 XCTAssertEqual(expected, actual) @@ -47,7 +47,7 @@ class ChartUtilsTests: XCTestCase { let number = Double.greatestFiniteMagnitude - let actual = ChartUtils.decimals(number) + let actual = number.decimalPlaces let expected = 0 XCTAssertEqual(expected, actual) @@ -57,7 +57,7 @@ class ChartUtilsTests: XCTestCase { let number = Double.leastNormalMagnitude - let actual = ChartUtils.decimals(number) + let actual = number.decimalPlaces let expected = 310 // Don't think this is supposed to be this value maybe 0? XCTAssertEqual(expected, actual) @@ -67,7 +67,7 @@ class ChartUtilsTests: XCTestCase { let number = 13.123123 - let actual = ChartUtils.decimals(number) + let actual = number.decimalPlaces let expected = 1 // Don't think this is supposed to be this value maybe 6? XCTAssertEqual(expected, actual) From 48ac6a627a5babeaf3d5eecc8c18cf9a35fdd19a Mon Sep 17 00:00:00 2001 From: Xuan Date: Thu, 28 Dec 2017 10:32:40 +0800 Subject: [PATCH 06/15] add option to build demo projects unit tests on iOS (#3121) * add option to build demo projects unit tests on iOS * add ChartsDemo-OSX build test. --- Rakefile | 64 +++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 49 insertions(+), 15 deletions(-) diff --git a/Rakefile b/Rakefile index 3b9aa0f515..516b385a96 100644 --- a/Rakefile +++ b/Rakefile @@ -3,7 +3,11 @@ def type end def project_name - 'Charts.xcodeproj' + 'ChartsDemo/ChartsDemo.xcodeproj' +end + +def macos_project_name + 'ChartsDemo-OSX/ChartsDemo-OSX.xcodeproj' end def configuration @@ -29,6 +33,19 @@ def build_schemes ] end +def build_demo_schemes + %i[ + ChartsDemo + ChartsDemo-Swift + ] +end + +def build_macos_demo_schemes + [ + 'ChartsDemo-OSX' + ] +end + def test_schemes [ 'ChartsTests' @@ -74,33 +91,43 @@ def xcodebuild(type, name, scheme, configuration, sdk, destination, tasks, xcpre sh "set -o pipefail && xcodebuild #{project_type} '#{name}' -scheme '#{scheme}' -configuration '#{configuration}' -sdk #{sdk} -destination #{destination} #{tasks} | bundle exec xcpretty -c #{xcprety_args}" end -def run_xcodebuild(schemes_to_execute, tasks, destination, is_test, xcprety_args) +def run_xcodebuild(tasks, destination, is_build_demo, xcprety_args) sdk = destination[:sdk] device = destination[:device] uuid = destination[:uuid] + is_test = tasks.include?('test') + is_macos = sdk == 'macosx' + + project = is_macos ? macos_project_name : project_name + + schemes_to_execute = [] + if is_test + schemes_to_execute = test_schemes + elsif is_build_demo + schemes_to_execute = is_macos ? build_macos_demo_schemes : build_demo_schemes + else + schemes_to_execute = build_schemes + end + open_simulator_and_sleep uuid if is_test schemes_to_execute.each do |scheme| - xcodebuild type, project_name, scheme, configuration, sdk, device, tasks, xcprety_args + xcodebuild type, project, scheme, configuration, sdk, device, tasks, xcprety_args end end -def execute(tasks, platform, xcprety_args: '') - is_test = tasks.include?('test') - +def execute(tasks, platform, is_build_demo = false, xcprety_args: '') # platform specific settings destination = devices[platform] - schemes = is_test ? test_schemes : build_schemes - # check if xcodebuild needs to be run on multiple devices if destination.is_a?(Array) destination.each do |destination| - run_xcodebuild schemes, tasks, destination, is_test, xcprety_args + run_xcodebuild tasks, destination, is_build_demo, xcprety_args end else - run_xcodebuild schemes, tasks, destination, is_test, xcprety_args + run_xcodebuild tasks, destination, is_build_demo, xcprety_args end end @@ -122,11 +149,18 @@ end desc 'Run CI tasks. Build and test or build depending on the platform.' task :ci, [:platform] do |_task, args| platform = arg_to_key(args[:platform]) if args.key?(:platform) - - if test_platforms.include?(platform) - execute 'clean test', platform - elsif build_platforms.include?(platform) - execute 'clean build', platform + is_build_demo = test_platforms.include?(platform) || build_platforms.include?(platform) + + if test_platforms.include?(platform) # iOS and tvOS + if platform == :iOS + execute 'clean', platform, is_build_demo + execute 'build', platform, is_build_demo + execute 'test', platform # not use demo specifically + else + execute 'clean test', platform + end + elsif build_platforms.include?(platform) # macOS + execute 'clean build', platform, is_build_demo else test_platforms.each do |platform| execute 'clean test', platform From 9706fa140bbce03e0e4fb7f798a3b2a13e8f0eb4 Mon Sep 17 00:00:00 2001 From: Parkin Wu Date: Mon, 1 Jan 2018 22:52:02 +0800 Subject: [PATCH 07/15] Update ViewPortHandler.swift (#3143) fix a small bug --- Source/Charts/Utils/ViewPortHandler.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Charts/Utils/ViewPortHandler.swift b/Source/Charts/Utils/ViewPortHandler.swift index db45d61cb3..4fde6eca50 100755 --- a/Source/Charts/Utils/ViewPortHandler.swift +++ b/Source/Charts/Utils/ViewPortHandler.swift @@ -332,7 +332,7 @@ open class ViewPortHandler: NSObject @objc open func setMinMaxScaleX(minScaleX: CGFloat, maxScaleX: CGFloat) { var newMin = minScaleX - var newMax = minScaleY + var newMax = maxScaleX if newMin < 1.0 { From f9053a77fe355e93ef80109aa3ca4dfb7cb54b1b Mon Sep 17 00:00:00 2001 From: Jacob Christie Date: Wed, 22 Nov 2017 19:39:10 -0500 Subject: [PATCH 08/15] ChartViewBase cleanup For the most part, condensing logic and using `guard` where appropriate Removed optionality of many internal variables as they were only optional to allow for deferred initialization. This is now replaced with lazy vars. Removed empty initializer overrides. `fileprivate` is now `private` --- Source/Charts/Charts/BarChartView.swift | 4 +- .../Charts/Charts/BarLineChartViewBase.swift | 45 ++-- Source/Charts/Charts/ChartViewBase.swift | 227 +++++++----------- .../Charts/HorizontalBarChartView.swift | 16 +- Source/Charts/Charts/PieChartView.swift | 6 +- .../Charts/Charts/PieRadarChartViewBase.swift | 4 +- Source/Charts/Charts/RadarChartView.swift | 17 +- 7 files changed, 126 insertions(+), 193 deletions(-) diff --git a/Source/Charts/Charts/BarChartView.swift b/Source/Charts/Charts/BarChartView.swift index ec4c019f1f..6130d5de14 100644 --- a/Source/Charts/Charts/BarChartView.swift +++ b/Source/Charts/Charts/BarChartView.swift @@ -40,13 +40,13 @@ open class BarChartView: BarLineChartViewBase, BarChartDataProvider if fitBars { - _xAxis.calculate( + xAxis.calculate( min: data.xMin - data.barWidth / 2.0, max: data.xMax + data.barWidth / 2.0) } else { - _xAxis.calculate(min: data.xMin, max: data.xMax) + xAxis.calculate(min: data.xMin, max: data.xMax) } // calculate axis range (min / max) according to provided data diff --git a/Source/Charts/Charts/BarLineChartViewBase.swift b/Source/Charts/Charts/BarLineChartViewBase.swift index 7d4f5a49c3..91f2641f94 100644 --- a/Source/Charts/Charts/BarLineChartViewBase.swift +++ b/Source/Charts/Charts/BarLineChartViewBase.swift @@ -78,7 +78,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// The X axis renderer. This is a read-write property so you can set your own custom renderer here. /// **default**: An instance of XAxisRenderer - @objc open lazy var xAxisRenderer = XAxisRenderer(viewPortHandler: _viewPortHandler, xAxis: _xAxis, transformer: _leftAxisTransformer) + @objc open lazy var xAxisRenderer = XAxisRenderer(viewPortHandler: _viewPortHandler, xAxis: xAxis, transformer: _leftAxisTransformer) internal var _tapGestureRecognizer: NSUITapGestureRecognizer! internal var _doubleTapGestureRecognizer: NSUITapGestureRecognizer! @@ -189,9 +189,9 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD rightYAxisRenderer.computeAxis(min: rightAxis._axisMinimum, max: rightAxis._axisMaximum, inverted: rightAxis.isInverted) } - if _xAxis.isEnabled + if xAxis.isEnabled { - xAxisRenderer.computeAxis(min: _xAxis._axisMinimum, max: _xAxis._axisMaximum, inverted: false) + xAxisRenderer.computeAxis(min: xAxis._axisMinimum, max: xAxis._axisMaximum, inverted: false) } xAxisRenderer.renderAxisLine(context: context) @@ -203,7 +203,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD leftYAxisRenderer.renderGridLines(context: context) rightYAxisRenderer.renderGridLines(context: context) - if _xAxis.isEnabled && _xAxis.isDrawLimitLinesBehindDataEnabled + if xAxis.isEnabled && xAxis.isDrawLimitLinesBehindDataEnabled { xAxisRenderer.renderLimitLines(context: context) } @@ -233,7 +233,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD renderer.drawExtras(context: context) - if _xAxis.isEnabled && !_xAxis.isDrawLimitLinesBehindDataEnabled + if xAxis.isEnabled && !xAxis.isDrawLimitLinesBehindDataEnabled { xAxisRenderer.renderLimitLines(context: context) } @@ -284,7 +284,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD data.calcMinMaxY(fromX: self.lowestVisibleX, toX: self.highestVisibleX) - _xAxis.calculate(min: data.xMin, max: data.xMax) + xAxis.calculate(min: data.xMin, max: data.xMax) // calculate axis range (min / max) according to provided data @@ -303,7 +303,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD internal func prepareValuePxMatrix() { - _rightAxisTransformer.prepareMatrixValuePx(chartXMin: _xAxis._axisMinimum, deltaX: CGFloat(xAxis.axisRange), deltaY: CGFloat(rightAxis.axisRange), chartYMin: rightAxis._axisMinimum) + _rightAxisTransformer.prepareMatrixValuePx(chartXMin: xAxis._axisMinimum, deltaX: CGFloat(xAxis.axisRange), deltaY: CGFloat(rightAxis.axisRange), chartYMin: rightAxis._axisMinimum) _leftAxisTransformer.prepareMatrixValuePx(chartXMin: xAxis._axisMinimum, deltaX: CGFloat(xAxis.axisRange), deltaY: CGFloat(leftAxis.axisRange), chartYMin: leftAxis._axisMinimum) } @@ -325,14 +325,11 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD if let data = _data { xAxisRenderer.computeAxis( - min: _xAxis._axisMinimum, - max: _xAxis._axisMaximum, + min: xAxis._axisMinimum, + max: xAxis._axisMaximum, inverted: false) - if _legend !== nil - { - _legendRenderer?.computeLegend(data: data) - } + _legendRenderer.computeLegend(data: data) } calculateOffsets() @@ -343,7 +340,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD internal override func calcMinMax() { // calculate / set x-axis range - _xAxis.calculate(min: _data?.xMin ?? 0.0, max: _data?.xMax ?? 0.0) + xAxis.calculate(min: _data?.xMin ?? 0.0, max: _data?.xMax ?? 0.0) // calculate axis range (min / max) according to provided data leftAxis.calculate(min: _data?.getYMin(axis: .left) ?? 0.0, max: _data?.getYMax(axis: .left) ?? 0.0) @@ -353,7 +350,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD internal func calculateLegendOffsets(offsetLeft: inout CGFloat, offsetTop: inout CGFloat, offsetRight: inout CGFloat, offsetBottom: inout CGFloat) { // setup offsets for legend - if _legend !== nil && _legend.isEnabled && !_legend.drawInside + if _legend.isEnabled, !_legend.drawInside { switch _legend.orientation { @@ -1095,7 +1092,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD transformer: getTransformer(forAxis: axis), view: self, yAxis: getAxis(axis), - xAxisRange: _xAxis.axisRange, + xAxisRange: xAxis.axisRange, scaleX: scaleX, scaleY: scaleY, xOrigin: viewPortHandler.scaleX, @@ -1180,7 +1177,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// If you call this method, chart must have data or it has no effect. @objc open func setVisibleXRangeMaximum(_ maxXRange: Double) { - let xScale = _xAxis.axisRange / maxXRange + let xScale = xAxis.axisRange / maxXRange _viewPortHandler.setMinimumScaleX(CGFloat(xScale)) } @@ -1191,7 +1188,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// If you call this method, chart must have data or it has no effect. @objc open func setVisibleXRangeMinimum(_ minXRange: Double) { - let xScale = _xAxis.axisRange / minXRange + let xScale = xAxis.axisRange / minXRange _viewPortHandler.setMaximumScaleX(CGFloat(xScale)) } @@ -1203,8 +1200,8 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// If you call this method, chart must have data or it has no effect. @objc open func setVisibleXRange(minXRange: Double, maxXRange: Double) { - let minScale = _xAxis.axisRange / maxXRange - let maxScale = _xAxis.axisRange / minXRange + let minScale = xAxis.axisRange / maxXRange + let maxScale = xAxis.axisRange / minXRange _viewPortHandler.setMinMaxScaleX( minScaleX: CGFloat(minScale), maxScaleX: CGFloat(maxScale)) @@ -1697,20 +1694,12 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// - returns: The current x-scale factor @objc open var scaleX: CGFloat { - if _viewPortHandler === nil - { - return 1.0 - } return _viewPortHandler.scaleX } /// - returns: The current y-scale factor @objc open var scaleY: CGFloat { - if _viewPortHandler === nil - { - return 1.0 - } return _viewPortHandler.scaleY } diff --git a/Source/Charts/Charts/ChartViewBase.swift b/Source/Charts/Charts/ChartViewBase.swift index 61b4491f30..8be60bae11 100644 --- a/Source/Charts/Charts/ChartViewBase.swift +++ b/Source/Charts/Charts/ChartViewBase.swift @@ -42,11 +42,11 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate /// - returns: The object representing all x-labels, this method can be used to /// acquire the XAxis object and modify it (e.g. change the position of the /// labels) - @objc open var xAxis: XAxis - { - return _xAxis - } - +// @objc open var xAxis: XAxis +// { +// return xAxis +// } + /// The default IValueFormatter that has been determined by the chart considering the provided minimum and maximum values. internal var _defaultValueFormatter: IValueFormatter? = DefaultValueFormatter(decimals: 0) @@ -67,15 +67,15 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate internal var _drawUnitInChart = false /// The object representing the labels on the x-axis - internal var _xAxis: XAxis! + @objc open internal(set) lazy var xAxis = XAxis() /// The `Description` object of the chart. /// This should have been called just "description", but - @objc open var chartDescription: Description? + @objc open var chartDescription = Description() /// The legend object containing all data associated with the legend - internal var _legend: Legend! - + internal lazy var _legend: Legend = Legend() + /// delegate to receive chart events @objc open weak var delegate: ChartViewDelegate? @@ -86,9 +86,9 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate @objc open var noDataFont: NSUIFont! = NSUIFont(name: "HelveticaNeue", size: 12.0) /// color of the no data text - @objc open var noDataTextColor: NSUIColor = NSUIColor.black + @objc open var noDataTextColor: NSUIColor = .black - internal var _legendRenderer: LegendRenderer! + internal lazy var _legendRenderer: LegendRenderer = LegendRenderer(viewPortHandler: _viewPortHandler, legend: _legend) /// object responsible for rendering the data @objc open var renderer: DataRenderer? @@ -96,14 +96,18 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate @objc open var highlighter: IHighlighter? /// object that manages the bounds and drawing constraints of the chart - internal var _viewPortHandler: ViewPortHandler! - + internal lazy var _viewPortHandler = ViewPortHandler(width: bounds.size.width, height: bounds.size.height) + /// object responsible for animations - internal var _animator: Animator! + internal lazy var _animator: Animator = { + let animator = Animator() + animator.delegate = self + return animator + }() /// flag that indicates if offsets calculation has already been done or not private var _offsetsCalculated = false - + /// array of Highlight objects that reference the highlighted slices in the chart internal var _indicesToHighlight = [Highlight]() @@ -156,30 +160,18 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate deinit { - self.removeObserver(self, forKeyPath: "bounds") - self.removeObserver(self, forKeyPath: "frame") + removeObserver(self, forKeyPath: "bounds") + removeObserver(self, forKeyPath: "frame") } internal func initialize() { #if os(iOS) - self.backgroundColor = NSUIColor.clear + self.backgroundColor = .clear #endif - _animator = Animator() - _animator.delegate = self - - _viewPortHandler = ViewPortHandler(width: bounds.size.width, height: bounds.size.height) - - chartDescription = Description() - - _legend = Legend() - _legendRenderer = LegendRenderer(viewPortHandler: _viewPortHandler, legend: _legend) - - _xAxis = XAxis() - - self.addObserver(self, forKeyPath: "bounds", options: .new, context: nil) - self.addObserver(self, forKeyPath: "frame", options: .new, context: nil) + addObserver(self, forKeyPath: "bounds", options: .new, context: nil) + addObserver(self, forKeyPath: "frame", options: .new, context: nil) } // MARK: - ChartViewBase @@ -187,24 +179,18 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate /// The data for the chart open var data: ChartData? { - get - { - return _data - } + get { return _data } set { _data = newValue _offsetsCalculated = false - guard let _data = _data else - { - return - } + guard let data = _data else { return } // calculate how many digits are needed - setupDefaultFormatter(min: _data.getYMin(), max: _data.getYMax()) + setupDefaultFormatter(min: data.getYMin(), max: data.getYMax()) - for set in _data.dataSets + for set in data.dataSets { if set.needsFormatter || set.valueFormatter === _defaultValueFormatter { @@ -223,8 +209,8 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate _data = nil _offsetsCalculated = false _indicesToHighlight.removeAll() - lastHighlighted = nil - + lastHighlighted = nil + setNeedsDisplay() } @@ -239,15 +225,7 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate @objc open func isEmpty() -> Bool { guard let data = _data else { return true } - - if data.entryCount <= 0 - { - return true - } - else - { - return false - } + return data.entryCount <= 0 } /// Lets the chart know its underlying data has changed and should perform all necessary recalculations. @@ -273,7 +251,7 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate internal func setupDefaultFormatter(min: Double, max: Double) { // check if a custom formatter is set or not - var reference = Double(0.0) + var reference = 0.0 if let data = _data , data.entryCount >= 2 { @@ -304,7 +282,7 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate let frame = self.bounds - if _data === nil && noDataText.count > 0 + if _data === nil && !noDataText.isEmpty { context.saveGState() defer { context.restoreGState() } @@ -314,8 +292,8 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate text: noDataText, point: CGPoint(x: frame.width / 2.0, y: frame.height / 2.0), attributes: - [NSAttributedStringKey.font: noDataFont, - NSAttributedStringKey.foregroundColor: noDataTextColor], + [.font: noDataFont, + .foregroundColor: noDataTextColor], constrainedToSize: self.bounds.size, anchor: CGPoint(x: 0.5, y: 0.5), angleRadians: 0.0) @@ -333,9 +311,10 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate /// Draws the description text in the bottom right corner of the chart (per default) internal func drawDescription(context: CGContext) { + let description = chartDescription + // check if description should be drawn guard - let description = chartDescription, description.isEnabled, let descriptionText = description.text, descriptionText.count > 0 @@ -344,10 +323,10 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate let position = description.position ?? CGPoint(x: bounds.width - _viewPortHandler.offsetRight - description.xOffset, y: bounds.height - _viewPortHandler.offsetBottom - description.yOffset - description.font.lineHeight) - var attrs = [NSAttributedStringKey : Any]() - - attrs[NSAttributedStringKey.font] = description.font - attrs[NSAttributedStringKey.foregroundColor] = description.textColor + let attrs: [NSAttributedStringKey : Any] = [ + .font: description.font, + .foregroundColor: description.textColor + ] ChartUtils.drawText( context: context, @@ -391,19 +370,15 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate /// null or an empty array to undo all highlighting. /// This should be used to programmatically highlight values. /// This method *will not* call the delegate. - @objc open func highlightValues(_ highs: [Highlight]?) + @objc open func highlightValues(_ highs: [Highlight]) { // set the indices to highlight - _indicesToHighlight = highs ?? [Highlight]() - - if _indicesToHighlight.isEmpty - { - self.lastHighlighted = nil - } - else - { - self.lastHighlighted = _indicesToHighlight[0] - } + _indicesToHighlight = highs + + lastHighlighted = _indicesToHighlight.isEmpty + ? nil + : _indicesToHighlight[0] + // redraw the chart setNeedsDisplay() @@ -475,41 +450,27 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate /// Highlights the value selected by touch gesture. @objc open func highlightValue(_ highlight: Highlight?, callDelegate: Bool) { - var entry: ChartDataEntry? - var h = highlight - - if h == nil - { - _indicesToHighlight.removeAll(keepingCapacity: false) - } - else - { - // set the indices to highlight - entry = _data?.entryForHighlight(h!) - if entry == nil - { - h = nil + var high = highlight + guard + let h = high, + let entry = _data?.entryForHighlight(h) + else { + high = nil _indicesToHighlight.removeAll(keepingCapacity: false) - } - else - { - _indicesToHighlight = [h!] - } + if callDelegate { + delegate?.chartValueNothingSelected?(self) + } + return } - - if callDelegate, let delegate = delegate - { - if let h = h - { - // notify the listener - delegate.chartValueSelected?(self, entry: entry!, highlight: h) - } - else - { - delegate.chartValueNothingSelected?(self) - } + + // set the indices to highlight + _indicesToHighlight = [h] + + if callDelegate { + // notify the listener + delegate?.chartValueSelected?(self, entry: entry, highlight: h) } - + // redraw the chart setNeedsDisplay() } @@ -519,8 +480,7 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate /// CandleStick-Chart. @objc open func getHighlightByTouchPoint(_ pt: CGPoint) -> Highlight? { - if _data === nil - { + guard _data != nil else { Swift.print("Can't select by touch. No data set.") return nil } @@ -538,33 +498,25 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate { // if there is no marker view or drawing marker is disabled guard - let marker = marker - , isDrawMarkersEnabled && - valuesToHighlight() + let marker = marker, + isDrawMarkersEnabled, + valuesToHighlight() else { return } - for i in 0 ..< _indicesToHighlight.count + for highlight in _indicesToHighlight { - let highlight = _indicesToHighlight[i] - - guard let - set = data?.getDataSetByIndex(highlight.dataSetIndex), + guard + let set = data?.getDataSetByIndex(highlight.dataSetIndex), let e = _data?.entryForHighlight(highlight) else { continue } let entryIndex = set.entryIndex(entry: e) - if entryIndex > Int(Double(set.entryCount) * _animator.phaseX) - { - continue - } + guard entryIndex <= Int(Double(set.entryCount) * _animator.phaseX) else { continue } let pos = getMarkerPosition(highlight: highlight) // check bounds - if !_viewPortHandler.isInBounds(x: pos.x, y: pos.y) - { - continue - } + guard _viewPortHandler.isInBounds(x: pos.x, y: pos.y) else { continue } // callbacks to update the content marker.refreshContent(entry: e, highlight: highlight) @@ -707,17 +659,17 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate open var chartXMax: Double { - return _xAxis._axisMaximum + return xAxis._axisMaximum } open var chartXMin: Double { - return _xAxis._axisMinimum + return xAxis._axisMinimum } open var xRange: Double { - return _xAxis.axisRange + return xAxis.axisRange } /// * @@ -810,7 +762,7 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate /// - returns: `true` if the image was saved successfully open func save(to path: String, format: ImageFormat, compressionQuality: Double) -> Bool { - guard let image = getChartImage(transparent: format != .jpeg) else { return false } + guard let image = getChartImage(transparent: format != .jpeg) else { return false } let imageData: Data? switch (format) @@ -830,7 +782,7 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate return false } - return true + return true } internal var _viewportJobs = [ViewPortJob]() @@ -841,8 +793,7 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate { let bounds = self.bounds - if (_viewPortHandler !== nil && - (bounds.size.width != _viewPortHandler.chartWidth || + if ((bounds.size.width != _viewPortHandler.chartWidth || bounds.size.height != _viewPortHandler.chartHeight)) { _viewPortHandler.setChartDimens(width: bounds.size.width, height: bounds.size.height) @@ -905,17 +856,11 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate } set { - var val = newValue - if val < 0.0 - { - val = 0.0 - } - if val >= 1.0 - { - val = 0.999 + switch newValue { + case ..<0.0: _dragDecelerationFrictionCoef = 0 + case 1.0...: _dragDecelerationFrictionCoef = 0.999 + default: _dragDecelerationFrictionCoef = newValue } - - _dragDecelerationFrictionCoef = val } } @@ -926,7 +871,7 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate /// the number of maximum visible drawn values on the chart only active when `drawValuesEnabled` is enabled open var maxVisibleCount: Int { - return Int(INT_MAX) + return .max } // MARK: - AnimatorDelegate diff --git a/Source/Charts/Charts/HorizontalBarChartView.swift b/Source/Charts/Charts/HorizontalBarChartView.swift index 13131942b7..07c96f822b 100644 --- a/Source/Charts/Charts/HorizontalBarChartView.swift +++ b/Source/Charts/Charts/HorizontalBarChartView.swift @@ -29,7 +29,7 @@ open class HorizontalBarChartView: BarChartView renderer = HorizontalBarChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: _viewPortHandler) leftYAxisRenderer = YAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, yAxis: leftAxis, transformer: _leftAxisTransformer) rightYAxisRenderer = YAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, yAxis: rightAxis, transformer: _rightAxisTransformer) - xAxisRenderer = XAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, xAxis: _xAxis, transformer: _leftAxisTransformer, chart: self) + xAxisRenderer = XAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, xAxis: xAxis, transformer: _leftAxisTransformer, chart: self) self.highlighter = HorizontalBarHighlighter(chart: self) } @@ -57,20 +57,20 @@ open class HorizontalBarChartView: BarChartView offsetBottom += rightAxis.getRequiredHeightSpace() } - let xlabelwidth = _xAxis.labelRotatedWidth + let xlabelwidth = xAxis.labelRotatedWidth - if _xAxis.isEnabled + if xAxis.isEnabled { // offsets for x-labels - if _xAxis.labelPosition == .bottom + if xAxis.labelPosition == .bottom { offsetLeft += xlabelwidth } - else if _xAxis.labelPosition == .top + else if xAxis.labelPosition == .top { offsetRight += xlabelwidth } - else if _xAxis.labelPosition == .bothSided + else if xAxis.labelPosition == .bothSided { offsetLeft += xlabelwidth offsetRight += xlabelwidth @@ -94,8 +94,8 @@ open class HorizontalBarChartView: BarChartView internal override func prepareValuePxMatrix() { - _rightAxisTransformer.prepareMatrixValuePx(chartXMin: rightAxis._axisMinimum, deltaX: CGFloat(rightAxis.axisRange), deltaY: CGFloat(_xAxis.axisRange), chartYMin: _xAxis._axisMinimum) - _leftAxisTransformer.prepareMatrixValuePx(chartXMin: leftAxis._axisMinimum, deltaX: CGFloat(leftAxis.axisRange), deltaY: CGFloat(_xAxis.axisRange), chartYMin: _xAxis._axisMinimum) + _rightAxisTransformer.prepareMatrixValuePx(chartXMin: rightAxis._axisMinimum, deltaX: CGFloat(rightAxis.axisRange), deltaY: CGFloat(xAxis.axisRange), chartYMin: xAxis._axisMinimum) + _leftAxisTransformer.prepareMatrixValuePx(chartXMin: leftAxis._axisMinimum, deltaX: CGFloat(leftAxis.axisRange), deltaY: CGFloat(xAxis.axisRange), chartYMin: xAxis._axisMinimum) } open override func getMarkerPosition(highlight: Highlight) -> CGPoint diff --git a/Source/Charts/Charts/PieChartView.swift b/Source/Charts/Charts/PieChartView.swift index e0b2d699a0..8e868eb88a 100644 --- a/Source/Charts/Charts/PieChartView.swift +++ b/Source/Charts/Charts/PieChartView.swift @@ -87,8 +87,7 @@ open class PieChartView: PieRadarChartViewBase super.initialize() renderer = PieChartRenderer(chart: self, animator: _animator, viewPortHandler: _viewPortHandler) - _xAxis = nil - + self.highlighter = PieHighlighter(chart: self) } @@ -261,7 +260,8 @@ open class PieChartView: PieRadarChartViewBase /// This will throw an exception, PieChart has no XAxis object. open override var xAxis: XAxis { - fatalError("PieChart has no XAxis") + get { fatalError("PieChart has no XAxis") } + set { fatalError("PieChart has no XAxis") } } open override func indexForAngle(_ angle: CGFloat) -> Int diff --git a/Source/Charts/Charts/PieRadarChartViewBase.swift b/Source/Charts/Charts/PieRadarChartViewBase.swift index 5d6f22fac8..947dfb8405 100755 --- a/Source/Charts/Charts/PieRadarChartViewBase.swift +++ b/Source/Charts/Charts/PieRadarChartViewBase.swift @@ -86,7 +86,7 @@ open class PieRadarChartViewBase: ChartViewBase { calcMinMax() - if let data = _data , _legend !== nil + if let data = _data { _legendRenderer.computeLegend(data: data) } @@ -103,7 +103,7 @@ open class PieRadarChartViewBase: ChartViewBase var legendBottom = CGFloat(0.0) var legendTop = CGFloat(0.0) - if _legend != nil && _legend.enabled && !_legend.drawInside + if _legend.enabled && !_legend.drawInside { let fullLegendWidth = min(_legend.neededWidth, _viewPortHandler.chartWidth * _legend.maxSizePercent) diff --git a/Source/Charts/Charts/RadarChartView.swift b/Source/Charts/Charts/RadarChartView.swift index 2b89fbae69..e72ff21034 100644 --- a/Source/Charts/Charts/RadarChartView.swift +++ b/Source/Charts/Charts/RadarChartView.swift @@ -63,7 +63,7 @@ open class RadarChartView: PieRadarChartViewBase renderer = RadarChartRenderer(chart: self, animator: _animator, viewPortHandler: _viewPortHandler) _yAxisRenderer = YAxisRendererRadarChart(viewPortHandler: _viewPortHandler, yAxis: _yAxis, chart: self) - _xAxisRenderer = XAxisRendererRadarChart(viewPortHandler: _viewPortHandler, xAxis: _xAxis, chart: self) + _xAxisRenderer = XAxisRendererRadarChart(viewPortHandler: _viewPortHandler, xAxis: xAxis, chart: self) self.highlighter = RadarHighlighter(chart: self) } @@ -75,7 +75,7 @@ open class RadarChartView: PieRadarChartViewBase guard let data = _data else { return } _yAxis.calculate(min: data.getYMin(axis: .left), max: data.getYMax(axis: .left)) - _xAxis.calculate(min: 0.0, max: Double(data.maxEntryCountSet?.entryCount ?? 0)) + xAxis.calculate(min: 0.0, max: Double(data.maxEntryCountSet?.entryCount ?? 0)) } open override func notifyDataSetChanged() @@ -83,13 +83,12 @@ open class RadarChartView: PieRadarChartViewBase calcMinMax() _yAxisRenderer?.computeAxis(min: _yAxis._axisMinimum, max: _yAxis._axisMaximum, inverted: _yAxis.isInverted) - _xAxisRenderer?.computeAxis(min: _xAxis._axisMinimum, max: _xAxis._axisMaximum, inverted: false) + _xAxisRenderer?.computeAxis(min: xAxis._axisMinimum, max: xAxis._axisMaximum, inverted: false) if let data = _data, - let legend = _legend, - !legend.isLegendCustom + !_legend.isLegendCustom { - _legendRenderer?.computeLegend(data: data) + _legendRenderer.computeLegend(data: data) } calculateOffsets() @@ -106,9 +105,9 @@ open class RadarChartView: PieRadarChartViewBase let optionalContext = NSUIGraphicsGetCurrentContext() guard let context = optionalContext else { return } - if _xAxis.isEnabled + if xAxis.isEnabled { - _xAxisRenderer.computeAxis(min: _xAxis._axisMinimum, max: _xAxis._axisMaximum, inverted: false) + _xAxisRenderer.computeAxis(min: xAxis._axisMinimum, max: xAxis._axisMaximum, inverted: false) } _xAxisRenderer?.renderAxisLabels(context: context) @@ -212,7 +211,7 @@ open class RadarChartView: PieRadarChartViewBase internal override var requiredBaseOffset: CGFloat { - return _xAxis.isEnabled && _xAxis.isDrawLabelsEnabled ? _xAxis.labelRotatedWidth : 10.0 + return xAxis.isEnabled && xAxis.isDrawLabelsEnabled ? xAxis.labelRotatedWidth : 10.0 } open override var radius: CGFloat From 386d357547f66ea515a46a5cdaa78e36b34e8129 Mon Sep 17 00:00:00 2001 From: Jacob Christie Date: Mon, 4 Dec 2017 13:53:30 -0500 Subject: [PATCH 09/15] Pulled latest master --- Source/Charts/Charts/BarChartView.swift | 2 +- .../Charts/Charts/BarLineChartViewBase.swift | 124 +++++++++--------- Source/Charts/Charts/BubbleChartView.swift | 2 +- .../Charts/Charts/CandleStickChartView.swift | 2 +- Source/Charts/Charts/ChartViewBase.swift | 10 +- Source/Charts/Charts/CombinedChartView.swift | 4 +- .../Charts/HorizontalBarChartView.swift | 14 +- Source/Charts/Charts/LineChartView.swift | 2 +- Source/Charts/Charts/PieChartView.swift | 2 +- .../Charts/Charts/PieRadarChartViewBase.swift | 12 +- Source/Charts/Charts/RadarChartView.swift | 10 +- Source/Charts/Charts/ScatterChartView.swift | 2 +- 12 files changed, 93 insertions(+), 93 deletions(-) diff --git a/Source/Charts/Charts/BarChartView.swift b/Source/Charts/Charts/BarChartView.swift index 6130d5de14..0967cce350 100644 --- a/Source/Charts/Charts/BarChartView.swift +++ b/Source/Charts/Charts/BarChartView.swift @@ -25,7 +25,7 @@ open class BarChartView: BarLineChartViewBase, BarChartDataProvider { super.initialize() - renderer = BarChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: _viewPortHandler) + renderer = BarChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: viewPortHandler) self.highlighter = BarHighlighter(chart: self) diff --git a/Source/Charts/Charts/BarLineChartViewBase.swift b/Source/Charts/Charts/BarLineChartViewBase.swift index 91f2641f94..656c66fd2c 100644 --- a/Source/Charts/Charts/BarLineChartViewBase.swift +++ b/Source/Charts/Charts/BarLineChartViewBase.swift @@ -67,18 +67,18 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// The left Y axis renderer. This is a read-write property so you can set your own custom renderer here. /// **default**: An instance of YAxisRenderer - @objc open lazy var leftYAxisRenderer = YAxisRenderer(viewPortHandler: _viewPortHandler, yAxis: leftAxis, transformer: _leftAxisTransformer) + @objc open lazy var leftYAxisRenderer = YAxisRenderer(viewPortHandler: viewPortHandler, yAxis: leftAxis, transformer: _leftAxisTransformer) /// The right Y axis renderer. This is a read-write property so you can set your own custom renderer here. /// **default**: An instance of YAxisRenderer - @objc open lazy var rightYAxisRenderer = YAxisRenderer(viewPortHandler: _viewPortHandler, yAxis: rightAxis, transformer: _rightAxisTransformer) + @objc open lazy var rightYAxisRenderer = YAxisRenderer(viewPortHandler: viewPortHandler, yAxis: rightAxis, transformer: _rightAxisTransformer) internal var _leftAxisTransformer: Transformer! internal var _rightAxisTransformer: Transformer! /// The X axis renderer. This is a read-write property so you can set your own custom renderer here. /// **default**: An instance of XAxisRenderer - @objc open lazy var xAxisRenderer = XAxisRenderer(viewPortHandler: _viewPortHandler, xAxis: xAxis, transformer: _leftAxisTransformer) + @objc open lazy var xAxisRenderer = XAxisRenderer(viewPortHandler: viewPortHandler, xAxis: xAxis, transformer: _leftAxisTransformer) internal var _tapGestureRecognizer: NSUITapGestureRecognizer! internal var _doubleTapGestureRecognizer: NSUITapGestureRecognizer! @@ -109,8 +109,8 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD { super.initialize() - _leftAxisTransformer = Transformer(viewPortHandler: _viewPortHandler) - _rightAxisTransformer = Transformer(viewPortHandler: _viewPortHandler) + _leftAxisTransformer = Transformer(viewPortHandler: viewPortHandler) + _rightAxisTransformer = Transformer(viewPortHandler: viewPortHandler) self.highlighter = ChartHighlighter(chart: self) @@ -220,7 +220,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD // make sure the data cannot be drawn outside the content-rect context.saveGState() - context.clip(to: _viewPortHandler.contentRect) + context.clip(to: viewPortHandler.contentRect) renderer.drawData(context: context) // if highlighting is enabled @@ -255,7 +255,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD if clipValuesToContentEnabled { context.saveGState() - context.clip(to: _viewPortHandler.contentRect) + context.clip(to: viewPortHandler.contentRect) renderer.drawValues(context: context) @@ -359,20 +359,20 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD switch _legend.horizontalAlignment { case .left: - offsetLeft += min(_legend.neededWidth, _viewPortHandler.chartWidth * _legend.maxSizePercent) + _legend.xOffset + offsetLeft += min(_legend.neededWidth, viewPortHandler.chartWidth * _legend.maxSizePercent) + _legend.xOffset case .right: - offsetRight += min(_legend.neededWidth, _viewPortHandler.chartWidth * _legend.maxSizePercent) + _legend.xOffset + offsetRight += min(_legend.neededWidth, viewPortHandler.chartWidth * _legend.maxSizePercent) + _legend.xOffset case .center: switch _legend.verticalAlignment { case .top: - offsetTop += min(_legend.neededHeight, _viewPortHandler.chartHeight * _legend.maxSizePercent) + _legend.yOffset + offsetTop += min(_legend.neededHeight, viewPortHandler.chartHeight * _legend.maxSizePercent) + _legend.yOffset case .bottom: - offsetBottom += min(_legend.neededHeight, _viewPortHandler.chartHeight * _legend.maxSizePercent) + _legend.yOffset + offsetBottom += min(_legend.neededHeight, viewPortHandler.chartHeight * _legend.maxSizePercent) + _legend.yOffset default: break @@ -384,14 +384,14 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD switch _legend.verticalAlignment { case .top: - offsetTop += min(_legend.neededHeight, _viewPortHandler.chartHeight * _legend.maxSizePercent) + _legend.yOffset + offsetTop += min(_legend.neededHeight, viewPortHandler.chartHeight * _legend.maxSizePercent) + _legend.yOffset if xAxis.isEnabled && xAxis.isDrawLabelsEnabled { offsetTop += xAxis.labelRotatedHeight } case .bottom: - offsetBottom += min(_legend.neededHeight, _viewPortHandler.chartHeight * _legend.maxSizePercent) + _legend.yOffset + offsetBottom += min(_legend.neededHeight, viewPortHandler.chartHeight * _legend.maxSizePercent) + _legend.yOffset if xAxis.isEnabled && xAxis.isDrawLabelsEnabled { offsetBottom += xAxis.labelRotatedHeight @@ -454,7 +454,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD offsetBottom += self.extraBottomOffset offsetLeft += self.extraLeftOffset - _viewPortHandler.restrainViewPort( + viewPortHandler.restrainViewPort( offsetLeft: max(self.minOffset, offsetLeft), offsetTop: max(self.minOffset, offsetTop), offsetRight: max(self.minOffset, offsetRight), @@ -477,14 +477,14 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD { // draw the grid background context.setFillColor(gridBackgroundColor.cgColor) - context.fill(_viewPortHandler.contentRect) + context.fill(viewPortHandler.contentRect) } if drawBordersEnabled { context.setLineWidth(borderLineWidth) context.setStrokeColor(borderColor.cgColor) - context.stroke(_viewPortHandler.contentRect) + context.stroke(viewPortHandler.contentRect) } if drawGridBackgroundEnabled || drawBordersEnabled @@ -553,15 +553,15 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD if _data !== nil && _doubleTapToZoomEnabled && (data?.entryCount ?? 0) > 0 { var location = recognizer.location(in: self) - location.x = location.x - _viewPortHandler.offsetLeft + location.x = location.x - viewPortHandler.offsetLeft if isTouchInverted() { - location.y = -(location.y - _viewPortHandler.offsetTop) + location.y = -(location.y - viewPortHandler.offsetTop) } else { - location.y = -(self.bounds.size.height - location.y - _viewPortHandler.offsetBottom) + location.y = -(self.bounds.size.height - location.y - viewPortHandler.offsetBottom) } self.zoom(scaleX: isScaleXEnabled ? 1.4 : 1.0, scaleY: isScaleYEnabled ? 1.4 : 1.0, x: location.x, y: location.y) @@ -616,8 +616,8 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD else if recognizer.state == NSUIGestureRecognizerState.changed { let isZoomingOut = (recognizer.nsuiScale < 1) - var canZoomMoreX = isZoomingOut ? _viewPortHandler.canZoomOutMoreX : _viewPortHandler.canZoomInMoreX - var canZoomMoreY = isZoomingOut ? _viewPortHandler.canZoomOutMoreY : _viewPortHandler.canZoomInMoreY + var canZoomMoreX = isZoomingOut ? viewPortHandler.canZoomOutMoreX : viewPortHandler.canZoomInMoreX + var canZoomMoreY = isZoomingOut ? viewPortHandler.canZoomOutMoreY : viewPortHandler.canZoomInMoreY if _isScaling { @@ -626,15 +626,15 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD if canZoomMoreX || canZoomMoreY { var location = recognizer.location(in: self) - location.x = location.x - _viewPortHandler.offsetLeft + location.x = location.x - viewPortHandler.offsetLeft if isTouchInverted() { - location.y = -(location.y - _viewPortHandler.offsetTop) + location.y = -(location.y - viewPortHandler.offsetTop) } else { - location.y = -(_viewPortHandler.chartHeight - location.y - _viewPortHandler.offsetBottom) + location.y = -(viewPortHandler.chartHeight - location.y - viewPortHandler.offsetBottom) } let scaleX = canZoomMoreX ? recognizer.nsuiScale : 1.0 @@ -644,9 +644,9 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD matrix = matrix.scaledBy(x: scaleX, y: scaleY) matrix = matrix.translatedBy(x: -location.x, y: -location.y) - matrix = _viewPortHandler.touchMatrix.concatenating(matrix) + matrix = viewPortHandler.touchMatrix.concatenating(matrix) - _viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: true) + viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: true) if delegate !== nil { @@ -795,12 +795,12 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD } } - let originalMatrix = _viewPortHandler.touchMatrix + let originalMatrix = viewPortHandler.touchMatrix var matrix = CGAffineTransform(translationX: translation.x, y: translation.y) matrix = originalMatrix.concatenating(matrix) - matrix = _viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: true) + matrix = viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: true) if delegate !== nil { @@ -963,10 +963,10 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// Zooms in by 1.4, into the charts center. @objc open func zoomIn() { - let center = _viewPortHandler.contentCenter + let center = viewPortHandler.contentCenter - let matrix = _viewPortHandler.zoomIn(x: center.x, y: -center.y) - _viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: false) + let matrix = viewPortHandler.zoomIn(x: center.x, y: -center.y) + viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: false) // Range might have changed, which means that Y-axis labels could have changed in size, affecting Y-axis size. So we need to recalculate offsets. calculateOffsets() @@ -976,10 +976,10 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// Zooms out by 0.7, from the charts center. @objc open func zoomOut() { - let center = _viewPortHandler.contentCenter + let center = viewPortHandler.contentCenter - let matrix = _viewPortHandler.zoomOut(x: center.x, y: -center.y) - _viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: false) + let matrix = viewPortHandler.zoomOut(x: center.x, y: -center.y) + viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: false) // Range might have changed, which means that Y-axis labels could have changed in size, affecting Y-axis size. So we need to recalculate offsets. calculateOffsets() @@ -989,8 +989,8 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// Zooms out to original size. @objc open func resetZoom() { - let matrix = _viewPortHandler.resetZoom() - _viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: false) + let matrix = viewPortHandler.resetZoom() + viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: false) // Range might have changed, which means that Y-axis labels could have changed in size, affecting Y-axis size. So we need to recalculate offsets. calculateOffsets() @@ -1010,8 +1010,8 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD x: CGFloat, y: CGFloat) { - let matrix = _viewPortHandler.zoom(scaleX: scaleX, scaleY: scaleY, x: x, y: -y) - _viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: false) + let matrix = viewPortHandler.zoom(scaleX: scaleX, scaleY: scaleY, x: x, y: -y) + viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: false) // Range might have changed, which means that Y-axis labels could have changed in size, affecting Y-axis size. So we need to recalculate offsets. calculateOffsets() @@ -1151,8 +1151,8 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// Resets all zooming and dragging and makes the chart fit exactly it's bounds. @objc open func fitScreen() { - let matrix = _viewPortHandler.fitScreen() - _viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: false) + let matrix = viewPortHandler.fitScreen() + viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: false) calculateOffsets() setNeedsDisplay() @@ -1161,8 +1161,8 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// Sets the minimum scale value to which can be zoomed out. 1 = fitScreen @objc open func setScaleMinima(_ scaleX: CGFloat, scaleY: CGFloat) { - _viewPortHandler.setMinimumScaleX(scaleX) - _viewPortHandler.setMinimumScaleY(scaleY) + viewPortHandler.setMinimumScaleX(scaleX) + viewPortHandler.setMinimumScaleY(scaleY) } @objc open var visibleXRange: Double @@ -1178,7 +1178,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD @objc open func setVisibleXRangeMaximum(_ maxXRange: Double) { let xScale = xAxis.axisRange / maxXRange - _viewPortHandler.setMinimumScaleX(CGFloat(xScale)) + viewPortHandler.setMinimumScaleX(CGFloat(xScale)) } /// Sets the size of the area (range on the x-axis) that should be minimum visible at once (no further zooming in allowed). @@ -1189,7 +1189,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD @objc open func setVisibleXRangeMinimum(_ minXRange: Double) { let xScale = xAxis.axisRange / minXRange - _viewPortHandler.setMaximumScaleX(CGFloat(xScale)) + viewPortHandler.setMaximumScaleX(CGFloat(xScale)) } /// Limits the maximum and minimum value count that can be visible by pinching and zooming. @@ -1202,7 +1202,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD { let minScale = xAxis.axisRange / maxXRange let maxScale = xAxis.axisRange / minXRange - _viewPortHandler.setMinMaxScaleX( + viewPortHandler.setMinMaxScaleX( minScaleX: CGFloat(minScale), maxScaleX: CGFloat(maxScale)) } @@ -1214,7 +1214,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD @objc open func setVisibleYRangeMaximum(_ maxYRange: Double, axis: YAxis.AxisDependency) { let yScale = getAxisRange(axis: axis) / maxYRange - _viewPortHandler.setMinimumScaleY(CGFloat(yScale)) + viewPortHandler.setMinimumScaleY(CGFloat(yScale)) } /// Sets the size of the area (range on the y-axis) that should be minimum visible at once, no further zooming in possible. @@ -1224,7 +1224,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD @objc open func setVisibleYRangeMinimum(_ minYRange: Double, axis: YAxis.AxisDependency) { let yScale = getAxisRange(axis: axis) / minYRange - _viewPortHandler.setMaximumScaleY(CGFloat(yScale)) + viewPortHandler.setMaximumScaleY(CGFloat(yScale)) } /// Limits the maximum and minimum y range that can be visible by pinching and zooming. @@ -1236,7 +1236,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD { let minScale = getAxisRange(axis: axis) / minYRange let maxScale = getAxisRange(axis: axis) / maxYRange - _viewPortHandler.setMinMaxScaleY(minScaleY: CGFloat(minScale), maxScaleY: CGFloat(maxScale)) + viewPortHandler.setMinMaxScaleY(minScaleY: CGFloat(minScale), maxScaleY: CGFloat(maxScale)) } /// Moves the left side of the current viewport to the specified x-value. @@ -1260,7 +1260,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// - parameter axis: - which axis should be used as a reference for the y-axis @objc open func moveViewToY(_ yValue: Double, axis: YAxis.AxisDependency) { - let yInView = getAxisRange(axis: axis) / Double(_viewPortHandler.scaleY) + let yInView = getAxisRange(axis: axis) / Double(viewPortHandler.scaleY) let job = MoveViewJob( viewPortHandler: viewPortHandler, @@ -1280,7 +1280,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// - parameter axis: - which axis should be used as a reference for the y-axis @objc open func moveViewTo(xValue: Double, yValue: Double, axis: YAxis.AxisDependency) { - let yInView = getAxisRange(axis: axis) / Double(_viewPortHandler.scaleY) + let yInView = getAxisRange(axis: axis) / Double(viewPortHandler.scaleY) let job = MoveViewJob( viewPortHandler: viewPortHandler, @@ -1311,7 +1311,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD point: CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentTop), axis: axis) - let yInView = getAxisRange(axis: axis) / Double(_viewPortHandler.scaleY) + let yInView = getAxisRange(axis: axis) / Double(viewPortHandler.scaleY) let job = AnimatedMoveViewJob( viewPortHandler: viewPortHandler, @@ -1373,8 +1373,8 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD yValue: Double, axis: YAxis.AxisDependency) { - let yInView = getAxisRange(axis: axis) / Double(_viewPortHandler.scaleY) - let xInView = xAxis.axisRange / Double(_viewPortHandler.scaleX) + let yInView = getAxisRange(axis: axis) / Double(viewPortHandler.scaleY) + let xInView = xAxis.axisRange / Double(viewPortHandler.scaleX) let job = MoveViewJob( viewPortHandler: viewPortHandler, @@ -1404,8 +1404,8 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD point: CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentTop), axis: axis) - let yInView = getAxisRange(axis: axis) / Double(_viewPortHandler.scaleY) - let xInView = xAxis.axisRange / Double(_viewPortHandler.scaleX) + let yInView = getAxisRange(axis: axis) / Double(viewPortHandler.scaleY) + let xInView = xAxis.axisRange / Double(viewPortHandler.scaleX) let job = AnimatedMoveViewJob( viewPortHandler: viewPortHandler, @@ -1462,7 +1462,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD if Thread.isMainThread { - self._viewPortHandler.restrainViewPort(offsetLeft: left, offsetTop: top, offsetRight: right, offsetBottom: bottom) + self.viewPortHandler.restrainViewPort(offsetLeft: left, offsetTop: top, offsetRight: right, offsetBottom: bottom) prepareOffsetMatrix() prepareValuePxMatrix() } @@ -1694,17 +1694,17 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// - returns: The current x-scale factor @objc open var scaleX: CGFloat { - return _viewPortHandler.scaleX + return viewPortHandler.scaleX } /// - returns: The current y-scale factor @objc open var scaleY: CGFloat { - return _viewPortHandler.scaleY + return viewPortHandler.scaleY } /// if the chart is fully zoomed out, return true - @objc open var isFullyZoomedOut: Bool { return _viewPortHandler.isFullyZoomedOut } + @objc open var isFullyZoomedOut: Bool { return viewPortHandler.isFullyZoomedOut } /// - returns: The y-axis object to the corresponding AxisDependency. In the /// horizontal bar-chart, LEFT == top, RIGHT == BOTTOM @@ -1747,18 +1747,18 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// bounds on the x-axis. @objc open func setDragOffsetX(_ offset: CGFloat) { - _viewPortHandler.setDragOffsetX(offset) + viewPortHandler.setDragOffsetX(offset) } /// Set an offset in dp that allows the user to drag the chart over it's /// bounds on the y-axis. @objc open func setDragOffsetY(_ offset: CGFloat) { - _viewPortHandler.setDragOffsetY(offset) + viewPortHandler.setDragOffsetY(offset) } /// - returns: `true` if both drag offsets (x and y) are zero or smaller. - @objc open var hasNoDragOffset: Bool { return _viewPortHandler.hasNoDragOffset } + @objc open var hasNoDragOffset: Bool { return viewPortHandler.hasNoDragOffset } open override var chartYMax: Double { diff --git a/Source/Charts/Charts/BubbleChartView.swift b/Source/Charts/Charts/BubbleChartView.swift index 1b13677564..80f3df0e05 100644 --- a/Source/Charts/Charts/BubbleChartView.swift +++ b/Source/Charts/Charts/BubbleChartView.swift @@ -18,7 +18,7 @@ open class BubbleChartView: BarLineChartViewBase, BubbleChartDataProvider { super.initialize() - renderer = BubbleChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: _viewPortHandler) + renderer = BubbleChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: viewPortHandler) } // MARK: - BubbleChartDataProvider diff --git a/Source/Charts/Charts/CandleStickChartView.swift b/Source/Charts/Charts/CandleStickChartView.swift index 0366e8b873..08c0e9ddbc 100644 --- a/Source/Charts/Charts/CandleStickChartView.swift +++ b/Source/Charts/Charts/CandleStickChartView.swift @@ -19,7 +19,7 @@ open class CandleStickChartView: BarLineChartViewBase, CandleChartDataProvider { super.initialize() - renderer = CandleStickChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: _viewPortHandler) + renderer = CandleStickChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: viewPortHandler) self.xAxis.spaceMin = 0.5 self.xAxis.spaceMax = 0.5 diff --git a/Source/Charts/Charts/ChartViewBase.swift b/Source/Charts/Charts/ChartViewBase.swift index 8be60bae11..47e72df92c 100644 --- a/Source/Charts/Charts/ChartViewBase.swift +++ b/Source/Charts/Charts/ChartViewBase.swift @@ -107,7 +107,7 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate /// flag that indicates if offsets calculation has already been done or not private var _offsetsCalculated = false - + /// array of Highlight objects that reference the highlighted slices in the chart internal var _indicesToHighlight = [Highlight]() @@ -209,8 +209,8 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate _data = nil _offsetsCalculated = false _indicesToHighlight.removeAll() - lastHighlighted = nil - + lastHighlighted = nil + setNeedsDisplay() } @@ -762,7 +762,7 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate /// - returns: `true` if the image was saved successfully open func save(to path: String, format: ImageFormat, compressionQuality: Double) -> Bool { - guard let image = getChartImage(transparent: format != .jpeg) else { return false } + guard let image = getChartImage(transparent: format != .jpeg) else { return false } let imageData: Data? switch (format) @@ -782,7 +782,7 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate return false } - return true + return true } internal var _viewportJobs = [ViewPortJob]() diff --git a/Source/Charts/Charts/CombinedChartView.swift b/Source/Charts/Charts/CombinedChartView.swift index ead6c3d130..d24df96b70 100644 --- a/Source/Charts/Charts/CombinedChartView.swift +++ b/Source/Charts/Charts/CombinedChartView.swift @@ -40,7 +40,7 @@ open class CombinedChartView: BarLineChartViewBase, CombinedChartDataProvider _fillFormatter = DefaultFillFormatter() - renderer = CombinedChartRenderer(chart: self, animator: _animator, viewPortHandler: _viewPortHandler) + renderer = CombinedChartRenderer(chart: self, animator: _animator, viewPortHandler: viewPortHandler) } open override var data: ChartData? @@ -231,7 +231,7 @@ open class CombinedChartView: BarLineChartViewBase, CombinedChartDataProvider let pos = getMarkerPosition(highlight: highlight) // check bounds - if !_viewPortHandler.isInBounds(x: pos.x, y: pos.y) + if !viewPortHandler.isInBounds(x: pos.x, y: pos.y) { continue } diff --git a/Source/Charts/Charts/HorizontalBarChartView.swift b/Source/Charts/Charts/HorizontalBarChartView.swift index 07c96f822b..26e4e4b735 100644 --- a/Source/Charts/Charts/HorizontalBarChartView.swift +++ b/Source/Charts/Charts/HorizontalBarChartView.swift @@ -23,13 +23,13 @@ open class HorizontalBarChartView: BarChartView { super.initialize() - _leftAxisTransformer = TransformerHorizontalBarChart(viewPortHandler: _viewPortHandler) - _rightAxisTransformer = TransformerHorizontalBarChart(viewPortHandler: _viewPortHandler) + _leftAxisTransformer = TransformerHorizontalBarChart(viewPortHandler: viewPortHandler) + _rightAxisTransformer = TransformerHorizontalBarChart(viewPortHandler: viewPortHandler) - renderer = HorizontalBarChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: _viewPortHandler) - leftYAxisRenderer = YAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, yAxis: leftAxis, transformer: _leftAxisTransformer) - rightYAxisRenderer = YAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, yAxis: rightAxis, transformer: _rightAxisTransformer) - xAxisRenderer = XAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, xAxis: xAxis, transformer: _leftAxisTransformer, chart: self) + renderer = HorizontalBarChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: viewPortHandler) + leftYAxisRenderer = YAxisRendererHorizontalBarChart(viewPortHandler: viewPortHandler, yAxis: leftAxis, transformer: _leftAxisTransformer) + rightYAxisRenderer = YAxisRendererHorizontalBarChart(viewPortHandler: viewPortHandler, yAxis: rightAxis, transformer: _rightAxisTransformer) + xAxisRenderer = XAxisRendererHorizontalBarChart(viewPortHandler: viewPortHandler, xAxis: xAxis, transformer: _leftAxisTransformer, chart: self) self.highlighter = HorizontalBarHighlighter(chart: self) } @@ -82,7 +82,7 @@ open class HorizontalBarChartView: BarChartView offsetBottom += self.extraBottomOffset offsetLeft += self.extraLeftOffset - _viewPortHandler.restrainViewPort( + viewPortHandler.restrainViewPort( offsetLeft: max(self.minOffset, offsetLeft), offsetTop: max(self.minOffset, offsetTop), offsetRight: max(self.minOffset, offsetRight), diff --git a/Source/Charts/Charts/LineChartView.swift b/Source/Charts/Charts/LineChartView.swift index c5fbecfacf..12f2463337 100644 --- a/Source/Charts/Charts/LineChartView.swift +++ b/Source/Charts/Charts/LineChartView.swift @@ -19,7 +19,7 @@ open class LineChartView: BarLineChartViewBase, LineChartDataProvider { super.initialize() - renderer = LineChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: _viewPortHandler) + renderer = LineChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: viewPortHandler) } // MARK: - LineChartDataProvider diff --git a/Source/Charts/Charts/PieChartView.swift b/Source/Charts/Charts/PieChartView.swift index 8e868eb88a..c44e7e5173 100644 --- a/Source/Charts/Charts/PieChartView.swift +++ b/Source/Charts/Charts/PieChartView.swift @@ -86,7 +86,7 @@ open class PieChartView: PieRadarChartViewBase { super.initialize() - renderer = PieChartRenderer(chart: self, animator: _animator, viewPortHandler: _viewPortHandler) + renderer = PieChartRenderer(chart: self, animator: _animator, viewPortHandler: viewPortHandler) self.highlighter = PieHighlighter(chart: self) } diff --git a/Source/Charts/Charts/PieRadarChartViewBase.swift b/Source/Charts/Charts/PieRadarChartViewBase.swift index 947dfb8405..889e8ef7c7 100755 --- a/Source/Charts/Charts/PieRadarChartViewBase.swift +++ b/Source/Charts/Charts/PieRadarChartViewBase.swift @@ -105,7 +105,7 @@ open class PieRadarChartViewBase: ChartViewBase if _legend.enabled && !_legend.drawInside { - let fullLegendWidth = min(_legend.neededWidth, _viewPortHandler.chartWidth * _legend.maxSizePercent) + let fullLegendWidth = min(_legend.neededWidth, viewPortHandler.chartWidth * _legend.maxSizePercent) switch _legend.orientation { @@ -171,10 +171,10 @@ open class PieRadarChartViewBase: ChartViewBase switch _legend.verticalAlignment { case .top: - legendTop = min(_legend.neededHeight, _viewPortHandler.chartHeight * _legend.maxSizePercent) + legendTop = min(_legend.neededHeight, viewPortHandler.chartHeight * _legend.maxSizePercent) case .bottom: - legendBottom = min(_legend.neededHeight, _viewPortHandler.chartHeight * _legend.maxSizePercent) + legendBottom = min(_legend.neededHeight, viewPortHandler.chartHeight * _legend.maxSizePercent) default: break @@ -195,7 +195,7 @@ open class PieRadarChartViewBase: ChartViewBase yLegendOffset = min( _legend.neededHeight + yOffset, - _viewPortHandler.chartHeight * _legend.maxSizePercent) + viewPortHandler.chartHeight * _legend.maxSizePercent) } switch _legend.verticalAlignment @@ -241,7 +241,7 @@ open class PieRadarChartViewBase: ChartViewBase let offsetRight = max(minOffset, legendRight) let offsetBottom = max(minOffset, max(self.requiredBaseOffset, legendBottom)) - _viewPortHandler.restrainViewPort(offsetLeft: offsetLeft, offsetTop: offsetTop, offsetRight: offsetRight, offsetBottom: offsetBottom) + viewPortHandler.restrainViewPort(offsetLeft: offsetLeft, offsetTop: offsetTop, offsetRight: offsetRight, offsetBottom: offsetBottom) } /// - returns: The angle relative to the chart center for the given point on the chart in degrees. @@ -351,7 +351,7 @@ open class PieRadarChartViewBase: ChartViewBase /// - returns: The diameter of the pie- or radar-chart @objc open var diameter: CGFloat { - var content = _viewPortHandler.contentRect + var content = viewPortHandler.contentRect content.origin.x += extraLeftOffset content.origin.y += extraTopOffset content.size.width -= extraLeftOffset + extraRightOffset diff --git a/Source/Charts/Charts/RadarChartView.swift b/Source/Charts/Charts/RadarChartView.swift index e72ff21034..c0bb45aa08 100644 --- a/Source/Charts/Charts/RadarChartView.swift +++ b/Source/Charts/Charts/RadarChartView.swift @@ -60,10 +60,10 @@ open class RadarChartView: PieRadarChartViewBase _yAxis = YAxis(position: .left) - renderer = RadarChartRenderer(chart: self, animator: _animator, viewPortHandler: _viewPortHandler) + renderer = RadarChartRenderer(chart: self, animator: _animator, viewPortHandler: viewPortHandler) - _yAxisRenderer = YAxisRendererRadarChart(viewPortHandler: _viewPortHandler, yAxis: _yAxis, chart: self) - _xAxisRenderer = XAxisRendererRadarChart(viewPortHandler: _viewPortHandler, xAxis: xAxis, chart: self) + _yAxisRenderer = YAxisRendererRadarChart(viewPortHandler: viewPortHandler, yAxis: _yAxis, chart: self) + _xAxisRenderer = XAxisRendererRadarChart(viewPortHandler: viewPortHandler, xAxis: xAxis, chart: self) self.highlighter = RadarHighlighter(chart: self) } @@ -148,7 +148,7 @@ open class RadarChartView: PieRadarChartViewBase /// - returns: The factor that is needed to transform values into pixels. @objc open var factor: CGFloat { - let content = _viewPortHandler.contentRect + let content = viewPortHandler.contentRect return min(content.width / 2.0, content.height / 2.0) / CGFloat(_yAxis.axisRange) } @@ -216,7 +216,7 @@ open class RadarChartView: PieRadarChartViewBase open override var radius: CGFloat { - let content = _viewPortHandler.contentRect + let content = viewPortHandler.contentRect return min(content.width / 2.0, content.height / 2.0) } diff --git a/Source/Charts/Charts/ScatterChartView.swift b/Source/Charts/Charts/ScatterChartView.swift index 22c710ad83..55d13a7118 100644 --- a/Source/Charts/Charts/ScatterChartView.swift +++ b/Source/Charts/Charts/ScatterChartView.swift @@ -19,7 +19,7 @@ open class ScatterChartView: BarLineChartViewBase, ScatterChartDataProvider { super.initialize() - renderer = ScatterChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: _viewPortHandler) + renderer = ScatterChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: viewPortHandler) xAxis.spaceMin = 0.5 xAxis.spaceMax = 0.5 From 8e53b3a83c26ce2e0a30925fa74fcf72f056bd73 Mon Sep 17 00:00:00 2001 From: Jacob Christie Date: Mon, 18 Dec 2017 08:02:43 -0400 Subject: [PATCH 10/15] Fixes for PR --- Source/Charts/Charts/ChartViewBase.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Source/Charts/Charts/ChartViewBase.swift b/Source/Charts/Charts/ChartViewBase.swift index 47e72df92c..a8b7b31a07 100644 --- a/Source/Charts/Charts/ChartViewBase.swift +++ b/Source/Charts/Charts/ChartViewBase.swift @@ -370,10 +370,10 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate /// null or an empty array to undo all highlighting. /// This should be used to programmatically highlight values. /// This method *will not* call the delegate. - @objc open func highlightValues(_ highs: [Highlight]) + @objc open func highlightValues(_ highs: [Highlight]?) { // set the indices to highlight - _indicesToHighlight = highs + _indicesToHighlight = highs ?? [] lastHighlighted = _indicesToHighlight.isEmpty ? nil @@ -480,7 +480,8 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate /// CandleStick-Chart. @objc open func getHighlightByTouchPoint(_ pt: CGPoint) -> Highlight? { - guard _data != nil else { + guard _data != nil else + { Swift.print("Can't select by touch. No data set.") return nil } From 27caae64bce88a15093133532f3c4af97995d294 Mon Sep 17 00:00:00 2001 From: Jacob Christie Date: Sun, 24 Dec 2017 08:15:07 -0400 Subject: [PATCH 11/15] Changes for PR review. --- Source/Charts/Charts/ChartViewBase.swift | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Source/Charts/Charts/ChartViewBase.swift b/Source/Charts/Charts/ChartViewBase.swift index a8b7b31a07..b737f2f3e3 100644 --- a/Source/Charts/Charts/ChartViewBase.swift +++ b/Source/Charts/Charts/ChartViewBase.swift @@ -375,10 +375,7 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate // set the indices to highlight _indicesToHighlight = highs ?? [] - lastHighlighted = _indicesToHighlight.isEmpty - ? nil - : _indicesToHighlight[0] - + lastHighlighted = _indicesToHighlight.first // redraw the chart setNeedsDisplay() @@ -455,6 +452,7 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate let h = high, let entry = _data?.entryForHighlight(h) else { + // If no highlight or entry, remove all highleted entries and notifgy delegate. high = nil _indicesToHighlight.removeAll(keepingCapacity: false) if callDelegate { From e5b401f32b7d27fc4513f4d29533080959a08a0a Mon Sep 17 00:00:00 2001 From: jjatie Date: Mon, 25 Dec 2017 22:40:36 -0400 Subject: [PATCH 12/15] Remove java interface convention (#2997) * Renamed `IMarker` to `Marker` following Swift API guidelines. * Renamed `IAxisValueFormatter` to `AxisValueFormatter` * Renamed `IFillFormatter` to `FillFormatter` * Renamed `IValueFormatter` to `ValueFormatter` * Renamed `IHighlighter` to `Highlighter` * Renamed `I*DataSet` to `*DataSetProtocol` to follow Swift API guidelines * Fixed naming of `LineRadarChartDataSetProtocol` and `RadarChartDataSetProtocol` from previous commit * Renamed "Interfaces" to "DataProviders" for clarity * Updated Demos to for new type naming --- Charts.xcodeproj/project.pbxproj | 150 +- .../ChartsDemo.xcodeproj/project.pbxproj | 2123 ++++++++--------- .../Objective-C/Components/XYMarkerView.swift | 4 +- .../Objective-C/DemoBaseViewController.m | 8 +- .../Demos/CandleStickChartViewController.m | 2 +- .../Demos/CombinedChartViewController.m | 8 +- .../Demos/CubicLineChartViewController.m | 12 +- .../Demos/LineChart1ViewController.m | 10 +- .../Demos/LineChart2ViewController.m | 10 +- .../Demos/LineChartFilledViewController.m | 4 +- .../Demos/LineChartTimeViewController.m | 10 +- .../Demos/MultipleLinesChartViewController.m | 8 +- .../NegativeStackedBarChartViewController.m | 4 +- .../PositiveNegativeBarChartViewController.m | 4 +- .../Demos/RadarChartViewController.m | 4 +- .../Formatters/DateValueFormatter.h | 2 +- .../Formatters/DayAxisValueFormatter.h | 2 +- .../Formatters/IntAxisValueFormatter.h | 2 +- .../Formatters/LargeValueFormatter.swift | 2 +- .../Swift/Components/XYMarkerView.swift | 4 +- .../Demos/CombinedChartViewController.swift | 2 +- .../Demos/CubicLineChartViewController.swift | 4 +- ...egativeStackedBarChartViewController.swift | 2 +- ...sitiveNegativeBarChartViewController.swift | 2 +- .../Demos/RadarChartViewController.swift | 2 +- .../Swift/Formatters/DateValueFormatter.swift | 2 +- .../Formatters/DayAxisValueFormatter.swift | 2 +- .../Formatters/IntAxisValueFormatter.swift | 2 +- .../Formatters/LargeValueFormatter.swift | 2 +- Source/Charts/Charts/BarChartView.swift | 2 +- .../Charts/Charts/BarLineChartViewBase.swift | 6 +- Source/Charts/Charts/ChartViewBase.swift | 8 +- Source/Charts/Charts/CombinedChartView.swift | 4 +- .../Charts/HorizontalBarChartView.swift | 2 +- .../Charts/Charts/PieRadarChartViewBase.swift | 0 Source/Charts/Components/AxisBase.swift | 4 +- .../{IMarker.swift => Marker.swift} | 10 +- Source/Charts/Components/MarkerImage.swift | 2 +- Source/Charts/Components/MarkerView.swift | 2 +- .../Implementations/ChartBaseDataSet.swift | 6 +- .../Standard/BarChartData.swift | 4 +- .../Standard/BarChartDataSet.swift | 2 +- .../BarLineScatterCandleBubbleChartData.swift | 2 +- ...rLineScatterCandleBubbleChartDataSet.swift | 2 +- .../Standard/BubbleChartData.swift | 4 +- .../Standard/BubbleChartDataSet.swift | 2 +- .../Standard/CandleChartData.swift | 2 +- .../Standard/CandleChartDataSet.swift | 2 +- .../Implementations/Standard/ChartData.swift | 40 +- .../Standard/CombinedChartData.swift | 6 +- .../Standard/LineChartData.swift | 2 +- .../Standard/LineChartDataSet.swift | 8 +- .../Standard/LineRadarChartDataSet.swift | 2 +- .../LineScatterCandleRadarChartDataSet.swift | 2 +- .../Standard/PieChartData.swift | 12 +- .../Standard/PieChartDataSet.swift | 2 +- .../Standard/RadarChartData.swift | 2 +- .../Standard/RadarChartDataSet.swift | 2 +- .../Standard/ScatterChartData.swift | 4 +- .../Standard/ScatterChartDataSet.swift | 2 +- ...et.swift => BarChartDataSetProtocol.swift} | 4 +- ...terCandleBubbleChartDataSetProtocol.swift} | 4 +- ...swift => BubbleChartDataSetProtocol.swift} | 4 +- ...swift => CandleChartDataSetProtocol.swift} | 4 +- ...taSet.swift => ChartDataSetProtocol.swift} | 6 +- ...t.swift => LineChartDataSetProtocol.swift} | 8 +- ...ft => LineRadarChartDataSetProtocol.swift} | 4 +- ...tterCandleRadarChartDataSetProtocol.swift} | 4 +- ...et.swift => PieChartDataSetProtocol.swift} | 4 +- ....swift => RadarChartDataSetProtocol.swift} | 4 +- ...wift => ScatterChartDataSetProtocol.swift} | 4 +- ...rmatter.swift => AxisValueFormatter.swift} | 6 +- .../DefaultAxisValueFormatter.swift | 2 +- .../Formatters/DefaultFillFormatter.swift | 6 +- .../Formatters/DefaultValueFormatter.swift | 2 +- ...illFormatter.swift => FillFormatter.swift} | 8 +- .../Formatters/IndexAxisValueFormatter.swift | 2 +- ...ueFormatter.swift => ValueFormatter.swift} | 6 +- Source/Charts/Highlight/BarHighlighter.swift | 4 +- .../Charts/Highlight/ChartHighlighter.swift | 4 +- .../{IHighlighter.swift => Highlighter.swift} | 6 +- .../Highlight/HorizontalBarHighlighter.swift | 4 +- .../Charts/Renderers/BarChartRenderer.swift | 16 +- .../BarLineScatterCandleBubbleRenderer.swift | 10 +- .../Renderers/BubbleChartRenderer.swift | 8 +- .../Renderers/CandleStickChartRenderer.swift | 8 +- .../HorizontalBarChartRenderer.swift | 8 +- Source/Charts/Renderers/LegendRenderer.swift | 16 +- .../Charts/Renderers/LineChartRenderer.swift | 26 +- .../LineScatterCandleRadarRenderer.swift | 2 +- .../Charts/Renderers/PieChartRenderer.swift | 10 +- .../Charts/Renderers/RadarChartRenderer.swift | 8 +- .../Scatter/ChevronDownShapeRenderer.swift | 2 +- .../Scatter/ChevronUpShapeRenderer.swift | 2 +- .../Scatter/CircleShapeRenderer.swift | 2 +- .../Scatter/CrossShapeRenderer.swift | 2 +- .../Renderers/Scatter/IShapeRenderer.swift | 2 +- .../Scatter/SquareShapeRenderer.swift | 2 +- .../Scatter/TriangleShapeRenderer.swift | 2 +- .../Renderers/Scatter/XShapeRenderer.swift | 2 +- .../Renderers/ScatterChartRenderer.swift | 12 +- Source/Charts/Utils/ChartUtils.swift | 6 +- 102 files changed, 1393 insertions(+), 1396 deletions(-) mode change 100755 => 100644 Source/Charts/Charts/PieRadarChartViewBase.swift rename Source/Charts/Components/{IMarker.swift => Marker.swift} (75%) rename Source/Charts/Data/Interfaces/{IBarChartDataSet.swift => BarChartDataSetProtocol.swift} (91%) rename Source/Charts/Data/Interfaces/{IBarLineScatterCandleBubbleChartDataSet.swift => BarLineScatterCandleBubbleChartDataSetProtocol.swift} (79%) rename Source/Charts/Data/Interfaces/{IBubbleChartDataSet.swift => BubbleChartDataSetProtocol.swift} (81%) rename Source/Charts/Data/Interfaces/{ICandleChartDataSet.swift => CandleChartDataSetProtocol.swift} (93%) rename Source/Charts/Data/Interfaces/{IChartDataSet.swift => ChartDataSetProtocol.swift} (98%) rename Source/Charts/Data/Interfaces/{ILineChartDataSet.swift => LineChartDataSetProtocol.swift} (88%) rename Source/Charts/Data/Interfaces/{ILineRadarChartDataSet.swift => LineRadarChartDataSetProtocol.swift} (90%) rename Source/Charts/Data/Interfaces/{ILineScatterCandleRadarChartDataSet.swift => LineScatterCandleRadarChartDataSetProtocol.swift} (87%) rename Source/Charts/Data/Interfaces/{IPieChartDataSet.swift => PieChartDataSetProtocol.swift} (95%) rename Source/Charts/Data/Interfaces/{IRadarChartDataSet.swift => RadarChartDataSetProtocol.swift} (90%) rename Source/Charts/Data/Interfaces/{IScatterChartDataSet.swift => ScatterChartDataSetProtocol.swift} (88%) rename Source/Charts/Formatters/{IAxisValueFormatter.swift => AxisValueFormatter.swift} (88%) rename Source/Charts/Formatters/{IFillFormatter.swift => FillFormatter.swift} (72%) rename Source/Charts/Formatters/{IValueFormatter.swift => ValueFormatter.swift} (93%) rename Source/Charts/Highlight/{IHighlighter.swift => Highlighter.swift} (84%) diff --git a/Charts.xcodeproj/project.pbxproj b/Charts.xcodeproj/project.pbxproj index f28679dde2..907d61fafd 100644 --- a/Charts.xcodeproj/project.pbxproj +++ b/Charts.xcodeproj/project.pbxproj @@ -10,7 +10,7 @@ 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 */; }; + 03960E8148C6AEDACE4B77CC /* Marker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 596963A429D485E3894C4666 /* Marker.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 */; }; @@ -19,14 +19,15 @@ 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 */; }; + 0D8A89398F9BD5DCC8D7F976 /* CandleChartDataSetProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18BFB0A14A5C47A302A597D9 /* CandleChartDataSetProtocol.swift */; }; 11F68AA2EBF822D7208EE002 /* YAxisRendererRadarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA5A16F4A382813C4FE8BDF9 /* YAxisRendererRadarChart.swift */; }; - 1311BEC21E9CC264E971EFAF /* ILineRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F7E6A99D82E6AE3804D5A39 /* ILineRadarChartDataSet.swift */; }; - 146EE16342C2BADC92E45BF2 /* ILineScatterCandleRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9249AD9AEC8C85772365A128 /* ILineScatterCandleRadarChartDataSet.swift */; }; + 1311BEC21E9CC264E971EFAF /* LineRadarChartDataSetProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F7E6A99D82E6AE3804D5A39 /* LineRadarChartDataSetProtocol.swift */; }; + 146EE16342C2BADC92E45BF2 /* LineScatterCandleRadarChartDataSetProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9249AD9AEC8C85772365A128 /* LineScatterCandleRadarChartDataSetProtocol.swift */; }; 17E994DA88777AA1D8CCFC58 /* BarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C31AA65EA27776F8C653C7E8 /* BarChartDataSet.swift */; }; - 203A39685CC96FC625F616E4 /* IHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 998F2BFE318471AFC05B50AC /* IHighlighter.swift */; }; + 203A39685CC96FC625F616E4 /* Highlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 998F2BFE318471AFC05B50AC /* Highlighter.swift */; }; 219192CA6B4895319AB49DCA /* BarLineScatterCandleBubbleRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B1C588E9DF6FFD56D7ADF8E /* BarLineScatterCandleBubbleRenderer.swift */; }; - 224EFF991FBAAC4700CF9B3B /* EquatableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 224EFF981FBAAC4700CF9B3B /* EquatableTests.swift */; }; + 2243BBFD1FF156EC00B49D0B /* EquatableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2243BBFB1FF156D000B49D0B /* EquatableTests.swift */; }; + 224EFF991FBAAC4700CF9B3B /* (null) in Sources */ = {isa = PBXBuildFile; }; 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 */; }; @@ -37,7 +38,7 @@ 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 */; }; + 2C40CFFC8D88BEA70E0A50B0 /* BubbleChartDataSetProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3788EC55EF908B0805D7C2F /* BubbleChartDataSetProtocol.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 */; }; @@ -57,7 +58,7 @@ 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 */; }; + 50476F8E6662CAFC1EFE0723 /* ScatterChartDataSetProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 219BC9CEA037F897E92E45D1 /* ScatterChartDataSetProtocol.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 */; }; @@ -84,7 +85,7 @@ 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 */; }; + 83BBAF3EDC31FD452F8BF1DB /* RadarChartDataSetProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EAD807534620E3B53327F04 /* RadarChartDataSetProtocol.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 */; }; @@ -101,15 +102,15 @@ 98E2EEF45E8933E4AD182D58 /* ChartViewBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EFAD7920F76360ADB3B5F5 /* ChartViewBase.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 */; }; + A40ACF0CCE96EEE104B0463D /* ValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EAA8AA30C377D54D22A577A /* ValueFormatter.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 */; }; + AF4AAF3709ED9DDF6362EAE8 /* BarLineScatterCandleBubbleChartDataSetProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5649B272BF3EBFC8A1EF0C1 /* BarLineScatterCandleBubbleChartDataSetProtocol.swift */; }; B0D28C68BB9A958DC56EB214 /* DefaultValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 107D8F8163EE54D6D9E916B0 /* DefaultValueFormatter.swift */; }; - B13C74B4FF705D7B595D01EF /* IAxisValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BD9DF16AF59680A3BB49452 /* IAxisValueFormatter.swift */; }; + B13C74B4FF705D7B595D01EF /* AxisValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BD9DF16AF59680A3BB49452 /* AxisValueFormatter.swift */; }; B539114951455C35BADAE3F3 /* PieChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4FB5E3761EF8B4D1E1E1014 /* PieChartDataSet.swift */; }; B6BF9A561F91993A00E62A5D /* CombinedChartTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6BF9A551F91993A00E62A5D /* CombinedChartTests.swift */; }; - B6C9F450D937B87224D29D5C /* IFillFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 818AC6B12505B7C0A53D62F9 /* IFillFormatter.swift */; }; + B6C9F450D937B87224D29D5C /* FillFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 818AC6B12505B7C0A53D62F9 /* FillFormatter.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, ); }; }; @@ -118,7 +119,7 @@ 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 */; }; + C3F0DDB7F0A922F0BB7EDB8A /* BarChartDataSetProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A53A9E42FC07FFDACA937C1 /* BarChartDataSetProtocol.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 */; }; @@ -134,7 +135,7 @@ 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 */; }; + E8F0F4F47CD7D72B4EE5A794 /* ChartDataSetProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A32510073A303CBB38E094A /* ChartDataSetProtocol.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 */; }; @@ -145,9 +146,9 @@ 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 */; }; + F941C88BF814DF51C465CB95 /* LineChartDataSetProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 429E88F2729735DC092EE556 /* LineChartDataSetProtocol.swift */; }; FA07D034D9C3BC7795184ACA /* LineScatterCandleRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C58BD7B14BEA440783ED8D2B /* LineScatterCandleRadarChartDataSet.swift */; }; - FAAD9FF6565DED2652188584 /* IPieChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2AA6CC89F809DCCD7605B4 /* IPieChartDataSet.swift */; }; + FAAD9FF6565DED2652188584 /* PieChartDataSetProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2AA6CC89F809DCCD7605B4 /* PieChartDataSetProtocol.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 */ @@ -168,7 +169,7 @@ 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 = ""; }; + 0BD9DF16AF59680A3BB49452 /* AxisValueFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AxisValueFormatter.swift; path = Source/Charts/Formatters/AxisValueFormatter.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 = ""; }; @@ -178,19 +179,19 @@ 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 = ""; }; 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 = ""; }; + 18BFB0A14A5C47A302A597D9 /* CandleChartDataSetProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleChartDataSetProtocol.swift; path = Source/Charts/Data/Interfaces/CandleChartDataSetProtocol.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 = ""; }; + 219BC9CEA037F897E92E45D1 /* ScatterChartDataSetProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScatterChartDataSetProtocol.swift; path = Source/Charts/Data/Interfaces/ScatterChartDataSetProtocol.swift; sourceTree = ""; }; + 2243BBFB1FF156D000B49D0B /* EquatableTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; 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 = ""; }; + 2EAD807534620E3B53327F04 /* RadarChartDataSetProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarChartDataSetProtocol.swift; path = Source/Charts/Data/Interfaces/RadarChartDataSetProtocol.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 = ""; }; @@ -198,13 +199,13 @@ 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 = ""; }; + 3A32510073A303CBB38E094A /* ChartDataSetProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartDataSetProtocol.swift; path = Source/Charts/Data/Interfaces/ChartDataSetProtocol.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 = ""; }; + 429E88F2729735DC092EE556 /* LineChartDataSetProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineChartDataSetProtocol.swift; path = Source/Charts/Data/Interfaces/LineChartDataSetProtocol.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 = ""; }; @@ -214,16 +215,16 @@ 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 = ""; }; + 4EAA8AA30C377D54D22A577A /* ValueFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ValueFormatter.swift; path = Source/Charts/Formatters/ValueFormatter.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 = ""; }; + 4F7E6A99D82E6AE3804D5A39 /* LineRadarChartDataSetProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineRadarChartDataSetProtocol.swift; path = Source/Charts/Data/Interfaces/LineRadarChartDataSetProtocol.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 = ""; }; + 596963A429D485E3894C4666 /* Marker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Marker.swift; path = Source/Charts/Components/Marker.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 = ""; }; @@ -241,26 +242,26 @@ 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 = ""; }; + 7A53A9E42FC07FFDACA937C1 /* BarChartDataSetProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartDataSetProtocol.swift; path = Source/Charts/Data/Interfaces/BarChartDataSetProtocol.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 = ""; }; + 818AC6B12505B7C0A53D62F9 /* FillFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FillFormatter.swift; path = Source/Charts/Formatters/FillFormatter.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 = ""; }; + 9249AD9AEC8C85772365A128 /* LineScatterCandleRadarChartDataSetProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineScatterCandleRadarChartDataSetProtocol.swift; path = Source/Charts/Data/Interfaces/LineScatterCandleRadarChartDataSetProtocol.swift; sourceTree = ""; }; 93EF9709CF635BEE70D1ABC5 /* DataApproximator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataApproximator.swift; path = Source/Charts/Filters/DataApproximator.swift; sourceTree = ""; }; - 998F2BFE318471AFC05B50AC /* IHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IHighlighter.swift; path = Source/Charts/Highlight/IHighlighter.swift; sourceTree = ""; }; + 998F2BFE318471AFC05B50AC /* Highlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Highlighter.swift; path = Source/Charts/Highlight/Highlighter.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 = ""; }; + A5649B272BF3EBFC8A1EF0C1 /* BarLineScatterCandleBubbleChartDataSetProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarLineScatterCandleBubbleChartDataSetProtocol.swift; path = Source/Charts/Data/Interfaces/BarLineScatterCandleBubbleChartDataSetProtocol.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 = ""; }; @@ -286,7 +287,7 @@ 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 = ""; }; + DA2AA6CC89F809DCCD7605B4 /* PieChartDataSetProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieChartDataSetProtocol.swift; path = Source/Charts/Data/Interfaces/PieChartDataSetProtocol.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 = ""; }; @@ -299,7 +300,7 @@ 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 = ""; }; + F3788EC55EF908B0805D7C2F /* BubbleChartDataSetProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartDataSetProtocol.swift; path = Source/Charts/Data/Interfaces/BubbleChartDataSetProtocol.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 = ""; }; @@ -330,7 +331,7 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 031D7C33F3BF172E30664862 /* Interfaces */ = { + 031D7C33F3BF172E30664862 /* DataProviders */ = { isa = PBXGroup; children = ( 9D7184C8A5A60A3522AB9B05 /* BarChartDataProvider.swift */, @@ -342,7 +343,7 @@ BFABD027DAF6851088F002AC /* LineChartDataProvider.swift */, 2FD37A55B4D85D883E29C744 /* ScatterChartDataProvider.swift */, ); - name = Interfaces; + name = DataProviders; sourceTree = ""; }; 033FD152BB2F906750106A85 /* Frameworks */ = { @@ -356,7 +357,7 @@ isa = PBXGroup; children = ( 3B9DD76FCE8D873300A822C7 /* Implementations */, - DB2D9648877455028EBEAA8F /* Interfaces */, + DB2D9648877455028EBEAA8F /* DataSet Protocols */, ); name = Data; sourceTree = ""; @@ -380,7 +381,7 @@ AA79AB82B0ADCA926510B73E /* Filters */, 74A391010038924F637D6752 /* Formatters */, 42824E1F334B0C484AF4C594 /* Highlight */, - 031D7C33F3BF172E30664862 /* Interfaces */, + 031D7C33F3BF172E30664862 /* DataProviders */, AD1224C45A29A5C88D6B7450 /* Jobs */, E7589D3E7C2BD2449960AD59 /* Renderers */, D047819AB7170595896D6FE8 /* Utils */, @@ -405,7 +406,7 @@ 2465CB73738EBAFB46C57288 /* CombinedHighlighter.swift */, 3D64616883374310C505EC39 /* Highlight.swift */, 33BE9A97FFA41D3D85CAFFC7 /* HorizontalBarHighlighter.swift */, - 998F2BFE318471AFC05B50AC /* IHighlighter.swift */, + 998F2BFE318471AFC05B50AC /* Highlighter.swift */, 7036F11832C017E26AC750A4 /* PieHighlighter.swift */, 04F7B9DF1F2D66E7279771D4 /* PieRadarHighlighter.swift */, F368CF209744D8F3B85B1028 /* RadarHighlighter.swift */, @@ -421,7 +422,7 @@ F6DEBFAB1D73E944ED430B4F /* ChartLimitLine.swift */, C8C9A105A7DB64F39DDA648B /* ComponentBase.swift */, B137428B41C143D5115726C4 /* Description.swift */, - 596963A429D485E3894C4666 /* IMarker.swift */, + 596963A429D485E3894C4666 /* Marker.swift */, E64A75540C627E09080B402A /* Legend.swift */, 9E7C673B9ED4340F550A9283 /* LegendEntry.swift */, 392AAEB02DD7B351D92907C2 /* MarkerImage.swift */, @@ -473,10 +474,10 @@ 6A4770E0F75EFFC30707A7C8 /* DefaultAxisValueFormatter.swift */, D6C1BEFDF17404666C7B6054 /* DefaultFillFormatter.swift */, 107D8F8163EE54D6D9E916B0 /* DefaultValueFormatter.swift */, - 0BD9DF16AF59680A3BB49452 /* IAxisValueFormatter.swift */, - 818AC6B12505B7C0A53D62F9 /* IFillFormatter.swift */, + 0BD9DF16AF59680A3BB49452 /* AxisValueFormatter.swift */, + 818AC6B12505B7C0A53D62F9 /* FillFormatter.swift */, 10DD0A02E3CF611BD11EBA9B /* IndexAxisValueFormatter.swift */, - 4EAA8AA30C377D54D22A577A /* IValueFormatter.swift */, + 4EAA8AA30C377D54D22A577A /* ValueFormatter.swift */, ); name = Formatters; sourceTree = ""; @@ -514,9 +515,9 @@ isa = PBXGroup; children = ( 5C3F5E1A69EC06E86505F7B1 /* BarChartTests.swift */, - 224EFF981FBAAC4700CF9B3B /* EquatableTests.swift */, 7AB9062A28AAB9469752A954 /* ChartUtilsTests.swift */, B6BF9A551F91993A00E62A5D /* CombinedChartTests.swift */, + 2243BBFB1FF156D000B49D0B /* EquatableTests.swift */, D2E1819D72CD7B6C4A4E8048 /* LineChartTests.swift */, 064989451F5C99C7006E8BB3 /* Snapshot.swift */, ); @@ -594,22 +595,22 @@ name = Tests; sourceTree = ""; }; - DB2D9648877455028EBEAA8F /* Interfaces */ = { + DB2D9648877455028EBEAA8F /* DataSet Protocols */ = { 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 */, + 7A53A9E42FC07FFDACA937C1 /* BarChartDataSetProtocol.swift */, + A5649B272BF3EBFC8A1EF0C1 /* BarLineScatterCandleBubbleChartDataSetProtocol.swift */, + F3788EC55EF908B0805D7C2F /* BubbleChartDataSetProtocol.swift */, + 18BFB0A14A5C47A302A597D9 /* CandleChartDataSetProtocol.swift */, + 3A32510073A303CBB38E094A /* ChartDataSetProtocol.swift */, + 429E88F2729735DC092EE556 /* LineChartDataSetProtocol.swift */, + 4F7E6A99D82E6AE3804D5A39 /* LineRadarChartDataSetProtocol.swift */, + 9249AD9AEC8C85772365A128 /* LineScatterCandleRadarChartDataSetProtocol.swift */, + DA2AA6CC89F809DCCD7605B4 /* PieChartDataSetProtocol.swift */, + 2EAD807534620E3B53327F04 /* RadarChartDataSetProtocol.swift */, + 219BC9CEA037F897E92E45D1 /* ScatterChartDataSetProtocol.swift */, ); - name = Interfaces; + name = "DataSet Protocols"; sourceTree = ""; }; E7589D3E7C2BD2449960AD59 /* Renderers */ = { @@ -824,7 +825,7 @@ 4390D74986A92DEF4F4F2BF0 /* ChartLimitLine.swift in Sources */, FDBDAFA7A5337C6E3992DACE /* ComponentBase.swift in Sources */, DBC9DB402CC9BB84B76968C4 /* Description.swift in Sources */, - 03960E8148C6AEDACE4B77CC /* IMarker.swift in Sources */, + 03960E8148C6AEDACE4B77CC /* Marker.swift in Sources */, ECE7EAE7179A7F57CE9BBD8F /* Legend.swift in Sources */, C20A62D8CB9120523D5FB650 /* LegendEntry.swift in Sources */, 369DEB23452CB436A3A1A644 /* MarkerImage.swift in Sources */, @@ -860,31 +861,31 @@ E3B28EA1E21279DF3889BCE8 /* RadarChartDataSet.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 */, + C3F0DDB7F0A922F0BB7EDB8A /* BarChartDataSetProtocol.swift in Sources */, + AF4AAF3709ED9DDF6362EAE8 /* BarLineScatterCandleBubbleChartDataSetProtocol.swift in Sources */, + 2C40CFFC8D88BEA70E0A50B0 /* BubbleChartDataSetProtocol.swift in Sources */, + 0D8A89398F9BD5DCC8D7F976 /* CandleChartDataSetProtocol.swift in Sources */, + E8F0F4F47CD7D72B4EE5A794 /* ChartDataSetProtocol.swift in Sources */, + F941C88BF814DF51C465CB95 /* LineChartDataSetProtocol.swift in Sources */, + 1311BEC21E9CC264E971EFAF /* LineRadarChartDataSetProtocol.swift in Sources */, + 146EE16342C2BADC92E45BF2 /* LineScatterCandleRadarChartDataSetProtocol.swift in Sources */, + FAAD9FF6565DED2652188584 /* PieChartDataSetProtocol.swift in Sources */, + 83BBAF3EDC31FD452F8BF1DB /* RadarChartDataSetProtocol.swift in Sources */, + 50476F8E6662CAFC1EFE0723 /* ScatterChartDataSetProtocol.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 */, + B13C74B4FF705D7B595D01EF /* AxisValueFormatter.swift in Sources */, + B6C9F450D937B87224D29D5C /* FillFormatter.swift in Sources */, 967EE2EDDE3337C5C4337C59 /* IndexAxisValueFormatter.swift in Sources */, - A40ACF0CCE96EEE104B0463D /* IValueFormatter.swift in Sources */, + A40ACF0CCE96EEE104B0463D /* ValueFormatter.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 */, + 203A39685CC96FC625F616E4 /* Highlighter.swift in Sources */, 73EDF662AD989E930D365B72 /* PieHighlighter.swift in Sources */, 3097296AC7FFA994FE4AD312 /* PieRadarHighlighter.swift in Sources */, C33E1AF5471A60BA42DAF52E /* RadarHighlighter.swift in Sources */, @@ -950,9 +951,10 @@ 3B11556EB7DC034E2FC958E4 /* BarChartTests.swift in Sources */, 8E1192F7A7152E9DA92C56A9 /* ChartUtilsTests.swift in Sources */, B6BF9A561F91993A00E62A5D /* CombinedChartTests.swift in Sources */, + 2243BBFD1FF156EC00B49D0B /* EquatableTests.swift in Sources */, 2BF85BEA981B359A65E9BF67 /* LineChartTests.swift in Sources */, 064989461F5C99C7006E8BB3 /* Snapshot.swift in Sources */, - 224EFF991FBAAC4700CF9B3B /* EquatableTests.swift in Sources */, + 224EFF991FBAAC4700CF9B3B /* (null) in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ChartsDemo/ChartsDemo.xcodeproj/project.pbxproj b/ChartsDemo/ChartsDemo.xcodeproj/project.pbxproj index 28674b1c25..6b834aab14 100644 --- a/ChartsDemo/ChartsDemo.xcodeproj/project.pbxproj +++ b/ChartsDemo/ChartsDemo.xcodeproj/project.pbxproj @@ -1,1109 +1,1104 @@ // !$*UTF8*$! { - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { + 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 */; }; + 0439A3541C9FF95F00496F83 /* PiePolylineChartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0439A3521C9FF95F00496F83 /* PiePolylineChartViewController.m */; }; + 0471CBFC1CA1090A00E52DBC /* PiePolylineChartViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0471CBFB1CA1090A00E52DBC /* PiePolylineChartViewController.xib */; }; + 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; - }; + 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; + }; + 225B368E1F6EBBB00005B3D5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0630AE391D8126C0008859B0 /* Charts.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = A58A4ED274A941CA248EA921; + remoteInfo = Charts; + }; + 22A4867B1FBA6D7000EC9A0F /* 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; - }; + 225B36901F6EBBB10005B3D5 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 225B368D1F6EBBB00005B3D5 /* 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-Swift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ChartsDemo-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.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ChartsDemo.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 = ""; }; + 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-Swift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ChartsDemo-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.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ChartsDemo.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; - }; + 225B361A1F6EB9A50005B3D5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 225B368C1F6EBBB00005B3D5 /* Charts.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5B57BBAC1A9B26AA0036A6CC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 22A486791FBA6D7000EC9A0F /* 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.app */, - 225B361D1F6EB9A50005B3D5 /* ChartsDemo-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 = ""; - }; + 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.app */, + 225B361D1F6EB9A50005B3D5 /* ChartsDemo-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-Swift */ = { - isa = PBXNativeTarget; - buildConfigurationList = 225B362C1F6EB9A50005B3D5 /* Build configuration list for PBXNativeTarget "ChartsDemo-Swift" */; - buildPhases = ( - 225B36191F6EB9A50005B3D5 /* Sources */, - 225B361A1F6EB9A50005B3D5 /* Frameworks */, - 225B361B1F6EB9A50005B3D5 /* Resources */, - 225B36901F6EBBB10005B3D5 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 225B368F1F6EBBB00005B3D5 /* PBXTargetDependency */, - ); - name = "ChartsDemo-Swift"; - productName = "ChartsDemo-Swift"; - productReference = 225B361D1F6EB9A50005B3D5 /* ChartsDemo-Swift.app */; - productType = "com.apple.product-type.application"; - }; - 5B57BBAE1A9B26AA0036A6CC /* ChartsDemo */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5B57BBD21A9B26AA0036A6CC /* Build configuration list for PBXNativeTarget "ChartsDemo" */; - buildPhases = ( - 5B57BBAB1A9B26AA0036A6CC /* Sources */, - 5B57BBAC1A9B26AA0036A6CC /* Frameworks */, - 5B57BBAD1A9B26AA0036A6CC /* Resources */, - 5BB4B0751ACA710D00E2EF4D /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 0630AE541D81271B008859B0 /* PBXTargetDependency */, - ); - name = ChartsDemo; - productName = chartstest; - productReference = 5B57BBAF1A9B26AA0036A6CC /* ChartsDemo.app */; - productType = "com.apple.product-type.application"; - }; + 225B361C1F6EB9A50005B3D5 /* ChartsDemo-Swift */ = { + isa = PBXNativeTarget; + buildConfigurationList = 225B362C1F6EB9A50005B3D5 /* Build configuration list for PBXNativeTarget "ChartsDemo-Swift" */; + buildPhases = ( + 225B36191F6EB9A50005B3D5 /* Sources */, + 225B361A1F6EB9A50005B3D5 /* Frameworks */, + 225B361B1F6EB9A50005B3D5 /* Resources */, + 225B36901F6EBBB10005B3D5 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 225B368F1F6EBBB00005B3D5 /* PBXTargetDependency */, + ); + name = "ChartsDemo-Swift"; + productName = "ChartsDemo-Swift"; + productReference = 225B361D1F6EB9A50005B3D5 /* ChartsDemo-Swift.app */; + productType = "com.apple.product-type.application"; + }; + 5B57BBAE1A9B26AA0036A6CC /* ChartsDemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5B57BBD21A9B26AA0036A6CC /* Build configuration list for PBXNativeTarget "ChartsDemo" */; + buildPhases = ( + 5B57BBAB1A9B26AA0036A6CC /* Sources */, + 5B57BBAC1A9B26AA0036A6CC /* Frameworks */, + 5B57BBAD1A9B26AA0036A6CC /* Resources */, + 22A4867D1FBA6D7100EC9A0F /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 22A4867C1FBA6D7000EC9A0F /* PBXTargetDependency */, + ); + name = ChartsDemo; + productName = chartstest; + productReference = 5B57BBAF1A9B26AA0036A6CC /* ChartsDemo.app */; + productType = "com.apple.product-type.application"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 5B57BBA71A9B26AA0036A6CC /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftMigration = 0700; - LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0900; - ORGANIZATIONNAME = dcg; - TargetAttributes = { - 225B361C1F6EB9A50005B3D5 = { - CreatedOnToolsVersion = 9.0; - }; - 5B57BBAE1A9B26AA0036A6CC = { - CreatedOnToolsVersion = 6.1.1; - LastSwiftMigration = 0900; - ProvisioningStyle = Manual; - }; - }; - }; - buildConfigurationList = 5B57BBAA1A9B26AA0036A6CC /* Build configuration list for PBXProject "ChartsDemo" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5B57BBA61A9B26AA0036A6CC; - productRefGroup = 5B57BBB01A9B26AA0036A6CC /* Products */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 0630AE3A1D8126C0008859B0 /* Products */; - ProjectRef = 0630AE391D8126C0008859B0 /* Charts.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 5B57BBAE1A9B26AA0036A6CC /* ChartsDemo */, - 225B361C1F6EB9A50005B3D5 /* ChartsDemo-Swift */, - ); - }; + 5B57BBA71A9B26AA0036A6CC /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftMigration = 0700; + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 0900; + ORGANIZATIONNAME = dcg; + TargetAttributes = { + 225B361C1F6EB9A50005B3D5 = { + CreatedOnToolsVersion = 9.0; + }; + 5B57BBAE1A9B26AA0036A6CC = { + CreatedOnToolsVersion = 6.1.1; + LastSwiftMigration = 0900; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 5B57BBAA1A9B26AA0036A6CC /* Build configuration list for PBXProject "ChartsDemo" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 5B57BBA61A9B26AA0036A6CC; + productRefGroup = 5B57BBB01A9B26AA0036A6CC /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 0630AE3A1D8126C0008859B0 /* Products */; + ProjectRef = 0630AE391D8126C0008859B0 /* Charts.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 5B57BBAE1A9B26AA0036A6CC /* ChartsDemo */, + 225B361C1F6EB9A50005B3D5 /* ChartsDemo-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; - }; + 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; - }; + 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; - }; + 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 */; - }; + 225B368F1F6EBBB00005B3D5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Charts; + targetProxy = 225B368E1F6EBBB00005B3D5 /* PBXContainerItemProxy */; + }; + 22A4867C1FBA6D7000EC9A0F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Charts; + targetProxy = 22A4867B1FBA6D7000EC9A0F /* 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 = 4.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 = 4.0; - TARGETED_DEVICE_FAMILY = 1; - }; - name = Release; - }; - 5B57BBD01A9B26AA0036A6CC /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - 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_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_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 = 8.2; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 5B57BBD11A9B26AA0036A6CC /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - 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_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_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 = 8.2; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - 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; - 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 = 4.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; - 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 = 4.0; - }; - name = Release; - }; + 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 = 4.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 = 4.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; + 5B57BBD01A9B26AA0036A6CC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + 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_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_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 = 8.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 5B57BBD11A9B26AA0036A6CC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + 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_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_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 = 8.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + 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; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = ""; + 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; + PROVISIONING_PROFILE_SPECIFIER = ""; + 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 = 4.0; + }; + name = Debug; + }; + 5B57BBD41A9B26AA0036A6CC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = ""; + 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; + PROVISIONING_PROFILE_SPECIFIER = ""; + 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 = 4.0; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 225B362C1F6EB9A50005B3D5 /* Build configuration list for PBXNativeTarget "ChartsDemo-Swift" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 225B362D1F6EB9A50005B3D5 /* Debug */, - 225B362E1F6EB9A50005B3D5 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5B57BBAA1A9B26AA0036A6CC /* Build configuration list for PBXProject "ChartsDemo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5B57BBD01A9B26AA0036A6CC /* Debug */, - 5B57BBD11A9B26AA0036A6CC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5B57BBD21A9B26AA0036A6CC /* Build configuration list for PBXNativeTarget "ChartsDemo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5B57BBD31A9B26AA0036A6CC /* Debug */, - 5B57BBD41A9B26AA0036A6CC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; + 225B362C1F6EB9A50005B3D5 /* Build configuration list for PBXNativeTarget "ChartsDemo-Swift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 225B362D1F6EB9A50005B3D5 /* Debug */, + 225B362E1F6EB9A50005B3D5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5B57BBAA1A9B26AA0036A6CC /* Build configuration list for PBXProject "ChartsDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5B57BBD01A9B26AA0036A6CC /* Debug */, + 5B57BBD11A9B26AA0036A6CC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5B57BBD21A9B26AA0036A6CC /* Build configuration list for PBXNativeTarget "ChartsDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5B57BBD31A9B26AA0036A6CC /* Debug */, + 5B57BBD41A9B26AA0036A6CC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ - }; - rootObject = 5B57BBA71A9B26AA0036A6CC /* Project object */; + }; + rootObject = 5B57BBA71A9B26AA0036A6CC /* Project object */; } diff --git a/ChartsDemo/Objective-C/Components/XYMarkerView.swift b/ChartsDemo/Objective-C/Components/XYMarkerView.swift index bc77c82206..9826dbbcf6 100644 --- a/ChartsDemo/Objective-C/Components/XYMarkerView.swift +++ b/ChartsDemo/Objective-C/Components/XYMarkerView.swift @@ -9,11 +9,11 @@ import Charts open class XYMarkerView: BalloonMarker { - @objc open var xAxisValueFormatter: IAxisValueFormatter? + @objc open var xAxisValueFormatter: AxisValueFormatter? fileprivate var yFormatter = NumberFormatter() @objc public init(color: UIColor, font: UIFont, textColor: UIColor, insets: UIEdgeInsets, - xAxisValueFormatter: IAxisValueFormatter) + xAxisValueFormatter: AxisValueFormatter) { super.init(color: color, font: font, textColor: textColor, insets: insets) self.xAxisValueFormatter = xAxisValueFormatter diff --git a/ChartsDemo/Objective-C/DemoBaseViewController.m b/ChartsDemo/Objective-C/DemoBaseViewController.m index c5908a844c..26cc0c7369 100644 --- a/ChartsDemo/Objective-C/DemoBaseViewController.m +++ b/ChartsDemo/Objective-C/DemoBaseViewController.m @@ -75,7 +75,7 @@ - (void)handleOption:(NSString *)key forChartView:(ChartViewBase *)chartView { if ([key isEqualToString:@"toggleValues"]) { - for (id set in chartView.data.dataSets) + for (id set in chartView.data.dataSets) { set.drawValuesEnabled = !set.isDrawValuesEnabled; } @@ -85,7 +85,7 @@ - (void)handleOption:(NSString *)key forChartView:(ChartViewBase *)chartView if ([key isEqualToString:@"toggleIcons"]) { - for (id set in chartView.data.dataSets) + for (id set in chartView.data.dataSets) { set.drawIconsEnabled = !set.isDrawIconsEnabled; } @@ -143,9 +143,9 @@ - (void)handleOption:(NSString *)key forChartView:(ChartViewBase *)chartView if ([key isEqualToString:@"toggleBarBorders"]) { - for (id set in chartView.data.dataSets) + for (id set in chartView.data.dataSets) { - if ([set conformsToProtocol:@protocol(IBarChartDataSet)]) + if ([set conformsToProtocol:@protocol(BarChartDataSetProtocol)]) { set.barBorderWidth = set.barBorderWidth == 1.0 ? 0.0 : 1.0; } diff --git a/ChartsDemo/Objective-C/Demos/CandleStickChartViewController.m b/ChartsDemo/Objective-C/Demos/CandleStickChartViewController.m index 2fe219de28..b1fb82346d 100644 --- a/ChartsDemo/Objective-C/Demos/CandleStickChartViewController.m +++ b/ChartsDemo/Objective-C/Demos/CandleStickChartViewController.m @@ -127,7 +127,7 @@ - (void)optionTapped:(NSString *)key { if ([key isEqualToString:@"toggleShadowColorSameAsCandle"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.shadowColorSameAsCandle = !set.shadowColorSameAsCandle; } diff --git a/ChartsDemo/Objective-C/Demos/CombinedChartViewController.m b/ChartsDemo/Objective-C/Demos/CombinedChartViewController.m index c0eb2fa2a4..4605c0e7fa 100644 --- a/ChartsDemo/Objective-C/Demos/CombinedChartViewController.m +++ b/ChartsDemo/Objective-C/Demos/CombinedChartViewController.m @@ -14,7 +14,7 @@ #define ITEM_COUNT 12 -@interface CombinedChartViewController () +@interface CombinedChartViewController () { NSArray *months; } @@ -122,7 +122,7 @@ - (void)optionTapped:(NSString *)key { if ([key isEqualToString:@"toggleLineValues"]) { - for (NSObject *set in _chartView.data.dataSets) + for (NSObject *set in _chartView.data.dataSets) { if ([set isKindOfClass:LineChartDataSet.class]) { @@ -136,7 +136,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleBarValues"]) { - for (NSObject *set in _chartView.data.dataSets) + for (NSObject *set in _chartView.data.dataSets) { if ([set isKindOfClass:BarChartDataSet.class]) { @@ -313,7 +313,7 @@ - (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView NSLog(@"chartValueNothingSelected"); } -#pragma mark - IAxisValueFormatter +#pragma mark - AxisValueFormatter - (NSString *)stringForValue:(double)value axis:(ChartAxisBase *)axis diff --git a/ChartsDemo/Objective-C/Demos/CubicLineChartViewController.m b/ChartsDemo/Objective-C/Demos/CubicLineChartViewController.m index d434898479..ffea9de365 100644 --- a/ChartsDemo/Objective-C/Demos/CubicLineChartViewController.m +++ b/ChartsDemo/Objective-C/Demos/CubicLineChartViewController.m @@ -12,7 +12,7 @@ #import "CubicLineChartViewController.h" #import "ChartsDemo-Swift.h" -@interface CubicLineSampleFillFormatter : NSObject +@interface CubicLineSampleFillFormatter : NSObject { } @end @@ -158,7 +158,7 @@ - (void)optionTapped:(NSString *)key { if ([key isEqualToString:@"toggleFilled"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.drawFilledEnabled = !set.isDrawFilledEnabled; } @@ -169,7 +169,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleCircles"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.drawCirclesEnabled = !set.isDrawCirclesEnabled; } @@ -180,7 +180,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleCubic"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.mode = set.mode == LineChartModeCubicBezier ? LineChartModeLinear : LineChartModeCubicBezier; } @@ -191,7 +191,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleStepped"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.mode = set.mode == LineChartModeStepped ? LineChartModeLinear : LineChartModeStepped; } @@ -201,7 +201,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleHorizontalCubic"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.mode = set.mode == LineChartModeCubicBezier ? LineChartModeHorizontalBezier : LineChartModeCubicBezier; } diff --git a/ChartsDemo/Objective-C/Demos/LineChart1ViewController.m b/ChartsDemo/Objective-C/Demos/LineChart1ViewController.m index 8cf348c759..37b8ee2c83 100644 --- a/ChartsDemo/Objective-C/Demos/LineChart1ViewController.m +++ b/ChartsDemo/Objective-C/Demos/LineChart1ViewController.m @@ -192,7 +192,7 @@ - (void)optionTapped:(NSString *)key { if ([key isEqualToString:@"toggleFilled"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.drawFilledEnabled = !set.isDrawFilledEnabled; } @@ -203,7 +203,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleCircles"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.drawCirclesEnabled = !set.isDrawCirclesEnabled; } @@ -214,7 +214,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleCubic"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.mode = set.mode == LineChartModeCubicBezier ? LineChartModeLinear : LineChartModeCubicBezier; } @@ -225,7 +225,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleStepped"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { switch (set.mode) { case LineChartModeLinear: @@ -242,7 +242,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleHorizontalCubic"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.mode = set.mode == LineChartModeHorizontalBezier ? LineChartModeCubicBezier : LineChartModeHorizontalBezier; } diff --git a/ChartsDemo/Objective-C/Demos/LineChart2ViewController.m b/ChartsDemo/Objective-C/Demos/LineChart2ViewController.m index 990ba151c5..38f1bc0777 100644 --- a/ChartsDemo/Objective-C/Demos/LineChart2ViewController.m +++ b/ChartsDemo/Objective-C/Demos/LineChart2ViewController.m @@ -204,7 +204,7 @@ - (void)optionTapped:(NSString *)key { if ([key isEqualToString:@"toggleFilled"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.drawFilledEnabled = !set.isDrawFilledEnabled; } @@ -215,7 +215,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleCircles"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.drawCirclesEnabled = !set.isDrawCirclesEnabled; } @@ -226,7 +226,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleCubic"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.mode = set.mode == LineChartModeCubicBezier ? LineChartModeLinear : LineChartModeCubicBezier; } @@ -237,7 +237,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleStepped"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { switch (set.mode) { case LineChartModeLinear: @@ -254,7 +254,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleHorizontalCubic"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.mode = set.mode == LineChartModeCubicBezier ? LineChartModeHorizontalBezier : LineChartModeCubicBezier; } diff --git a/ChartsDemo/Objective-C/Demos/LineChartFilledViewController.m b/ChartsDemo/Objective-C/Demos/LineChartFilledViewController.m index c78a043b30..e0f215ce46 100644 --- a/ChartsDemo/Objective-C/Demos/LineChartFilledViewController.m +++ b/ChartsDemo/Objective-C/Demos/LineChartFilledViewController.m @@ -123,7 +123,7 @@ - (void)setDataCount:(int)count range:(double)range 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) { + set1.fillFormatter = [ChartDefaultFillFormatter withBlock:^CGFloat(id _Nonnull dataSet, id _Nonnull dataProvider) { return _chartView.leftAxis.axisMinimum; }]; @@ -138,7 +138,7 @@ - (void)setDataCount:(int)count range:(double)range 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) { + set2.fillFormatter = [ChartDefaultFillFormatter withBlock:^CGFloat(id _Nonnull dataSet, id _Nonnull dataProvider) { return _chartView.leftAxis.axisMaximum; }]; diff --git a/ChartsDemo/Objective-C/Demos/LineChartTimeViewController.m b/ChartsDemo/Objective-C/Demos/LineChartTimeViewController.m index 07bf61c50d..4f09d8ef47 100644 --- a/ChartsDemo/Objective-C/Demos/LineChartTimeViewController.m +++ b/ChartsDemo/Objective-C/Demos/LineChartTimeViewController.m @@ -158,7 +158,7 @@ - (void)optionTapped:(NSString *)key { if ([key isEqualToString:@"toggleFilled"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.drawFilledEnabled = !set.isDrawFilledEnabled; } @@ -169,7 +169,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleCircles"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.drawCirclesEnabled = !set.isDrawCirclesEnabled; } @@ -180,7 +180,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleCubic"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.mode = set.mode == LineChartModeCubicBezier ? LineChartModeLinear : LineChartModeCubicBezier; } @@ -191,7 +191,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleStepped"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { switch (set.mode) { case LineChartModeLinear: @@ -208,7 +208,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleHorizontalCubic"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.mode = set.mode == LineChartModeCubicBezier ? LineChartModeHorizontalBezier : LineChartModeCubicBezier; } diff --git a/ChartsDemo/Objective-C/Demos/MultipleLinesChartViewController.m b/ChartsDemo/Objective-C/Demos/MultipleLinesChartViewController.m index 01f284f014..738a89cad8 100644 --- a/ChartsDemo/Objective-C/Demos/MultipleLinesChartViewController.m +++ b/ChartsDemo/Objective-C/Demos/MultipleLinesChartViewController.m @@ -130,7 +130,7 @@ - (void)optionTapped:(NSString *)key { if ([key isEqualToString:@"toggleFilled"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.drawFilledEnabled = !set.isDrawFilledEnabled; } @@ -141,7 +141,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleCircles"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.drawCirclesEnabled = !set.isDrawCirclesEnabled; } @@ -152,7 +152,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleCubic"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { set.mode = set.mode == LineChartModeCubicBezier ? LineChartModeLinear : LineChartModeCubicBezier; } @@ -163,7 +163,7 @@ - (void)optionTapped:(NSString *)key if ([key isEqualToString:@"toggleStepped"]) { - for (id set in _chartView.data.dataSets) + for (id set in _chartView.data.dataSets) { switch (set.mode) { case LineChartModeLinear: diff --git a/ChartsDemo/Objective-C/Demos/NegativeStackedBarChartViewController.m b/ChartsDemo/Objective-C/Demos/NegativeStackedBarChartViewController.m index da934ad7b7..408947c5f8 100644 --- a/ChartsDemo/Objective-C/Demos/NegativeStackedBarChartViewController.m +++ b/ChartsDemo/Objective-C/Demos/NegativeStackedBarChartViewController.m @@ -12,7 +12,7 @@ #import "NegativeStackedBarChartViewController.h" #import "ChartsDemo-Swift.h" -@interface NegativeStackedBarChartViewController () +@interface NegativeStackedBarChartViewController () @property (nonatomic, strong) IBOutlet HorizontalBarChartView *chartView; @@ -184,7 +184,7 @@ - (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView NSLog(@"chartValueNothingSelected"); } -#pragma mark - IAxisValueFormatter +#pragma mark - AxisValueFormatter - (NSString *)stringForValue:(double)value axis:(ChartAxisBase *)axis diff --git a/ChartsDemo/Objective-C/Demos/PositiveNegativeBarChartViewController.m b/ChartsDemo/Objective-C/Demos/PositiveNegativeBarChartViewController.m index 4a048dab65..3d36ecd6a3 100644 --- a/ChartsDemo/Objective-C/Demos/PositiveNegativeBarChartViewController.m +++ b/ChartsDemo/Objective-C/Demos/PositiveNegativeBarChartViewController.m @@ -12,7 +12,7 @@ #import "PositiveNegativeBarChartViewController.h" #import "ChartsDemo-Swift.h" -@interface PositiveNegativeBarChartViewController () +@interface PositiveNegativeBarChartViewController () { NSArray *dataList; } @@ -182,7 +182,7 @@ - (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView NSLog(@"chartValueNothingSelected"); } -#pragma mark - IAxisValueFormatter +#pragma mark - AxisValueFormatter - (NSString *)stringForValue:(double)value axis:(ChartAxisBase *)axis diff --git a/ChartsDemo/Objective-C/Demos/RadarChartViewController.m b/ChartsDemo/Objective-C/Demos/RadarChartViewController.m index 1810924a86..b895fdb727 100644 --- a/ChartsDemo/Objective-C/Demos/RadarChartViewController.m +++ b/ChartsDemo/Objective-C/Demos/RadarChartViewController.m @@ -12,7 +12,7 @@ #import "RadarChartViewController.h" #import "ChartsDemo-Swift.h" -@interface RadarChartViewController () +@interface RadarChartViewController () { NSArray *activities; UIColor *originalBarBgColor; @@ -265,7 +265,7 @@ - (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView NSLog(@"chartValueNothingSelected"); } -#pragma mark - IAxisValueFormatter +#pragma mark - AxisValueFormatter - (NSString *)stringForValue:(double)value axis:(ChartAxisBase *)axis diff --git a/ChartsDemo/Objective-C/Formatters/DateValueFormatter.h b/ChartsDemo/Objective-C/Formatters/DateValueFormatter.h index 71ba11d021..e7f0c31dec 100644 --- a/ChartsDemo/Objective-C/Formatters/DateValueFormatter.h +++ b/ChartsDemo/Objective-C/Formatters/DateValueFormatter.h @@ -12,6 +12,6 @@ #import #import "ChartsDemo-Swift.h" -@interface DateValueFormatter : NSObject +@interface DateValueFormatter : NSObject @end diff --git a/ChartsDemo/Objective-C/Formatters/DayAxisValueFormatter.h b/ChartsDemo/Objective-C/Formatters/DayAxisValueFormatter.h index 117e8c8de1..d9a7c78570 100644 --- a/ChartsDemo/Objective-C/Formatters/DayAxisValueFormatter.h +++ b/ChartsDemo/Objective-C/Formatters/DayAxisValueFormatter.h @@ -7,7 +7,7 @@ #import #import "ChartsDemo-Swift.h" -@interface DayAxisValueFormatter : NSObject +@interface DayAxisValueFormatter : NSObject - (id)initForChart:(BarLineChartViewBase *)chart; diff --git a/ChartsDemo/Objective-C/Formatters/IntAxisValueFormatter.h b/ChartsDemo/Objective-C/Formatters/IntAxisValueFormatter.h index 746cc21565..aac046df7d 100644 --- a/ChartsDemo/Objective-C/Formatters/IntAxisValueFormatter.h +++ b/ChartsDemo/Objective-C/Formatters/IntAxisValueFormatter.h @@ -7,6 +7,6 @@ #import #import "ChartsDemo-Swift.h" -@interface IntAxisValueFormatter : NSObject +@interface IntAxisValueFormatter : NSObject @end diff --git a/ChartsDemo/Objective-C/Formatters/LargeValueFormatter.swift b/ChartsDemo/Objective-C/Formatters/LargeValueFormatter.swift index 47ca78fd5e..1f37660ed3 100644 --- a/ChartsDemo/Objective-C/Formatters/LargeValueFormatter.swift +++ b/ChartsDemo/Objective-C/Formatters/LargeValueFormatter.swift @@ -7,7 +7,7 @@ import Foundation import Charts -open class LargeValueFormatter: NSObject, IValueFormatter, IAxisValueFormatter +open class LargeValueFormatter: NSObject, ValueFormatter, AxisValueFormatter { fileprivate static let MAX_LENGTH = 5 diff --git a/ChartsDemo/Swift/Components/XYMarkerView.swift b/ChartsDemo/Swift/Components/XYMarkerView.swift index 23bb965487..290ab85011 100644 --- a/ChartsDemo/Swift/Components/XYMarkerView.swift +++ b/ChartsDemo/Swift/Components/XYMarkerView.swift @@ -10,11 +10,11 @@ import Foundation import Charts public class XYMarkerView: BalloonMarker { - public var xAxisValueFormatter: IAxisValueFormatter + public var xAxisValueFormatter: AxisValueFormatter fileprivate var yFormatter = NumberFormatter() public init(color: UIColor, font: UIFont, textColor: UIColor, insets: UIEdgeInsets, - xAxisValueFormatter: IAxisValueFormatter) { + xAxisValueFormatter: AxisValueFormatter) { self.xAxisValueFormatter = xAxisValueFormatter yFormatter.minimumFractionDigits = 1 yFormatter.maximumFractionDigits = 1 diff --git a/ChartsDemo/Swift/Demos/CombinedChartViewController.swift b/ChartsDemo/Swift/Demos/CombinedChartViewController.swift index d3162293a7..e884cd042b 100644 --- a/ChartsDemo/Swift/Demos/CombinedChartViewController.swift +++ b/ChartsDemo/Swift/Demos/CombinedChartViewController.swift @@ -226,7 +226,7 @@ class CombinedChartViewController: DemoBaseViewController { } } -extension CombinedChartViewController: IAxisValueFormatter { +extension CombinedChartViewController: AxisValueFormatter { func stringForValue(_ value: Double, axis: AxisBase?) -> String { return months[Int(value) % months.count] } diff --git a/ChartsDemo/Swift/Demos/CubicLineChartViewController.swift b/ChartsDemo/Swift/Demos/CubicLineChartViewController.swift index 627d13d08d..5029456988 100644 --- a/ChartsDemo/Swift/Demos/CubicLineChartViewController.swift +++ b/ChartsDemo/Swift/Demos/CubicLineChartViewController.swift @@ -9,8 +9,8 @@ import UIKit import Charts -private class CubicLineSampleFillFormatter: IFillFormatter { - func getFillLinePosition(dataSet: ILineChartDataSet, dataProvider: LineChartDataProvider) -> CGFloat { +private class CubicLineSampleFillFormatter: FillFormatter { + func getFillLinePosition(dataSet: LineChartDataSetProtocol, dataProvider: LineChartDataProvider) -> CGFloat { return -10 } } diff --git a/ChartsDemo/Swift/Demos/NegativeStackedBarChartViewController.swift b/ChartsDemo/Swift/Demos/NegativeStackedBarChartViewController.swift index 088d2da1a3..3598d64602 100644 --- a/ChartsDemo/Swift/Demos/NegativeStackedBarChartViewController.swift +++ b/ChartsDemo/Swift/Demos/NegativeStackedBarChartViewController.swift @@ -125,7 +125,7 @@ class NegativeStackedBarChartViewController: DemoBaseViewController { } } -extension NegativeStackedBarChartViewController: IAxisValueFormatter { +extension NegativeStackedBarChartViewController: AxisValueFormatter { func stringForValue(_ value: Double, axis: AxisBase?) -> String { return String(format: "%03.0f-%03.0f", value, value + 10) } diff --git a/ChartsDemo/Swift/Demos/PositiveNegativeBarChartViewController.swift b/ChartsDemo/Swift/Demos/PositiveNegativeBarChartViewController.swift index 6d363dec0c..85aeb9d129 100644 --- a/ChartsDemo/Swift/Demos/PositiveNegativeBarChartViewController.swift +++ b/ChartsDemo/Swift/Demos/PositiveNegativeBarChartViewController.swift @@ -113,7 +113,7 @@ class PositiveNegativeBarChartViewController: DemoBaseViewController { } } -extension PositiveNegativeBarChartViewController: IAxisValueFormatter { +extension PositiveNegativeBarChartViewController: AxisValueFormatter { func stringForValue(_ value: Double, axis: AxisBase?) -> String { return dataLabels[min(max(Int(value), 0), dataLabels.count - 1)] } diff --git a/ChartsDemo/Swift/Demos/RadarChartViewController.swift b/ChartsDemo/Swift/Demos/RadarChartViewController.swift index f90bb74c6c..5c7f8599a4 100644 --- a/ChartsDemo/Swift/Demos/RadarChartViewController.swift +++ b/ChartsDemo/Swift/Demos/RadarChartViewController.swift @@ -196,7 +196,7 @@ class RadarChartViewController: DemoBaseViewController { } } -extension RadarChartViewController: IAxisValueFormatter { +extension RadarChartViewController: AxisValueFormatter { func stringForValue(_ value: Double, axis: AxisBase?) -> String { return activities[Int(value) % activities.count] } diff --git a/ChartsDemo/Swift/Formatters/DateValueFormatter.swift b/ChartsDemo/Swift/Formatters/DateValueFormatter.swift index 2962a6852a..aa39e3d444 100644 --- a/ChartsDemo/Swift/Formatters/DateValueFormatter.swift +++ b/ChartsDemo/Swift/Formatters/DateValueFormatter.swift @@ -9,7 +9,7 @@ import Foundation import Charts -public class DateValueFormatter: NSObject, IAxisValueFormatter { +public class DateValueFormatter: NSObject, AxisValueFormatter { private let dateFormatter = DateFormatter() override init() { diff --git a/ChartsDemo/Swift/Formatters/DayAxisValueFormatter.swift b/ChartsDemo/Swift/Formatters/DayAxisValueFormatter.swift index 245a25c83e..f403daa06a 100644 --- a/ChartsDemo/Swift/Formatters/DayAxisValueFormatter.swift +++ b/ChartsDemo/Swift/Formatters/DayAxisValueFormatter.swift @@ -9,7 +9,7 @@ import Foundation import Charts -public class DayAxisValueFormatter: NSObject, IAxisValueFormatter { +public class DayAxisValueFormatter: NSObject, AxisValueFormatter { weak var chart: BarLineChartViewBase? let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", diff --git a/ChartsDemo/Swift/Formatters/IntAxisValueFormatter.swift b/ChartsDemo/Swift/Formatters/IntAxisValueFormatter.swift index bd3062a190..00157055ec 100644 --- a/ChartsDemo/Swift/Formatters/IntAxisValueFormatter.swift +++ b/ChartsDemo/Swift/Formatters/IntAxisValueFormatter.swift @@ -9,7 +9,7 @@ import Foundation import Charts -public class IntAxisValueFormatter: NSObject, IAxisValueFormatter { +public class IntAxisValueFormatter: NSObject, AxisValueFormatter { public func stringForValue(_ value: Double, axis: AxisBase?) -> String { return "\(Int(value))" } diff --git a/ChartsDemo/Swift/Formatters/LargeValueFormatter.swift b/ChartsDemo/Swift/Formatters/LargeValueFormatter.swift index c95ca034a6..8cf679d2b5 100644 --- a/ChartsDemo/Swift/Formatters/LargeValueFormatter.swift +++ b/ChartsDemo/Swift/Formatters/LargeValueFormatter.swift @@ -11,7 +11,7 @@ private let MAX_LENGTH = 5 @objc protocol Testing123 { } -public class LargeValueFormatter: NSObject, IValueFormatter, IAxisValueFormatter { +public class LargeValueFormatter: NSObject, ValueFormatter, AxisValueFormatter { /// Suffix to be appended after the values. /// diff --git a/Source/Charts/Charts/BarChartView.swift b/Source/Charts/Charts/BarChartView.swift index 0967cce350..52eea9d691 100644 --- a/Source/Charts/Charts/BarChartView.swift +++ b/Source/Charts/Charts/BarChartView.swift @@ -87,7 +87,7 @@ open class BarChartView: BarLineChartViewBase, BarChartDataProvider { guard let data = _data as? BarChartData, - let set = data.getDataSetForEntry(e) as? IBarChartDataSet + let set = data.getDataSetForEntry(e) as? BarChartDataSetProtocol else { return CGRect.null } let y = e.y diff --git a/Source/Charts/Charts/BarLineChartViewBase.swift b/Source/Charts/Charts/BarLineChartViewBase.swift index 656c66fd2c..181c4116d6 100644 --- a/Source/Charts/Charts/BarLineChartViewBase.swift +++ b/Source/Charts/Charts/BarLineChartViewBase.swift @@ -505,7 +505,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD private var _isDragging = false private var _isScaling = false private var _gestureScaleAxis = GestureScaleAxis.both - private var _closestDataSetToTouch: IChartDataSet! + private var _closestDataSetToTouch: ChartDataSetProtocol! private var _panGestureReachedEdge: Bool = false private weak var _outerScrollView: NSUIScrollView? @@ -1681,12 +1681,12 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD } /// - returns: The DataSet object displayed at the touched position of the chart - @objc open func getDataSetByTouchPoint(point pt: CGPoint) -> IBarLineScatterCandleBubbleChartDataSet! + @objc open func getDataSetByTouchPoint(point pt: CGPoint) -> BarLineScatterCandleBubbleChartDataSetProtocol! { let h = getHighlightByTouchPoint(pt) if h !== nil { - return _data?.getDataSetByIndex(h!.dataSetIndex) as! IBarLineScatterCandleBubbleChartDataSet! + return _data?.getDataSetByIndex(h!.dataSetIndex) as! BarLineScatterCandleBubbleChartDataSetProtocol! } return nil } diff --git a/Source/Charts/Charts/ChartViewBase.swift b/Source/Charts/Charts/ChartViewBase.swift index b737f2f3e3..833f072f3f 100644 --- a/Source/Charts/Charts/ChartViewBase.swift +++ b/Source/Charts/Charts/ChartViewBase.swift @@ -48,8 +48,8 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate // } /// The default IValueFormatter that has been determined by the chart considering the provided minimum and maximum values. - internal var _defaultValueFormatter: IValueFormatter? = DefaultValueFormatter(decimals: 0) - + internal var _defaultValueFormatter: ValueFormatter? = DefaultValueFormatter(decimals: 0) + /// object that holds all data that was originally set for the chart, before it was modified or any filtering algorithms had been applied internal var _data: ChartData? @@ -93,7 +93,7 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate /// object responsible for rendering the data @objc open var renderer: DataRenderer? - @objc open var highlighter: IHighlighter? + @objc open var highlighter: Highlighter? /// object that manages the bounds and drawing constraints of the chart internal lazy var _viewPortHandler = ViewPortHandler(width: bounds.size.width, height: bounds.size.height) @@ -120,7 +120,7 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate @objc open var isDrawMarkersEnabled: Bool { return drawMarkers } /// The marker that is displayed when a value is clicked on the chart - @objc open var marker: IMarker? + @objc open var marker: Marker? private var _interceptTouchEvents = false diff --git a/Source/Charts/Charts/CombinedChartView.swift b/Source/Charts/Charts/CombinedChartView.swift index d24df96b70..a6a2500ac9 100644 --- a/Source/Charts/Charts/CombinedChartView.swift +++ b/Source/Charts/Charts/CombinedChartView.swift @@ -16,7 +16,7 @@ import CoreGraphics open class CombinedChartView: BarLineChartViewBase, CombinedChartDataProvider { /// the fill-formatter used for determining the position of the fill-line - internal var _fillFormatter: IFillFormatter! + internal var _fillFormatter: FillFormatter! /// enum that allows to specify the order in which the different data objects for the combined-chart are drawn @objc(CombinedChartDrawOrder) @@ -60,7 +60,7 @@ open class CombinedChartView: BarLineChartViewBase, CombinedChartDataProvider } } - @objc open var fillFormatter: IFillFormatter + @objc open var fillFormatter: FillFormatter { get { diff --git a/Source/Charts/Charts/HorizontalBarChartView.swift b/Source/Charts/Charts/HorizontalBarChartView.swift index 26e4e4b735..f962dd6ec6 100644 --- a/Source/Charts/Charts/HorizontalBarChartView.swift +++ b/Source/Charts/Charts/HorizontalBarChartView.swift @@ -107,7 +107,7 @@ open class HorizontalBarChartView: BarChartView { guard let data = _data as? BarChartData, - let set = data.getDataSetForEntry(e) as? IBarChartDataSet + let set = data.getDataSetForEntry(e) as? BarChartDataSetProtocol else { return CGRect.null } let y = e.y diff --git a/Source/Charts/Charts/PieRadarChartViewBase.swift b/Source/Charts/Charts/PieRadarChartViewBase.swift old mode 100755 new mode 100644 diff --git a/Source/Charts/Components/AxisBase.swift b/Source/Charts/Components/AxisBase.swift index 8753d948fd..b97da1e03b 100644 --- a/Source/Charts/Components/AxisBase.swift +++ b/Source/Charts/Components/AxisBase.swift @@ -22,7 +22,7 @@ open class AxisBase: ComponentBase } /// Custom formatter that is used instead of the auto-formatter if set - private var _axisValueFormatter: IAxisValueFormatter? + private var _axisValueFormatter: AxisValueFormatter? @objc open var labelFont = NSUIFont.systemFont(ofSize: 10.0) @objc open var labelTextColor = NSUIColor.black @@ -157,7 +157,7 @@ open class AxisBase: ComponentBase /// Sets the formatter to be used for formatting the axis labels. /// If no formatter is set, the chart will automatically determine a reasonable formatting (concerning decimals) for all the values that are drawn inside the chart. /// Use `nil` to use the formatter calculated by the chart. - @objc open var valueFormatter: IAxisValueFormatter? + @objc open var valueFormatter: AxisValueFormatter? { get { diff --git a/Source/Charts/Components/IMarker.swift b/Source/Charts/Components/Marker.swift similarity index 75% rename from Source/Charts/Components/IMarker.swift rename to Source/Charts/Components/Marker.swift index 59abfad7bb..834b66eeb5 100644 --- a/Source/Charts/Components/IMarker.swift +++ b/Source/Charts/Components/Marker.swift @@ -12,8 +12,8 @@ import Foundation import CoreGraphics -@objc(IChartMarker) -public protocol IMarker: class +@objc(ChartMarker) +public protocol Marker: class { /// - returns: The desired (general) offset you wish the IMarker to have on the x-axis. /// @@ -29,12 +29,12 @@ public protocol IMarker: class /// - parameter point: This is the point at which the marker wants to be drawn. You can adjust the offset conditionally based on this argument. func offsetForDrawing(atPoint: CGPoint) -> CGPoint - /// This method enables a custom IMarker to update it's content every time the IMarker is redrawn according to the data entry it points to. + /// This method enables a custom Marker to update it's content every time the Marker is redrawn according to the data entry it points to. /// - /// - parameter entry: The Entry the IMarker belongs to. This can also be any subclass of Entry, like BarEntry or CandleEntry, simply cast it at runtime. + /// - parameter entry: The Entry the Marker belongs to. This can also be any subclass of Entry, like BarEntry or CandleEntry, simply cast it at runtime. /// - parameter highlight: The highlight object contains information about the highlighted value such as it's dataset-index, the selected range or stack-index (only stacked bar entries). func refreshContent(entry: ChartDataEntry, highlight: Highlight) - /// Draws the IMarker on the given position on the given context + /// Draws the Marker on the given position on the given context func draw(context: CGContext, point: CGPoint) } diff --git a/Source/Charts/Components/MarkerImage.swift b/Source/Charts/Components/MarkerImage.swift index 14e4dcfc86..0503112d67 100644 --- a/Source/Charts/Components/MarkerImage.swift +++ b/Source/Charts/Components/MarkerImage.swift @@ -17,7 +17,7 @@ import CoreGraphics #endif @objc(ChartMarkerImage) -open class MarkerImage: NSObject, IMarker +open class MarkerImage: NSObject, Marker { /// The marker image to render @objc open var image: NSUIImage? diff --git a/Source/Charts/Components/MarkerView.swift b/Source/Charts/Components/MarkerView.swift index a051ff9968..2e380381be 100644 --- a/Source/Charts/Components/MarkerView.swift +++ b/Source/Charts/Components/MarkerView.swift @@ -17,7 +17,7 @@ import CoreGraphics #endif @objc(ChartMarkerView) -open class MarkerView: NSUIView, IMarker +open class MarkerView: NSUIView, Marker { open var offset: CGPoint = CGPoint() diff --git a/Source/Charts/Data/Implementations/ChartBaseDataSet.swift b/Source/Charts/Data/Implementations/ChartBaseDataSet.swift index 7136f2f04b..5e59660d21 100644 --- a/Source/Charts/Data/Implementations/ChartBaseDataSet.swift +++ b/Source/Charts/Data/Implementations/ChartBaseDataSet.swift @@ -13,7 +13,7 @@ import Foundation import CoreGraphics -open class ChartBaseDataSet: NSObject, IChartDataSet +open class ChartBaseDataSet: NSObject, ChartDataSetProtocol { public required override init() { @@ -270,10 +270,10 @@ open class ChartBaseDataSet: NSObject, IChartDataSet open var isHighlightEnabled: Bool { return highlightEnabled } /// Custom formatter that is used instead of the auto-formatter if set - internal var _valueFormatter: IValueFormatter? + internal var _valueFormatter: ValueFormatter? /// Custom formatter that is used instead of the auto-formatter if set - open var valueFormatter: IValueFormatter? + open var valueFormatter: ValueFormatter? { get { diff --git a/Source/Charts/Data/Implementations/Standard/BarChartData.swift b/Source/Charts/Data/Implementations/Standard/BarChartData.swift index 0317fc8a6b..df85bbafc1 100644 --- a/Source/Charts/Data/Implementations/Standard/BarChartData.swift +++ b/Source/Charts/Data/Implementations/Standard/BarChartData.swift @@ -19,7 +19,7 @@ open class BarChartData: BarLineScatterCandleBubbleChartData super.init() } - public override init(dataSets: [IChartDataSet]?) + public override init(dataSets: [ChartDataSetProtocol]?) { super.init(dataSets: dataSets) } @@ -61,7 +61,7 @@ open class BarChartData: BarLineScatterCandleBubbleChartData let start = fromX fromX += groupSpaceWidthHalf - (_dataSets as? [IBarChartDataSet])?.forEach { set in + (_dataSets as! [BarChartDataSetProtocol]).forEach { set in fromX += barSpaceHalf fromX += barWidthHalf diff --git a/Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift b/Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift index 27ed7a5722..6f88bf95cb 100644 --- a/Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift +++ b/Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift @@ -13,7 +13,7 @@ import Foundation import CoreGraphics -open class BarChartDataSet: BarLineScatterCandleBubbleChartDataSet, IBarChartDataSet +open class BarChartDataSet: BarLineScatterCandleBubbleChartDataSet, BarChartDataSetProtocol { private func initialize() { diff --git a/Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartData.swift b/Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartData.swift index c98bb1d075..0325328f84 100644 --- a/Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartData.swift +++ b/Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartData.swift @@ -18,7 +18,7 @@ open class BarLineScatterCandleBubbleChartData: ChartData super.init() } - public override init(dataSets: [IChartDataSet]?) + public override init(dataSets: [ChartDataSetProtocol]?) { super.init(dataSets: dataSets) } diff --git a/Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartDataSet.swift b/Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartDataSet.swift index 02b942f479..276a93155d 100644 --- a/Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartDataSet.swift +++ b/Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartDataSet.swift @@ -13,7 +13,7 @@ import Foundation import CoreGraphics -open class BarLineScatterCandleBubbleChartDataSet: ChartDataSet, IBarLineScatterCandleBubbleChartDataSet +open class BarLineScatterCandleBubbleChartDataSet: ChartDataSet, BarLineScatterCandleBubbleChartDataSetProtocol { // MARK: - Data functions and accessors diff --git a/Source/Charts/Data/Implementations/Standard/BubbleChartData.swift b/Source/Charts/Data/Implementations/Standard/BubbleChartData.swift index 433f384f75..f514340881 100644 --- a/Source/Charts/Data/Implementations/Standard/BubbleChartData.swift +++ b/Source/Charts/Data/Implementations/Standard/BubbleChartData.swift @@ -19,7 +19,7 @@ open class BubbleChartData: BarLineScatterCandleBubbleChartData super.init() } - public override init(dataSets: [IChartDataSet]?) + public override init(dataSets: [ChartDataSetProtocol]?) { super.init(dataSets: dataSets) } @@ -27,6 +27,6 @@ open class BubbleChartData: BarLineScatterCandleBubbleChartData /// Sets the width of the circle that surrounds the bubble when highlighted for all DataSet objects this data object contains @objc open func setHighlightCircleWidth(_ width: CGFloat) { - (_dataSets as? [IBubbleChartDataSet])?.forEach { $0.highlightCircleWidth = width } + (_dataSets as? [BubbleChartDataSetProtocol])?.forEach { $0.highlightCircleWidth = width } } } diff --git a/Source/Charts/Data/Implementations/Standard/BubbleChartDataSet.swift b/Source/Charts/Data/Implementations/Standard/BubbleChartDataSet.swift index cdc3567e69..d93eef6645 100644 --- a/Source/Charts/Data/Implementations/Standard/BubbleChartDataSet.swift +++ b/Source/Charts/Data/Implementations/Standard/BubbleChartDataSet.swift @@ -13,7 +13,7 @@ import Foundation import CoreGraphics -open class BubbleChartDataSet: BarLineScatterCandleBubbleChartDataSet, IBubbleChartDataSet +open class BubbleChartDataSet: BarLineScatterCandleBubbleChartDataSet, BubbleChartDataSetProtocol { // MARK: - Data functions and accessors diff --git a/Source/Charts/Data/Implementations/Standard/CandleChartData.swift b/Source/Charts/Data/Implementations/Standard/CandleChartData.swift index 5158668ad9..5501ebc98b 100644 --- a/Source/Charts/Data/Implementations/Standard/CandleChartData.swift +++ b/Source/Charts/Data/Implementations/Standard/CandleChartData.swift @@ -18,7 +18,7 @@ open class CandleChartData: BarLineScatterCandleBubbleChartData super.init() } - public override init(dataSets: [IChartDataSet]?) + public override init(dataSets: [ChartDataSetProtocol]?) { super.init(dataSets: dataSets) } diff --git a/Source/Charts/Data/Implementations/Standard/CandleChartDataSet.swift b/Source/Charts/Data/Implementations/Standard/CandleChartDataSet.swift index 852e65d385..c04a5edceb 100644 --- a/Source/Charts/Data/Implementations/Standard/CandleChartDataSet.swift +++ b/Source/Charts/Data/Implementations/Standard/CandleChartDataSet.swift @@ -13,7 +13,7 @@ import Foundation import CoreGraphics -open class CandleChartDataSet: LineScatterCandleRadarChartDataSet, ICandleChartDataSet +open class CandleChartDataSet: LineScatterCandleRadarChartDataSet, CandleChartDataSetProtocol { public required init() diff --git a/Source/Charts/Data/Implementations/Standard/ChartData.swift b/Source/Charts/Data/Implementations/Standard/ChartData.swift index 3b9851a43c..bb1bd869a3 100644 --- a/Source/Charts/Data/Implementations/Standard/ChartData.swift +++ b/Source/Charts/Data/Implementations/Standard/ChartData.swift @@ -22,30 +22,30 @@ open class ChartData: NSObject internal var _rightAxisMax: Double = -Double.greatestFiniteMagnitude internal var _rightAxisMin: Double = Double.greatestFiniteMagnitude - internal var _dataSets = [IChartDataSet]() + internal var _dataSets = [ChartDataSetProtocol]() public override init() { super.init() - _dataSets = [IChartDataSet]() + _dataSets = [ChartDataSetProtocol]() } - @objc public init(dataSets: [IChartDataSet]?) + @objc public init(dataSets: [ChartDataSetProtocol]?) { super.init() - _dataSets = dataSets ?? [IChartDataSet]() + _dataSets = dataSets ?? [ChartDataSetProtocol]() self.initialize(dataSets: _dataSets) } - @objc public convenience init(dataSet: IChartDataSet?) + @objc public convenience init(dataSet: ChartDataSetProtocol?) { self.init(dataSets: dataSet === nil ? nil : [dataSet!]) } - internal func initialize(dataSets: [IChartDataSet]) + internal func initialize(dataSets: [ChartDataSetProtocol]) { notifyDataChanged() } @@ -187,7 +187,7 @@ open class ChartData: NSObject } /// Adjusts the minimum and maximum values based on the given DataSet. - @objc open func calcMinMax(dataSet d: IChartDataSet) + @objc open func calcMinMax(dataSet d: ChartDataSetProtocol) { if _yMax < d.yMax { @@ -329,7 +329,7 @@ open class ChartData: NSObject } /// - returns: All DataSet objects this ChartData object holds. - @objc open var dataSets: [IChartDataSet] + @objc open var dataSets: [ChartDataSetProtocol] { get { @@ -419,7 +419,7 @@ open class ChartData: NSObject /// - parameter label: /// - parameter ignorecase: /// - returns: The DataSet Object with the given label. Sensitive or not. - @objc open func getDataSetByLabel(_ label: String, ignorecase: Bool) -> IChartDataSet? + @objc open func getDataSetByLabel(_ label: String, ignorecase: Bool) -> ChartDataSetProtocol? { let index = getDataSetIndexByLabel(label, ignorecase: ignorecase) @@ -433,7 +433,7 @@ open class ChartData: NSObject } } - @objc open func getDataSetByIndex(_ index: Int) -> IChartDataSet! + @objc open func getDataSetByIndex(_ index: Int) -> ChartDataSetProtocol! { if index < 0 || index >= _dataSets.count { @@ -443,7 +443,7 @@ open class ChartData: NSObject return _dataSets[index] } - @objc open func addDataSet(_ dataSet: IChartDataSet!) + @objc open func addDataSet(_ dataSet: ChartDataSetProtocol!) { calcMinMax(dataSet: dataSet) @@ -454,7 +454,7 @@ open class ChartData: NSObject /// Also recalculates all minimum and maximum values. /// /// - returns: `true` if a DataSet was removed, `false` ifno DataSet could be removed. - @objc @discardableResult open func removeDataSet(_ dataSet: IChartDataSet!) -> Bool + @objc @discardableResult open func removeDataSet(_ dataSet: ChartDataSetProtocol!) -> Bool { if dataSet === nil { @@ -546,7 +546,7 @@ open class ChartData: NSObject } /// - returns: The DataSet that contains the provided Entry, or null, if no DataSet contains this entry. - @objc open func getDataSetForEntry(_ e: ChartDataEntry!) -> IChartDataSet? + @objc open func getDataSetForEntry(_ e: ChartDataEntry!) -> ChartDataSetProtocol? { if e == nil { @@ -567,7 +567,7 @@ open class ChartData: NSObject } /// - returns: The index of the provided DataSet in the DataSet array of this data object, or -1 if it does not exist. - @objc open func indexOfDataSet(_ dataSet: IChartDataSet) -> Int + @objc open func indexOfDataSet(_ dataSet: ChartDataSetProtocol) -> Int { for i in 0 ..< _dataSets.count { @@ -581,7 +581,7 @@ open class ChartData: NSObject } /// - returns: The first DataSet from the datasets-array that has it's dependency on the left axis. Returns null if no DataSet with left dependency could be found. - @objc open func getFirstLeft(dataSets: [IChartDataSet]) -> IChartDataSet? + @objc open func getFirstLeft(dataSets: [ChartDataSetProtocol]) -> ChartDataSetProtocol? { for dataSet in dataSets { @@ -595,7 +595,7 @@ open class ChartData: NSObject } /// - returns: The first DataSet from the datasets-array that has it's dependency on the right axis. Returns null if no DataSet with right dependency could be found. - @objc open func getFirstRight(dataSets: [IChartDataSet]) -> IChartDataSet? + @objc open func getFirstRight(dataSets: [ChartDataSetProtocol]) -> ChartDataSetProtocol? { for dataSet in _dataSets { @@ -633,8 +633,8 @@ open class ChartData: NSObject return colors } - /// Sets a custom IValueFormatter for all DataSets this data object contains. - @objc open func setValueFormatter(_ formatter: IValueFormatter?) + /// Sets a custom ValueFormatter for all DataSets this data object contains. + @objc open func setValueFormatter(_ formatter: ValueFormatter?) { guard let formatter = formatter else { return } @@ -710,7 +710,7 @@ open class ChartData: NSObject /// Checks if this data object contains the specified DataSet. /// - returns: `true` if so, `false` ifnot. - @objc open func contains(dataSet: IChartDataSet) -> Bool + @objc open func contains(dataSet: ChartDataSetProtocol) -> Bool { for set in dataSets { @@ -737,7 +737,7 @@ open class ChartData: NSObject } /// - returns: The DataSet object with the maximum number of entries or null if there are no DataSets. - @objc open var maxEntryCountSet: IChartDataSet? + @objc open var maxEntryCountSet: ChartDataSetProtocol? { if _dataSets.count == 0 { diff --git a/Source/Charts/Data/Implementations/Standard/CombinedChartData.swift b/Source/Charts/Data/Implementations/Standard/CombinedChartData.swift index 8d269edf66..59e1f2327b 100644 --- a/Source/Charts/Data/Implementations/Standard/CombinedChartData.swift +++ b/Source/Charts/Data/Implementations/Standard/CombinedChartData.swift @@ -24,7 +24,7 @@ open class CombinedChartData: BarLineScatterCandleBubbleChartData super.init() } - public override init(dataSets: [IChartDataSet]?) + public override init(dataSets: [ChartDataSetProtocol]?) { super.init(dataSets: dataSets) } @@ -204,7 +204,7 @@ open class CombinedChartData: BarLineScatterCandleBubbleChartData return allData.index(of: data) } - open override func removeDataSet(_ dataSet: IChartDataSet!) -> Bool + open override func removeDataSet(_ dataSet: ChartDataSetProtocol!) -> Bool { let datas = allData @@ -301,7 +301,7 @@ open class CombinedChartData: BarLineScatterCandleBubbleChartData /// /// - Parameter highlight: current highlight /// - Returns: dataset related to highlight - @objc open func getDataSetByHighlight(_ highlight: Highlight) -> IChartDataSet! + @objc open func getDataSetByHighlight(_ highlight: Highlight) -> ChartDataSetProtocol! { if highlight.dataIndex >= allData.count { diff --git a/Source/Charts/Data/Implementations/Standard/LineChartData.swift b/Source/Charts/Data/Implementations/Standard/LineChartData.swift index 2ebd6b42a9..cc19888cc0 100644 --- a/Source/Charts/Data/Implementations/Standard/LineChartData.swift +++ b/Source/Charts/Data/Implementations/Standard/LineChartData.swift @@ -19,7 +19,7 @@ open class LineChartData: ChartData super.init() } - public override init(dataSets: [IChartDataSet]?) + public override init(dataSets: [ChartDataSetProtocol]?) { super.init(dataSets: dataSets) } diff --git a/Source/Charts/Data/Implementations/Standard/LineChartDataSet.swift b/Source/Charts/Data/Implementations/Standard/LineChartDataSet.swift index c41dd6ac2f..8c6f50b367 100644 --- a/Source/Charts/Data/Implementations/Standard/LineChartDataSet.swift +++ b/Source/Charts/Data/Implementations/Standard/LineChartDataSet.swift @@ -13,7 +13,7 @@ import Foundation import CoreGraphics -open class LineChartDataSet: LineRadarChartDataSet, ILineChartDataSet +open class LineChartDataSet: LineRadarChartDataSet, LineChartDataSetProtocol { @objc(LineChartMode) public enum Mode: Int @@ -144,10 +144,10 @@ open class LineChartDataSet: LineRadarChartDataSet, ILineChartDataSet open var lineCapType = CGLineCap.butt /// formatter for customizing the position of the fill-line - private var _fillFormatter: IFillFormatter = DefaultFillFormatter() + private var _fillFormatter: FillFormatter = DefaultFillFormatter() - /// Sets a custom IFillFormatter to the chart that handles the position of the filled-line for each DataSet. Set this to null to use the default logic. - open var fillFormatter: IFillFormatter? + /// Sets a custom FillFormatterProtocol to the chart that handles the position of the filled-line for each DataSet. Set this to null to use the default logic. + open var fillFormatter: FillFormatter? { get { diff --git a/Source/Charts/Data/Implementations/Standard/LineRadarChartDataSet.swift b/Source/Charts/Data/Implementations/Standard/LineRadarChartDataSet.swift index be934257f1..f254ea6514 100644 --- a/Source/Charts/Data/Implementations/Standard/LineRadarChartDataSet.swift +++ b/Source/Charts/Data/Implementations/Standard/LineRadarChartDataSet.swift @@ -13,7 +13,7 @@ import Foundation import CoreGraphics -open class LineRadarChartDataSet: LineScatterCandleRadarChartDataSet, ILineRadarChartDataSet +open class LineRadarChartDataSet: LineScatterCandleRadarChartDataSet, LineRadarChartDataSetProtocol { // MARK: - Data functions and accessors diff --git a/Source/Charts/Data/Implementations/Standard/LineScatterCandleRadarChartDataSet.swift b/Source/Charts/Data/Implementations/Standard/LineScatterCandleRadarChartDataSet.swift index b21868ab08..ccd99d2743 100644 --- a/Source/Charts/Data/Implementations/Standard/LineScatterCandleRadarChartDataSet.swift +++ b/Source/Charts/Data/Implementations/Standard/LineScatterCandleRadarChartDataSet.swift @@ -12,7 +12,7 @@ import Foundation -open class LineScatterCandleRadarChartDataSet: BarLineScatterCandleBubbleChartDataSet, ILineScatterCandleRadarChartDataSet +open class LineScatterCandleRadarChartDataSet: BarLineScatterCandleBubbleChartDataSet, LineScatterCandleRadarChartDataSetProtocol { // MARK: - Data functions and accessors diff --git a/Source/Charts/Data/Implementations/Standard/PieChartData.swift b/Source/Charts/Data/Implementations/Standard/PieChartData.swift index f2dc35a948..e5bd22f23c 100644 --- a/Source/Charts/Data/Implementations/Standard/PieChartData.swift +++ b/Source/Charts/Data/Implementations/Standard/PieChartData.swift @@ -18,16 +18,16 @@ open class PieChartData: ChartData super.init() } - public override init(dataSets: [IChartDataSet]?) + public override init(dataSets: [ChartDataSetProtocol]?) { super.init(dataSets: dataSets) } - @objc var dataSet: IPieChartDataSet? + @objc var dataSet: PieChartDataSetProtocol? { get { - return dataSets.count > 0 ? dataSets[0] as? IPieChartDataSet : nil + return dataSets.count > 0 ? dataSets[0] as? PieChartDataSetProtocol : nil } set { @@ -42,7 +42,7 @@ open class PieChartData: ChartData } } - open override func getDataSetByIndex(_ index: Int) -> IChartDataSet? + open override func getDataSetByIndex(_ index: Int) -> ChartDataSetProtocol? { if index != 0 { @@ -51,7 +51,7 @@ open class PieChartData: ChartData return super.getDataSetByIndex(index) } - open override func getDataSetByLabel(_ label: String, ignorecase: Bool) -> IChartDataSet? + open override func getDataSetByLabel(_ label: String, ignorecase: Bool) -> ChartDataSetProtocol? { if dataSets.count == 0 || dataSets[0].label == nil { @@ -80,7 +80,7 @@ open class PieChartData: ChartData return dataSet?.entryForIndex(Int(highlight.x)) } - open override func addDataSet(_ d: IChartDataSet!) + open override func addDataSet(_ d: ChartDataSetProtocol!) { super.addDataSet(d) } diff --git a/Source/Charts/Data/Implementations/Standard/PieChartDataSet.swift b/Source/Charts/Data/Implementations/Standard/PieChartDataSet.swift index af4aa617d0..ea53d8666f 100644 --- a/Source/Charts/Data/Implementations/Standard/PieChartDataSet.swift +++ b/Source/Charts/Data/Implementations/Standard/PieChartDataSet.swift @@ -12,7 +12,7 @@ import Foundation import CoreGraphics -open class PieChartDataSet: ChartDataSet, IPieChartDataSet +open class PieChartDataSet: ChartDataSet, PieChartDataSetProtocol { @objc(PieChartValuePosition) public enum ValuePosition: Int diff --git a/Source/Charts/Data/Implementations/Standard/RadarChartData.swift b/Source/Charts/Data/Implementations/Standard/RadarChartData.swift index 31fd7d2ba0..30203de084 100644 --- a/Source/Charts/Data/Implementations/Standard/RadarChartData.swift +++ b/Source/Charts/Data/Implementations/Standard/RadarChartData.swift @@ -34,7 +34,7 @@ open class RadarChartData: ChartData super.init() } - public override init(dataSets: [IChartDataSet]?) + public override init(dataSets: [ChartDataSetProtocol]?) { super.init(dataSets: dataSets) } diff --git a/Source/Charts/Data/Implementations/Standard/RadarChartDataSet.swift b/Source/Charts/Data/Implementations/Standard/RadarChartDataSet.swift index 67b4730a28..b6da45866e 100644 --- a/Source/Charts/Data/Implementations/Standard/RadarChartDataSet.swift +++ b/Source/Charts/Data/Implementations/Standard/RadarChartDataSet.swift @@ -13,7 +13,7 @@ import Foundation import CoreGraphics -open class RadarChartDataSet: LineRadarChartDataSet, IRadarChartDataSet +open class RadarChartDataSet: LineRadarChartDataSet, RadarChartDataSetProtocol { private func initialize() { diff --git a/Source/Charts/Data/Implementations/Standard/ScatterChartData.swift b/Source/Charts/Data/Implementations/Standard/ScatterChartData.swift index ff8ccaf93e..4fe5127c34 100644 --- a/Source/Charts/Data/Implementations/Standard/ScatterChartData.swift +++ b/Source/Charts/Data/Implementations/Standard/ScatterChartData.swift @@ -19,7 +19,7 @@ open class ScatterChartData: BarLineScatterCandleBubbleChartData super.init() } - public override init(dataSets: [IChartDataSet]?) + public override init(dataSets: [ChartDataSetProtocol]?) { super.init(dataSets: dataSets) } @@ -31,7 +31,7 @@ open class ScatterChartData: BarLineScatterCandleBubbleChartData for set in _dataSets { - let scatterDataSet = set as? IScatterChartDataSet + let scatterDataSet = set as? ScatterChartDataSetProtocol if scatterDataSet == nil { diff --git a/Source/Charts/Data/Implementations/Standard/ScatterChartDataSet.swift b/Source/Charts/Data/Implementations/Standard/ScatterChartDataSet.swift index 8aee713389..1f60c8c126 100644 --- a/Source/Charts/Data/Implementations/Standard/ScatterChartDataSet.swift +++ b/Source/Charts/Data/Implementations/Standard/ScatterChartDataSet.swift @@ -12,7 +12,7 @@ import Foundation import CoreGraphics -open class ScatterChartDataSet: LineScatterCandleRadarChartDataSet, IScatterChartDataSet +open class ScatterChartDataSet: LineScatterCandleRadarChartDataSet, ScatterChartDataSetProtocol { @objc(ScatterShape) diff --git a/Source/Charts/Data/Interfaces/IBarChartDataSet.swift b/Source/Charts/Data/Interfaces/BarChartDataSetProtocol.swift similarity index 91% rename from Source/Charts/Data/Interfaces/IBarChartDataSet.swift rename to Source/Charts/Data/Interfaces/BarChartDataSetProtocol.swift index 6f5cad081c..3e64d24f49 100644 --- a/Source/Charts/Data/Interfaces/IBarChartDataSet.swift +++ b/Source/Charts/Data/Interfaces/BarChartDataSetProtocol.swift @@ -1,5 +1,5 @@ // -// IBarChartDataSet.swift +// BarChartDataSetProtocol.swift // Charts // // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda @@ -13,7 +13,7 @@ import Foundation import CoreGraphics @objc -public protocol IBarChartDataSet: IBarLineScatterCandleBubbleChartDataSet +public protocol BarChartDataSetProtocol: BarLineScatterCandleBubbleChartDataSetProtocol { // MARK: - Data functions and accessors diff --git a/Source/Charts/Data/Interfaces/IBarLineScatterCandleBubbleChartDataSet.swift b/Source/Charts/Data/Interfaces/BarLineScatterCandleBubbleChartDataSetProtocol.swift similarity index 79% rename from Source/Charts/Data/Interfaces/IBarLineScatterCandleBubbleChartDataSet.swift rename to Source/Charts/Data/Interfaces/BarLineScatterCandleBubbleChartDataSetProtocol.swift index 8af47ff4a7..cbc90147f0 100644 --- a/Source/Charts/Data/Interfaces/IBarLineScatterCandleBubbleChartDataSet.swift +++ b/Source/Charts/Data/Interfaces/BarLineScatterCandleBubbleChartDataSetProtocol.swift @@ -1,5 +1,5 @@ // -// IBarLineScatterCandleBubbleChartDataSet.swift +// BarLineScatterCandleBubbleChartDataSetProtocol.swift // Charts // // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda @@ -13,7 +13,7 @@ import Foundation import CoreGraphics @objc -public protocol IBarLineScatterCandleBubbleChartDataSet: IChartDataSet +public protocol BarLineScatterCandleBubbleChartDataSetProtocol: ChartDataSetProtocol { // MARK: - Data functions and accessors diff --git a/Source/Charts/Data/Interfaces/IBubbleChartDataSet.swift b/Source/Charts/Data/Interfaces/BubbleChartDataSetProtocol.swift similarity index 81% rename from Source/Charts/Data/Interfaces/IBubbleChartDataSet.swift rename to Source/Charts/Data/Interfaces/BubbleChartDataSetProtocol.swift index 10c5d9eecb..5cc9457951 100644 --- a/Source/Charts/Data/Interfaces/IBubbleChartDataSet.swift +++ b/Source/Charts/Data/Interfaces/BubbleChartDataSetProtocol.swift @@ -1,5 +1,5 @@ // -// IBubbleChartDataSet.swift +// BubbleChartDataSetProtocol.swift // Charts // // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda @@ -13,7 +13,7 @@ import Foundation import CoreGraphics @objc -public protocol IBubbleChartDataSet: IBarLineScatterCandleBubbleChartDataSet +public protocol BubbleChartDataSetProtocol: BarLineScatterCandleBubbleChartDataSetProtocol { // MARK: - Data functions and accessors diff --git a/Source/Charts/Data/Interfaces/ICandleChartDataSet.swift b/Source/Charts/Data/Interfaces/CandleChartDataSetProtocol.swift similarity index 93% rename from Source/Charts/Data/Interfaces/ICandleChartDataSet.swift rename to Source/Charts/Data/Interfaces/CandleChartDataSetProtocol.swift index fac88d3b2e..d47b5a8c9f 100644 --- a/Source/Charts/Data/Interfaces/ICandleChartDataSet.swift +++ b/Source/Charts/Data/Interfaces/CandleChartDataSetProtocol.swift @@ -1,5 +1,5 @@ // -// ICandleChartDataSet.swift +// CandleChartDataSetProtocol.swift // Charts // // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda @@ -13,7 +13,7 @@ import Foundation import CoreGraphics @objc -public protocol ICandleChartDataSet: ILineScatterCandleRadarChartDataSet +public protocol CandleChartDataSetProtocol: LineScatterCandleRadarChartDataSetProtocol { // MARK: - Data functions and accessors diff --git a/Source/Charts/Data/Interfaces/IChartDataSet.swift b/Source/Charts/Data/Interfaces/ChartDataSetProtocol.swift similarity index 98% rename from Source/Charts/Data/Interfaces/IChartDataSet.swift rename to Source/Charts/Data/Interfaces/ChartDataSetProtocol.swift index 293db393eb..77b1e6b0d2 100644 --- a/Source/Charts/Data/Interfaces/IChartDataSet.swift +++ b/Source/Charts/Data/Interfaces/ChartDataSetProtocol.swift @@ -1,5 +1,5 @@ // -// IChartDataSet.swift +// ChartDataSetProtocol.swift // Charts // // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda @@ -13,7 +13,7 @@ import Foundation import CoreGraphics @objc -public protocol IChartDataSet +public protocol ChartDataSetProtocol { // MARK: - Data functions and accessors @@ -187,7 +187,7 @@ public protocol IChartDataSet var isHighlightEnabled: Bool { get } /// Custom formatter that is used instead of the auto-formatter if set - var valueFormatter: IValueFormatter? { get set } + var valueFormatter: ValueFormatter? { get set } /// - returns: `true` if the valueFormatter object of this DataSet is null. var needsFormatter: Bool { get } diff --git a/Source/Charts/Data/Interfaces/ILineChartDataSet.swift b/Source/Charts/Data/Interfaces/LineChartDataSetProtocol.swift similarity index 88% rename from Source/Charts/Data/Interfaces/ILineChartDataSet.swift rename to Source/Charts/Data/Interfaces/LineChartDataSetProtocol.swift index bc9e484907..2da6ef4437 100644 --- a/Source/Charts/Data/Interfaces/ILineChartDataSet.swift +++ b/Source/Charts/Data/Interfaces/LineChartDataSetProtocol.swift @@ -1,5 +1,5 @@ // -// ILineChartDataSet.swift +// LineChartDataSetProtocol.swift // Charts // // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda @@ -14,7 +14,7 @@ import CoreGraphics @objc -public protocol ILineChartDataSet: ILineRadarChartDataSet +public protocol LineChartDataSetProtocol: LineRadarChartDataSetProtocol { // MARK: - Data functions and accessors @@ -75,6 +75,6 @@ public protocol ILineChartDataSet: ILineRadarChartDataSet /// Line cap type, default is CGLineCap.Butt var lineCapType: CGLineCap { get set } - /// Sets a custom IFillFormatter to the chart that handles the position of the filled-line for each DataSet. Set this to null to use the default logic. - var fillFormatter: IFillFormatter? { get set } + /// Sets a custom FillFormatterProtocol to the chart that handles the position of the filled-line for each DataSet. Set this to null to use the default logic. + var fillFormatter: FillFormatter? { get set } } diff --git a/Source/Charts/Data/Interfaces/ILineRadarChartDataSet.swift b/Source/Charts/Data/Interfaces/LineRadarChartDataSetProtocol.swift similarity index 90% rename from Source/Charts/Data/Interfaces/ILineRadarChartDataSet.swift rename to Source/Charts/Data/Interfaces/LineRadarChartDataSetProtocol.swift index 5d054948af..e9f3297562 100644 --- a/Source/Charts/Data/Interfaces/ILineRadarChartDataSet.swift +++ b/Source/Charts/Data/Interfaces/LineRadarChartDataSetProtocol.swift @@ -1,5 +1,5 @@ // -// ILineRadarChartDataSet.swift +// LineRadarChartDataSetProtocol.swift // Charts // // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda @@ -13,7 +13,7 @@ import Foundation import CoreGraphics @objc -public protocol ILineRadarChartDataSet: ILineScatterCandleRadarChartDataSet +public protocol LineRadarChartDataSetProtocol: LineScatterCandleRadarChartDataSetProtocol { // MARK: - Data functions and accessors diff --git a/Source/Charts/Data/Interfaces/ILineScatterCandleRadarChartDataSet.swift b/Source/Charts/Data/Interfaces/LineScatterCandleRadarChartDataSetProtocol.swift similarity index 87% rename from Source/Charts/Data/Interfaces/ILineScatterCandleRadarChartDataSet.swift rename to Source/Charts/Data/Interfaces/LineScatterCandleRadarChartDataSetProtocol.swift index cf646a1b56..d1de8e2248 100644 --- a/Source/Charts/Data/Interfaces/ILineScatterCandleRadarChartDataSet.swift +++ b/Source/Charts/Data/Interfaces/LineScatterCandleRadarChartDataSetProtocol.swift @@ -1,5 +1,5 @@ // -// ILineScatterCandleRadarChartDataSet.swift +// LineScatterCandleRadarChartDataSetProtocol.swift // Charts // // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda @@ -12,7 +12,7 @@ import Foundation @objc -public protocol ILineScatterCandleRadarChartDataSet: IBarLineScatterCandleBubbleChartDataSet +public protocol LineScatterCandleRadarChartDataSetProtocol: BarLineScatterCandleBubbleChartDataSetProtocol { // MARK: - Data functions and accessors diff --git a/Source/Charts/Data/Interfaces/IPieChartDataSet.swift b/Source/Charts/Data/Interfaces/PieChartDataSetProtocol.swift similarity index 95% rename from Source/Charts/Data/Interfaces/IPieChartDataSet.swift rename to Source/Charts/Data/Interfaces/PieChartDataSetProtocol.swift index 1e027be0cb..0cbe2c55e8 100644 --- a/Source/Charts/Data/Interfaces/IPieChartDataSet.swift +++ b/Source/Charts/Data/Interfaces/PieChartDataSetProtocol.swift @@ -1,5 +1,5 @@ // -// IPieChartDataSet.swift +// PieChartDataSetProtocol.swift // Charts // // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda @@ -17,7 +17,7 @@ import CoreGraphics #endif @objc -public protocol IPieChartDataSet: IChartDataSet +public protocol PieChartDataSetProtocol: ChartDataSetProtocol { // MARK: - Styling functions and accessors diff --git a/Source/Charts/Data/Interfaces/IRadarChartDataSet.swift b/Source/Charts/Data/Interfaces/RadarChartDataSetProtocol.swift similarity index 90% rename from Source/Charts/Data/Interfaces/IRadarChartDataSet.swift rename to Source/Charts/Data/Interfaces/RadarChartDataSetProtocol.swift index 2e37b4ffd5..98c12d77c3 100644 --- a/Source/Charts/Data/Interfaces/IRadarChartDataSet.swift +++ b/Source/Charts/Data/Interfaces/RadarChartDataSetProtocol.swift @@ -1,5 +1,5 @@ // -// IRadarChartDataSet.swift +// RadarChartDataSetProtocol.swift // Charts // // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda @@ -13,7 +13,7 @@ import Foundation import CoreGraphics @objc -public protocol IRadarChartDataSet: ILineRadarChartDataSet +public protocol RadarChartDataSetProtocol: LineRadarChartDataSetProtocol { // MARK: - Data functions and accessors diff --git a/Source/Charts/Data/Interfaces/IScatterChartDataSet.swift b/Source/Charts/Data/Interfaces/ScatterChartDataSetProtocol.swift similarity index 88% rename from Source/Charts/Data/Interfaces/IScatterChartDataSet.swift rename to Source/Charts/Data/Interfaces/ScatterChartDataSetProtocol.swift index 5703f07d00..d101e22af3 100644 --- a/Source/Charts/Data/Interfaces/IScatterChartDataSet.swift +++ b/Source/Charts/Data/Interfaces/ScatterChartDataSetProtocol.swift @@ -1,5 +1,5 @@ // -// IScatterChartDataSet.swift +// ScatterChartDataSetProtocol.swift // Charts // // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda @@ -13,7 +13,7 @@ import Foundation import CoreGraphics @objc -public protocol IScatterChartDataSet: ILineScatterCandleRadarChartDataSet +public protocol ScatterChartDataSetProtocol: LineScatterCandleRadarChartDataSetProtocol { // MARK: - Data functions and accessors diff --git a/Source/Charts/Formatters/IAxisValueFormatter.swift b/Source/Charts/Formatters/AxisValueFormatter.swift similarity index 88% rename from Source/Charts/Formatters/IAxisValueFormatter.swift rename to Source/Charts/Formatters/AxisValueFormatter.swift index 9634334cb5..ecdcb5498e 100644 --- a/Source/Charts/Formatters/IAxisValueFormatter.swift +++ b/Source/Charts/Formatters/AxisValueFormatter.swift @@ -1,5 +1,5 @@ // -// IAxisValueFormatter.swift +// AxisValueFormatter.swift // Charts // // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda @@ -12,8 +12,8 @@ import Foundation /// An interface for providing custom axis Strings. -@objc(IChartAxisValueFormatter) -public protocol IAxisValueFormatter: class +@objc(ChartAxisValueFormatter) +public protocol AxisValueFormatter: class { /// Called when a value from an axis is formatted before being drawn. diff --git a/Source/Charts/Formatters/DefaultAxisValueFormatter.swift b/Source/Charts/Formatters/DefaultAxisValueFormatter.swift index 85193d0c46..b698c5a319 100644 --- a/Source/Charts/Formatters/DefaultAxisValueFormatter.swift +++ b/Source/Charts/Formatters/DefaultAxisValueFormatter.swift @@ -12,7 +12,7 @@ import Foundation @objc(ChartDefaultAxisValueFormatter) -open class DefaultAxisValueFormatter: NSObject, IAxisValueFormatter +open class DefaultAxisValueFormatter: NSObject, AxisValueFormatter { public typealias Block = ( _ value: Double, diff --git a/Source/Charts/Formatters/DefaultFillFormatter.swift b/Source/Charts/Formatters/DefaultFillFormatter.swift index ea9c2a7465..91f99c0018 100644 --- a/Source/Charts/Formatters/DefaultFillFormatter.swift +++ b/Source/Charts/Formatters/DefaultFillFormatter.swift @@ -18,10 +18,10 @@ import CoreGraphics /// Default formatter that calculates the position of the filled line. @objc(ChartDefaultFillFormatter) -open class DefaultFillFormatter: NSObject, IFillFormatter +open class DefaultFillFormatter: NSObject, FillFormatter { public typealias Block = ( - _ dataSet: ILineChartDataSet, + _ dataSet: LineChartDataSetProtocol, _ dataProvider: LineChartDataProvider) -> CGFloat @objc open var block: Block? @@ -39,7 +39,7 @@ open class DefaultFillFormatter: NSObject, IFillFormatter } open func getFillLinePosition( - dataSet: ILineChartDataSet, + dataSet: LineChartDataSetProtocol, dataProvider: LineChartDataProvider) -> CGFloat { guard block == nil else { return block!(dataSet, dataProvider) } diff --git a/Source/Charts/Formatters/DefaultValueFormatter.swift b/Source/Charts/Formatters/DefaultValueFormatter.swift index b3fff70ac9..6c3fdbc9da 100644 --- a/Source/Charts/Formatters/DefaultValueFormatter.swift +++ b/Source/Charts/Formatters/DefaultValueFormatter.swift @@ -12,7 +12,7 @@ import Foundation @objc(ChartDefaultValueFormatter) -open class DefaultValueFormatter: NSObject, IValueFormatter +open class DefaultValueFormatter: NSObject, ValueFormatter { public typealias Block = ( _ value: Double, diff --git a/Source/Charts/Formatters/IFillFormatter.swift b/Source/Charts/Formatters/FillFormatter.swift similarity index 72% rename from Source/Charts/Formatters/IFillFormatter.swift rename to Source/Charts/Formatters/FillFormatter.swift index 8a88500299..5fb53136bb 100644 --- a/Source/Charts/Formatters/IFillFormatter.swift +++ b/Source/Charts/Formatters/FillFormatter.swift @@ -1,5 +1,5 @@ // -// IFillFormatter.swift +// FillFormatter.swift // Charts // // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda @@ -13,9 +13,9 @@ import Foundation import CoreGraphics /// Protocol for providing a custom logic to where the filling line of a LineDataSet should end. This of course only works if setFillEnabled(...) is set to true. -@objc(IChartFillFormatter) -public protocol IFillFormatter +@objc(ChartFillFormatter) +public protocol FillFormatter { /// - returns: The vertical (y-axis) position where the filled-line of the LineDataSet should end. - func getFillLinePosition(dataSet: ILineChartDataSet, dataProvider: LineChartDataProvider) -> CGFloat + func getFillLinePosition(dataSet: LineChartDataSetProtocol, dataProvider: LineChartDataProvider) -> CGFloat } diff --git a/Source/Charts/Formatters/IndexAxisValueFormatter.swift b/Source/Charts/Formatters/IndexAxisValueFormatter.swift index 9655123984..afca4cc76c 100644 --- a/Source/Charts/Formatters/IndexAxisValueFormatter.swift +++ b/Source/Charts/Formatters/IndexAxisValueFormatter.swift @@ -13,7 +13,7 @@ import Foundation /// This formatter is used for passing an array of x-axis labels, on whole x steps. @objc(ChartIndexAxisValueFormatter) -open class IndexAxisValueFormatter: NSObject, IAxisValueFormatter +open class IndexAxisValueFormatter: NSObject, AxisValueFormatter { private var _values: [String] = [String]() private var _valueCount: Int = 0 diff --git a/Source/Charts/Formatters/IValueFormatter.swift b/Source/Charts/Formatters/ValueFormatter.swift similarity index 93% rename from Source/Charts/Formatters/IValueFormatter.swift rename to Source/Charts/Formatters/ValueFormatter.swift index bd7c0c90f8..66d4100097 100644 --- a/Source/Charts/Formatters/IValueFormatter.swift +++ b/Source/Charts/Formatters/ValueFormatter.swift @@ -1,5 +1,5 @@ // -// IValueFormatter.swift +// ValueFormatter.swift // Charts // // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda @@ -16,8 +16,8 @@ import Foundation /// Simply create your own formatting class and let it implement ValueFormatter. /// /// Then override the getFormattedValue(...) method and return whatever you want. -@objc(IChartValueFormatter) -public protocol IValueFormatter: class +@objc(ChartValueFormatter) +public protocol ValueFormatter: class { /// Called when a value (from labels inside the chart) is formatted before being drawn. diff --git a/Source/Charts/Highlight/BarHighlighter.swift b/Source/Charts/Highlight/BarHighlighter.swift index ff115fe147..e34e2bc47a 100644 --- a/Source/Charts/Highlight/BarHighlighter.swift +++ b/Source/Charts/Highlight/BarHighlighter.swift @@ -29,7 +29,7 @@ open class BarHighlighter: ChartHighlighter let pos = getValsForTouch(x: x, y: y) if - let set = barData.getDataSetByIndex(high!.dataSetIndex) as? IBarChartDataSet, + let set = barData.getDataSetByIndex(high!.dataSetIndex) as? BarChartDataSetProtocol, set.isStacked { return getStackedHighlight(high: high!, @@ -60,7 +60,7 @@ open class BarHighlighter: ChartHighlighter /// - parameter yValue: /// - returns: @objc open func getStackedHighlight(high: Highlight, - set: IBarChartDataSet, + set: BarChartDataSetProtocol, xValue: Double, yValue: Double) -> Highlight? { diff --git a/Source/Charts/Highlight/ChartHighlighter.swift b/Source/Charts/Highlight/ChartHighlighter.swift index 719f44e757..abc0a3e4a4 100644 --- a/Source/Charts/Highlight/ChartHighlighter.swift +++ b/Source/Charts/Highlight/ChartHighlighter.swift @@ -12,7 +12,7 @@ import Foundation import CoreGraphics -open class ChartHighlighter : NSObject, IHighlighter +open class ChartHighlighter : NSObject, Highlighter { /// instance of the data-provider @objc open weak var chart: ChartDataProvider? @@ -103,7 +103,7 @@ open class ChartHighlighter : NSObject, IHighlighter /// - returns: An array of `Highlight` objects corresponding to the selected xValue and dataSetIndex. internal func buildHighlights( - dataSet set: IChartDataSet, + dataSet set: ChartDataSetProtocol, dataSetIndex: Int, xValue: Double, rounding: ChartDataSetRounding) -> [Highlight] diff --git a/Source/Charts/Highlight/IHighlighter.swift b/Source/Charts/Highlight/Highlighter.swift similarity index 84% rename from Source/Charts/Highlight/IHighlighter.swift rename to Source/Charts/Highlight/Highlighter.swift index 56acfcc226..4197e5d7fd 100644 --- a/Source/Charts/Highlight/IHighlighter.swift +++ b/Source/Charts/Highlight/Highlighter.swift @@ -1,5 +1,5 @@ // -// IHighlighter.swift +// Highlighter.swift // Charts // // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda @@ -12,8 +12,8 @@ import Foundation import CoreGraphics -@objc(IChartHighlighter) -public protocol IHighlighter: class +@objc(ChartHighlighter) +public protocol Highlighter: class { /// - returns: A Highlight object corresponding to the given x- and y- touch positions in pixels. /// - parameter x: diff --git a/Source/Charts/Highlight/HorizontalBarHighlighter.swift b/Source/Charts/Highlight/HorizontalBarHighlighter.swift index eec39c807e..a9f0fe6f3d 100644 --- a/Source/Charts/Highlight/HorizontalBarHighlighter.swift +++ b/Source/Charts/Highlight/HorizontalBarHighlighter.swift @@ -24,7 +24,7 @@ open class HorizontalBarHighlighter: BarHighlighter guard let high = getHighlight(xValue: Double(pos.y), x: y, y: x) else { return nil } - if let set = barData.getDataSetByIndex(high.dataSetIndex) as? IBarChartDataSet, + if let set = barData.getDataSetByIndex(high.dataSetIndex) as? BarChartDataSetProtocol, set.isStacked { return getStackedHighlight(high: high, @@ -39,7 +39,7 @@ open class HorizontalBarHighlighter: BarHighlighter } internal override func buildHighlights( - dataSet set: IChartDataSet, + dataSet set: ChartDataSetProtocol, dataSetIndex: Int, xValue: Double, rounding: ChartDataSetRounding) -> [Highlight] diff --git a/Source/Charts/Renderers/BarChartRenderer.swift b/Source/Charts/Renderers/BarChartRenderer.swift index 3621ddbf9c..cf8fad5f5b 100644 --- a/Source/Charts/Renderers/BarChartRenderer.swift +++ b/Source/Charts/Renderers/BarChartRenderer.swift @@ -54,7 +54,7 @@ open class BarChartRenderer: BarLineScatterCandleBubbleRenderer for i in stride(from: 0, to: barData.dataSetCount, by: 1) { - let set = barData.dataSets[i] as! IBarChartDataSet + let set = barData.dataSets[i] as! BarChartDataSetProtocol let size = set.entryCount * (set.isStacked ? set.stackSize : 1) if _buffers[i].rects.count != size { @@ -68,7 +68,7 @@ open class BarChartRenderer: BarLineScatterCandleBubbleRenderer } } - private func prepareBuffer(dataSet: IBarChartDataSet, index: Int) + private func prepareBuffer(dataSet: BarChartDataSetProtocol, index: Int) { guard let dataProvider = dataProvider, @@ -193,19 +193,19 @@ open class BarChartRenderer: BarLineScatterCandleBubbleRenderer if set.isVisible { - if !(set is IBarChartDataSet) + if !(set is BarChartDataSetProtocol) { - fatalError("Datasets for BarChartRenderer must conform to IBarChartDataset") + fatalError("Datasets for BarChartRenderer must conform to BarChartDataSetProtocol") } - drawDataSet(context: context, dataSet: set as! IBarChartDataSet, index: i) + drawDataSet(context: context, dataSet: set as! BarChartDataSetProtocol, index: i) } } } private var _barShadowRectBuffer: CGRect = CGRect() - @objc open func drawDataSet(context: CGContext, dataSet: IBarChartDataSet, index: Int) + @objc open func drawDataSet(context: CGContext, dataSet: BarChartDataSetProtocol, index: Int) { guard let dataProvider = dataProvider else { return } @@ -362,7 +362,7 @@ open class BarChartRenderer: BarLineScatterCandleBubbleRenderer for dataSetIndex in 0 ..< barData.dataSetCount { - guard let dataSet = dataSets[dataSetIndex] as? IBarChartDataSet else { continue } + guard let dataSet = dataSets[dataSetIndex] as? BarChartDataSetProtocol else { continue } if !shouldDrawValues(forDataSet: dataSet) { @@ -630,7 +630,7 @@ open class BarChartRenderer: BarLineScatterCandleBubbleRenderer for high in indices { guard - let set = barData.getDataSetByIndex(high.dataSetIndex) as? IBarChartDataSet, + let set = barData.getDataSetByIndex(high.dataSetIndex) as? BarChartDataSetProtocol, set.isHighlightEnabled else { continue } diff --git a/Source/Charts/Renderers/BarLineScatterCandleBubbleRenderer.swift b/Source/Charts/Renderers/BarLineScatterCandleBubbleRenderer.swift index 4ba1b5fac7..1a2ad8ce46 100644 --- a/Source/Charts/Renderers/BarLineScatterCandleBubbleRenderer.swift +++ b/Source/Charts/Renderers/BarLineScatterCandleBubbleRenderer.swift @@ -23,7 +23,7 @@ open class BarLineScatterCandleBubbleRenderer: DataRenderer } /// Checks if the provided entry object is in bounds for drawing considering the current animation phase. - internal func isInBoundsX(entry e: ChartDataEntry, dataSet: IBarLineScatterCandleBubbleChartDataSet) -> Bool + internal func isInBoundsX(entry e: ChartDataEntry, dataSet: BarLineScatterCandleBubbleChartDataSetProtocol) -> Bool { let entryIndex = dataSet.entryIndex(entry: e) return Double(entryIndex) < Double(dataSet.entryCount) * animator.phaseX @@ -32,14 +32,14 @@ open class BarLineScatterCandleBubbleRenderer: DataRenderer /// Calculates and returns the x-bounds for the given DataSet in terms of index in their values array. /// This includes minimum and maximum visible x, as well as range. internal func xBounds(chart: BarLineScatterCandleBubbleChartDataProvider, - dataSet: IBarLineScatterCandleBubbleChartDataSet, + dataSet: BarLineScatterCandleBubbleChartDataSetProtocol, animator: Animator?) -> XBounds { return XBounds(chart: chart, dataSet: dataSet, animator: animator) } /// - returns: `true` if the DataSet values should be drawn, `false` if not. - internal func shouldDrawValues(forDataSet set: IChartDataSet) -> Bool + internal func shouldDrawValues(forDataSet set: ChartDataSetProtocol) -> Bool { return set.isVisible && (set.isDrawValuesEnabled || set.isDrawIconsEnabled) } @@ -62,7 +62,7 @@ open class BarLineScatterCandleBubbleRenderer: DataRenderer } public init(chart: BarLineScatterCandleBubbleChartDataProvider, - dataSet: IBarLineScatterCandleBubbleChartDataSet, + dataSet: BarLineScatterCandleBubbleChartDataSetProtocol, animator: Animator?) { self.set(chart: chart, dataSet: dataSet, animator: animator) @@ -70,7 +70,7 @@ open class BarLineScatterCandleBubbleRenderer: DataRenderer /// Calculates the minimum and maximum x values as well as the range between them. open func set(chart: BarLineScatterCandleBubbleChartDataProvider, - dataSet: IBarLineScatterCandleBubbleChartDataSet, + dataSet: BarLineScatterCandleBubbleChartDataSetProtocol, animator: Animator?) { let phaseX = Swift.max(0.0, Swift.min(1.0, animator?.phaseX ?? 1.0)) diff --git a/Source/Charts/Renderers/BubbleChartRenderer.swift b/Source/Charts/Renderers/BubbleChartRenderer.swift index 8498070c17..bdf8f5c95d 100644 --- a/Source/Charts/Renderers/BubbleChartRenderer.swift +++ b/Source/Charts/Renderers/BubbleChartRenderer.swift @@ -35,7 +35,7 @@ open class BubbleChartRenderer: BarLineScatterCandleBubbleRenderer let bubbleData = dataProvider.bubbleData else { return } - for set in bubbleData.dataSets as! [IBubbleChartDataSet] where set.isVisible + for set in bubbleData.dataSets as! [BubbleChartDataSetProtocol] where set.isVisible { drawDataSet(context: context, dataSet: set) } @@ -57,7 +57,7 @@ open class BubbleChartRenderer: BarLineScatterCandleBubbleRenderer private var _pointBuffer = CGPoint() private var _sizeBuffer = [CGPoint](repeating: CGPoint(), count: 2) - @objc open func drawDataSet(context: CGContext, dataSet: IBubbleChartDataSet) + @objc open func drawDataSet(context: CGContext, dataSet: BubbleChartDataSetProtocol) { guard let dataProvider = dataProvider else { return } @@ -125,7 +125,7 @@ open class BubbleChartRenderer: BarLineScatterCandleBubbleRenderer dataProvider = dataProvider, let bubbleData = dataProvider.bubbleData, isDrawingValuesAllowed(dataProvider: dataProvider), - let dataSets = bubbleData.dataSets as? [IBubbleChartDataSet] + let dataSets = bubbleData.dataSets as? [BubbleChartDataSetProtocol] else { return } let phaseX = max(0.0, min(1.0, animator.phaseX)) @@ -222,7 +222,7 @@ open class BubbleChartRenderer: BarLineScatterCandleBubbleRenderer for high in indices { guard - let dataSet = bubbleData.getDataSetByIndex(high.dataSetIndex) as? IBubbleChartDataSet, + let dataSet = bubbleData.getDataSetByIndex(high.dataSetIndex) as? BubbleChartDataSetProtocol, dataSet.isHighlightEnabled, let entry = dataSet.entryForXValue(high.x, closestToY: high.y) as? BubbleChartDataEntry, isInBoundsX(entry: entry, dataSet: dataSet) diff --git a/Source/Charts/Renderers/CandleStickChartRenderer.swift b/Source/Charts/Renderers/CandleStickChartRenderer.swift index 28a460d9fe..8582db4869 100644 --- a/Source/Charts/Renderers/CandleStickChartRenderer.swift +++ b/Source/Charts/Renderers/CandleStickChartRenderer.swift @@ -32,7 +32,7 @@ open class CandleStickChartRenderer: LineScatterCandleRadarRenderer { guard let dataProvider = dataProvider, let candleData = dataProvider.candleData else { return } - for set in candleData.dataSets as! [ICandleChartDataSet] + for set in candleData.dataSets as! [CandleChartDataSetProtocol] { if set.isVisible { @@ -48,7 +48,7 @@ open class CandleStickChartRenderer: LineScatterCandleRadarRenderer private var _bodyRect = CGRect() private var _lineSegments = [CGPoint](repeating: CGPoint(), count: 2) - @objc open func drawDataSet(context: CGContext, dataSet: ICandleChartDataSet) + @objc open func drawDataSet(context: CGContext, dataSet: CandleChartDataSetProtocol) { guard let dataProvider = dataProvider else { return } @@ -250,7 +250,7 @@ open class CandleStickChartRenderer: LineScatterCandleRadarRenderer for i in 0 ..< dataSets.count { - guard let dataSet = dataSets[i] as? IBarLineScatterCandleBubbleChartDataSet + guard let dataSet = dataSets[i] as? BarLineScatterCandleBubbleChartDataSetProtocol else { continue } if !shouldDrawValues(forDataSet: dataSet) @@ -335,7 +335,7 @@ open class CandleStickChartRenderer: LineScatterCandleRadarRenderer for high in indices { guard - let set = candleData.getDataSetByIndex(high.dataSetIndex) as? ICandleChartDataSet, + let set = candleData.getDataSetByIndex(high.dataSetIndex) as? CandleChartDataSetProtocol, set.isHighlightEnabled else { continue } diff --git a/Source/Charts/Renderers/HorizontalBarChartRenderer.swift b/Source/Charts/Renderers/HorizontalBarChartRenderer.swift index 23925c4d60..373f4df331 100644 --- a/Source/Charts/Renderers/HorizontalBarChartRenderer.swift +++ b/Source/Charts/Renderers/HorizontalBarChartRenderer.swift @@ -51,7 +51,7 @@ open class HorizontalBarChartRenderer: BarChartRenderer for i in stride(from: 0, to: barData.dataSetCount, by: 1) { - let set = barData.dataSets[i] as! IBarChartDataSet + let set = barData.dataSets[i] as! BarChartDataSetProtocol let size = set.entryCount * (set.isStacked ? set.stackSize : 1) if _buffers[i].rects.count != size { @@ -65,7 +65,7 @@ open class HorizontalBarChartRenderer: BarChartRenderer } } - private func prepareBuffer(dataSet: IBarChartDataSet, index: Int) + private func prepareBuffer(dataSet: BarChartDataSetProtocol, index: Int) { guard let dataProvider = dataProvider, @@ -179,7 +179,7 @@ open class HorizontalBarChartRenderer: BarChartRenderer private var _barShadowRectBuffer: CGRect = CGRect() - open override func drawDataSet(context: CGContext, dataSet: IBarChartDataSet, index: Int) + open override func drawDataSet(context: CGContext, dataSet: BarChartDataSetProtocol, index: Int) { guard let dataProvider = dataProvider else { return } @@ -316,7 +316,7 @@ open class HorizontalBarChartRenderer: BarChartRenderer for dataSetIndex in 0 ..< barData.dataSetCount { - guard let dataSet = dataSets[dataSetIndex] as? IBarChartDataSet else { continue } + guard let dataSet = dataSets[dataSetIndex] as? BarChartDataSetProtocol else { continue } if !shouldDrawValues(forDataSet: dataSet) || !(dataSet.isDrawIconsEnabled && dataSet.isVisible) { diff --git a/Source/Charts/Renderers/LegendRenderer.swift b/Source/Charts/Renderers/LegendRenderer.swift index 38c3648537..93537cd09b 100755 --- a/Source/Charts/Renderers/LegendRenderer.swift +++ b/Source/Charts/Renderers/LegendRenderer.swift @@ -47,10 +47,10 @@ open class LegendRenderer: Renderer let entryCount = dataSet.entryCount // if we have a barchart with stacked bars - if dataSet is IBarChartDataSet && - (dataSet as! IBarChartDataSet).isStacked + if dataSet is BarChartDataSetProtocol && + (dataSet as! BarChartDataSetProtocol).isStacked { - let bds = dataSet as! IBarChartDataSet + let bds = dataSet as! BarChartDataSetProtocol var sLabels = bds.stackLabels for j in 0.. CGPath + private func generateFilledPath(dataSet: LineChartDataSetProtocol, fillMin: CGFloat, bounds: XBounds, matrix: CGAffineTransform) -> CGPath { let phaseY = animator.phaseY let isDrawSteppedEnabled = dataSet.mode == .stepped @@ -512,7 +512,7 @@ open class LineChartRenderer: LineRadarRenderer for i in 0 ..< dataSets.count { - guard let dataSet = dataSets[i] as? ILineChartDataSet else { continue } + guard let dataSet = dataSets[i] as? LineChartDataSetProtocol else { continue } if !shouldDrawValues(forDataSet: dataSet) { @@ -607,7 +607,7 @@ open class LineChartRenderer: LineRadarRenderer for i in 0 ..< dataSets.count { - guard let dataSet = lineData.getDataSetByIndex(i) as? ILineChartDataSet else { continue } + guard let dataSet = lineData.getDataSetByIndex(i) as? LineChartDataSetProtocol else { continue } if !dataSet.isVisible || !dataSet.isDrawCirclesEnabled || dataSet.entryCount == 0 { @@ -709,7 +709,7 @@ open class LineChartRenderer: LineRadarRenderer for high in indices { - guard let set = lineData.getDataSetByIndex(high.dataSetIndex) as? ILineChartDataSet + guard let set = lineData.getDataSetByIndex(high.dataSetIndex) as? LineChartDataSetProtocol , set.isHighlightEnabled else { continue } diff --git a/Source/Charts/Renderers/LineScatterCandleRadarRenderer.swift b/Source/Charts/Renderers/LineScatterCandleRadarRenderer.swift index 05203caf9c..dd33ffe862 100644 --- a/Source/Charts/Renderers/LineScatterCandleRadarRenderer.swift +++ b/Source/Charts/Renderers/LineScatterCandleRadarRenderer.swift @@ -25,7 +25,7 @@ open class LineScatterCandleRadarRenderer: BarLineScatterCandleBubbleRenderer /// :param: points /// :param: horizontal /// :param: vertical - @objc open func drawHighlightLines(context: CGContext, point: CGPoint, set: ILineScatterCandleRadarChartDataSet) + @objc open func drawHighlightLines(context: CGContext, point: CGPoint, set: LineScatterCandleRadarChartDataSetProtocol) { // draw vertical highlight lines diff --git a/Source/Charts/Renderers/PieChartRenderer.swift b/Source/Charts/Renderers/PieChartRenderer.swift index a363da290d..3f5fecb30e 100644 --- a/Source/Charts/Renderers/PieChartRenderer.swift +++ b/Source/Charts/Renderers/PieChartRenderer.swift @@ -36,7 +36,7 @@ open class PieChartRenderer: DataRenderer if pieData != nil { - for set in pieData!.dataSets as! [IPieChartDataSet] + for set in pieData!.dataSets as! [PieChartDataSetProtocol] { if set.isVisible && set.entryCount > 0 { @@ -88,7 +88,7 @@ open class PieChartRenderer: DataRenderer } /// Calculates the sliceSpace to use based on visible values and their size compared to the set sliceSpace. - @objc open func getSliceSpace(dataSet: IPieChartDataSet) -> CGFloat + @objc open func getSliceSpace(dataSet: PieChartDataSetProtocol) -> CGFloat { guard dataSet.automaticallyDisableSliceSpacing, @@ -105,7 +105,7 @@ open class PieChartRenderer: DataRenderer return sliceSpace } - @objc open func drawDataSet(context: CGContext, dataSet: IPieChartDataSet) + @objc open func drawDataSet(context: CGContext, dataSet: PieChartDataSetProtocol) { guard let chart = chart else {return } @@ -298,7 +298,7 @@ open class PieChartRenderer: DataRenderer for i in 0 ..< dataSets.count { - guard let dataSet = dataSets[i] as? IPieChartDataSet else { continue } + guard let dataSet = dataSets[i] as? PieChartDataSetProtocol else { continue } let drawValues = dataSet.isDrawValuesEnabled @@ -687,7 +687,7 @@ open class PieChartRenderer: DataRenderer continue } - guard let set = data.getDataSetByIndex(indices[i].dataSetIndex) as? IPieChartDataSet else { continue } + guard let set = data.getDataSetByIndex(indices[i].dataSetIndex) as? PieChartDataSetProtocol else { continue } if !set.isHighlightEnabled { diff --git a/Source/Charts/Renderers/RadarChartRenderer.swift b/Source/Charts/Renderers/RadarChartRenderer.swift index ab4890f646..941d70948e 100644 --- a/Source/Charts/Renderers/RadarChartRenderer.swift +++ b/Source/Charts/Renderers/RadarChartRenderer.swift @@ -38,7 +38,7 @@ open class RadarChartRenderer: LineRadarRenderer { let mostEntries = radarData?.maxEntryCountSet?.entryCount ?? 0 - for set in radarData!.dataSets as! [IRadarChartDataSet] + for set in radarData!.dataSets as! [RadarChartDataSetProtocol] { if set.isVisible { @@ -53,7 +53,7 @@ open class RadarChartRenderer: LineRadarRenderer /// - parameter context: /// - parameter dataSet: /// - parameter mostEntries: the entry count of the dataset with the most entries - internal func drawDataSet(context: CGContext, dataSet: IRadarChartDataSet, mostEntries: Int) + internal func drawDataSet(context: CGContext, dataSet: RadarChartDataSetProtocol, mostEntries: Int) { guard let chart = chart else { return } @@ -155,7 +155,7 @@ open class RadarChartRenderer: LineRadarRenderer for i in 0 ..< data.dataSetCount { - let dataSet = data.getDataSetByIndex(i) as! IRadarChartDataSet + let dataSet = data.getDataSetByIndex(i) as! RadarChartDataSetProtocol if !shouldDrawValues(forDataSet: dataSet) { @@ -310,7 +310,7 @@ open class RadarChartRenderer: LineRadarRenderer for high in indices { guard - let set = chart.data?.getDataSetByIndex(high.dataSetIndex) as? IRadarChartDataSet, + let set = chart.data?.getDataSetByIndex(high.dataSetIndex) as? RadarChartDataSetProtocol, set.isHighlightEnabled else { continue } diff --git a/Source/Charts/Renderers/Scatter/ChevronDownShapeRenderer.swift b/Source/Charts/Renderers/Scatter/ChevronDownShapeRenderer.swift index 2d035bf357..152c44ab80 100644 --- a/Source/Charts/Renderers/Scatter/ChevronDownShapeRenderer.swift +++ b/Source/Charts/Renderers/Scatter/ChevronDownShapeRenderer.swift @@ -15,7 +15,7 @@ open class ChevronDownShapeRenderer : NSObject, IShapeRenderer { open func renderShape( context: CGContext, - dataSet: IScatterChartDataSet, + dataSet: ScatterChartDataSetProtocol, viewPortHandler: ViewPortHandler, point: CGPoint, color: NSUIColor) diff --git a/Source/Charts/Renderers/Scatter/ChevronUpShapeRenderer.swift b/Source/Charts/Renderers/Scatter/ChevronUpShapeRenderer.swift index 725533e780..8b416684d8 100644 --- a/Source/Charts/Renderers/Scatter/ChevronUpShapeRenderer.swift +++ b/Source/Charts/Renderers/Scatter/ChevronUpShapeRenderer.swift @@ -15,7 +15,7 @@ open class ChevronUpShapeRenderer : NSObject, IShapeRenderer { open func renderShape( context: CGContext, - dataSet: IScatterChartDataSet, + dataSet: ScatterChartDataSetProtocol, viewPortHandler: ViewPortHandler, point: CGPoint, color: NSUIColor) diff --git a/Source/Charts/Renderers/Scatter/CircleShapeRenderer.swift b/Source/Charts/Renderers/Scatter/CircleShapeRenderer.swift index b94a51137a..27dd6a8dea 100644 --- a/Source/Charts/Renderers/Scatter/CircleShapeRenderer.swift +++ b/Source/Charts/Renderers/Scatter/CircleShapeRenderer.swift @@ -15,7 +15,7 @@ open class CircleShapeRenderer : NSObject, IShapeRenderer { open func renderShape( context: CGContext, - dataSet: IScatterChartDataSet, + dataSet: ScatterChartDataSetProtocol, viewPortHandler: ViewPortHandler, point: CGPoint, color: NSUIColor) diff --git a/Source/Charts/Renderers/Scatter/CrossShapeRenderer.swift b/Source/Charts/Renderers/Scatter/CrossShapeRenderer.swift index 18785d3dee..c4f5c5f059 100644 --- a/Source/Charts/Renderers/Scatter/CrossShapeRenderer.swift +++ b/Source/Charts/Renderers/Scatter/CrossShapeRenderer.swift @@ -15,7 +15,7 @@ open class CrossShapeRenderer : NSObject, IShapeRenderer { open func renderShape( context: CGContext, - dataSet: IScatterChartDataSet, + dataSet: ScatterChartDataSetProtocol, viewPortHandler: ViewPortHandler, point: CGPoint, color: NSUIColor) diff --git a/Source/Charts/Renderers/Scatter/IShapeRenderer.swift b/Source/Charts/Renderers/Scatter/IShapeRenderer.swift index bb12d9824a..b8fd5e7c4a 100644 --- a/Source/Charts/Renderers/Scatter/IShapeRenderer.swift +++ b/Source/Charts/Renderers/Scatter/IShapeRenderer.swift @@ -24,7 +24,7 @@ public protocol IShapeRenderer: class /// - parameter color: Color to draw the shape func renderShape( context: CGContext, - dataSet: IScatterChartDataSet, + dataSet: ScatterChartDataSetProtocol, viewPortHandler: ViewPortHandler, point: CGPoint, color: NSUIColor) diff --git a/Source/Charts/Renderers/Scatter/SquareShapeRenderer.swift b/Source/Charts/Renderers/Scatter/SquareShapeRenderer.swift index ea692e33fd..76646c68e2 100644 --- a/Source/Charts/Renderers/Scatter/SquareShapeRenderer.swift +++ b/Source/Charts/Renderers/Scatter/SquareShapeRenderer.swift @@ -15,7 +15,7 @@ open class SquareShapeRenderer : NSObject, IShapeRenderer { open func renderShape( context: CGContext, - dataSet: IScatterChartDataSet, + dataSet: ScatterChartDataSetProtocol, viewPortHandler: ViewPortHandler, point: CGPoint, color: NSUIColor) diff --git a/Source/Charts/Renderers/Scatter/TriangleShapeRenderer.swift b/Source/Charts/Renderers/Scatter/TriangleShapeRenderer.swift index fa313b765b..c73a8b8d09 100644 --- a/Source/Charts/Renderers/Scatter/TriangleShapeRenderer.swift +++ b/Source/Charts/Renderers/Scatter/TriangleShapeRenderer.swift @@ -15,7 +15,7 @@ open class TriangleShapeRenderer : NSObject, IShapeRenderer { open func renderShape( context: CGContext, - dataSet: IScatterChartDataSet, + dataSet: ScatterChartDataSetProtocol, viewPortHandler: ViewPortHandler, point: CGPoint, color: NSUIColor) diff --git a/Source/Charts/Renderers/Scatter/XShapeRenderer.swift b/Source/Charts/Renderers/Scatter/XShapeRenderer.swift index 8a546c5f0b..67b8a8a9d5 100644 --- a/Source/Charts/Renderers/Scatter/XShapeRenderer.swift +++ b/Source/Charts/Renderers/Scatter/XShapeRenderer.swift @@ -15,7 +15,7 @@ open class XShapeRenderer : NSObject, IShapeRenderer { open func renderShape( context: CGContext, - dataSet: IScatterChartDataSet, + dataSet: ScatterChartDataSetProtocol, viewPortHandler: ViewPortHandler, point: CGPoint, color: NSUIColor) diff --git a/Source/Charts/Renderers/ScatterChartRenderer.swift b/Source/Charts/Renderers/ScatterChartRenderer.swift index 010ca16791..756a6c81a5 100644 --- a/Source/Charts/Renderers/ScatterChartRenderer.swift +++ b/Source/Charts/Renderers/ScatterChartRenderer.swift @@ -38,19 +38,19 @@ open class ScatterChartRenderer: LineScatterCandleRadarRenderer if set.isVisible { - if !(set is IScatterChartDataSet) + if !(set is ScatterChartDataSetProtocol) { - fatalError("Datasets for ScatterChartRenderer must conform to IScatterChartDataSet") + fatalError("Datasets for ScatterChartRenderer must conform to ScatterChartDataSetProtocol") } - drawDataSet(context: context, dataSet: set as! IScatterChartDataSet) + drawDataSet(context: context, dataSet: set as! ScatterChartDataSetProtocol) } } } private var _lineSegments = [CGPoint](repeating: CGPoint(), count: 2) - @objc open func drawDataSet(context: CGContext, dataSet: IScatterChartDataSet) + @objc open func drawDataSet(context: CGContext, dataSet: ScatterChartDataSetProtocol) { guard let dataProvider = dataProvider else { return } @@ -108,7 +108,7 @@ open class ScatterChartRenderer: LineScatterCandleRadarRenderer // if values are drawn if isDrawingValuesAllowed(dataProvider: dataProvider) { - guard let dataSets = scatterData.dataSets as? [IScatterChartDataSet] else { return } + guard let dataSets = scatterData.dataSets as? [ScatterChartDataSetProtocol] else { return } let phaseY = animator.phaseY @@ -206,7 +206,7 @@ open class ScatterChartRenderer: LineScatterCandleRadarRenderer for high in indices { guard - let set = scatterData.getDataSetByIndex(high.dataSetIndex) as? IScatterChartDataSet, + let set = scatterData.getDataSetByIndex(high.dataSetIndex) as? ScatterChartDataSetProtocol, set.isHighlightEnabled else { continue } diff --git a/Source/Charts/Utils/ChartUtils.swift b/Source/Charts/Utils/ChartUtils.swift index 38603a5c60..3373ad543d 100644 --- a/Source/Charts/Utils/ChartUtils.swift +++ b/Source/Charts/Utils/ChartUtils.swift @@ -83,7 +83,7 @@ extension Double { open class ChartUtils { - private static var _defaultValueFormatter: IValueFormatter = ChartUtils.generateDefaultValueFormatter() + private static var _defaultValueFormatter: ValueFormatter = ChartUtils.generateDefaultValueFormatter() /// Calculates the position around a center point, depending on the distance from the center, and the angle of the position around the center. internal class func getPosition(center: CGPoint, dist: CGFloat, angle: CGFloat) -> CGPoint @@ -263,14 +263,14 @@ open class ChartUtils drawMultilineText(context: context, text: text, knownTextSize: rect.size, point: point, attributes: attributes, constrainedToSize: constrainedToSize, anchor: anchor, angleRadians: angleRadians) } - private class func generateDefaultValueFormatter() -> IValueFormatter + private class func generateDefaultValueFormatter() -> ValueFormatter { let formatter = DefaultValueFormatter(decimals: 1) return formatter } /// - returns: The default value formatter used for all chart components that needs a default - open class func defaultValueFormatter() -> IValueFormatter + open class func defaultValueFormatter() -> ValueFormatter { return _defaultValueFormatter } From 9503634f91219eb6318d309bb8c1ff3f967394c3 Mon Sep 17 00:00:00 2001 From: jjatie Date: Tue, 26 Dec 2017 00:31:23 -0400 Subject: [PATCH 13/15] Renderer protocols (#3136) * Renderer is now a protocol Renamed Renderers, and organized the Renderer folder. * DataRenderer is now a protocol * AxisRenderer is now a protocol --- Charts.xcodeproj/project.pbxproj | 82 +++-- .../Charts/Charts/BarLineChartViewBase.swift | 8 +- .../Charts/HorizontalBarChartView.swift | 8 +- Source/Charts/Charts/RadarChartView.swift | 6 +- .../Standard/ScatterChartDataSet.swift | 6 +- .../ScatterChartDataSetProtocol.swift | 2 +- Source/Charts/Renderers/AxisRenderer.swift | 45 +++ .../Charts/Renderers/AxisRendererBase.swift | 211 ------------ .../BarLineScatterCandleBubbleRenderer.swift | 31 +- .../Renderers/ChartDataRendererBase.swift | 59 ---- .../Renderers/CombinedChartRenderer.swift | 27 +- Source/Charts/Renderers/DataRenderer.swift | 36 ++ Source/Charts/Renderers/LegendRenderer.swift | 9 +- .../Charts/Renderers/PieChartRenderer.swift | 29 +- Source/Charts/Renderers/Renderer.swift | 12 +- .../Scatter/ChevronDownShapeRenderer.swift | 2 +- .../Scatter/ChevronUpShapeRenderer.swift | 2 +- .../Scatter/CircleShapeRenderer.swift | 2 +- .../Scatter/CrossShapeRenderer.swift | 2 +- ...hapeRenderer.swift => ShapeRenderer.swift} | 4 +- .../Scatter/SquareShapeRenderer.swift | 2 +- .../Scatter/TriangleShapeRenderer.swift | 2 +- .../Renderers/Scatter/XShapeRenderer.swift | 2 +- .../Renderers/ScatterChartRenderer.swift | 2 +- Source/Charts/Renderers/XAxisRenderer.swift | 264 ++++++++++----- .../XAxisRendererHorizontalBarChart.swift | 94 +++--- .../Renderers/XAxisRendererRadarChart.swift | 23 +- Source/Charts/Renderers/YAxisRenderer.swift | 319 +++++++++++++----- .../YAxisRendererHorizontalBarChart.swift | 77 ++--- .../Renderers/YAxisRendererRadarChart.swift | 36 +- Source/Charts/Utils/ChartUtils.swift | 4 +- 31 files changed, 742 insertions(+), 666 deletions(-) create mode 100644 Source/Charts/Renderers/AxisRenderer.swift delete mode 100644 Source/Charts/Renderers/AxisRendererBase.swift delete mode 100644 Source/Charts/Renderers/ChartDataRendererBase.swift create mode 100644 Source/Charts/Renderers/DataRenderer.swift rename Source/Charts/Renderers/Scatter/{IShapeRenderer.swift => ShapeRenderer.swift} (93%) diff --git a/Charts.xcodeproj/project.pbxproj b/Charts.xcodeproj/project.pbxproj index 907d61fafd..c3c1f24af1 100644 --- a/Charts.xcodeproj/project.pbxproj +++ b/Charts.xcodeproj/project.pbxproj @@ -88,7 +88,7 @@ 83BBAF3EDC31FD452F8BF1DB /* RadarChartDataSetProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EAD807534620E3B53327F04 /* RadarChartDataSetProtocol.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 */; }; + 8A9FF54E2075A9047CC8E953 /* ShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA1D3D13180C2E3893A82546 /* ShapeRenderer.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 */; }; @@ -140,10 +140,10 @@ 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 */; }; + ECECC58CEF03B1718F8267E8 /* AxisRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C75935E899183DDFA181E2CC /* AxisRenderer.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 */; }; + F37B07008B8AE7F3909FFB9C /* DataRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0216EDC6A1FE272F4EB19FCF /* DataRenderer.swift */; }; F5A209116FAC68F5903D0B46 /* ChartAnimationEasing.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB762958EE8E6521563665D /* ChartAnimationEasing.swift */; }; F744C510DA9B85C228BBB335 /* DefaultFillFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6C1BEFDF17404666C7B6054 /* DefaultFillFormatter.swift */; }; F941C88BF814DF51C465CB95 /* LineChartDataSetProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 429E88F2729735DC092EE556 /* LineChartDataSetProtocol.swift */; }; @@ -165,7 +165,7 @@ /* 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 = ""; }; + 0216EDC6A1FE272F4EB19FCF /* DataRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataRenderer.swift; path = Source/Charts/Renderers/DataRenderer.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 = ""; }; @@ -279,7 +279,7 @@ 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 = ""; }; + C75935E899183DDFA181E2CC /* AxisRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AxisRenderer.swift; path = Source/Charts/Renderers/AxisRenderer.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 = ""; }; @@ -305,7 +305,7 @@ 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 = ""; }; + FA1D3D13180C2E3893A82546 /* ShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/ShapeRenderer.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 = ""; }; @@ -371,6 +371,40 @@ name = Source; sourceTree = ""; }; + 2227EA571FF1F219007D98D9 /* AxisRenderers */ = { + isa = PBXGroup; + children = ( + C75935E899183DDFA181E2CC /* AxisRenderer.swift */, + 1C02C3AF5C92FCFC18224C35 /* XAxisRenderer.swift */, + 1F3D55A7E6176D52DC957D27 /* XAxisRendererHorizontalBarChart.swift */, + BC19DC2434D65FFB446A61B7 /* XAxisRendererRadarChart.swift */, + 688B80F1AA88AE54152BE768 /* YAxisRenderer.swift */, + EAE417AAA0FCA0DD00E77489 /* YAxisRendererHorizontalBarChart.swift */, + AA5A16F4A382813C4FE8BDF9 /* YAxisRendererRadarChart.swift */, + ); + name = AxisRenderers; + sourceTree = ""; + }; + 2227EA581FF1F224007D98D9 /* ChartRenderers */ = { + isa = PBXGroup; + children = ( + 0216EDC6A1FE272F4EB19FCF /* DataRenderer.swift */, + 75F279974FE650E57A061B09 /* BarChartRenderer.swift */, + 5B1C588E9DF6FFD56D7ADF8E /* BarLineScatterCandleBubbleRenderer.swift */, + 2194AA554712E6BA2677F114 /* BubbleChartRenderer.swift */, + BD5C6D20243EC2F19069AACD /* CandleStickChartRenderer.swift */, + 52265C1B343CCC41AF2300E3 /* CombinedChartRenderer.swift */, + 539382766378B702660FDFB2 /* HorizontalBarChartRenderer.swift */, + 0DABDBBCCE6B3620C967F04A /* LineChartRenderer.swift */, + 105FFC9D3773A9C7A60A897F /* LineRadarRenderer.swift */, + 923206233CA89FD03565FF87 /* LineScatterCandleRadarRenderer.swift */, + 46D8013D44629521B1746364 /* PieChartRenderer.swift */, + 7AC9C3D69ACB5BDE22421E15 /* RadarChartRenderer.swift */, + 80D5B764EC0AE1E17E55DC67 /* ScatterChartRenderer.swift */, + ); + name = ChartRenderers; + sourceTree = ""; + }; 2647844720BC6574A544A337 /* Charts */ = { isa = PBXGroup; children = ( @@ -616,29 +650,11 @@ 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 */, + 2227EA571FF1F219007D98D9 /* AxisRenderers */, + 2227EA581FF1F224007D98D9 /* ChartRenderers */, + F7059584CB30EF419CFB3335 /* ShapeRenderer */, ); name = Renderers; sourceTree = ""; @@ -652,19 +668,19 @@ name = "Supporting Files"; sourceTree = ""; }; - F7059584CB30EF419CFB3335 /* Scatter */ = { + F7059584CB30EF419CFB3335 /* ShapeRenderer */ = { isa = PBXGroup; children = ( C52E8344160B5E689DA3C25C /* ChevronDownShapeRenderer.swift */, AA70259ED16FF80D8EEB0F94 /* ChevronUpShapeRenderer.swift */, ECE1B1623D3AF69CECAE8562 /* CircleShapeRenderer.swift */, 823F7DB281C6C6F069A69605 /* CrossShapeRenderer.swift */, - FA1D3D13180C2E3893A82546 /* IShapeRenderer.swift */, + FA1D3D13180C2E3893A82546 /* ShapeRenderer.swift */, 32FC01A016DFF1BA73AF9182 /* SquareShapeRenderer.swift */, C8FB6219B143F8F7DA762950 /* TriangleShapeRenderer.swift */, 23D35CF6F9177D77B6B97AE1 /* XShapeRenderer.swift */, ); - name = Scatter; + name = ShapeRenderer; sourceTree = ""; }; /* End PBXGroup section */ @@ -904,12 +920,12 @@ 02A6E6E1A82A27A66B8D08C4 /* MoveViewJob.swift in Sources */, 9400725714D0DA707DDECD2E /* ViewPortJob.swift in Sources */, AEE9C4E4AC02B8FB3CD21975 /* ZoomViewJob.swift in Sources */, - ECECC58CEF03B1718F8267E8 /* AxisRendererBase.swift in Sources */, + ECECC58CEF03B1718F8267E8 /* AxisRenderer.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 */, + F37B07008B8AE7F3909FFB9C /* DataRenderer.swift in Sources */, 05253AFC448C107DEF54C2FE /* CombinedChartRenderer.swift in Sources */, F100D68395F169B93590FA96 /* HorizontalBarChartRenderer.swift in Sources */, 2B821AAC3EBD60A73EACBCE6 /* LegendRenderer.swift in Sources */, @@ -923,7 +939,7 @@ F103D90FC5DEEA0D7BB4407E /* ChevronUpShapeRenderer.swift in Sources */, B85DEB06B4C1AFFC8A0E3295 /* CircleShapeRenderer.swift in Sources */, 0529DD51622C8769C1121F90 /* CrossShapeRenderer.swift in Sources */, - 8A9FF54E2075A9047CC8E953 /* IShapeRenderer.swift in Sources */, + 8A9FF54E2075A9047CC8E953 /* ShapeRenderer.swift in Sources */, 8EF7B3FBE37F72CC030CD865 /* SquareShapeRenderer.swift in Sources */, 8F4B1A9060472764073DFA0B /* TriangleShapeRenderer.swift in Sources */, 93A94E1FF55041A6032891FE /* XShapeRenderer.swift in Sources */, diff --git a/Source/Charts/Charts/BarLineChartViewBase.swift b/Source/Charts/Charts/BarLineChartViewBase.swift index 181c4116d6..f83bbc988e 100644 --- a/Source/Charts/Charts/BarLineChartViewBase.swift +++ b/Source/Charts/Charts/BarLineChartViewBase.swift @@ -67,18 +67,18 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD /// The left Y axis renderer. This is a read-write property so you can set your own custom renderer here. /// **default**: An instance of YAxisRenderer - @objc open lazy var leftYAxisRenderer = YAxisRenderer(viewPortHandler: viewPortHandler, yAxis: leftAxis, transformer: _leftAxisTransformer) + @objc open lazy var leftYAxisRenderer = YAxisRenderer(viewPortHandler: viewPortHandler, axis: leftAxis, transformer: _leftAxisTransformer) /// The right Y axis renderer. This is a read-write property so you can set your own custom renderer here. /// **default**: An instance of YAxisRenderer - @objc open lazy var rightYAxisRenderer = YAxisRenderer(viewPortHandler: viewPortHandler, yAxis: rightAxis, transformer: _rightAxisTransformer) + @objc open lazy var rightYAxisRenderer = YAxisRenderer(viewPortHandler: viewPortHandler, axis: rightAxis, transformer: _rightAxisTransformer) internal var _leftAxisTransformer: Transformer! internal var _rightAxisTransformer: Transformer! /// The X axis renderer. This is a read-write property so you can set your own custom renderer here. /// **default**: An instance of XAxisRenderer - @objc open lazy var xAxisRenderer = XAxisRenderer(viewPortHandler: viewPortHandler, xAxis: xAxis, transformer: _leftAxisTransformer) + @objc open lazy var xAxisRenderer = XAxisRenderer(viewPortHandler: viewPortHandler, axis: xAxis, transformer: _leftAxisTransformer) internal var _tapGestureRecognizer: NSUITapGestureRecognizer! internal var _doubleTapGestureRecognizer: NSUITapGestureRecognizer! @@ -111,7 +111,7 @@ open class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartD _leftAxisTransformer = Transformer(viewPortHandler: viewPortHandler) _rightAxisTransformer = Transformer(viewPortHandler: viewPortHandler) - + self.highlighter = ChartHighlighter(chart: self) _tapGestureRecognizer = NSUITapGestureRecognizer(target: self, action: #selector(tapGestureRecognized(_:))) diff --git a/Source/Charts/Charts/HorizontalBarChartView.swift b/Source/Charts/Charts/HorizontalBarChartView.swift index f962dd6ec6..11e4a66937 100644 --- a/Source/Charts/Charts/HorizontalBarChartView.swift +++ b/Source/Charts/Charts/HorizontalBarChartView.swift @@ -27,10 +27,10 @@ open class HorizontalBarChartView: BarChartView _rightAxisTransformer = TransformerHorizontalBarChart(viewPortHandler: viewPortHandler) renderer = HorizontalBarChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: viewPortHandler) - leftYAxisRenderer = YAxisRendererHorizontalBarChart(viewPortHandler: viewPortHandler, yAxis: leftAxis, transformer: _leftAxisTransformer) - rightYAxisRenderer = YAxisRendererHorizontalBarChart(viewPortHandler: viewPortHandler, yAxis: rightAxis, transformer: _rightAxisTransformer) - xAxisRenderer = XAxisRendererHorizontalBarChart(viewPortHandler: viewPortHandler, xAxis: xAxis, transformer: _leftAxisTransformer, chart: self) - + leftYAxisRenderer = YAxisRendererHorizontalBarChart(viewPortHandler: viewPortHandler, axis: leftAxis, transformer: _leftAxisTransformer) + rightYAxisRenderer = YAxisRendererHorizontalBarChart(viewPortHandler: viewPortHandler, axis: rightAxis, transformer: _rightAxisTransformer) + xAxisRenderer = XAxisRendererHorizontalBarChart(viewPortHandler: viewPortHandler, axis: xAxis, transformer: _leftAxisTransformer, chart: self) + self.highlighter = HorizontalBarHighlighter(chart: self) } diff --git a/Source/Charts/Charts/RadarChartView.swift b/Source/Charts/Charts/RadarChartView.swift index c0bb45aa08..c7eaea58c3 100644 --- a/Source/Charts/Charts/RadarChartView.swift +++ b/Source/Charts/Charts/RadarChartView.swift @@ -62,9 +62,9 @@ open class RadarChartView: PieRadarChartViewBase renderer = RadarChartRenderer(chart: self, animator: _animator, viewPortHandler: viewPortHandler) - _yAxisRenderer = YAxisRendererRadarChart(viewPortHandler: viewPortHandler, yAxis: _yAxis, chart: self) - _xAxisRenderer = XAxisRendererRadarChart(viewPortHandler: viewPortHandler, xAxis: xAxis, chart: self) - + _yAxisRenderer = YAxisRendererRadarChart(viewPortHandler: viewPortHandler, axis: _yAxis, chart: self) + _xAxisRenderer = XAxisRendererRadarChart(viewPortHandler: viewPortHandler, axis: xAxis, chart: self) + self.highlighter = RadarHighlighter(chart: self) } diff --git a/Source/Charts/Data/Implementations/Standard/ScatterChartDataSet.swift b/Source/Charts/Data/Implementations/Standard/ScatterChartDataSet.swift index 1f60c8c126..b7d1658349 100644 --- a/Source/Charts/Data/Implementations/Standard/ScatterChartDataSet.swift +++ b/Source/Charts/Data/Implementations/Standard/ScatterChartDataSet.swift @@ -39,7 +39,7 @@ open class ScatterChartDataSet: LineScatterCandleRadarChartDataSet, ScatterChart open var scatterShapeHoleColor: NSUIColor? = nil /// Sets the ScatterShape this DataSet should be drawn with. - /// This will search for an available IShapeRenderer and set this renderer for the DataSet + /// This will search for an available ShapeRenderer and set this renderer for the DataSet @objc open func setScatterShape(_ shape: Shape) { self.shapeRenderer = ScatterChartDataSet.renderer(forShape: shape) @@ -48,9 +48,9 @@ open class ScatterChartDataSet: LineScatterCandleRadarChartDataSet, ScatterChart /// The IShapeRenderer responsible for rendering this DataSet. /// This can also be used to set a custom IShapeRenderer aside from the default ones. /// **default**: `SquareShapeRenderer` - open var shapeRenderer: IShapeRenderer? = SquareShapeRenderer() + open var shapeRenderer: ShapeRenderer? = SquareShapeRenderer() - @objc open class func renderer(forShape shape: Shape) -> IShapeRenderer + @objc open class func renderer(forShape shape: Shape) -> ShapeRenderer { switch shape { diff --git a/Source/Charts/Data/Interfaces/ScatterChartDataSetProtocol.swift b/Source/Charts/Data/Interfaces/ScatterChartDataSetProtocol.swift index d101e22af3..0fa23662ae 100644 --- a/Source/Charts/Data/Interfaces/ScatterChartDataSetProtocol.swift +++ b/Source/Charts/Data/Interfaces/ScatterChartDataSetProtocol.swift @@ -32,5 +32,5 @@ public protocol ScatterChartDataSetProtocol: LineScatterCandleRadarChartDataSetP var scatterShapeHoleColor: NSUIColor? { get } /// - returns: The IShapeRenderer responsible for rendering this DataSet. - var shapeRenderer: IShapeRenderer? { get } + var shapeRenderer: ShapeRenderer? { get } } diff --git a/Source/Charts/Renderers/AxisRenderer.swift b/Source/Charts/Renderers/AxisRenderer.swift new file mode 100644 index 0000000000..35b1ddf72d --- /dev/null +++ b/Source/Charts/Renderers/AxisRenderer.swift @@ -0,0 +1,45 @@ +// +// AxisRenderer.swift +// Charts +// +// 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 CoreGraphics + + +public protocol AxisRenderer: Renderer { + + associatedtype Axis: AxisBase + + /// base axis this axis renderer works with + var axis: Axis { get } + + /// transformer to transform values to screen pixels and return + var transformer: Transformer? { get } + + /// Draws the axis labels on the specified context + func renderAxisLabels(context: CGContext) + + /// Draws the grid lines belonging to the axis. + func renderGridLines(context: CGContext) + + /// Draws the line that goes alongside the axis. + func renderAxisLine(context: CGContext) + + /// Draws the LimitLines associated with this axis to the screen. + func renderLimitLines(context: CGContext) + + /// Computes the axis values. + /// - parameter min: the minimum value in the data object for this axis + /// - parameter max: the maximum value in the data object for this axis + func computeAxis(min: Double, max: Double, inverted: Bool) + + /// Sets up the axis values. Computes the desired number of labels between the two given extremes. + func computeAxisValues(min: Double, max: Double) +} diff --git a/Source/Charts/Renderers/AxisRendererBase.swift b/Source/Charts/Renderers/AxisRendererBase.swift deleted file mode 100644 index 19ebf9527e..0000000000 --- a/Source/Charts/Renderers/AxisRendererBase.swift +++ /dev/null @@ -1,211 +0,0 @@ -// -// AxisRendererBase.swift -// Charts -// -// 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 CoreGraphics - -@objc(ChartAxisRendererBase) -open class AxisRendererBase: Renderer -{ - /// base axis this axis renderer works with - @objc open var axis: AxisBase? - - /// transformer to transform values to screen pixels and return - @objc open var transformer: Transformer? - - @objc public init(viewPortHandler: ViewPortHandler, transformer: Transformer?, axis: AxisBase?) - { - super.init(viewPortHandler: viewPortHandler) - - self.transformer = transformer - self.axis = axis - } - - /// Draws the axis labels on the specified context - @objc open func renderAxisLabels(context: CGContext) - { - fatalError("renderAxisLabels() cannot be called on AxisRendererBase") - } - - /// Draws the grid lines belonging to the axis. - @objc open func renderGridLines(context: CGContext) - { - fatalError("renderGridLines() cannot be called on AxisRendererBase") - } - - /// Draws the line that goes alongside the axis. - @objc open func renderAxisLine(context: CGContext) - { - fatalError("renderAxisLine() cannot be called on AxisRendererBase") - } - - /// Draws the LimitLines associated with this axis to the screen. - @objc open func renderLimitLines(context: CGContext) - { - fatalError("renderLimitLines() cannot be called on AxisRendererBase") - } - - /// Computes the axis values. - /// - parameter min: the minimum value in the data object for this axis - /// - parameter max: the maximum value in the data object for this axis - @objc open func computeAxis(min: Double, max: Double, inverted: Bool) - { - var min = min, max = max - - if let transformer = self.transformer - { - // calculate the starting and entry point of the y-labels (depending on zoom / contentrect bounds) - if viewPortHandler.contentWidth > 10.0 && !viewPortHandler.isFullyZoomedOutY - { - let p1 = transformer.valueForTouchPoint(CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentTop)) - let p2 = transformer.valueForTouchPoint(CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentBottom)) - - if !inverted - { - min = Double(p2.y) - max = Double(p1.y) - } - else - { - min = Double(p1.y) - max = Double(p2.y) - } - } - } - - computeAxisValues(min: min, max: max) - } - - /// Sets up the axis values. Computes the desired number of labels between the two given extremes. - @objc open func computeAxisValues(min: Double, max: Double) - { - guard let axis = self.axis else { return } - - let yMin = min - let yMax = max - - let labelCount = axis.labelCount - let range = abs(yMax - yMin) - - if labelCount == 0 || range <= 0 || range.isInfinite - { - axis.entries = [Double]() - axis.centeredEntries = [Double]() - return - } - - // Find out how much spacing (in y value space) between axis values - let rawInterval = range / Double(labelCount) - var interval = rawInterval.roundedToNextSignficant() - - // If granularity is enabled, then do not allow the interval to go below specified granularity. - // This is used to avoid repeated values when rounding values for display. - if axis.granularityEnabled - { - interval = interval < axis.granularity ? axis.granularity : interval - } - - // Normalize interval - let intervalMagnitude = pow(10.0, Double(Int(log10(interval)))).roundedToNextSignficant() - let intervalSigDigit = Int(interval / intervalMagnitude) - if intervalSigDigit > 5 - { - // Use one order of magnitude higher, to avoid intervals like 0.9 or 90 - interval = floor(10.0 * Double(intervalMagnitude)) - } - - var n = axis.centerAxisLabelsEnabled ? 1 : 0 - - // force label count - if axis.isForceLabelsEnabled - { - interval = Double(range) / Double(labelCount - 1) - - // Ensure stops contains at least n elements. - axis.entries.removeAll(keepingCapacity: true) - axis.entries.reserveCapacity(labelCount) - - var v = yMin - - for _ in 0 ..< labelCount - { - axis.entries.append(v) - v += interval - } - - n = labelCount - } - else - { - // no forced count - - var first = interval == 0.0 ? 0.0 : ceil(yMin / interval) * interval - - if axis.centerAxisLabelsEnabled - { - first -= interval - } - - let last = interval == 0.0 ? 0.0 : (floor(yMax / interval) * interval).nextUp - - if interval != 0.0 && last != first - { - for _ in stride(from: first, through: last, by: interval) - { - n += 1 - } - } - - // Ensure stops contains at least n elements. - axis.entries.removeAll(keepingCapacity: true) - axis.entries.reserveCapacity(labelCount) - - var f = first - var i = 0 - while i < n - { - if f == 0.0 - { - // Fix for IEEE negative zero case (Where value == -0.0, and 0.0 == -0.0) - f = 0.0 - } - - axis.entries.append(Double(f)) - - f += interval - i += 1 - } - } - - // set decimals - if interval < 1 - { - axis.decimals = Int(ceil(-log10(interval))) - } - else - { - axis.decimals = 0 - } - - if axis.centerAxisLabelsEnabled - { - axis.centeredEntries.reserveCapacity(n) - axis.centeredEntries.removeAll() - - let offset: Double = interval / 2.0 - - for i in 0 ..< n - { - axis.centeredEntries.append(axis.entries[i] + offset) - } - } - } -} diff --git a/Source/Charts/Renderers/BarLineScatterCandleBubbleRenderer.swift b/Source/Charts/Renderers/BarLineScatterCandleBubbleRenderer.swift index 1a2ad8ce46..4bfd560f87 100644 --- a/Source/Charts/Renderers/BarLineScatterCandleBubbleRenderer.swift +++ b/Source/Charts/Renderers/BarLineScatterCandleBubbleRenderer.swift @@ -13,15 +13,30 @@ import Foundation import CoreGraphics @objc(BarLineScatterCandleBubbleChartRenderer) -open class BarLineScatterCandleBubbleRenderer: DataRenderer +open class BarLineScatterCandleBubbleRenderer: NSObject, DataRenderer { + public let viewPortHandler: ViewPortHandler + + public let animator: Animator + internal var _xBounds = XBounds() // Reusable XBounds object - public override init(animator: Animator, viewPortHandler: ViewPortHandler) + public init(animator: Animator, viewPortHandler: ViewPortHandler) { - super.init(animator: animator, viewPortHandler: viewPortHandler) + self.viewPortHandler = viewPortHandler + self.animator = animator + + super.init() } - + + open func drawData(context: CGContext) { } + + open func drawValues(context: CGContext) { } + + open func drawExtras(context: CGContext) { } + + open func drawHighlighted(context: CGContext, indices: [Highlight]) { } + /// Checks if the provided entry object is in bounds for drawing considering the current animation phase. internal func isInBoundsX(entry e: ChartDataEntry, dataSet: BarLineScatterCandleBubbleChartDataSetProtocol) -> Bool { @@ -44,6 +59,14 @@ open class BarLineScatterCandleBubbleRenderer: DataRenderer return set.isVisible && (set.isDrawValuesEnabled || set.isDrawIconsEnabled) } + open func initBuffers() { } + + open func isDrawingValuesAllowed(dataProvider: ChartDataProvider?) -> Bool + { + guard let data = dataProvider?.data else { return false } + return data.entryCount < Int(CGFloat(dataProvider?.maxVisibleCount ?? 0) * viewPortHandler.scaleX) + } + /// Class representing the bounds of the current viewport in terms of indices in the values array of a DataSet. open class XBounds { diff --git a/Source/Charts/Renderers/ChartDataRendererBase.swift b/Source/Charts/Renderers/ChartDataRendererBase.swift deleted file mode 100644 index 024516aa15..0000000000 --- a/Source/Charts/Renderers/ChartDataRendererBase.swift +++ /dev/null @@ -1,59 +0,0 @@ -// -// DataRenderer.swift -// Charts -// -// 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 CoreGraphics - -@objc(ChartDataRendererBase) -open class DataRenderer: Renderer -{ - @objc open let animator: Animator - - @objc public init(animator: Animator, viewPortHandler: ViewPortHandler) - { - self.animator = animator - - super.init(viewPortHandler: viewPortHandler) - } - - @objc open func drawData(context: CGContext) - { - fatalError("drawData() cannot be called on DataRenderer") - } - - @objc open func drawValues(context: CGContext) - { - fatalError("drawValues() cannot be called on DataRenderer") - } - - @objc open func drawExtras(context: CGContext) - { - fatalError("drawExtras() cannot be called on DataRenderer") - } - - /// Draws all highlight indicators for the values that are currently highlighted. - /// - /// - parameter indices: the highlighted values - @objc open func drawHighlighted(context: CGContext, indices: [Highlight]) - { - fatalError("drawHighlighted() cannot be called on DataRenderer") - } - - /// An opportunity for initializing internal buffers used for rendering with a new size. - /// Since this might do memory allocations, it should only be called if necessary. - @objc open func initBuffers() { } - - @objc open func isDrawingValuesAllowed(dataProvider: ChartDataProvider?) -> Bool - { - guard let data = dataProvider?.data else { return false } - return data.entryCount < Int(CGFloat(dataProvider?.maxVisibleCount ?? 0) * viewPortHandler.scaleX) - } -} diff --git a/Source/Charts/Renderers/CombinedChartRenderer.swift b/Source/Charts/Renderers/CombinedChartRenderer.swift index d38ccb5f7a..529561878f 100644 --- a/Source/Charts/Renderers/CombinedChartRenderer.swift +++ b/Source/Charts/Renderers/CombinedChartRenderer.swift @@ -12,8 +12,11 @@ import Foundation import CoreGraphics -open class CombinedChartRenderer: DataRenderer +open class CombinedChartRenderer: NSObject, DataRenderer { + public let viewPortHandler: ViewPortHandler + public let animator: Animator + @objc open weak var chart: CombinedChartView? /// if set to true, all values are drawn above their bars, instead of below their top @@ -28,9 +31,11 @@ open class CombinedChartRenderer: DataRenderer @objc public init(chart: CombinedChartView, animator: Animator, viewPortHandler: ViewPortHandler) { - super.init(animator: animator, viewPortHandler: viewPortHandler) - self.chart = chart + self.viewPortHandler = viewPortHandler + self.animator = animator + + super.init() createRenderers() } @@ -85,7 +90,7 @@ open class CombinedChartRenderer: DataRenderer } - open override func initBuffers() + open func initBuffers() { for renderer in _renderers { @@ -93,7 +98,7 @@ open class CombinedChartRenderer: DataRenderer } } - open override func drawData(context: CGContext) + open func drawData(context: CGContext) { for renderer in _renderers { @@ -101,7 +106,7 @@ open class CombinedChartRenderer: DataRenderer } } - open override func drawValues(context: CGContext) + open func drawValues(context: CGContext) { for renderer in _renderers { @@ -109,7 +114,7 @@ open class CombinedChartRenderer: DataRenderer } } - open override func drawExtras(context: CGContext) + open func drawExtras(context: CGContext) { for renderer in _renderers { @@ -117,7 +122,7 @@ open class CombinedChartRenderer: DataRenderer } } - open override func drawHighlighted(context: CGContext, indices: [Highlight]) + open func drawHighlighted(context: CGContext, indices: [Highlight]) { for renderer in _renderers { @@ -152,6 +157,12 @@ open class CombinedChartRenderer: DataRenderer } } + open func isDrawingValuesAllowed(dataProvider: ChartDataProvider?) -> Bool + { + guard let data = dataProvider?.data else { return false } + return data.entryCount < Int(CGFloat(dataProvider?.maxVisibleCount ?? 0) * viewPortHandler.scaleX) + } + /// - returns: The sub-renderer object at the specified index. @objc open func getSubRenderer(index: Int) -> DataRenderer? { diff --git a/Source/Charts/Renderers/DataRenderer.swift b/Source/Charts/Renderers/DataRenderer.swift new file mode 100644 index 0000000000..bea371e428 --- /dev/null +++ b/Source/Charts/Renderers/DataRenderer.swift @@ -0,0 +1,36 @@ +// +// DataRenderer.swift +// Charts +// +// 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 CoreGraphics + +@objc(ChartDataRenderer) +public protocol DataRenderer: Renderer +{ + var animator: Animator { get } + + func drawData(context: CGContext) + + func drawValues(context: CGContext) + + func drawExtras(context: CGContext) + + /// Draws all highlight indicators for the values that are currently highlighted. + /// + /// - parameter indices: the highlighted values + func drawHighlighted(context: CGContext, indices: [Highlight]) + + /// An opportunity for initializing internal buffers used for rendering with a new size. + /// Since this might do memory allocations, it should only be called if necessary. + func initBuffers() + + func isDrawingValuesAllowed(dataProvider: ChartDataProvider?) -> Bool +} diff --git a/Source/Charts/Renderers/LegendRenderer.swift b/Source/Charts/Renderers/LegendRenderer.swift index 93537cd09b..a32344c3aa 100755 --- a/Source/Charts/Renderers/LegendRenderer.swift +++ b/Source/Charts/Renderers/LegendRenderer.swift @@ -17,16 +17,19 @@ import CoreGraphics #endif @objc(ChartLegendRenderer) -open class LegendRenderer: Renderer +open class LegendRenderer: NSObject, Renderer { + @objc public let viewPortHandler: ViewPortHandler + /// the legend object this renderer renders @objc open var legend: Legend? @objc public init(viewPortHandler: ViewPortHandler, legend: Legend?) { - super.init(viewPortHandler: viewPortHandler) - + self.viewPortHandler = viewPortHandler self.legend = legend + + super.init() } /// Prepares the legend and calculates all needed forms, labels and colors. diff --git a/Source/Charts/Renderers/PieChartRenderer.swift b/Source/Charts/Renderers/PieChartRenderer.swift index 3f5fecb30e..c71959e8e1 100644 --- a/Source/Charts/Renderers/PieChartRenderer.swift +++ b/Source/Charts/Renderers/PieChartRenderer.swift @@ -17,18 +17,23 @@ import CoreGraphics #endif -open class PieChartRenderer: DataRenderer +open class PieChartRenderer: NSObject, DataRenderer { + public let viewPortHandler: ViewPortHandler + public let animator: Animator + @objc open weak var chart: PieChartView? @objc public init(chart: PieChartView, animator: Animator, viewPortHandler: ViewPortHandler) { - super.init(animator: animator, viewPortHandler: viewPortHandler) - + self.viewPortHandler = viewPortHandler + self.animator = animator self.chart = chart + + super.init() } - open override func drawData(context: CGContext) + open func drawData(context: CGContext) { guard let chart = chart else { return } @@ -254,7 +259,7 @@ open class PieChartRenderer: DataRenderer context.restoreGState() } - open override func drawValues(context: CGContext) + open func drawValues(context: CGContext) { guard let chart = chart, @@ -545,12 +550,20 @@ open class PieChartRenderer: DataRenderer } } - open override func drawExtras(context: CGContext) + open func drawExtras(context: CGContext) { drawHole(context: context) drawCenterText(context: context) } - + + open func initBuffers() { } + + open func isDrawingValuesAllowed(dataProvider: ChartDataProvider?) -> Bool + { + guard let data = dataProvider?.data else { return false } + return data.entryCount < Int(CGFloat(dataProvider?.maxVisibleCount ?? 0) * viewPortHandler.scaleX) + } + /// draws the hole in the center of the chart and the transparent circle / hole private func drawHole(context: CGContext) { @@ -656,7 +669,7 @@ open class PieChartRenderer: DataRenderer } } - open override func drawHighlighted(context: CGContext, indices: [Highlight]) + open func drawHighlighted(context: CGContext, indices: [Highlight]) { guard let chart = chart, diff --git a/Source/Charts/Renderers/Renderer.swift b/Source/Charts/Renderers/Renderer.swift index 5c929f28e0..dbdcb8ae3b 100644 --- a/Source/Charts/Renderers/Renderer.swift +++ b/Source/Charts/Renderers/Renderer.swift @@ -13,14 +13,8 @@ import Foundation import CoreGraphics @objc(ChartRenderer) -open class Renderer: NSObject -{ - /// the component that handles the drawing area of the chart and it's offsets - @objc open let viewPortHandler: ViewPortHandler +public protocol Renderer { - @objc public init(viewPortHandler: ViewPortHandler) - { - self.viewPortHandler = viewPortHandler - super.init() - } + /// the component that handles the drawing area of the chart and it's offsets + var viewPortHandler: ViewPortHandler { get } } diff --git a/Source/Charts/Renderers/Scatter/ChevronDownShapeRenderer.swift b/Source/Charts/Renderers/Scatter/ChevronDownShapeRenderer.swift index 152c44ab80..1dab1cc46b 100644 --- a/Source/Charts/Renderers/Scatter/ChevronDownShapeRenderer.swift +++ b/Source/Charts/Renderers/Scatter/ChevronDownShapeRenderer.swift @@ -11,7 +11,7 @@ import Foundation import CoreGraphics -open class ChevronDownShapeRenderer : NSObject, IShapeRenderer +open class ChevronDownShapeRenderer : NSObject, ShapeRenderer { open func renderShape( context: CGContext, diff --git a/Source/Charts/Renderers/Scatter/ChevronUpShapeRenderer.swift b/Source/Charts/Renderers/Scatter/ChevronUpShapeRenderer.swift index 8b416684d8..0d077707f7 100644 --- a/Source/Charts/Renderers/Scatter/ChevronUpShapeRenderer.swift +++ b/Source/Charts/Renderers/Scatter/ChevronUpShapeRenderer.swift @@ -11,7 +11,7 @@ import Foundation import CoreGraphics -open class ChevronUpShapeRenderer : NSObject, IShapeRenderer +open class ChevronUpShapeRenderer : NSObject, ShapeRenderer { open func renderShape( context: CGContext, diff --git a/Source/Charts/Renderers/Scatter/CircleShapeRenderer.swift b/Source/Charts/Renderers/Scatter/CircleShapeRenderer.swift index 27dd6a8dea..fc0c4dfef1 100644 --- a/Source/Charts/Renderers/Scatter/CircleShapeRenderer.swift +++ b/Source/Charts/Renderers/Scatter/CircleShapeRenderer.swift @@ -11,7 +11,7 @@ import Foundation import CoreGraphics -open class CircleShapeRenderer : NSObject, IShapeRenderer +open class CircleShapeRenderer : NSObject, ShapeRenderer { open func renderShape( context: CGContext, diff --git a/Source/Charts/Renderers/Scatter/CrossShapeRenderer.swift b/Source/Charts/Renderers/Scatter/CrossShapeRenderer.swift index c4f5c5f059..7961da25aa 100644 --- a/Source/Charts/Renderers/Scatter/CrossShapeRenderer.swift +++ b/Source/Charts/Renderers/Scatter/CrossShapeRenderer.swift @@ -11,7 +11,7 @@ import Foundation import CoreGraphics -open class CrossShapeRenderer : NSObject, IShapeRenderer +open class CrossShapeRenderer : NSObject, ShapeRenderer { open func renderShape( context: CGContext, diff --git a/Source/Charts/Renderers/Scatter/IShapeRenderer.swift b/Source/Charts/Renderers/Scatter/ShapeRenderer.swift similarity index 93% rename from Source/Charts/Renderers/Scatter/IShapeRenderer.swift rename to Source/Charts/Renderers/Scatter/ShapeRenderer.swift index b8fd5e7c4a..9b7be2d0ba 100644 --- a/Source/Charts/Renderers/Scatter/IShapeRenderer.swift +++ b/Source/Charts/Renderers/Scatter/ShapeRenderer.swift @@ -1,5 +1,5 @@ // -// IShapeRenderer.swift +// ShapeRenderer.swift // Charts // // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda @@ -13,7 +13,7 @@ import Foundation import CoreGraphics @objc -public protocol IShapeRenderer: class +public protocol ShapeRenderer: class { /// Renders the provided ScatterDataSet with a shape. /// diff --git a/Source/Charts/Renderers/Scatter/SquareShapeRenderer.swift b/Source/Charts/Renderers/Scatter/SquareShapeRenderer.swift index 76646c68e2..948c1ff2eb 100644 --- a/Source/Charts/Renderers/Scatter/SquareShapeRenderer.swift +++ b/Source/Charts/Renderers/Scatter/SquareShapeRenderer.swift @@ -11,7 +11,7 @@ import Foundation import CoreGraphics -open class SquareShapeRenderer : NSObject, IShapeRenderer +open class SquareShapeRenderer : NSObject, ShapeRenderer { open func renderShape( context: CGContext, diff --git a/Source/Charts/Renderers/Scatter/TriangleShapeRenderer.swift b/Source/Charts/Renderers/Scatter/TriangleShapeRenderer.swift index c73a8b8d09..1f4bdca0d7 100644 --- a/Source/Charts/Renderers/Scatter/TriangleShapeRenderer.swift +++ b/Source/Charts/Renderers/Scatter/TriangleShapeRenderer.swift @@ -11,7 +11,7 @@ import Foundation import CoreGraphics -open class TriangleShapeRenderer : NSObject, IShapeRenderer +open class TriangleShapeRenderer : NSObject, ShapeRenderer { open func renderShape( context: CGContext, diff --git a/Source/Charts/Renderers/Scatter/XShapeRenderer.swift b/Source/Charts/Renderers/Scatter/XShapeRenderer.swift index 67b8a8a9d5..73e2efdd4b 100644 --- a/Source/Charts/Renderers/Scatter/XShapeRenderer.swift +++ b/Source/Charts/Renderers/Scatter/XShapeRenderer.swift @@ -11,7 +11,7 @@ import Foundation import CoreGraphics -open class XShapeRenderer : NSObject, IShapeRenderer +open class XShapeRenderer : NSObject, ShapeRenderer { open func renderShape( context: CGContext, diff --git a/Source/Charts/Renderers/ScatterChartRenderer.swift b/Source/Charts/Renderers/ScatterChartRenderer.swift index 756a6c81a5..d7b1afa3a5 100644 --- a/Source/Charts/Renderers/ScatterChartRenderer.swift +++ b/Source/Charts/Renderers/ScatterChartRenderer.swift @@ -94,7 +94,7 @@ open class ScatterChartRenderer: LineScatterCandleRadarRenderer } else { - print("There's no IShapeRenderer specified for ScatterDataSet", terminator: "\n") + print("There's no ShapeRenderer specified for ScatterDataSet", terminator: "\n") } } diff --git a/Source/Charts/Renderers/XAxisRenderer.swift b/Source/Charts/Renderers/XAxisRenderer.swift index 534e606dcf..6cc566aac3 100644 --- a/Source/Charts/Renderers/XAxisRenderer.swift +++ b/Source/Charts/Renderers/XAxisRenderer.swift @@ -17,14 +17,22 @@ import CoreGraphics #endif @objc(ChartXAxisRenderer) -open class XAxisRenderer: AxisRendererBase +open class XAxisRenderer: NSObject, AxisRenderer { - @objc public init(viewPortHandler: ViewPortHandler, xAxis: XAxis?, transformer: Transformer?) + public let viewPortHandler: ViewPortHandler + public let axis: XAxis + public let transformer: Transformer? + + @objc public init(viewPortHandler: ViewPortHandler, axis: XAxis, transformer: Transformer?) { - super.init(viewPortHandler: viewPortHandler, transformer: transformer, axis: xAxis) + self.viewPortHandler = viewPortHandler + self.axis = axis + self.transformer = transformer + + super.init() } - open override func computeAxis(min: Double, max: Double, inverted: Bool) + open func computeAxis(min: Double, max: Double, inverted: Bool) { var min = min, max = max @@ -53,60 +61,171 @@ open class XAxisRenderer: AxisRendererBase computeAxisValues(min: min, max: max) } - open override func computeAxisValues(min: Double, max: Double) + open func computeAxisValues(min: Double, max: Double) { - super.computeAxisValues(min: min, max: max) + let yMin = min + let yMax = max + + let labelCount = axis.labelCount + let range = abs(yMax - yMin) + + if labelCount == 0 || range <= 0 || range.isInfinite + { + axis.entries = [Double]() + axis.centeredEntries = [Double]() + return + } + + // Find out how much spacing (in y value space) between axis values + let rawInterval = range / Double(labelCount) + var interval = rawInterval.roundedToNextSignificant() + + // If granularity is enabled, then do not allow the interval to go below specified granularity. + // This is used to avoid repeated values when rounding values for display. + if axis.granularityEnabled + { + interval = interval < axis.granularity ? axis.granularity : interval + } + + // Normalize interval + let intervalMagnitude = pow(10.0, Double(Int(log10(interval)))).roundedToNextSignificant() + let intervalSigDigit = Int(interval / intervalMagnitude) + if intervalSigDigit > 5 + { + // Use one order of magnitude higher, to avoid intervals like 0.9 or 90 + interval = floor(10.0 * Double(intervalMagnitude)) + } + + var n = axis.centerAxisLabelsEnabled ? 1 : 0 + + // force label count + if axis.isForceLabelsEnabled + { + interval = Double(range) / Double(labelCount - 1) + + // Ensure stops contains at least n elements. + axis.entries.removeAll(keepingCapacity: true) + axis.entries.reserveCapacity(labelCount) + + var v = yMin + + for _ in 0 ..< labelCount + { + axis.entries.append(v) + v += interval + } + + n = labelCount + } + else + { + // no forced count + + var first = interval == 0.0 ? 0.0 : ceil(yMin / interval) * interval + + if axis.centerAxisLabelsEnabled + { + first -= interval + } + + let last = interval == 0.0 ? 0.0 : (floor(yMax / interval) * interval).nextUp + + if interval != 0.0 && last != first + { + for _ in stride(from: first, through: last, by: interval) + { + n += 1 + } + } + + // Ensure stops contains at least n elements. + axis.entries.removeAll(keepingCapacity: true) + axis.entries.reserveCapacity(labelCount) + + var f = first + var i = 0 + while i < n + { + if f == 0.0 + { + // Fix for IEEE negative zero case (Where value == -0.0, and 0.0 == -0.0) + f = 0.0 + } + + axis.entries.append(Double(f)) + + f += interval + i += 1 + } + } + + // set decimals + if interval < 1 + { + axis.decimals = Int(ceil(-log10(interval))) + } + else + { + axis.decimals = 0 + } + + if axis.centerAxisLabelsEnabled + { + axis.centeredEntries.reserveCapacity(n) + axis.centeredEntries.removeAll() + + let offset: Double = interval / 2.0 + + for i in 0 ..< n + { + axis.centeredEntries.append(axis.entries[i] + offset) + } + } computeSize() } @objc open func computeSize() { - guard let - xAxis = self.axis as? XAxis - else { return } - - let longest = xAxis.getLongestLabel() + let longest = axis.getLongestLabel() - let labelSize = longest.size(withAttributes: [NSAttributedStringKey.font: xAxis.labelFont]) + let labelSize = longest.size(withAttributes: [NSAttributedStringKey.font: axis.labelFont]) let labelWidth = labelSize.width let labelHeight = labelSize.height - let labelRotatedSize = labelSize.rotatedBy(degrees: xAxis.labelRotationAngle) + let labelRotatedSize = labelSize.rotatedBy(degrees: axis.labelRotationAngle) - xAxis.labelWidth = labelWidth - xAxis.labelHeight = labelHeight - xAxis.labelRotatedWidth = labelRotatedSize.width - xAxis.labelRotatedHeight = labelRotatedSize.height + axis.labelWidth = labelWidth + axis.labelHeight = labelHeight + axis.labelRotatedWidth = labelRotatedSize.width + axis.labelRotatedHeight = labelRotatedSize.height } - open override func renderAxisLabels(context: CGContext) + open func renderAxisLabels(context: CGContext) { - guard let xAxis = self.axis as? XAxis else { return } - - if !xAxis.isEnabled || !xAxis.isDrawLabelsEnabled + if !axis.isEnabled || !axis.isDrawLabelsEnabled { return } - let yOffset = xAxis.yOffset + let yOffset = axis.yOffset - if xAxis.labelPosition == .top + if axis.labelPosition == .top { drawLabels(context: context, pos: viewPortHandler.contentTop - yOffset, anchor: CGPoint(x: 0.5, y: 1.0)) } - else if xAxis.labelPosition == .topInside + else if axis.labelPosition == .topInside { - drawLabels(context: context, pos: viewPortHandler.contentTop + yOffset + xAxis.labelRotatedHeight, anchor: CGPoint(x: 0.5, y: 1.0)) + drawLabels(context: context, pos: viewPortHandler.contentTop + yOffset + axis.labelRotatedHeight, anchor: CGPoint(x: 0.5, y: 1.0)) } - else if xAxis.labelPosition == .bottom + else if axis.labelPosition == .bottom { drawLabels(context: context, pos: viewPortHandler.contentBottom + yOffset, anchor: CGPoint(x: 0.5, y: 0.0)) } - else if xAxis.labelPosition == .bottomInside + else if axis.labelPosition == .bottomInside { - drawLabels(context: context, pos: viewPortHandler.contentBottom - yOffset - xAxis.labelRotatedHeight, anchor: CGPoint(x: 0.5, y: 0.0)) + drawLabels(context: context, pos: viewPortHandler.contentBottom - yOffset - axis.labelRotatedHeight, anchor: CGPoint(x: 0.5, y: 0.0)) } else { // BOTH SIDED @@ -117,31 +236,29 @@ open class XAxisRenderer: AxisRendererBase private var _axisLineSegmentsBuffer = [CGPoint](repeating: CGPoint(), count: 2) - open override func renderAxisLine(context: CGContext) - { - guard let xAxis = self.axis as? XAxis else { return } - - if !xAxis.isEnabled || !xAxis.isDrawAxisLineEnabled + open func renderAxisLine(context: CGContext) + { + if !axis.isEnabled || !axis.isDrawAxisLineEnabled { return } context.saveGState() - context.setStrokeColor(xAxis.axisLineColor.cgColor) - context.setLineWidth(xAxis.axisLineWidth) - if xAxis.axisLineDashLengths != nil + context.setStrokeColor(axis.axisLineColor.cgColor) + context.setLineWidth(axis.axisLineWidth) + if axis.axisLineDashLengths != nil { - context.setLineDash(phase: xAxis.axisLineDashPhase, lengths: xAxis.axisLineDashLengths) + context.setLineDash(phase: axis.axisLineDashPhase, lengths: axis.axisLineDashLengths) } else { context.setLineDash(phase: 0.0, lengths: []) } - if xAxis.labelPosition == .top - || xAxis.labelPosition == .topInside - || xAxis.labelPosition == .bothSided + if axis.labelPosition == .top + || axis.labelPosition == .topInside + || axis.labelPosition == .bothSided { _axisLineSegmentsBuffer[0].x = viewPortHandler.contentLeft _axisLineSegmentsBuffer[0].y = viewPortHandler.contentTop @@ -150,9 +267,9 @@ open class XAxisRenderer: AxisRendererBase context.strokeLineSegments(between: _axisLineSegmentsBuffer) } - if xAxis.labelPosition == .bottom - || xAxis.labelPosition == .bottomInside - || xAxis.labelPosition == .bothSided + if axis.labelPosition == .bottom + || axis.labelPosition == .bottomInside + || axis.labelPosition == .bothSided { _axisLineSegmentsBuffer[0].x = viewPortHandler.contentLeft _axisLineSegmentsBuffer[0].y = viewPortHandler.contentBottom @@ -167,10 +284,7 @@ open class XAxisRenderer: AxisRendererBase /// draws the x-labels on the specified y-position @objc open func drawLabels(context: CGContext, pos: CGFloat, anchor: CGPoint) { - guard - let xAxis = self.axis as? XAxis, - let transformer = self.transformer - else { return } + guard let transformer = self.transformer else { return } #if os(OSX) let paraStyle = NSParagraphStyle.default.mutableCopy() as! NSMutableParagraphStyle @@ -179,12 +293,12 @@ open class XAxisRenderer: AxisRendererBase #endif paraStyle.alignment = .center - let labelAttrs: [NSAttributedStringKey : Any] = [NSAttributedStringKey.font: xAxis.labelFont, - NSAttributedStringKey.foregroundColor: xAxis.labelTextColor, + let labelAttrs: [NSAttributedStringKey : Any] = [NSAttributedStringKey.font: axis.labelFont, + NSAttributedStringKey.foregroundColor: axis.labelTextColor, NSAttributedStringKey.paragraphStyle: paraStyle] - let labelRotationAngleRadians = xAxis.labelRotationAngle.DEG2RAD + let labelRotationAngleRadians = axis.labelRotationAngle.DEG2RAD - let centeringEnabled = xAxis.isCenterAxisLabelsEnabled + let centeringEnabled = axis.isCenterAxisLabelsEnabled let valueToPixelMatrix = transformer.valueToPixelMatrix @@ -192,18 +306,18 @@ open class XAxisRenderer: AxisRendererBase var labelMaxSize = CGSize() - if xAxis.isWordWrapEnabled + if axis.isWordWrapEnabled { - labelMaxSize.width = xAxis.wordWrapWidthPercent * valueToPixelMatrix.a + labelMaxSize.width = axis.wordWrapWidthPercent * valueToPixelMatrix.a } - let entries = xAxis.entries + let entries = axis.entries for i in stride(from: 0, to: entries.count, by: 1) { if centeringEnabled { - position.x = CGFloat(xAxis.centeredEntries[i]) + position.x = CGFloat(axis.centeredEntries[i]) } else { @@ -215,14 +329,14 @@ open class XAxisRenderer: AxisRendererBase if viewPortHandler.isInBoundsX(position.x) { - let label = xAxis.valueFormatter?.stringForValue(xAxis.entries[i], axis: xAxis) ?? "" + let label = axis.valueFormatter?.stringForValue(axis.entries[i], axis: axis) ?? "" let labelns = label as NSString - if xAxis.isAvoidFirstLastClippingEnabled + if axis.isAvoidFirstLastClippingEnabled { // avoid clipping of the last - if i == xAxis.entryCount - 1 && xAxis.entryCount > 1 + if i == axis.entryCount - 1 && axis.entryCount > 1 { let width = labelns.boundingRect(with: labelMaxSize, options: .usesLineFragmentOrigin, attributes: labelAttrs, context: nil).size.width @@ -271,14 +385,11 @@ open class XAxisRenderer: AxisRendererBase angleRadians: angleRadians) } - open override func renderGridLines(context: CGContext) + open func renderGridLines(context: CGContext) { - guard - let xAxis = self.axis as? XAxis, - let transformer = self.transformer - else { return } + guard let transformer = self.transformer else { return } - if !xAxis.isDrawGridLinesEnabled || !xAxis.isEnabled + if !axis.isDrawGridLinesEnabled || !axis.isEnabled { return } @@ -287,14 +398,14 @@ open class XAxisRenderer: AxisRendererBase defer { context.restoreGState() } context.clip(to: self.gridClippingRect) - context.setShouldAntialias(xAxis.gridAntialiasEnabled) - context.setStrokeColor(xAxis.gridColor.cgColor) - context.setLineWidth(xAxis.gridLineWidth) - context.setLineCap(xAxis.gridLineCap) + context.setShouldAntialias(axis.gridAntialiasEnabled) + context.setStrokeColor(axis.gridColor.cgColor) + context.setLineWidth(axis.gridLineWidth) + context.setLineCap(axis.gridLineCap) - if xAxis.gridLineDashLengths != nil + if axis.gridLineDashLengths != nil { - context.setLineDash(phase: xAxis.gridLineDashPhase, lengths: xAxis.gridLineDashLengths) + context.setLineDash(phase: axis.gridLineDashPhase, lengths: axis.gridLineDashLengths) } else { @@ -305,7 +416,7 @@ open class XAxisRenderer: AxisRendererBase var position = CGPoint(x: 0.0, y: 0.0) - let entries = xAxis.entries + let entries = axis.entries for i in stride(from: 0, to: entries.count, by: 1) { @@ -320,7 +431,7 @@ open class XAxisRenderer: AxisRendererBase @objc open var gridClippingRect: CGRect { var contentRect = viewPortHandler.contentRect - let dx = self.axis?.gridLineWidth ?? 0.0 + let dx = self.axis.gridLineWidth contentRect.origin.x -= dx / 2.0 contentRect.size.width += dx return contentRect @@ -338,14 +449,11 @@ open class XAxisRenderer: AxisRendererBase } } - open override func renderLimitLines(context: CGContext) + open func renderLimitLines(context: CGContext) { - guard - let xAxis = self.axis as? XAxis, - let transformer = self.transformer - else { return } + guard let transformer = self.transformer else { return } - var limitLines = xAxis.limitLines + var limitLines = axis.limitLines if limitLines.count == 0 { diff --git a/Source/Charts/Renderers/XAxisRendererHorizontalBarChart.swift b/Source/Charts/Renderers/XAxisRendererHorizontalBarChart.swift index fef05d7a49..dc9580d4db 100644 --- a/Source/Charts/Renderers/XAxisRendererHorizontalBarChart.swift +++ b/Source/Charts/Renderers/XAxisRendererHorizontalBarChart.swift @@ -20,9 +20,9 @@ open class XAxisRendererHorizontalBarChart: XAxisRenderer { internal weak var chart: BarChartView? - @objc public init(viewPortHandler: ViewPortHandler, xAxis: XAxis?, transformer: Transformer?, chart: BarChartView) + @objc public init(viewPortHandler: ViewPortHandler, axis: XAxis, transformer: Transformer?, chart: BarChartView) { - super.init(viewPortHandler: viewPortHandler, xAxis: xAxis, transformer: transformer) + super.init(viewPortHandler: viewPortHandler, axis: axis, transformer: transformer) self.chart = chart } @@ -58,50 +58,42 @@ open class XAxisRendererHorizontalBarChart: XAxisRenderer open override func computeSize() { - guard let - xAxis = self.axis as? XAxis - else { return } - - let longest = xAxis.getLongestLabel() as NSString + let longest = axis.getLongestLabel() as NSString - let labelSize = longest.size(withAttributes: [NSAttributedStringKey.font: xAxis.labelFont]) + let labelSize = longest.size(withAttributes: [NSAttributedStringKey.font: axis.labelFont]) - let labelWidth = floor(labelSize.width + xAxis.xOffset * 3.5) + let labelWidth = floor(labelSize.width + axis.xOffset * 3.5) let labelHeight = labelSize.height - let labelRotatedSize = CGSize(width: labelSize.width, height: labelHeight).rotatedBy(degrees: xAxis.labelRotationAngle) + let labelRotatedSize = CGSize(width: labelSize.width, height: labelHeight).rotatedBy(degrees: axis.labelRotationAngle) - xAxis.labelWidth = labelWidth - xAxis.labelHeight = labelHeight - xAxis.labelRotatedWidth = round(labelRotatedSize.width + xAxis.xOffset * 3.5) - xAxis.labelRotatedHeight = round(labelRotatedSize.height) + axis.labelWidth = labelWidth + axis.labelHeight = labelHeight + axis.labelRotatedWidth = round(labelRotatedSize.width + axis.xOffset * 3.5) + axis.labelRotatedHeight = round(labelRotatedSize.height) } open override func renderAxisLabels(context: CGContext) { - guard - let xAxis = self.axis as? XAxis - else { return } - - if !xAxis.isEnabled || !xAxis.isDrawLabelsEnabled || chart?.data === nil + if !axis.isEnabled || !axis.isDrawLabelsEnabled || chart?.data === nil { return } - let xoffset = xAxis.xOffset + let xoffset = axis.xOffset - if xAxis.labelPosition == .top + if axis.labelPosition == .top { drawLabels(context: context, pos: viewPortHandler.contentRight + xoffset, anchor: CGPoint(x: 0.0, y: 0.5)) } - else if xAxis.labelPosition == .topInside + else if axis.labelPosition == .topInside { drawLabels(context: context, pos: viewPortHandler.contentRight - xoffset, anchor: CGPoint(x: 1.0, y: 0.5)) } - else if xAxis.labelPosition == .bottom + else if axis.labelPosition == .bottom { drawLabels(context: context, pos: viewPortHandler.contentLeft - xoffset, anchor: CGPoint(x: 1.0, y: 0.5)) } - else if xAxis.labelPosition == .bottomInside + else if axis.labelPosition == .bottomInside { drawLabels(context: context, pos: viewPortHandler.contentLeft + xoffset, anchor: CGPoint(x: 0.0, y: 0.5)) } @@ -115,21 +107,18 @@ open class XAxisRendererHorizontalBarChart: XAxisRenderer /// draws the x-labels on the specified y-position open override func drawLabels(context: CGContext, pos: CGFloat, anchor: CGPoint) { - guard - let xAxis = self.axis as? XAxis, - let transformer = self.transformer - else { return } + guard let transformer = self.transformer else { return } - let labelFont = xAxis.labelFont - let labelTextColor = xAxis.labelTextColor - let labelRotationAngleRadians = xAxis.labelRotationAngle.DEG2RAD + let labelFont = axis.labelFont + let labelTextColor = axis.labelTextColor + let labelRotationAngleRadians = axis.labelRotationAngle.DEG2RAD - let centeringEnabled = xAxis.isCenterAxisLabelsEnabled + let centeringEnabled = axis.isCenterAxisLabelsEnabled // pre allocate to save performance (dont allocate in loop) var position = CGPoint(x: 0.0, y: 0.0) - for i in stride(from: 0, to: xAxis.entryCount, by: 1) + for i in stride(from: 0, to: axis.entryCount, by: 1) { // only fill x values @@ -137,18 +126,18 @@ open class XAxisRendererHorizontalBarChart: XAxisRenderer if centeringEnabled { - position.y = CGFloat(xAxis.centeredEntries[i]) + position.y = CGFloat(axis.centeredEntries[i]) } else { - position.y = CGFloat(xAxis.entries[i]) + position.y = CGFloat(axis.entries[i]) } transformer.pointValueToPixel(&position) if viewPortHandler.isInBoundsY(position.y) { - if let label = xAxis.valueFormatter?.stringForValue(xAxis.entries[i], axis: xAxis) + if let label = axis.valueFormatter?.stringForValue(axis.entries[i], axis: axis) { drawLabel( context: context, @@ -184,7 +173,7 @@ open class XAxisRendererHorizontalBarChart: XAxisRenderer open override var gridClippingRect: CGRect { var contentRect = viewPortHandler.contentRect - let dy = self.axis?.gridLineWidth ?? 0.0 + let dy = self.axis.gridLineWidth contentRect.origin.y -= dy / 2.0 contentRect.size.height += dy return contentRect @@ -205,29 +194,27 @@ open class XAxisRendererHorizontalBarChart: XAxisRenderer open override func renderAxisLine(context: CGContext) { - guard let xAxis = self.axis as? XAxis else { return } - - if !xAxis.isEnabled || !xAxis.isDrawAxisLineEnabled + if !axis.isEnabled || !axis.isDrawAxisLineEnabled { return } context.saveGState() - context.setStrokeColor(xAxis.axisLineColor.cgColor) - context.setLineWidth(xAxis.axisLineWidth) - if xAxis.axisLineDashLengths != nil + context.setStrokeColor(axis.axisLineColor.cgColor) + context.setLineWidth(axis.axisLineWidth) + if axis.axisLineDashLengths != nil { - context.setLineDash(phase: xAxis.axisLineDashPhase, lengths: xAxis.axisLineDashLengths) + context.setLineDash(phase: axis.axisLineDashPhase, lengths: axis.axisLineDashLengths) } else { context.setLineDash(phase: 0.0, lengths: []) } - if xAxis.labelPosition == .top || - xAxis.labelPosition == .topInside || - xAxis.labelPosition == .bothSided + if axis.labelPosition == .top || + axis.labelPosition == .topInside || + axis.labelPosition == .bothSided { context.beginPath() context.move(to: CGPoint(x: viewPortHandler.contentRight, y: viewPortHandler.contentTop)) @@ -235,9 +222,9 @@ open class XAxisRendererHorizontalBarChart: XAxisRenderer context.strokePath() } - if xAxis.labelPosition == .bottom || - xAxis.labelPosition == .bottomInside || - xAxis.labelPosition == .bothSided + if axis.labelPosition == .bottom || + axis.labelPosition == .bottomInside || + axis.labelPosition == .bothSided { context.beginPath() context.move(to: CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentTop)) @@ -250,12 +237,9 @@ open class XAxisRendererHorizontalBarChart: XAxisRenderer open override func renderLimitLines(context: CGContext) { - guard - let xAxis = self.axis as? XAxis, - let transformer = self.transformer - else { return } + guard let transformer = self.transformer else { return } - var limitLines = xAxis.limitLines + var limitLines = axis.limitLines if limitLines.count == 0 { diff --git a/Source/Charts/Renderers/XAxisRendererRadarChart.swift b/Source/Charts/Renderers/XAxisRendererRadarChart.swift index ab57149cce..8b92a10b8b 100644 --- a/Source/Charts/Renderers/XAxisRendererRadarChart.swift +++ b/Source/Charts/Renderers/XAxisRendererRadarChart.swift @@ -20,28 +20,25 @@ open class XAxisRendererRadarChart: XAxisRenderer { @objc open weak var chart: RadarChartView? - @objc public init(viewPortHandler: ViewPortHandler, xAxis: XAxis?, chart: RadarChartView) + @objc public init(viewPortHandler: ViewPortHandler, axis: XAxis, chart: RadarChartView) { - super.init(viewPortHandler: viewPortHandler, xAxis: xAxis, transformer: nil) + super.init(viewPortHandler: viewPortHandler, axis: axis, transformer: nil) self.chart = chart } open override func renderAxisLabels(context: CGContext) { - guard let - xAxis = axis as? XAxis, - let chart = chart - else { return } + guard let chart = chart else { return } - if !xAxis.isEnabled || !xAxis.isDrawLabelsEnabled + if !axis.isEnabled || !axis.isDrawLabelsEnabled { return } - let labelFont = xAxis.labelFont - let labelTextColor = xAxis.labelTextColor - let labelRotationAngleRadians = xAxis.labelRotationAngle.RAD2DEG + let labelFont = axis.labelFont + let labelTextColor = axis.labelTextColor + let labelRotationAngleRadians = axis.labelRotationAngle.RAD2DEG let drawLabelAnchor = CGPoint(x: 0.5, y: 0.25) let sliceangle = chart.sliceAngle @@ -54,16 +51,16 @@ open class XAxisRendererRadarChart: XAxisRenderer for i in stride(from: 0, to: chart.data?.maxEntryCountSet?.entryCount ?? 0, by: 1) { - let label = xAxis.valueFormatter?.stringForValue(Double(i), axis: xAxis) ?? "" + let label = axis.valueFormatter?.stringForValue(Double(i), axis: axis) ?? "" let angle = (sliceangle * CGFloat(i) + chart.rotationAngle).truncatingRemainder(dividingBy: 360.0) - let p = ChartUtils.getPosition(center: center, dist: CGFloat(chart.yRange) * factor + xAxis.labelRotatedWidth / 2.0, angle: angle) + let p = ChartUtils.getPosition(center: center, dist: CGFloat(chart.yRange) * factor + axis.labelRotatedWidth / 2.0, angle: angle) drawLabel(context: context, formattedLabel: label, x: p.x, - y: p.y - xAxis.labelRotatedHeight / 2.0, + y: p.y - axis.labelRotatedHeight / 2.0, attributes: [NSAttributedStringKey.font: labelFont, NSAttributedStringKey.foregroundColor: labelTextColor], anchor: drawLabelAnchor, angleRadians: labelRotationAngleRadians) diff --git a/Source/Charts/Renderers/YAxisRenderer.swift b/Source/Charts/Renderers/YAxisRenderer.swift index e5b0802575..e8a684b49b 100644 --- a/Source/Charts/Renderers/YAxisRenderer.swift +++ b/Source/Charts/Renderers/YAxisRenderer.swift @@ -17,28 +17,34 @@ import CoreGraphics #endif @objc(ChartYAxisRenderer) -open class YAxisRenderer: AxisRendererBase +open class YAxisRenderer: NSObject, AxisRenderer { - @objc public init(viewPortHandler: ViewPortHandler, yAxis: YAxis?, transformer: Transformer?) + public let viewPortHandler: ViewPortHandler + public let axis: YAxis + public let transformer: Transformer? + + @objc public init(viewPortHandler: ViewPortHandler, axis: YAxis, transformer: Transformer?) { - super.init(viewPortHandler: viewPortHandler, transformer: transformer, axis: yAxis) + self.viewPortHandler = viewPortHandler + self.axis = axis + self.transformer = transformer + + super.init() } /// draws the y-axis labels to the screen - open override func renderAxisLabels(context: CGContext) + open func renderAxisLabels(context: CGContext) { - guard let yAxis = self.axis as? YAxis else { return } - - if !yAxis.isEnabled || !yAxis.isDrawLabelsEnabled + if !axis.isEnabled || !axis.isDrawLabelsEnabled { return } - let xoffset = yAxis.xOffset - let yoffset = yAxis.labelFont.lineHeight / 2.5 + yAxis.yOffset + let xoffset = axis.xOffset + let yoffset = axis.labelFont.lineHeight / 2.5 + axis.yOffset - let dependency = yAxis.axisDependency - let labelPosition = yAxis.labelPosition + let dependency = axis.axisDependency + let labelPosition = axis.labelPosition var xPos = CGFloat(0.0) @@ -76,33 +82,31 @@ open class YAxisRenderer: AxisRendererBase context: context, fixedPosition: xPos, positions: transformedPositions(), - offset: yoffset - yAxis.labelFont.lineHeight, + offset: yoffset - axis.labelFont.lineHeight, textAlign: textAlign) } - open override func renderAxisLine(context: CGContext) + open func renderAxisLine(context: CGContext) { - guard let yAxis = self.axis as? YAxis else { return } - - if !yAxis.isEnabled || !yAxis.drawAxisLineEnabled + if !axis.isEnabled || !axis.drawAxisLineEnabled { return } context.saveGState() - context.setStrokeColor(yAxis.axisLineColor.cgColor) - context.setLineWidth(yAxis.axisLineWidth) - if yAxis.axisLineDashLengths != nil + context.setStrokeColor(axis.axisLineColor.cgColor) + context.setLineWidth(axis.axisLineWidth) + if axis.axisLineDashLengths != nil { - context.setLineDash(phase: yAxis.axisLineDashPhase, lengths: yAxis.axisLineDashLengths) + context.setLineDash(phase: axis.axisLineDashPhase, lengths: axis.axisLineDashLengths) } else { context.setLineDash(phase: 0.0, lengths: []) } - if yAxis.axisDependency == .left + if axis.axisDependency == .left { context.beginPath() context.move(to: CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentTop)) @@ -128,19 +132,15 @@ open class YAxisRenderer: AxisRendererBase offset: CGFloat, textAlign: NSTextAlignment) { - guard - let yAxis = self.axis as? YAxis - else { return } + let labelFont = axis.labelFont + let labelTextColor = axis.labelTextColor - let labelFont = yAxis.labelFont - let labelTextColor = yAxis.labelTextColor - - let from = yAxis.isDrawBottomYLabelEntryEnabled ? 0 : 1 - let to = yAxis.isDrawTopYLabelEntryEnabled ? yAxis.entryCount : (yAxis.entryCount - 1) + let from = axis.isDrawBottomYLabelEntryEnabled ? 0 : 1 + let to = axis.isDrawTopYLabelEntryEnabled ? axis.entryCount : (axis.entryCount - 1) for i in stride(from: from, to: to, by: 1) { - let text = yAxis.getFormattedLabel(i) + let text = axis.getFormattedLabel(i) ChartUtils.drawText( context: context, @@ -151,18 +151,14 @@ open class YAxisRenderer: AxisRendererBase } } - open override func renderGridLines(context: CGContext) + open func renderGridLines(context: CGContext) { - guard let - yAxis = self.axis as? YAxis - else { return } - - if !yAxis.isEnabled + if !axis.isEnabled { return } - if yAxis.drawGridLinesEnabled + if axis.drawGridLinesEnabled { let positions = transformedPositions() @@ -170,14 +166,14 @@ open class YAxisRenderer: AxisRendererBase defer { context.restoreGState() } context.clip(to: self.gridClippingRect) - context.setShouldAntialias(yAxis.gridAntialiasEnabled) - context.setStrokeColor(yAxis.gridColor.cgColor) - context.setLineWidth(yAxis.gridLineWidth) - context.setLineCap(yAxis.gridLineCap) + context.setShouldAntialias(axis.gridAntialiasEnabled) + context.setStrokeColor(axis.gridColor.cgColor) + context.setLineWidth(axis.gridLineWidth) + context.setLineCap(axis.gridLineCap) - if yAxis.gridLineDashLengths != nil + if axis.gridLineDashLengths != nil { - context.setLineDash(phase: yAxis.gridLineDashPhase, lengths: yAxis.gridLineDashLengths) + context.setLineDash(phase: axis.gridLineDashPhase, lengths: axis.gridLineDashLengths) } else @@ -192,7 +188,7 @@ open class YAxisRenderer: AxisRendererBase } } - if yAxis.drawZeroLineEnabled + if axis.drawZeroLineEnabled { // draw zero line drawZeroLine(context: context) @@ -202,7 +198,7 @@ open class YAxisRenderer: AxisRendererBase @objc open var gridClippingRect: CGRect { var contentRect = viewPortHandler.contentRect - let dy = self.axis?.gridLineWidth ?? 0.0 + let dy = self.axis.gridLineWidth contentRect.origin.y -= dy / 2.0 contentRect.size.height += dy return contentRect @@ -220,17 +216,14 @@ open class YAxisRenderer: AxisRendererBase @objc open func transformedPositions() -> [CGPoint] { - guard - let yAxis = self.axis as? YAxis, - let transformer = self.transformer - else { return [CGPoint]() } + guard let transformer = self.transformer else { return [] } var positions = [CGPoint]() - positions.reserveCapacity(yAxis.entryCount) + positions.reserveCapacity(axis.entryCount) - let entries = yAxis.entries + let entries = axis.entries - for i in stride(from: 0, to: yAxis.entryCount, by: 1) + for i in stride(from: 0, to: axis.entryCount, by: 1) { positions.append(CGPoint(x: 0.0, y: entries[i])) } @@ -244,27 +237,26 @@ open class YAxisRenderer: AxisRendererBase @objc open func drawZeroLine(context: CGContext) { guard - let yAxis = self.axis as? YAxis, let transformer = self.transformer, - let zeroLineColor = yAxis.zeroLineColor + let zeroLineColor = axis.zeroLineColor else { return } context.saveGState() defer { context.restoreGState() } var clippingRect = viewPortHandler.contentRect - clippingRect.origin.y -= yAxis.zeroLineWidth / 2.0 - clippingRect.size.height += yAxis.zeroLineWidth + clippingRect.origin.y -= axis.zeroLineWidth / 2.0 + clippingRect.size.height += axis.zeroLineWidth context.clip(to: clippingRect) context.setStrokeColor(zeroLineColor.cgColor) - context.setLineWidth(yAxis.zeroLineWidth) + context.setLineWidth(axis.zeroLineWidth) let pos = transformer.pixelForValues(x: 0.0, y: 0.0) - - if yAxis.zeroLineDashLengths != nil + + if axis.zeroLineDashLengths != nil { - context.setLineDash(phase: yAxis.zeroLineDashPhase, lengths: yAxis.zeroLineDashLengths!) + context.setLineDash(phase: axis.zeroLineDashPhase, lengths: axis.zeroLineDashLengths!) } else { @@ -276,14 +268,11 @@ open class YAxisRenderer: AxisRendererBase context.drawPath(using: CGPathDrawingMode.stroke) } - open override func renderLimitLines(context: CGContext) + open func renderLimitLines(context: CGContext) { - guard - let yAxis = self.axis as? YAxis, - let transformer = self.transformer - else { return } + guard let transformer = self.transformer else { return } - var limitLines = yAxis.limitLines + var limitLines = axis.limitLines if limitLines.count == 0 { @@ -347,46 +336,196 @@ open class YAxisRenderer: AxisRendererBase if l.labelPosition == .rightTop { ChartUtils.drawText(context: context, - text: label, - point: CGPoint( - x: viewPortHandler.contentRight - xOffset, - y: position.y - yOffset), - align: .right, - attributes: [NSAttributedStringKey.font: l.valueFont, NSAttributedStringKey.foregroundColor: l.valueTextColor]) + text: label, + point: CGPoint( + x: viewPortHandler.contentRight - xOffset, + y: position.y - yOffset), + align: .right, + attributes: [NSAttributedStringKey.font: l.valueFont, NSAttributedStringKey.foregroundColor: l.valueTextColor]) } else if l.labelPosition == .rightBottom { ChartUtils.drawText(context: context, - text: label, - point: CGPoint( - x: viewPortHandler.contentRight - xOffset, - y: position.y + yOffset - labelLineHeight), - align: .right, - attributes: [NSAttributedStringKey.font: l.valueFont, NSAttributedStringKey.foregroundColor: l.valueTextColor]) + text: label, + point: CGPoint( + x: viewPortHandler.contentRight - xOffset, + y: position.y + yOffset - labelLineHeight), + align: .right, + attributes: [NSAttributedStringKey.font: l.valueFont, NSAttributedStringKey.foregroundColor: l.valueTextColor]) } else if l.labelPosition == .leftTop { ChartUtils.drawText(context: context, - text: label, - point: CGPoint( - x: viewPortHandler.contentLeft + xOffset, - y: position.y - yOffset), - align: .left, - attributes: [NSAttributedStringKey.font: l.valueFont, NSAttributedStringKey.foregroundColor: l.valueTextColor]) + text: label, + point: CGPoint( + x: viewPortHandler.contentLeft + xOffset, + y: position.y - yOffset), + align: .left, + attributes: [NSAttributedStringKey.font: l.valueFont, NSAttributedStringKey.foregroundColor: l.valueTextColor]) } else { ChartUtils.drawText(context: context, - text: label, - point: CGPoint( - x: viewPortHandler.contentLeft + xOffset, - y: position.y + yOffset - labelLineHeight), - align: .left, - attributes: [NSAttributedStringKey.font: l.valueFont, NSAttributedStringKey.foregroundColor: l.valueTextColor]) + text: label, + point: CGPoint( + x: viewPortHandler.contentLeft + xOffset, + y: position.y + yOffset - labelLineHeight), + align: .left, + attributes: [NSAttributedStringKey.font: l.valueFont, NSAttributedStringKey.foregroundColor: l.valueTextColor]) } } } context.restoreGState() } + + @objc open func computeAxis(min: Double, max: Double, inverted: Bool) + { + var min = min, max = max + + if let transformer = self.transformer + { + // calculate the starting and entry point of the y-labels (depending on zoom / contentrect bounds) + if viewPortHandler.contentWidth > 10.0 && !viewPortHandler.isFullyZoomedOutY + { + let p1 = transformer.valueForTouchPoint(CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentTop)) + let p2 = transformer.valueForTouchPoint(CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentBottom)) + + if !inverted + { + min = Double(p2.y) + max = Double(p1.y) + } + else + { + min = Double(p1.y) + max = Double(p2.y) + } + } + } + + computeAxisValues(min: min, max: max) + } + + @objc open func computeAxisValues(min: Double, max: Double) + { + let yMin = min + let yMax = max + + let labelCount = axis.labelCount + let range = abs(yMax - yMin) + + if labelCount == 0 || range <= 0 || range.isInfinite + { + axis.entries = [Double]() + axis.centeredEntries = [Double]() + return + } + + // Find out how much spacing (in y value space) between axis values + let rawInterval = range / Double(labelCount) + var interval = rawInterval.roundedToNextSignificant() + + // If granularity is enabled, then do not allow the interval to go below specified granularity. + // This is used to avoid repeated values when rounding values for display. + if axis.granularityEnabled + { + interval = interval < axis.granularity ? axis.granularity : interval + } + + // Normalize interval + let intervalMagnitude = pow(10.0, Double(Int(log10(interval)))).roundedToNextSignificant() + let intervalSigDigit = Int(interval / intervalMagnitude) + if intervalSigDigit > 5 + { + // Use one order of magnitude higher, to avoid intervals like 0.9 or 90 + interval = floor(10.0 * Double(intervalMagnitude)) + } + + var n = axis.centerAxisLabelsEnabled ? 1 : 0 + + // force label count + if axis.isForceLabelsEnabled + { + interval = Double(range) / Double(labelCount - 1) + + // Ensure stops contains at least n elements. + axis.entries.removeAll(keepingCapacity: true) + axis.entries.reserveCapacity(labelCount) + + var v = yMin + + for _ in 0 ..< labelCount + { + axis.entries.append(v) + v += interval + } + + n = labelCount + } + else + { + // no forced count + + var first = interval == 0.0 ? 0.0 : ceil(yMin / interval) * interval + + if axis.centerAxisLabelsEnabled + { + first -= interval + } + + let last = interval == 0.0 ? 0.0 : (floor(yMax / interval) * interval).nextUp + + if interval != 0.0 && last != first + { + for _ in stride(from: first, through: last, by: interval) + { + n += 1 + } + } + + // Ensure stops contains at least n elements. + axis.entries.removeAll(keepingCapacity: true) + axis.entries.reserveCapacity(labelCount) + + var f = first + var i = 0 + while i < n + { + if f == 0.0 + { + // Fix for IEEE negative zero case (Where value == -0.0, and 0.0 == -0.0) + f = 0.0 + } + + axis.entries.append(Double(f)) + + f += interval + i += 1 + } + } + + // set decimals + if interval < 1 + { + axis.decimals = Int(ceil(-log10(interval))) + } + else + { + axis.decimals = 0 + } + + if axis.centerAxisLabelsEnabled + { + axis.centeredEntries.reserveCapacity(n) + axis.centeredEntries.removeAll() + + let offset: Double = interval / 2.0 + + for i in 0 ..< n + { + axis.centeredEntries.append(axis.entries[i] + offset) + } + } + } } diff --git a/Source/Charts/Renderers/YAxisRendererHorizontalBarChart.swift b/Source/Charts/Renderers/YAxisRendererHorizontalBarChart.swift index ba7c51f17f..163a74d146 100644 --- a/Source/Charts/Renderers/YAxisRendererHorizontalBarChart.swift +++ b/Source/Charts/Renderers/YAxisRendererHorizontalBarChart.swift @@ -18,9 +18,9 @@ import CoreGraphics open class YAxisRendererHorizontalBarChart: YAxisRenderer { - public override init(viewPortHandler: ViewPortHandler, yAxis: YAxis?, transformer: Transformer?) + public override init(viewPortHandler: ViewPortHandler, axis: YAxis, transformer: Transformer?) { - super.init(viewPortHandler: viewPortHandler, yAxis: yAxis, transformer: transformer) + super.init(viewPortHandler: viewPortHandler, axis: axis, transformer: transformer) } /// Computes the axis values. @@ -54,18 +54,16 @@ open class YAxisRendererHorizontalBarChart: YAxisRenderer /// draws the y-axis labels to the screen open override func renderAxisLabels(context: CGContext) { - guard let yAxis = axis as? YAxis else { return } - - if !yAxis.isEnabled || !yAxis.isDrawLabelsEnabled + if !axis.isEnabled || !axis.isDrawLabelsEnabled { return } - let lineHeight = yAxis.labelFont.lineHeight + let lineHeight = axis.labelFont.lineHeight let baseYOffset: CGFloat = 2.5 - let dependency = yAxis.axisDependency - let labelPosition = yAxis.labelPosition + let dependency = axis.axisDependency + let labelPosition = axis.labelPosition var yPos: CGFloat = 0.0 @@ -100,32 +98,30 @@ open class YAxisRendererHorizontalBarChart: YAxisRenderer context: context, fixedPosition: yPos, positions: transformedPositions(), - offset: yAxis.yOffset) + offset: axis.yOffset) } open override func renderAxisLine(context: CGContext) { - guard let yAxis = axis as? YAxis else { return } - - if !yAxis.isEnabled || !yAxis.drawAxisLineEnabled + if !axis.isEnabled || !axis.drawAxisLineEnabled { return } context.saveGState() - context.setStrokeColor(yAxis.axisLineColor.cgColor) - context.setLineWidth(yAxis.axisLineWidth) - if yAxis.axisLineDashLengths != nil + context.setStrokeColor(axis.axisLineColor.cgColor) + context.setLineWidth(axis.axisLineWidth) + if axis.axisLineDashLengths != nil { - context.setLineDash(phase: yAxis.axisLineDashPhase, lengths: yAxis.axisLineDashLengths) + context.setLineDash(phase: axis.axisLineDashPhase, lengths: axis.axisLineDashLengths) } else { context.setLineDash(phase: 0.0, lengths: []) } - if yAxis.axisDependency == .left + if axis.axisDependency == .left { context.beginPath() context.move(to: CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentTop)) @@ -149,19 +145,15 @@ open class YAxisRendererHorizontalBarChart: YAxisRenderer positions: [CGPoint], offset: CGFloat) { - guard let - yAxis = axis as? YAxis - else { return } - - let labelFont = yAxis.labelFont - let labelTextColor = yAxis.labelTextColor + let labelFont = axis.labelFont + let labelTextColor = axis.labelTextColor - let from = yAxis.isDrawBottomYLabelEntryEnabled ? 0 : 1 - let to = yAxis.isDrawTopYLabelEntryEnabled ? yAxis.entryCount : (yAxis.entryCount - 1) + let from = axis.isDrawBottomYLabelEntryEnabled ? 0 : 1 + let to = axis.isDrawTopYLabelEntryEnabled ? axis.entryCount : (axis.entryCount - 1) for i in stride(from: from, to: to, by: 1) { - let text = yAxis.getFormattedLabel(i) + let text = axis.getFormattedLabel(i) ChartUtils.drawText( context: context, @@ -175,7 +167,7 @@ open class YAxisRendererHorizontalBarChart: YAxisRenderer open override var gridClippingRect: CGRect { var contentRect = viewPortHandler.contentRect - let dx = self.axis?.gridLineWidth ?? 0.0 + let dx = self.axis.gridLineWidth contentRect.origin.x -= dx / 2.0 contentRect.size.width += dx return contentRect @@ -193,17 +185,14 @@ open class YAxisRendererHorizontalBarChart: YAxisRenderer open override func transformedPositions() -> [CGPoint] { - guard - let yAxis = self.axis as? YAxis, - let transformer = self.transformer - else { return [CGPoint]() } + guard let transformer = self.transformer else { return [] } var positions = [CGPoint]() - positions.reserveCapacity(yAxis.entryCount) + positions.reserveCapacity(axis.entryCount) - let entries = yAxis.entries + let entries = axis.entries - for i in stride(from: 0, to: yAxis.entryCount, by: 1) + for i in stride(from: 0, to: axis.entryCount, by: 1) { positions.append(CGPoint(x: entries[i], y: 0.0)) } @@ -217,27 +206,26 @@ open class YAxisRendererHorizontalBarChart: YAxisRenderer open override func drawZeroLine(context: CGContext) { guard - let yAxis = self.axis as? YAxis, let transformer = self.transformer, - let zeroLineColor = yAxis.zeroLineColor + let zeroLineColor = axis.zeroLineColor else { return } context.saveGState() defer { context.restoreGState() } var clippingRect = viewPortHandler.contentRect - clippingRect.origin.x -= yAxis.zeroLineWidth / 2.0 - clippingRect.size.width += yAxis.zeroLineWidth + clippingRect.origin.x -= axis.zeroLineWidth / 2.0 + clippingRect.size.width += axis.zeroLineWidth context.clip(to: clippingRect) context.setStrokeColor(zeroLineColor.cgColor) - context.setLineWidth(yAxis.zeroLineWidth) + context.setLineWidth(axis.zeroLineWidth) let pos = transformer.pixelForValues(x: 0.0, y: 0.0) - if yAxis.zeroLineDashLengths != nil + if axis.zeroLineDashLengths != nil { - context.setLineDash(phase: yAxis.zeroLineDashPhase, lengths: yAxis.zeroLineDashLengths!) + context.setLineDash(phase: axis.zeroLineDashPhase, lengths: axis.zeroLineDashLengths!) } else { @@ -253,12 +241,9 @@ open class YAxisRendererHorizontalBarChart: YAxisRenderer open override func renderLimitLines(context: CGContext) { - guard - let yAxis = axis as? YAxis, - let transformer = self.transformer - else { return } + guard let transformer = self.transformer else { return } - var limitLines = yAxis.limitLines + var limitLines = axis.limitLines if limitLines.count <= 0 { diff --git a/Source/Charts/Renderers/YAxisRendererRadarChart.swift b/Source/Charts/Renderers/YAxisRendererRadarChart.swift index a1afd0135d..2c6ca48ed2 100644 --- a/Source/Charts/Renderers/YAxisRendererRadarChart.swift +++ b/Source/Charts/Renderers/YAxisRendererRadarChart.swift @@ -20,19 +20,15 @@ open class YAxisRendererRadarChart: YAxisRenderer { private weak var chart: RadarChartView? - @objc public init(viewPortHandler: ViewPortHandler, yAxis: YAxis?, chart: RadarChartView) + @objc public init(viewPortHandler: ViewPortHandler, axis: YAxis, chart: RadarChartView) { - super.init(viewPortHandler: viewPortHandler, yAxis: yAxis, transformer: nil) + super.init(viewPortHandler: viewPortHandler, axis: axis, transformer: nil) self.chart = chart } open override func computeAxisValues(min yMin: Double, max yMax: Double) { - guard let - axis = axis as? YAxis - else { return } - let labelCount = axis.labelCount let range = abs(yMax - yMin) @@ -45,7 +41,7 @@ open class YAxisRendererRadarChart: YAxisRenderer // Find out how much spacing (in yValue space) between axis values let rawInterval = range / Double(labelCount) - var interval = rawInterval.roundedToNextSignficant() + var interval = rawInterval.roundedToNextSignificant() // If granularity is enabled, then do not allow the interval to go below specified granularity. // This is used to avoid repeated values when rounding values for display. @@ -55,7 +51,7 @@ open class YAxisRendererRadarChart: YAxisRenderer } // Normalize interval - let intervalMagnitude = pow(10.0, floor(log10(interval))).roundedToNextSignficant() + let intervalMagnitude = pow(10.0, floor(log10(interval))).roundedToNextSignificant() let intervalSigDigit = Int(interval / intervalMagnitude) if intervalSigDigit > 5 @@ -161,34 +157,31 @@ open class YAxisRendererRadarChart: YAxisRenderer open override func renderAxisLabels(context: CGContext) { - guard let - yAxis = axis as? YAxis, - let chart = chart - else { return } + guard let chart = chart else { return } - if !yAxis.isEnabled || !yAxis.isDrawLabelsEnabled + if !axis.isEnabled || !axis.isDrawLabelsEnabled { return } - let labelFont = yAxis.labelFont - let labelTextColor = yAxis.labelTextColor + let labelFont = axis.labelFont + let labelTextColor = axis.labelTextColor let center = chart.centerOffsets let factor = chart.factor - let labelLineHeight = yAxis.labelFont.lineHeight + let labelLineHeight = axis.labelFont.lineHeight - let from = yAxis.isDrawBottomYLabelEntryEnabled ? 0 : 1 - let to = yAxis.isDrawTopYLabelEntryEnabled ? yAxis.entryCount : (yAxis.entryCount - 1) + let from = axis.isDrawBottomYLabelEntryEnabled ? 0 : 1 + let to = axis.isDrawTopYLabelEntryEnabled ? axis.entryCount : (axis.entryCount - 1) for j in stride(from: from, to: to, by: 1) { - let r = CGFloat(yAxis.entries[j] - yAxis._axisMinimum) * factor + let r = CGFloat(axis.entries[j] - axis._axisMinimum) * factor let p = ChartUtils.getPosition(center: center, dist: r, angle: chart.rotationAngle) - let label = yAxis.getFormattedLabel(j) + let label = axis.getFormattedLabel(j) ChartUtils.drawText( context: context, @@ -205,12 +198,11 @@ open class YAxisRendererRadarChart: YAxisRenderer open override func renderLimitLines(context: CGContext) { guard - let yAxis = axis as? YAxis, let chart = chart, let data = chart.data else { return } - var limitLines = yAxis.limitLines + var limitLines = axis.limitLines if limitLines.count == 0 { diff --git a/Source/Charts/Utils/ChartUtils.swift b/Source/Charts/Utils/ChartUtils.swift index 3373ad543d..b96b337729 100644 --- a/Source/Charts/Utils/ChartUtils.swift +++ b/Source/Charts/Utils/ChartUtils.swift @@ -49,7 +49,7 @@ extension CGSize { extension Double { /// Rounds the number to the nearest multiple of it's order of magnitude, rounding away from zero if halfway. - func roundedToNextSignficant() -> Double { + func roundedToNextSignificant() -> Double { guard !isInfinite, !isNaN, @@ -70,7 +70,7 @@ extension Double { self != 0.0 else { return 0 } - let i = self.roundedToNextSignficant() + let i = self.roundedToNextSignificant() guard !i.isInfinite, From d0643a3bdc3ec2a1962e2c4bd977af29efa087f3 Mon Sep 17 00:00:00 2001 From: Jacob Christie Date: Thu, 28 Dec 2017 09:01:14 -0400 Subject: [PATCH 14/15] Code style fixes --- Source/Charts/Charts/ChartViewBase.swift | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Source/Charts/Charts/ChartViewBase.swift b/Source/Charts/Charts/ChartViewBase.swift index 833f072f3f..516fec7858 100644 --- a/Source/Charts/Charts/ChartViewBase.swift +++ b/Source/Charts/Charts/ChartViewBase.swift @@ -99,7 +99,8 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate internal lazy var _viewPortHandler = ViewPortHandler(width: bounds.size.width, height: bounds.size.height) /// object responsible for animations - internal lazy var _animator: Animator = { + internal lazy var _animator: Animator = + { let animator = Animator() animator.delegate = self return animator @@ -464,7 +465,8 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate // set the indices to highlight _indicesToHighlight = [h] - if callDelegate { + if callDelegate + { // notify the listener delegate?.chartValueSelected?(self, entry: entry, highlight: h) } @@ -855,7 +857,8 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate } set { - switch newValue { + switch newValue + { case ..<0.0: _dragDecelerationFrictionCoef = 0 case 1.0...: _dragDecelerationFrictionCoef = 0.999 default: _dragDecelerationFrictionCoef = newValue From 8e67c9e5a9bfedc027ac761794319676de3a4262 Mon Sep 17 00:00:00 2001 From: Jacob Christie Date: Thu, 28 Dec 2017 09:03:01 -0400 Subject: [PATCH 15/15] Code style fixes --- Source/Charts/Charts/ChartViewBase.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Source/Charts/Charts/ChartViewBase.swift b/Source/Charts/Charts/ChartViewBase.swift index 516fec7858..b34acba956 100644 --- a/Source/Charts/Charts/ChartViewBase.swift +++ b/Source/Charts/Charts/ChartViewBase.swift @@ -456,7 +456,8 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate // If no highlight or entry, remove all highleted entries and notifgy delegate. high = nil _indicesToHighlight.removeAll(keepingCapacity: false) - if callDelegate { + if callDelegate + { delegate?.chartValueNothingSelected?(self) } return @@ -841,7 +842,7 @@ open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate /// **default**: true /// - returns: `true` if chart continues to scroll after touch up, `false` ifnot. @objc open var isDragDecelerationEnabled: Bool - { + { return dragDecelerationEnabled }