코드로 UI를 그리다 보면 중첩이 많다. 그렸다 지웠다 하는 경우는 레이어를 쓰게 되고 그 외 뷰는 대부분 UIView로 그리게 된다. 또, 하나의 파일에 넣는게 길어져 파일을 나누고, 결국은 클래스를 나누게 된다.


import UIKit

import SnapKit


class InsidePanel1 : UIView {

    

    var ret = UIView()

    var item1 = UILabel()

    var img1 = UILabel()

    var item2 = UILabel()

    var item3 = UILabel()

    

    func entry() {

        item1.text = "Item1"

        ret.addSubview(item1)

        ret.addSubview(img1)

        ret.addSubview(item2)

        ret.addSubview(item3)

        self.addSubview(ret)

    }

}


또 그룹을 나누게 된다.


    lazy var topGroup : UIView = {

        let uptownGirls : UIView = UIView()

        return uptownGirls

    }()

    

    lazy var leftGroup : UIView = {

        let leftHander : UIView = UIView()

        return leftHander

    }()

    

    lazy var rightGroup : UIView = {

        let uRright : UIView = UIView()

        return uRright

    }()


UIView라서 스크롤뷰도 안에 넣을 수도 있고 기타 그래픽 stuff도 모두 넣을 수 있다.


   lazy var imgBloodSugar : UIView = {

        let view : UIView = FilledRect(frame: CGRect(x: 0, y: 0, width: 10, height: 18), level: 1, color :  colorLiteral(red: 0.9529411793, green: 0.6862745285, blue: 0.1333333403, alpha: 1))

        return view

    }()


가능


    lazy var labelUpperValue : UILabel = {

        let label: UILabel = UILabel()

        label.font = UIFont.init(name: "NanumSquareOTFL", size: 16)

        label.text = "......--%(---회)"

        label.textAlignment = .center

        label.textColor =  colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)

        return label

    }()


가능


코드로 모두 그렸기에 redraw 나 refresh 도 가능하다.


func jhRedraw() {

        

        print("xDistance", xDistance)


        dataLayer.removeFromSuperlayer()

.

.

.



    open func refresh() {

        if let view = zoomView {

            display(view: view)

        }

    }


redraw 만을 위한 큐를 만들어서 for문을 돌며 한꺼번에 redrawing 도 가능 하다.


protocol observer_p {

    func jhRedraw()

}


선언하고



    private static var listeners = [observer_p]()

    

    static func attachObserver(observer : observer_p) {

        listeners.append(observer)

    }

    

전역에서 호출하게 만들고


    public static func notiDataDowloadFinish() {

        for x in listeners {

            x.jhRedraw()

        }

    }


모두 호출해 주면 된다.


필요한 상황에 필요한 drawing만 가능하니까 무조건 반응형(reactive)으로 만드는 것보다. 효율적이다.


소스 고치기도 쉽다. 


    override func jhRedraw() {

        drawAxes()


옵저버 프로토콜을 구현한 애들만 리스너에서 제외하던지 해당 함수를 지워버리면 된다. 


너무 쉬운 것만 추구하면 기본을 잊어버리고 유연성을 잃어버리게 된다. Swift design pattern 책이 많다.

모듈 디자인은 디자인 패턴 책 하나면 충분하다.


내가 이전 블로그에서 여기에 해당 책을 올려놨는지 기억이 안난다. 최근 술을 자주 마셔서 black out 이 온다. 중복 사진을 올리더라도 독자의 너그러운 이해를 구한다.



+ Recent posts