상위 패널(상위 클래스)에서 골격을 만들고

  var dataLayer : CALayer = CALayer(layer: 0)


    func drawAdata(_ index : Int) {

    }


 override func drawAdata(_ index : Int) {


골격구현


    override func drawAdata(_ index : Int) {

        if GS.s.logLevel.contains(.graphPanel) { debugPrint("index \(index)") }

        

        dataLayer.removeFromSuperlayer()

        dataLayer = jhType1graphLayer<T>(self, 0, maxY, index)

        dataLayer.frame = CGRect(x: GS.s.jhLMarginX, y: GS.s.jhLMarginY, width: self.bounds.width - GS.s.jhLMarginX, height: self.bounds.height - GS.s.jhLMarginY)

        dataLayer.zPosition=1

        self.layer.addSublayer(dataLayer)

        dataLayer.setNeedsDisplay()

        jhDataCenter.attachObserver(observer: self)

    }


데이터 센터는 그래프 드로잉에 필요한 데이터를 저장하는 공간이다. 해당 공간에 옵저버 패턴으로 구현된 브로드 캐스팅 시스템이 있다. - redraw를 위해.


원리는 간단하다. 본래 그렸던 레이어를 지우면서 계속해서 새로 그리는 것이다. 포토샵 할 때 레이어를 여러장 얹는 것과 같다. hightlight 되는 그래프나 점 같은 것을 그 위에 덮는 것.

https://github.com/hajunho/iOS_startUpCodes


깃헙 latest에는 그래프가 없지만, 히스토리를 보면 만들다가 회사로 넘겨진 그래프 프로토타입이 하나 있다.


프로토 타입인데 framwork 화까지는 되어 Xcode 에서 framwork 타입으로 불러 올 수 있다. 


내가 혼자 만드는 거라 이 후 품질을 향상하려면 오픈 소스화 해야 한다고 했는데 회사에서 오픈소스화 한다는 메세지를 줬었기에


블로그에 내 고민을 남겨 두면 아마 나중에 새로운 그래프를 만들거나 더 나은 그래프를 만들려고 할 때 도움이 될 것 같아서


이 카테고리를 만들었다. 그리고 첫 글을 쓰는 시점 즈음에는 이제 오픈소스 그래프를 좀 봐야지 했다.


본디 처음부터 그것을 보면 절대 그 안에서 벗어날 수 없는 법이라...


깃헙에 올려졌었던 그래프와 오픈 소스 그래프와 다른 점은 한 패널에 여러개의 그래프를 붙일 수 있다는 점이다.


처음부터 다른 철학으로 쌓아올려지는 것이라 참고를 하지 않았었다. 코어 그래픽이라 딱히 복잡하진 않은데


싱글톤, 빌더, 옵저버 패턴 정도는 들어갔다.


나도 개발하느라 바빠서 잘 정리하지는 짧막한 글이라도 분명 후진에는 도움이 될거라 생각한다.

링크는


https://github.com/danielgindi/Charts



ChartsDemo-iOS Swift 그룹 아래 다음 개의 파일을 복사한다.

LineChart1ViewController

BalloonMarker

DemoBaseViewController


xib 복사하지 않고, interface builder 에서 view 추가하고 Custom Class

LineChartView 맞춘다. -> Module Charts 자동으로 들어간다.


LineChart1ViewController 열고 기존 리소스를 지우고, 다시 연결해 준다.

다음 세개를 연결한다.


    @IBOutlet var chartView: LineChartView!

    @IBOutlet var sliderX: UISlider!

    @IBOutlet var sliderY: UISlider!

    

    override func viewDidLoad() {

        super.viewDidLoad()


2개를 올렸으니 주석 처리해야할 것이 생긴다.


        chartView.rightAxis.enabled = false

        

//        [_chartView.viewPortHandler setMaximumScaleY: 2.f];

//        [_chartView.viewPortHandler setMaximumScaleX: 2.f];



    @IBAction func slidersValueChanged(_ sender: Any?) {

//        sliderTextX.text = "\(Int(sliderX.value))"

//        sliderTextY.text = "\(Int(sliderY.value))"


그래프 나옴.

Fin.


+ Recent posts