iOS

View Drawing Cycle

GREEN.1229 2021. 3. 15. 16:42

안녕하세요. 그린입니다!

이번 포스팅에서는 iOS에서의 뷰 드로잉 사이클에 대해 알아보겠습니다.

 

Drawing Cycle?

 : 뷰가 로드 되거나 변경이 있을때 화면에 시각적으로 표현되어 그려지는 일종의 사이클

 1) 뷰 로드 시 시스템이 UIView에게 draw 메서드를 통해 드로잉을 요청

 2) 뷰의 스냅샷을 캡쳐하여 UIView에게 전달

 3) 뷰의 컨텐츠 변경 시 관련 메서드 (SetNeedsDisplay, SetNeedsLayout 등등..) 호출하여 시스템에 업데이트 요청

 4) Next Drawing Cycle에서 업데이트 요청 받은 뷰를 업데이트

-> 뷰의 스냅샷을 캡쳐하고 뿌려주는 프로세스를 반복하는 과정!

 

View 컨텐츠 변경 관련한 업데이트 트리거 종류

 1) View를 부분적으로 가린 타 View의 이동 및 제거

 2) 히든 뷰 노출

 3) 뷰를 화면 밖과 안으로 이동 및 스크롤

 4) 뷰 드로잉 사이클 관련 메서드 호출 (명시적)

 

View Drawing Cycle 관련 메서드

1) setNeedsDisplay()

 : 뷰 내 요소들을 드로잉 해줌

-. 호출시점: 다음번 드로잉 사이클 시 (draw() 자동 호출)

2) setNeedsLayout()

 : 뷰 자체의 크기 및 위치를 레이아웃 시킴

-. 호출시점: 다음번 드로잉 사이클 시 (layoutSubviews() 자동 호출 )

3) displayIfNeeded()

 : setNeedsDisplay와 같음 (layer의 내용을 강제로 업데이트)

-. 호출시점: Cycle을 기다리지 않고 즉시 실행

4) layoutIfNeeded()

 : setNeedsLayout()과 같은 기능 (호출 시점만 다르다)

-. 호출시점: Cycle 기다리지 않고 즉시 실행

Layout Cycle

-. Constraints -> Layout -> Draw

 

알아두어야 할 점!

1) 뷰의 드로잉은 요청 필요에 의해 발생한다

2) layoutIfNeeded 메서드는 즉시 실행됨으로 다음 사이클을 기다리지 않아 자연스러운 애니메이션 효과처럼 뷰가 변화한다.

    (뷰가 확 바뀌지 않고 바로 실행됨으로..!)

3) 뷰가 처음 표시되거나 뷰의 일부 변경을 다시 그릴때 draw() 메서드 호출하여 뷰에 컨텐츠 드로잉을 요청 (직접 호출 금지)

    -> 드로잉 시 iOS 내장 메서드 코드에 의해서만 호출 해야함

 

 

[참고자료]

https://daeun28.github.io/이론/post22/

https://zeddios.tistory.com/359

https://velog.io/@elile-e/Drawing-Cycle

https://developer.apple.com/library/archive/documentation/2DDrawing/Conceptual/DrawingPrintingiOS/GraphicsDrawingOverview/GraphicsDrawingOverview.html

https://docs.google.com/document/d/1paIjtx9uktmcKG2KiS4696QkQ4KVBj5NlgRHvXCiF9g/edit#

https://developer.apple.com/videos/play/wwdc2018/220