Skip to content

Commit 6626a2b

Browse files
authored
Merge pull request #5163 from crash481/feature/corner-radius
Posibility to add Corner Radius for rounded bars in bar chart
2 parents 7143ae6 + 1c92520 commit 6626a2b

File tree

4 files changed

+87
-5
lines changed

4 files changed

+87
-5
lines changed

Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,34 @@ open class BarChartDataSet: BarLineScatterCandleBubbleChartDataSet, BarChartData
5151
/// the overall entry count, including counting each stack-value individually
5252
private var _entryCountStacks = 0
5353

54+
/// the corner radius applied to each data set
55+
public var cornerRadius: CGFloat = 0.0
56+
57+
/// array of corners to be rounded
58+
open var roundedCorners: UIRectCorner = [] {
59+
didSet {
60+
var invertedCorners: UIRectCorner = []
61+
if roundedCorners.contains(.topLeft) {
62+
invertedCorners.insert(.bottomLeft)
63+
}
64+
if roundedCorners.contains(.topRight) {
65+
invertedCorners.insert(.bottomRight)
66+
}
67+
if roundedCorners.contains(.bottomLeft) {
68+
invertedCorners.insert(.topLeft)
69+
}
70+
if roundedCorners.contains(.bottomRight) {
71+
invertedCorners.insert(.topRight)
72+
}
73+
if roundedCorners.contains(.allCorners) {
74+
invertedCorners.insert(.allCorners)
75+
}
76+
roundedCornersInverted = invertedCorners
77+
}
78+
}
79+
80+
open private(set) var roundedCornersInverted: UIRectCorner = []
81+
5482
/// Calculates the total number of entries this DataSet represents, including
5583
/// stacks. All values belonging to a stack are calculated separately.
5684
private func calcEntryCountIncludingStacks(entries: [BarChartDataEntry])

Source/Charts/Data/Interfaces/BarChartDataSetProtocol.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
import Foundation
1313
import CoreGraphics
1414

15+
#if canImport(UIKit)
16+
import UIKit
17+
#endif
18+
1519
@objc
1620
public protocol BarChartDataSetProtocol: BarLineScatterCandleBubbleChartDataSetProtocol
1721
{
@@ -39,4 +43,13 @@ public protocol BarChartDataSetProtocol: BarLineScatterCandleBubbleChartDataSetP
3943

4044
/// array of labels used to describe the different values of the stacked bars
4145
var stackLabels: [String] { get set }
46+
47+
/// the corner radius applied to each data set
48+
var cornerRadius: CGFloat { get set }
49+
50+
/// array of corners to be rounded
51+
var roundedCorners: UIRectCorner { get set }
52+
53+
/// array of corners to be rounded
54+
var roundedCornersInverted: UIRectCorner { get }
4255
}

Source/Charts/Renderers/BarChartRenderer.swift

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,17 @@ open class BarChartRenderer: BarLineScatterCandleBubbleRenderer
351351
guard viewPortHandler.isInBoundsRight(barRect.origin.x) else { break }
352352

353353
context.setFillColor(dataSet.barShadowColor.cgColor)
354-
context.fill(barRect)
354+
355+
var roundedCorners = dataSet.roundedCorners
356+
if let i = buffer.firstIndex(of: barRect),
357+
let entry = dataSet.entryForIndex(i),
358+
entry.y < 0 {
359+
roundedCorners = dataSet.roundedCornersInverted
360+
}
361+
let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: roundedCorners,
362+
cornerRadii: .init(width: dataSet.cornerRadius, height: dataSet.cornerRadius))
363+
context.addPath(bezierPath.cgPath)
364+
context.drawPath(using: .fill)
355365
}
356366
}
357367

@@ -379,7 +389,15 @@ open class BarChartRenderer: BarLineScatterCandleBubbleRenderer
379389
context.setFillColor(dataSet.color(atIndex: j).cgColor)
380390
}
381391

382-
context.fill(barRect)
392+
var roundedCorners = dataSet.roundedCorners
393+
if let entry = dataSet.entryForIndex(j),
394+
entry.y < 0 {
395+
roundedCorners = dataSet.roundedCornersInverted
396+
}
397+
let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: roundedCorners,
398+
cornerRadii: .init(width: dataSet.cornerRadius, height: dataSet.cornerRadius))
399+
context.addPath(bezierPath.cgPath)
400+
context.drawPath(using: .fill)
383401

384402
if drawBorder
385403
{
@@ -744,7 +762,14 @@ open class BarChartRenderer: BarLineScatterCandleBubbleRenderer
744762

745763
setHighlightDrawPos(highlight: high, barRect: barRect)
746764

747-
context.fill(barRect)
765+
var roundedCorners = set.roundedCorners
766+
if e.y < 0 {
767+
roundedCorners = set.roundedCornersInverted
768+
}
769+
let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: roundedCorners,
770+
cornerRadii: .init(width: set.cornerRadius, height: set.cornerRadius))
771+
context.addPath(bezierPath.cgPath)
772+
context.drawPath(using: .fill)
748773
}
749774
}
750775
}

Source/Charts/Renderers/HorizontalBarChartRenderer.swift

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,15 @@ open class HorizontalBarChartRenderer: BarChartRenderer
228228
_barShadowRectBuffer.size.width = viewPortHandler.contentWidth
229229

230230
context.setFillColor(dataSet.barShadowColor.cgColor)
231-
context.fill(_barShadowRectBuffer)
231+
232+
var roundedCorners = dataSet.roundedCorners
233+
if e.x < 0 {
234+
roundedCorners = dataSet.roundedCornersInverted
235+
}
236+
let bezierPath = UIBezierPath(roundedRect: _barShadowRectBuffer, byRoundingCorners: roundedCorners,
237+
cornerRadii: .init(width: dataSet.cornerRadius, height: dataSet.cornerRadius))
238+
context.addPath(bezierPath.cgPath)
239+
context.drawPath(using: .fill)
232240
}
233241
}
234242

@@ -265,7 +273,15 @@ open class HorizontalBarChartRenderer: BarChartRenderer
265273
context.setFillColor(dataSet.color(atIndex: j).cgColor)
266274
}
267275

268-
context.fill(barRect)
276+
var roundedCorners = dataSet.roundedCorners
277+
if let entry = dataSet.entryForIndex(j),
278+
entry.x < 0 {
279+
roundedCorners = dataSet.roundedCornersInverted
280+
}
281+
let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: roundedCorners,
282+
cornerRadii: .init(width: dataSet.cornerRadius, height: dataSet.cornerRadius))
283+
context.addPath(bezierPath.cgPath)
284+
context.drawPath(using: .fill)
269285

270286
if drawBorder
271287
{

0 commit comments

Comments
 (0)