카테고리 없음

Swift - draw(:_)및 drawRect: 함수

jin_j_i_n 2022. 2. 23. 14:34

 

UIKit - funcdraw(_rect: CGRect)

AppKit - (void)drawRect:(NSRect)dirtyRect;

 

Core Graphic과 같은 기술을 사용하여 view의 콘텐츠를 그릴때 해당 함수를 오버라이딩하여 그릴 수 있다.

UIView의 백그라운드 컬러를 바꾸는 경우와 같이 해당 함수를 사용할 필요가 없다면 굳이 오버라이딩 하지 않아도 된다.

 

하지만 NSView와 같이 기존 프로퍼티로 변경할 수 없는 부분들에 대해서는 draw 함수를 오버라이딩 할 필요가 있다. (왜 NSView는 백그라운드 컬러를 프로퍼티 메서드로 변경할 수 없는가.....ㅠ)

 

이번글에서 예시는 backgroundColor를 바꿀 수 없는 NSView의 draw 함수 위주로 설명하겠다.

 

 

func draw(_ dirtyRect: NSRect)

위 함수를 오버라이드 해서 뷰를 다시 그릴 수 있다.

- parameter 

        dirtyRect 

뷰에서 다시 그리기가 필요한 부분을 정의하는 사각형 (NSRect) 이다. dirtyRect는 보통 업데이트가 필요한 뷰의 부분을 나타낸다.

 

설명

view 콘텐츠의 특정 부분을 그릴때 해당 메서드를 사용할 수 있다. dirtyRect 파라미터는 그려질 부분을 특정하여 더 나은 퍼포먼스를 수행할 수 있다. 해당 메서드를 사용하여 뷰를 다시 그릴 때 이 dirtyRect 사각형 내에서 콘텐츠를 다시 그려야 한다.

 

draw 함수는 view가 최초로 보여질때 또는 view의 보이는 부분을 무효화 하는 이벤트가 발생할 때 호출된다.

 

draw 함수는 절대 직접 호출해서는 안되고, view의 일부분을 무효화시키고 해당 부분을 다시 그리기 위해서는 setNeedsDisplay() 또는 setNeedsDisplay(_:)를 호출하면 된다.

 

예시 - draw 함수를 사용하여 NSView Background Color 변경하기

 

ViewController에 NSView를 끌어다 놓는다. Custom View는 NSView 클래스이며,

단순한 NSView 클래스는 스토리보드나 코드를 통해 backgroundColor를 바꿀 수 없다.

 

NSView를 서브클래싱 하고, 위에서 언급한 draw 함수를 사용해 backgroundColor를 바꿔주는 커스텀 클래스를 제작해보자.

 

코드는 간단하다

 

실행화면

 

draw 함수 내에서 쓰이는 함수들, Core Graphic에 대해서는 또 포스팅을 하겠다.