

[`Charts`](https://github.com/danielgindi/Charts)というフレームワークを使っています。Cocoapodsでインストールしました。

この中で`RadarChartView`の表示を変えたいと思います。そのためには`RadarChartRenderer`を変更する必要があります。

`RadarChartView`の中では

[code]

    internal override func initialize()
    {
        super.initialize()
    
        _yAxis = YAxis(position: .left)
    
        renderer = RadarChartRenderer(chart: self, animator: _animator, viewPortHandler: _viewPortHandler)
    
        _yAxisRenderer = YAxisRendererRadarChart(viewPortHandler: _viewPortHandler, yAxis: _yAxis, chart: self)
        _xAxisRenderer = XAxisRendererRadarChart(viewPortHandler: _viewPortHandler, xAxis: _xAxis, chart: self)
    
        self.highlighter = RadarHighlighter(chart: self)
    }
    
[/code]

の`renderer`が`RadarChartRenderer`のインスタンスです。まず`initialize`がinternal指定なのでこれをオーバーライドすることはできません。`renderer`は

[code]

    open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate
    {
        ...
    
        /// object responsible for rendering the data
        open var renderer: DataRenderer?
    
        ...
    }
    
[/code]

ですのでopenですからカスタムのrendererに置き換えることはできそうです。ただし

[code]

        renderer = RadarChartRenderer(chart: self, animator: _animator, viewPortHandler: _viewPortHandler)
    
[/code]

で使われる`_animator`や`_viewPortHandler`がinternalですので必要なパラメータを`RadarChartView`のサブクラスやextensionで与えることはできません。

このような疑問は私だけでなく多くの人が持っているようで

  * [Module is not extensible](https://github.com/danielgindi/Charts/issues/357)
  * [ChartUtils methods are marked internal and cannot be use to create custom charts](https://github.com/danielgindi/Charts/issues/1518)

ほか色々あります。2015年のプルリクエストなのでこれが採用される見込みはないのかも知れません。

何か上手いアイディアがあればお知恵を拝借したいと思います。よろしくお願いします。

現在はモジュールを直接書き換えるという乱暴な方法を取っています。

# 追記（2017年2月7日）

具体的に何をしたいか書かなかったためわかりにくかったかも知れません。

レーダーチャートで一番凹んでいるところに「！」を付与してほしいと上司から頼まれました。例えば試験の成績をレーダーチャートで表して、英語が一番点が低かったらそこに「！」を表示します。

そのためには`RadarChartRenderer`を変更するしかなく、カスタムの`RadarChartRenderer`を使うには`RadarChartView`のrendererも変更しないといけないのです。

Chartsライブラリはクラス全体はopenになっているものの、internal指定も多く実質的にカスタマイズが難しい構造になっています。


CC BY-SA 3.0
2017-02-01T21:49:47.413
32314
2018-12-05T09:00:01.940
2017-02-07T23:19:51.333
14631
14631
question
swift ios
モジュール内でinternalを使用しているクラスをカスタマイズしたい


「RadarChartRendererを変更」は私では無理ですが根っこの問題である表示を変えたいということに対して一例として回答してみます。

Charts Ver 3.0.1

[code]

    import UIKit
    import Charts
    
    class ViewController: UIViewController {
    
    @IBOutlet weak var radarChartView: RadarChartView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let titles = ["コーヒー", "紅茶", "ココア", "ほうじ茶", "緑茶", "玄米茶", "プーアール茶", "ごぼう茶", "はとむぎ茶"]
        var entries1 = [RadarChartDataEntry]()
        var entries2 = [RadarChartDataEntry]()
    
       //味や人気の点数
        for _ in 0...titles.count {
            let double1 = 80.0
            let double2 = 20.0
            let entry1 = RadarChartDataEntry(value: double1)
            let entry2 = RadarChartDataEntry(value: double2)
            entries1.append(entry1)
            entries2.append(entry2)
        }
    
        let set1 = RadarChartDataSet(values: entries1, label: "味")
        set1.colors = [UIColor.white]
    
        let set2 = RadarChartDataSet(values: entries2, label: "人気")
        set2.drawFilledEnabled = true
        set2.valueColors = [UIColor.blue]
        set2.fillColor = UIColor.white
    
        //目盛りだったり線だったり描写されるものは色々と消せます
        set2.drawValuesEnabled = false
    
        let data = RadarChartData(dataSets: [set1, set2])
        radarChartView.data = data
    
        radarChartView.backgroundColor = UIColor.lightGray
    
        //Ver 3.0から軸のタイトルの付け方が変わったようです
        radarChartView.xAxis.valueFormatter = IndexAxisValueFormatter(values: titles)
    
        //点の最大値と最小値
        radarChartView.yAxis.axisMinimum = 0
        radarChartView.yAxis.axisMaximum = 100
    
        radarChartView.minOffset = 64
    
        radarChartView.yAxis.drawLabelsEnabled = false
        radarChartView.chartDescription?.text = "単位：点"
    
        radarChartView.animate(xAxisDuration: 3.5)
    
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    
    }
    
[/code]

バージョンが上がったことで細部が変わっているのでその点には注意してください。  
これをビルドすると  
[![ビルド画像](https://i.stack.imgur.com/oxsbZ.png)](https://i.stack.imgur.com/oxsbZ.png)  
こうなります。  
答えられる範囲で回答してみましたがいかがでしょうか。


CC BY-SA 3.0
2017-02-07T13:27:25.647
32464
2017-02-07T13:27:25.647
19964
32314
answer