diff --git a/Charts/Classes/Charts/BarChartView.swift b/Charts/Classes/Charts/BarChartView.swift index 05b1e2e0a3..9e053b8222 100644 --- a/Charts/Classes/Charts/BarChartView.swift +++ b/Charts/Classes/Charts/BarChartView.swift @@ -215,6 +215,28 @@ public class BarChartView: BarLineChartViewBase, BarChartRendererDelegate return bounds; } + public override var lowestVisibleXIndex: Int + { + var step = CGFloat(_data.dataSetCount); + var div = (step <= 1.0) ? 1.0 : step + (_data as! BarChartData).groupSpace; + + var pt = CGPoint(x: _viewPortHandler.contentLeft, y: _viewPortHandler.contentBottom); + getTransformer(ChartYAxis.AxisDependency.Left).pixelToValue(&pt); + + return Int(((pt.x <= 0.0) ? 0.0 : pt.x / div) + 1.0); + } + + public override var highestVisibleXIndex: Int + { + var step = CGFloat(_data.dataSetCount); + var div = (step <= 1.0) ? 1.0 : step + (_data as! BarChartData).groupSpace; + + var pt = CGPoint(x: _viewPortHandler.contentRight, y: _viewPortHandler.contentBottom); + getTransformer(ChartYAxis.AxisDependency.Left).pixelToValue(&pt); + + return Int((pt.x >= CGFloat(chartXMax)) ? CGFloat(chartXMax) / div : (pt.x / div)); + } + // MARK: Accessors /// flag that enables or disables the highlighting arrow diff --git a/Charts/Classes/Charts/BarLineChartViewBase.swift b/Charts/Classes/Charts/BarLineChartViewBase.swift index e529c8d4f7..ee379889e7 100644 --- a/Charts/Classes/Charts/BarLineChartViewBase.swift +++ b/Charts/Classes/Charts/BarLineChartViewBase.swift @@ -124,6 +124,15 @@ public class BarLineChartViewBase: ChartViewBase, UIGestureRecognizerDelegate { calcModulus(); } + + if (_xAxisRenderer !== nil) + { + _xAxisRenderer!.calcXBounds(chart: self, xAxisModulus: _xAxis.axisLabelModulus); + } + if (renderer !== nil) + { + renderer!.calcXBounds(chart: self, xAxisModulus: _xAxis.axisLabelModulus); + } // execute all drawing commands drawGridBackground(context: context); @@ -137,10 +146,6 @@ public class BarLineChartViewBase: ChartViewBase, UIGestureRecognizerDelegate _rightYAxisRenderer?.computeAxis(yMin: _rightAxis.axisMinimum, yMax: _rightAxis.axisMaximum); } - _xAxisRenderer?.calcXBounds(_xAxisRenderer.transformer); - _leftYAxisRenderer?.calcXBounds(_xAxisRenderer.transformer); - _rightYAxisRenderer?.calcXBounds(_xAxisRenderer.transformer); - _xAxisRenderer?.renderAxisLine(context: context); _leftYAxisRenderer?.renderAxisLine(context: context); _rightYAxisRenderer?.renderAxisLine(context: context); diff --git a/Charts/Classes/Charts/HorizontalBarChartView.swift b/Charts/Classes/Charts/HorizontalBarChartView.swift index ace3003d54..08bb2fe8c9 100644 --- a/Charts/Classes/Charts/HorizontalBarChartView.swift +++ b/Charts/Classes/Charts/HorizontalBarChartView.swift @@ -170,4 +170,26 @@ public class HorizontalBarChartView: BarChartView return getHighlight(xPosition: pt.y, yPosition: pt.x); } + + public override var lowestVisibleXIndex: Int + { + var step = CGFloat(_data.dataSetCount); + var div = (step <= 1.0) ? 1.0 : step + (_data as! BarChartData).groupSpace; + + var pt = CGPoint(x: _viewPortHandler.contentLeft, y: _viewPortHandler.contentBottom); + getTransformer(ChartYAxis.AxisDependency.Left).pixelToValue(&pt); + + return Int(((pt.y <= 0.0) ? 0.0 : pt.y / div) + 1.0); + } + + public override var highestVisibleXIndex: Int + { + var step = CGFloat(_data.dataSetCount); + var div = (step <= 1.0) ? 1.0 : step + (_data as! BarChartData).groupSpace; + + var pt = CGPoint(x: _viewPortHandler.contentLeft, y: _viewPortHandler.contentTop); + getTransformer(ChartYAxis.AxisDependency.Left).pixelToValue(&pt); + + return Int((pt.y >= CGFloat(chartXMax)) ? CGFloat(chartXMax) / div : (pt.y / div)); + } } \ No newline at end of file diff --git a/Charts/Classes/Renderers/BarChartRenderer.swift b/Charts/Classes/Renderers/BarChartRenderer.swift index 4753522434..97cea57b0f 100644 --- a/Charts/Classes/Renderers/BarChartRenderer.swift +++ b/Charts/Classes/Renderers/BarChartRenderer.swift @@ -68,7 +68,6 @@ public class BarChartRenderer: ChartDataRendererBase var barData = delegate!.barChartRendererData(self); var trans = delegate!.barChartRenderer(self, transformerForAxis: dataSet.axisDependency); - calcXBounds(trans); var drawBarShadowEnabled: Bool = delegate!.barChartIsDrawBarShadowEnabled(self); var dataSetOffset = (barData.dataSetCount - 1); diff --git a/Charts/Classes/Renderers/BubbleChartRenderer.swift b/Charts/Classes/Renderers/BubbleChartRenderer.swift index 57c1130fe2..5e43778dfe 100644 --- a/Charts/Classes/Renderers/BubbleChartRenderer.swift +++ b/Charts/Classes/Renderers/BubbleChartRenderer.swift @@ -51,7 +51,7 @@ public class BubbleChartRenderer: ChartDataRendererBase internal func drawDataSet(#context: CGContext, dataSet: BubbleChartDataSet) { let trans = delegate!.bubbleChartRenderer(self, transformerForAxis: dataSet.axisDependency); - calcXBounds(trans); + let bubbleData = delegate!.bubbleChartRendererData(self); let phaseX = _animator.phaseX; @@ -207,7 +207,6 @@ public class BubbleChartRenderer: ChartDataRendererBase let entry = bubbleData.getEntryForHighlight(indice) as! BubbleChartDataEntry let trans = delegate!.bubbleChartRenderer(self, transformerForAxis: dataSet.axisDependency); - calcXBounds(trans); let valueToPixelMatrix = trans.valueToPixelMatrix; diff --git a/Charts/Classes/Renderers/CandleStickChartRenderer.swift b/Charts/Classes/Renderers/CandleStickChartRenderer.swift index 1dc5d832ca..3b12082a34 100644 --- a/Charts/Classes/Renderers/CandleStickChartRenderer.swift +++ b/Charts/Classes/Renderers/CandleStickChartRenderer.swift @@ -61,7 +61,6 @@ public class CandleStickChartRenderer: ChartDataRendererBase var candleData = delegate!.candleStickChartRendererCandleData(self); var trans = delegate!.candleStickChartRenderer(self, transformerForAxis: dataSet.axisDependency); - calcXBounds(trans); var phaseX = _animator.phaseX; var phaseY = _animator.phaseY; @@ -285,11 +284,11 @@ public class CandleStickChartRenderer: ChartDataRendererBase _vertPtsBuffer[2] = CGPoint(x: CGFloat(xIndex) + 0.5, y: CGFloat(max)); _vertPtsBuffer[3] = CGPoint(x: CGFloat(xIndex) + 0.5, y: CGFloat(min)); - _horzPtsBuffer[0] = CGPoint(x: CGFloat(0.0), y: low); + _horzPtsBuffer[0] = CGPoint(x: CGFloat(delegate!.candleStickChartRendererChartXMin(self)), y: low); _horzPtsBuffer[1] = CGPoint(x: CGFloat(delegate!.candleStickChartRendererChartXMax(self)), y: low); - _horzPtsBuffer[2] = CGPoint(x: 0.0, y: high); + _horzPtsBuffer[2] = CGPoint(x: CGFloat(delegate!.candleStickChartRendererChartXMin(self)), y: high); _horzPtsBuffer[3] = CGPoint(x: CGFloat(delegate!.candleStickChartRendererChartXMax(self)), y: high); - + trans.pointValuesToPixel(&_vertPtsBuffer); trans.pointValuesToPixel(&_horzPtsBuffer); diff --git a/Charts/Classes/Renderers/ChartRendererBase.swift b/Charts/Classes/Renderers/ChartRendererBase.swift index 6eb78a40ed..aa65286fc0 100644 --- a/Charts/Classes/Renderers/ChartRendererBase.swift +++ b/Charts/Classes/Renderers/ChartRendererBase.swift @@ -18,7 +18,11 @@ public class ChartRendererBase: NSObject { /// the component that handles the drawing area of the chart and it's offsets public var viewPortHandler: ChartViewPortHandler!; + + /// the minimum value on the x-axis that should be plotted internal var _minX: Int = 0; + + /// the maximum value on the x-axis that should be plotted internal var _maxX: Int = 0; public override init() @@ -46,27 +50,15 @@ public class ChartRendererBase: NSObject } /// Calculates the minimum and maximum x-value the chart can currently display (with the given zoom level). - internal func calcXBounds(trans: ChartTransformer!) + public func calcXBounds(#chart: BarLineChartViewBase, xAxisModulus: Int) { - var minx = trans.getValueByTouchPoint(CGPoint(x: viewPortHandler.contentLeft, y: 0.0)).x; - var maxx = trans.getValueByTouchPoint(CGPoint(x: viewPortHandler.contentRight, y: 0.0)).x; + let low = chart.lowestVisibleXIndex; + let high = chart.highestVisibleXIndex; - if (isnan(minx)) - { - minx = 0; - } - if (isnan(maxx)) - { - maxx = 0; - } + let subLow = (low % xAxisModulus == 0) ? xAxisModulus : 0; - if (!isinf(minx)) - { - _minX = max(0, Int(minx)); - } - if (!isinf(maxx)) - { - _maxX = max(0, Int(ceil(maxx))); - } + _minX = max((low / xAxisModulus) * (xAxisModulus) - subLow, 0); + _maxX = min((high / xAxisModulus) * (xAxisModulus) + xAxisModulus, Int(chart.chartXMax)); } -} \ No newline at end of file +} + \ No newline at end of file diff --git a/Charts/Classes/Renderers/ChartXAxisRenderer.swift b/Charts/Classes/Renderers/ChartXAxisRenderer.swift index 4be1fe6d92..700ad4a579 100644 --- a/Charts/Classes/Renderers/ChartXAxisRenderer.swift +++ b/Charts/Classes/Renderers/ChartXAxisRenderer.swift @@ -134,19 +134,7 @@ public class ChartXAxisRenderer: ChartAxisRendererBase var position = CGPoint(x: 0.0, y: 0.0); - var maxx = self._maxX; - var minx = self._minX; - - if (maxx >= _xAxis.values.count) - { - maxx = _xAxis.values.count - 1; - } - if (minx < 0) - { - minx = 0; - } - - for (var i = minx; i <= maxx; i += _xAxis.axisLabelModulus) + for (var i = _minX; i <= _maxX; i += _xAxis.axisLabelModulus) { position.x = CGFloat(i); position.y = 0.0; diff --git a/Charts/Classes/Renderers/ChartXAxisRendererBarChart.swift b/Charts/Classes/Renderers/ChartXAxisRendererBarChart.swift index 77566a97ca..330afb06db 100644 --- a/Charts/Classes/Renderers/ChartXAxisRendererBarChart.swift +++ b/Charts/Classes/Renderers/ChartXAxisRendererBarChart.swift @@ -44,11 +44,7 @@ public class ChartXAxisRendererBarChart: ChartXAxisRenderer var position = CGPoint(x: 0.0, y: 0.0); - var div = CGFloat(step) + (step > 1 ? barData.groupSpace : 0.0); - var min = Int(CGFloat(_minX) / div); - var max = Int(CGFloat(_maxX) / div); - - for (var i = min; i <= max; i += _xAxis.axisLabelModulus) + for (var i = _minX; i <= _maxX; i += _xAxis.axisLabelModulus) { position.x = CGFloat(i * step) + CGFloat(i) * barData.groupSpace + barData.groupSpace / 2.0; position.y = 0.0; @@ -120,11 +116,7 @@ public class ChartXAxisRendererBarChart: ChartXAxisRenderer var position = CGPoint(x: 0.0, y: 0.0); - var div = CGFloat(step) + (step > 1 ? barData.groupSpace : 0.0); - var min = Int(CGFloat(_minX) / div); - var max = Int(CGFloat(_maxX) / div); - - for (var i = min; i <= max; i += _xAxis.axisLabelModulus) + for (var i = _minX; i < _maxX; i += _xAxis.axisLabelModulus) { position.x = CGFloat(i * step) + CGFloat(i) * barData.groupSpace - 0.5; position.y = 0.0; diff --git a/Charts/Classes/Renderers/ChartXAxisRendererHorizontalBarChart.swift b/Charts/Classes/Renderers/ChartXAxisRendererHorizontalBarChart.swift index 3a056d75c8..c8a1d8327c 100644 --- a/Charts/Classes/Renderers/ChartXAxisRendererHorizontalBarChart.swift +++ b/Charts/Classes/Renderers/ChartXAxisRendererHorizontalBarChart.swift @@ -76,7 +76,7 @@ public class ChartXAxisRendererHorizontalBarChart: ChartXAxisRendererBarChart var bd = _chart.data as! BarChartData; var step = bd.dataSetCount; - for (var i = 0; i < _xAxis.values.count; i += _xAxis.axisLabelModulus) + for (var i = _minX; i <= _maxX; i += _xAxis.axisLabelModulus) { position.x = 0.0; position.y = CGFloat(i * step) + CGFloat(i) * bd.groupSpace + bd.groupSpace / 2.0; @@ -127,7 +127,7 @@ public class ChartXAxisRendererHorizontalBarChart: ChartXAxisRendererBarChart // take into consideration that multiple DataSets increase _deltaX var step = bd.dataSetCount; - for (var i = 0; i < _xAxis.values.count; i += _xAxis.axisLabelModulus) + for (var i = _minX; i <= _maxX; i += _xAxis.axisLabelModulus) { position.x = 0.0; position.y = CGFloat(i * step) + CGFloat(i) * bd.groupSpace - 0.5; diff --git a/Charts/Classes/Renderers/CombinedChartRenderer.swift b/Charts/Classes/Renderers/CombinedChartRenderer.swift index bd9ae64ebd..3e26763516 100644 --- a/Charts/Classes/Renderers/CombinedChartRenderer.swift +++ b/Charts/Classes/Renderers/CombinedChartRenderer.swift @@ -117,6 +117,14 @@ public class CombinedChartRenderer: ChartDataRendererBase, } } + public override func calcXBounds(#chart: BarLineChartViewBase, xAxisModulus: Int) + { + for renderer in _renderers + { + renderer.calcXBounds(chart: chart, xAxisModulus: xAxisModulus); + } + } + /// Returns the sub-renderer object at the specified index. public func getSubRenderer(#index: Int) -> ChartDataRendererBase! { diff --git a/Charts/Classes/Renderers/HorizontalBarChartRenderer.swift b/Charts/Classes/Renderers/HorizontalBarChartRenderer.swift index 69e73aee9c..8f1bd6fe63 100644 --- a/Charts/Classes/Renderers/HorizontalBarChartRenderer.swift +++ b/Charts/Classes/Renderers/HorizontalBarChartRenderer.swift @@ -32,7 +32,6 @@ public class HorizontalBarChartRenderer: BarChartRenderer var barData = delegate!.barChartRendererData(self); var trans = delegate!.barChartRenderer(self, transformerForAxis: dataSet.axisDependency); - calcXBounds(trans); var drawBarShadowEnabled: Bool = delegate!.barChartIsDrawBarShadowEnabled(self); var dataSetOffset = (barData.dataSetCount - 1); diff --git a/Charts/Classes/Renderers/LineChartRenderer.swift b/Charts/Classes/Renderers/LineChartRenderer.swift index 9841821838..3459c9a5fb 100644 --- a/Charts/Classes/Renderers/LineChartRenderer.swift +++ b/Charts/Classes/Renderers/LineChartRenderer.swift @@ -88,8 +88,6 @@ public class LineChartRenderer: ChartDataRendererBase return; } - calcXBounds(delegate!.lineChartRenderer(self, transformerForAxis: dataSet.axisDependency)); - CGContextSaveGState(context); CGContextSetLineWidth(context, dataSet.lineWidth); @@ -619,7 +617,7 @@ public class LineChartRenderer: ChartDataRendererBase _highlightPtsBuffer[0] = CGPoint(x: CGFloat(xIndex), y: CGFloat(chartYMax)); _highlightPtsBuffer[1] = CGPoint(x: CGFloat(xIndex), y: CGFloat(chartYMin)); - _highlightPtsBuffer[2] = CGPoint(x: 0.0, y: y); + _highlightPtsBuffer[2] = CGPoint(x: CGFloat(delegate!.lineChartRendererChartXMin(self)), y: y); _highlightPtsBuffer[3] = CGPoint(x: CGFloat(chartXMax), y: y); var trans = delegate!.lineChartRenderer(self, transformerForAxis: set.axisDependency); diff --git a/Charts/Classes/Renderers/ScatterChartRenderer.swift b/Charts/Classes/Renderers/ScatterChartRenderer.swift index 44e02fe2db..23ccfec315 100644 --- a/Charts/Classes/Renderers/ScatterChartRenderer.swift +++ b/Charts/Classes/Renderers/ScatterChartRenderer.swift @@ -64,7 +64,6 @@ public class ScatterChartRenderer: ChartDataRendererBase internal func drawDataSet(#context: CGContext, dataSet: ScatterChartDataSet) { var trans = delegate!.scatterChartRenderer(self, transformerForAxis: dataSet.axisDependency); - calcXBounds(trans); var phaseX = _animator.phaseX; var phaseY = _animator.phaseY;