From c300992086a6f64651f1b85fba19646e4e1b700e Mon Sep 17 00:00:00 2001 From: ibrahimakpinar Date: Fri, 15 Dec 2023 10:51:59 +0300 Subject: [PATCH] [issue: #4414 ] Added: minAngleForSlices it's a similar functionality to setMinAngleForSlices at Android. When the percentages of some data are very small, they are either not visible or difficult to touch. For this, it is necessary to determine the minimum slice angle. --- Source/Charts/Charts/PieChartView.swift | 55 +++++++++++++++++++++++++ Tests/ChartsTests/PieChartTests.swift | 5 +++ 2 files changed, 60 insertions(+) diff --git a/Source/Charts/Charts/PieChartView.swift b/Source/Charts/Charts/PieChartView.swift index 704c066bdf..a7c1bdcaf3 100644 --- a/Source/Charts/Charts/PieChartView.swift +++ b/Source/Charts/Charts/PieChartView.swift @@ -72,6 +72,9 @@ open class PieChartView: PieRadarChartViewBase /// maximum angle for this pie private var _maxAngle: CGFloat = 360.0 + /// mininum angle for slices + private var _minAngleForSlices: CGFloat = 0.0 + public override init(frame: CGRect) { super.init(frame: frame) @@ -249,6 +252,7 @@ open class PieChartView: PieRadarChartViewBase { _drawAngles = [CGFloat]() _absoluteAngles = [CGFloat]() + var minAngles = [CGFloat]() guard let data = data else { return } @@ -256,17 +260,32 @@ open class PieChartView: PieRadarChartViewBase _drawAngles.reserveCapacity(entryCount) _absoluteAngles.reserveCapacity(entryCount) + minAngles.reserveCapacity(entryCount) let yValueSum = (data as! PieChartData).yValueSum + let hasMinAngle = _minAngleForSlices != .zero && (CGFloat(entryCount) * _minAngleForSlices) <= _maxAngle var cnt = 0 + var offset = 0.0 + var diff = 0.0 for set in data { for j in 0 ..< set.entryCount { guard let e = set.entryForIndex(j) else { continue } + let drawAngle = calcAngle(value: abs(e.y), yValueSum: yValueSum) + if hasMinAngle { + let temp = drawAngle - _minAngleForSlices + if temp <= 0 { + minAngles.append(_minAngleForSlices) + offset += -temp + } else { + minAngles.append(drawAngle) + diff += temp + } + } _drawAngles.append(calcAngle(value: abs(e.y), yValueSum: yValueSum)) if cnt == 0 @@ -281,6 +300,20 @@ open class PieChartView: PieRadarChartViewBase cnt += 1 } } + + if hasMinAngle { + for i in 0.. (_maxAngle / 2) { + _minAngleForSlices = _maxAngle / 2 + } else if _minAngleForSlices < 0 { + _minAngleForSlices = .zero + } + } + } + /// smallest pie slice angle that will have a label drawn in degrees, 0 by default @objc open var sliceTextDrawingThreshold: CGFloat = 0.0 { diff --git a/Tests/ChartsTests/PieChartTests.swift b/Tests/ChartsTests/PieChartTests.swift index a33c3ebae7..0a57781212 100644 --- a/Tests/ChartsTests/PieChartTests.swift +++ b/Tests/ChartsTests/PieChartTests.swift @@ -76,4 +76,9 @@ class PieChartTests: XCTestCase { chart.highlightValue(x: 1.0, dataSetIndex: 0, callDelegate: false) assertChartSnapshot(matching: chart) } + + func testMinAngleForSlices() { + chart.minAngleForSlices = 2 + assertChartSnapshot(matching: chart) + } }