ライブラリ、ChartsのPieChartを使っていて以下の様に
Swift
1 let dataSet = PieChartDataSet(values: entries, label: "") 2 dataSet.valueFormatter = CustomLabelFomatter(types: labels, values: values)
クラスCustomLabelFomatterを使いラベルのフォーマットを変更しています。
CustomLabelFomatterを以下に示します
Swift
1class CustomLabelFomatter: NSObject, IValueFormatter { 2 3 let types: [String] 4 let values: [Double] 5 6 init(types: [String], values: [Double]) { 7 self.types = types 8 self.values = values 9 print(types) 10 print(values) 11 } 12 13 func convert(value: Double) -> String { 14 guard let convertedString = values 15 .enumerated() 16 .filter({$0.element == value}) 17 .map({ tuple -> String in 18 print(tuple) 19 20 let index = tuple.offset 21 let type = types[index] 22 if value < 3600 { 23 return "" 24 } 25 26 print(type) 27 switch type { 28 case "blank": 29 return "" 30 default: 31 return "(type)\n(round((value/3600)*10)/10)h" 32 } 33 34 }).first else {fatalError()} 35 36 return convertedString 37 } 38 39 func stringForValue(_ value: Double, entry: ChartDataEntry, dataSetIndex: Int, viewPortHandler: ViewPortHandler?) -> String { 40 41 return convert(value: value) 42 } 43}
しかしこれで困ったことがありました。例えばtypesとvaluesが以下の様に、
["blank", "テスト", "blank", "筋トレ", "blank", "バイト", "blank", "テスト2", "blank"]
[0.0, 18000.0, 39600.0, 5400.0, 3600.0, 5400.0, 5400.0, 600.0, 8399.0]
となっていた場合5400.0というvalueが3つあり、.filter({$0.element == value})で3つ分実行されてしまい、結局どれも最初の”筋トレ”だけがラベルとして返されてしまいます。
ここでうまく正しいラベルを返せる様にするにはどうすればいいでしょうか・・・?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/12 05:16