diff --git a/Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift b/Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift index 2dee2ab262..63894b55d3 100644 --- a/Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift +++ b/Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift @@ -55,7 +55,29 @@ open class BarChartDataSet: BarLineScatterCandleBubbleChartDataSet, BarChartData public var cornerRadius: CGFloat = 0.0 /// array of corners to be rounded - open var roundedCorners: UIRectCorner = [] + open var roundedCorners: UIRectCorner = [] { + didSet { + var invertedCorners: UIRectCorner = [] + if roundedCorners.contains(.topLeft) { + invertedCorners.insert(.bottomLeft) + } + if roundedCorners.contains(.topRight) { + invertedCorners.insert(.bottomRight) + } + if roundedCorners.contains(.bottomLeft) { + invertedCorners.insert(.topLeft) + } + if roundedCorners.contains(.bottomRight) { + invertedCorners.insert(.topRight) + } + if roundedCorners.contains(.allCorners) { + invertedCorners.insert(.allCorners) + } + roundedCornersInverted = invertedCorners + } + } + + open var roundedCornersInverted: UIRectCorner = [] /// Calculates the total number of entries this DataSet represents, including /// stacks. All values belonging to a stack are calculated separately. diff --git a/Source/Charts/Data/Interfaces/BarChartDataSetProtocol.swift b/Source/Charts/Data/Interfaces/BarChartDataSetProtocol.swift index 7d1ab45548..fcd9277f6a 100644 --- a/Source/Charts/Data/Interfaces/BarChartDataSetProtocol.swift +++ b/Source/Charts/Data/Interfaces/BarChartDataSetProtocol.swift @@ -49,4 +49,7 @@ public protocol BarChartDataSetProtocol: BarLineScatterCandleBubbleChartDataSetP /// array of corners to be rounded var roundedCorners: UIRectCorner { get set } + + /// array of corners to be rounded + var roundedCornersInverted: UIRectCorner { get } } diff --git a/Source/Charts/Renderers/BarChartRenderer.swift b/Source/Charts/Renderers/BarChartRenderer.swift index eb2eebe819..7d5e5bfd95 100644 --- a/Source/Charts/Renderers/BarChartRenderer.swift +++ b/Source/Charts/Renderers/BarChartRenderer.swift @@ -352,7 +352,13 @@ open class BarChartRenderer: BarLineScatterCandleBubbleRenderer context.setFillColor(dataSet.barShadowColor.cgColor) - let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: dataSet.roundedCorners, + var roundedCorners = dataSet.roundedCorners + if let i = buffer.firstIndex(of: barRect), + let entry = dataSet.entryForIndex(i), + entry.y < 0 { + roundedCorners = dataSet.roundedCornersInverted + } + let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: roundedCorners, cornerRadii: .init(width: dataSet.cornerRadius, height: dataSet.cornerRadius)) context.addPath(bezierPath.cgPath) context.drawPath(using: .fill) @@ -383,7 +389,12 @@ open class BarChartRenderer: BarLineScatterCandleBubbleRenderer context.setFillColor(dataSet.color(atIndex: j).cgColor) } - let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: dataSet.roundedCorners, + var roundedCorners = dataSet.roundedCorners + if let entry = dataSet.entryForIndex(j), + entry.y < 0 { + roundedCorners = dataSet.roundedCornersInverted + } + let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: roundedCorners, cornerRadii: .init(width: dataSet.cornerRadius, height: dataSet.cornerRadius)) context.addPath(bezierPath.cgPath) context.drawPath(using: .fill) @@ -751,7 +762,11 @@ open class BarChartRenderer: BarLineScatterCandleBubbleRenderer setHighlightDrawPos(highlight: high, barRect: barRect) - let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: set.roundedCorners, + var roundedCorners = set.roundedCorners + if e.y < 0 { + roundedCorners = set.roundedCornersInverted + } + let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: roundedCorners, cornerRadii: .init(width: set.cornerRadius, height: set.cornerRadius)) context.addPath(bezierPath.cgPath) context.drawPath(using: .fill) diff --git a/Source/Charts/Renderers/HorizontalBarChartRenderer.swift b/Source/Charts/Renderers/HorizontalBarChartRenderer.swift index 588f45bc95..32116acd6d 100644 --- a/Source/Charts/Renderers/HorizontalBarChartRenderer.swift +++ b/Source/Charts/Renderers/HorizontalBarChartRenderer.swift @@ -229,7 +229,11 @@ open class HorizontalBarChartRenderer: BarChartRenderer context.setFillColor(dataSet.barShadowColor.cgColor) - let bezierPath = UIBezierPath(roundedRect: _barShadowRectBuffer, byRoundingCorners: dataSet.roundedCorners, + var roundedCorners = dataSet.roundedCorners + if e.x < 0 { + roundedCorners = dataSet.roundedCornersInverted + } + let bezierPath = UIBezierPath(roundedRect: _barShadowRectBuffer, byRoundingCorners: roundedCorners, cornerRadii: .init(width: dataSet.cornerRadius, height: dataSet.cornerRadius)) context.addPath(bezierPath.cgPath) context.drawPath(using: .fill) @@ -269,7 +273,12 @@ open class HorizontalBarChartRenderer: BarChartRenderer context.setFillColor(dataSet.color(atIndex: j).cgColor) } - let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: dataSet.roundedCorners, + var roundedCorners = dataSet.roundedCorners + if let entry = dataSet.entryForIndex(j), + entry.x < 0 { + roundedCorners = dataSet.roundedCornersInverted + } + let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: roundedCorners, cornerRadii: .init(width: dataSet.cornerRadius, height: dataSet.cornerRadius)) context.addPath(bezierPath.cgPath) context.drawPath(using: .fill)