Skip to content

Commit

Permalink
Major bug fixes in X-axis rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
danielgindi committed Apr 30, 2015
1 parent c2f6d78 commit 6ca1e0a
Show file tree
Hide file tree
Showing 14 changed files with 83 additions and 61 deletions.
22 changes: 22 additions & 0 deletions Charts/Classes/Charts/BarChartView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
13 changes: 9 additions & 4 deletions Charts/Classes/Charts/BarLineChartViewBase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down
22 changes: 22 additions & 0 deletions Charts/Classes/Charts/HorizontalBarChartView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
}
1 change: 0 additions & 1 deletion Charts/Classes/Renderers/BarChartRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
3 changes: 1 addition & 2 deletions Charts/Classes/Renderers/BubbleChartRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand Down
7 changes: 3 additions & 4 deletions Charts/Classes/Renderers/CandleStickChartRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand Down
32 changes: 12 additions & 20 deletions Charts/Classes/Renderers/ChartRendererBase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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));
}
}
}

14 changes: 1 addition & 13 deletions Charts/Classes/Renderers/ChartXAxisRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
12 changes: 2 additions & 10 deletions Charts/Classes/Renderers/ChartXAxisRendererBarChart.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
8 changes: 8 additions & 0 deletions Charts/Classes/Renderers/CombinedChartRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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!
{
Expand Down
1 change: 0 additions & 1 deletion Charts/Classes/Renderers/HorizontalBarChartRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 1 addition & 3 deletions Charts/Classes/Renderers/LineChartRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,6 @@ public class LineChartRenderer: ChartDataRendererBase
return;
}

calcXBounds(delegate!.lineChartRenderer(self, transformerForAxis: dataSet.axisDependency));

CGContextSaveGState(context);

CGContextSetLineWidth(context, dataSet.lineWidth);
Expand Down Expand Up @@ -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);
Expand Down
1 change: 0 additions & 1 deletion Charts/Classes/Renderers/ScatterChartRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 6ca1e0a

Please sign in to comment.