250x250
반응형
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

스윞한 개발자

뷰 드로잉 사이클 - View Drawing Cycle 본문

Swift 이론

뷰 드로잉 사이클 - View Drawing Cycle

스윞남 2025. 1. 20. 20:59
728x90
반응형
SMALL

안녕하세요! 오늘은 뷰의 드로잉 사이클에 대해 정리해보려고 합니다!

 

 

 

# 뷰의 드로잉 사이클이란?

뷰가 로드되거나 변경이 생겼을 때 이를 화면에 적용시켜 그리는 과정을 의미합니다. 뷰가 변경되었을때, 즉각적으로 처리되지 않으며 Main Run Loop에 의존해 업데이트 됩니다.

 

 

* Main Run Loop란?

위의 그림을 보시면, iOS의 애플리케이션과의 모든 상호 작용은 이벤트 대기열에 추가됩니다. 그리고 대기열에 있던 이벤트를 가져와 각 과정을 거쳐 Run Loop가 돌아가면서 하나씩 처리하게 됩니다. 

 

이러한 메서드 호출이 반환되면, 제어는 Main Run Loop로 돌아가게 되고 업데이트 주기가 시작됩니다. 이때, 업데이트 주기는 뷰를 배치하고 다시 그리는 역할을 하게 됩니다. 

 

* 업데이트 주기?

업데이트 주기는 사용자가 이벤트를 주고 개발자의 이벤트 코드가 다 실행되고 난후 메인 루프로 다시 돌아갈때 가리킵니다. 이때 layout, display, constraints가 업데이트 되게 됩니다. 이때 만약 뷰를 변경하셨다면, 다시 위의 업데이트 과정을 거쳐 다시 그려지게 됩니다. 

 

 

iOS 어플 같은 경우네는 일반적으로 이 사이클이 리프레시 되는데 1/60 초 정도 걸린다고 합니다! 이 과정을 돌아야 하기에 뷰는 즉각적으로 업데이트 되지 않는 것입니다. 이벤트들을 처리하는 과정에서 뷰의 변경이 요청되면 시스템은 바로바로 처리하지 않고, 마킹해 두었다가 돌아오는 Update Cycle에 맞춰 변화를 적용시켜주게 됩니다.

 

Display는 draw, Layout은 layoutSubviews, Constraints는 updateConstraints가 업데이트 처리를 담당합니다. 

 

위의 과정을 살펴보면 Constrains을 변경하고 updateConstraints가 호출되면서 그 다음 순서인 Layout이 변경되며 layoutSubviews가 호출되고 최종적으로 Drawing까지 수행하게 됩니다.

 

 

하지만, 위의 메서드들이 Update Cycle에서 수행되는 것이 더 바람직하기에 애플에서는 직접적인 호출을 삼가하라고 하고 있습니다. setNeedsUpdateConstraints, setNeedsLayout, setNeedsDisplay 같은 요청들을 통해 업데이트를 실행할 수 있습니다. 

 

위의 새로고침 트리거들을 호출하지 않아도 되는 경우가 있긴합니다.

 

# 자동 새로 고침 트리거

  • View의 크기 변경
  • SubView 추가
  • ScrollView에서 Scroll 발생
  • 디바이스 회전으로 인한 화면표시 모드변경 (가로, 세로)
  • View의 Constraints 변경

# Update Cycle을 기다리지 않고 즉각 업데이트

뷰가 업데이트가 되려면 Update Cycle을 기다려야하지만, 바로 View를 업데이트 할 수 있는 방법도 있습니다. updateConstraintsIfNeeded 혹은 layoutIfNeeded 메서드를 호출할 수 있습니다. 이 두 메서드를 호출하게 된다면, 사이클과 관계없이 즉각적으로! updateConstraints, layoutSubviews를 호출할 수 있습니다.

 

# invalidateIntrinsicContentSize()

 

사용자가 여러뷰들에 대해 AutoLayout을 설정하는데, intrinsicContentSize property를 가지고 있을 것입니다. 이것은 컨텐츠의 본질적인 크기이며, 직접 호출할 경우에는 다음 레이아웃 과정에서 재계산이 됩니다.  즉 view의 content 크기가 바뀔 때 invalidateIntrinsicContentSize 메서드를 호출하게 된다면 inTrinsicContentSize 값이 새로 계산되어 적용 됩니다.

 

오늘 포스팅은 마무리하겠습니다! 다음 포스팅에는 SnapKit 라이브러리 파해치기라는 주제로 돌아오겠습니다!

 

 

긴 글 읽어주셔서 감사합니다!

 

 

728x90
반응형
LIST