나만의 공부 노트

Draw에 관하여 본문

정리 X/Core Graphics

Draw에 관하여

va95 2021. 2. 6. 02:28

view의 커스텀 클래스를 만들어보면 얘네가 들어있따..

 

override func draw(_ rect: CGRect) {

    여기서 인자는 최적화를 위한 인자라고 함(원하는 rect부분만 그리는듯)

    ios 시스템이 호출하므로 되도록 이 함수는 바꾸지말것

    

    * 실험해본 결과 기존의 모양은 유지한 채 커스텀 드로잉이 실행됨

}  <- 얘는 매번 바뀔 때마다 호출해서 최적화 문제 발생

 

draw에 구현해 놓으면 바뀔때마다 호출하니 매우 성능이 저하됨.

draw말고 딴 데서 바꾸고, 다 바꿨으면 쌓아놓은채로 한꺼번에 아래 함수 호출해서 그리도록 하자

func setNeedsDisplay() { code }

override func setNeedsDisplay(_ rect: CGRect) { code } <- 얜 최적화 버전

 

 

 


 

 

 

cg = core graphics  <- OpenGL 같은 친구?

 

전역 함수로써 존재하고 단순히 얘로 그릴 순 있음

그릴려면

1. context를 얻어와야함 -> window에 context(모니터, 프린터..등)를 생성하는데 맞나? (context안에 버퍼 넣고.. 등등 했었음)

2. 경로를 context 안에 저장

3. 그 다음 색상, 굵기 등 적용함

4. 버퍼에 그림           -> 이거 컴그에서 본듯 과정 다시 살펴보기

 

 

 

하지만 객체지향프로그래밍을 해보자!

 

UIBezierPath() <- 클래스로 존재하고 기저에는 cg를 쓰고 있긴함(색, 폰트, 텍스트, 이미지 4개 지원안함)

getContext 안해도 자동으로 해줌 매우 편리

 

예)

let path = UIbezierPath() <- 경로만 만들뿐 그리진 않음

path.fill()

path.stroke()

 

 

addClip() <- 베지에 경로로 둥근 모서리 구현 가능

 

*필요하다면 베지에 경로 문서 참고할 것*

 

 

와... 텍스트도 결국 베지에 경로로 그리는 거였고

라벨의 글자들을 베지에 경로로 그리는 거였음;

 

view draw에서 그린 후 텍스트, 그림을 그리는 방법은

1. 간단하게 subview로 UILabel, UIImage를 써서 그리는것

2. NSAttributedString("hello").drawAtPoint(aCGPoint) or UIImage.drawAt ... 처럼 하위 뷰가 아닌 직접 그리는 법

 

 

 


 

 

 

bound가 바뀔 때 최적화를 위해서 보통 비트를 늘리거나 줄이는 방법을 택함(default : scale to fill)

그래서 content mode를 설정해서 다시 그릴지(redraw), 크기를 늘려 맞출지, 새로운 bound로 이동만 할지 등등 설정해야함

-> content mode가 요런거 였구나... 깨달음

'정리 X > Core Graphics' 카테고리의 다른 글

Bound에 관하여  (0) 2021.02.05