본문 바로가기

iOS

[iOS] View Drawing Cycle

# Drawing cycle이 뭔디

View가 로드되거나 변경이 되었을때 화면에 시각적으로 표현되어 그려지는 사이클임

  1. view load 시 system이 UIView에게 draw를 통해 Drawing을 요청함
  1. view의 스냅샷을 캡쳐하고 UIView에게 전달함
  2. view의 content변경시 관련(setNeedsDisplay, setNeedsLayout 등등) 호출하여 system에 업데이트를 요청함
  1. Next drawing cycle에서 업데이트 요청 받은 view를 업데이트함

# view drawing cycle trigger 해주는 상황

View 컨텐츠 변경 관련한 업데이트 트리거를 해주는 상황이 존재한다

  • view를 부분적으로 가린 타 view의 이동 및 제거
  • hidden view 노출
  • view를 화면 밖과 안으로 이동 및 스크롤
  • view drawing cycle관련 메서드 호출(setNeedsDisplay, setNeedsLayout)

그런데 hidden과 view의 이동 및 제거부분을 테스트해본결과 draw method가 호출되지않았었다. 한참을 답답해하고 있던찰나에 야곰이 한마디를 던진다…

야곰: 원래안되는겁니다. 그거…
우리: 예?

이 내용이 적혀있던 apple문서를 참고해보면 옛날 문서가 종종있는데 Document 옆에 Archive라고 적혀있는다. 번역은 보관소 이런 뜻인데 야곰이 말하기를 아카이브 문서를 100% 신뢰할수 없는 문서라고한다. 업데이트가 되는 내용이 반영되는것이아니라 옛날에 만들어놓은 내용을 그냥 보관만해놓는 문서같다… 추가적으로 이 업데이트된 내용의 문서를 찾아보면 좋겠찌만 시간관계상 패스

암튼 기억해두자.

# layout과 display의 차이점

layout은 화면에 위치를 잡아 배치하는것이고
display는 배치된 view를 화면에 그리는 작업입니다.
이것이 layout과 display의 차이점이라고 볼 수 있다.

# View Drawing Cycle 관련 메서드

1) setNeedsDisplay()

  • view 내 요소들을 drawing 해준다.
  • 즉시 업데이트 반영이되지않고 다음 drawing cycle에 반영되기때문에 그 시점에 draw메서드를 자동으로 호출한다.
  • display를 변경할 요소가 한개뿐일 경우 아무리 setNeedsDisplay메서드를 여러번 호출하더라도 draw메서드를 한번만 호출이된다.
  • 비동기로 호출됨

2) setNeedsLayout()

  • view 자체의 크기 및 위치를 배치(layout) 시킨다.
  • 즉시 업데이트 되지않고 다음 drawing cycle에 반영되기에 그시점에 layoutSubviews를 자동으로 호출한다.
  • 이 또한 layoutSubviews를 재배치해야할게 한개뿐이면 아무리 setNeedsLayout을 여러번 호출하더라도 내부적으로 layoutSubviews를 한번만 호출한다.

3) layoutIfNeeded()

  • setNeedsLayout과 같은 기능을 하지만 이 메서드를 즉시 업데이트를 해준다. (호출시점차이)
  • cycle을 기다리지않고 즉시실행함

4) displayIfNeeded()

  • setNeedsDisplay와 같은 역할을 한다.
  • setNeedsDisplay와 같은 기능을 하지만 이 메서드는 즉시 업데이트를 해준다.(호출시점차이)

5) layoutSubviews

  • view와 subview들의 위치 및 크기조정을 재배치하는기능이다.
  • view의 값을 호출한 즉시 변경시켜준다.
  • 호출되면 해당 view의 모든 subview들의 LayoutSubview또한 연달아 호출한다. 그렇기에 비용이 많이드는 메서드이고 그렇기때문이 직접호출하는 것을 지양한다. 이는 시스템에 의해서 view의 값이 재계산되어야하는 적절한 시점에 자동으로 호출이된다.

다음과 같은 상황에서 시스템이 자동으로 size혹은 position이 변경되야하는 view라고 체크하고 update cycle에서는 LayoutSubviews가호출되어 체크된 view들의 변경사항을 반영함

  • view의 크기를 조절할때
  • Subviews를 추가할때
  • 사용자가 UIScrollView를 스크롤할때
  • 기기를 회전할때
  • view의 autolayout constraint값을 변경할때

# view관련 개념 정의

1) Layout

  • view의 Layout은 화면에서 size와 position을 나타낸다. 모든 view는 super view의 좌표계에서 존재하는 위치와 크기를 정의하는 frame이 존재한다. UIView는 view의 Layout이 변경되었음을 시스템에게 알릴 수 있는 메서드를 제공할뿐아니라 view의 Layout이 다시 재계산된 후 수행할 작업을 정의하기위한 메서드도 제공합니다.

2) Display

  • view의 Display는 Color, text, image 및 core graphics 그리기를 포함해 view 및 subview의 resizing 및 position 설정을 포함하지 않은 view의 프로퍼티를 말한다.
    display pass에는 트리거하기위한 layout pass와 유사한 메서드가 포함되있따. 즉, 둘이 연관되있다는 소리같음…

부가적으로 메서드들이 존재하지만 차근차근 더 정리해보자.

# reference