본문 바로가기

iOS

[iOS] updateCycle

updateCycle이란?!

 

run loop에서 updateCycle은 view 들을 배치하고 다시 그리는 역할을 합니다.

Update Cycle은 애플리케이션이 유저로부터 이벤트 핸들링 코드를 수행하고 다시 main run loop로 컨트롤을 반환하는 지점입니다. 

 

하는 일은?!

 

- View들을 배치하고(layout),

Layout은 화면에서 UIView의 위치와 크기를 의미합니다. 모든 View는 frame을 갖고 있고 이는 부모 뷰와의 상대적 거리도 나타낸다.

 

- 보여주고(display)

Layout이 뷰의 위치나 크기를 의미한다면 Display는 View의 속성들 중 크기와 위치 자식 View들에 대한 정보를 포함합니다.

색, 텍스트, 이미지, Core Graphics 등이 있습니다. 

 

- 제약한다(constraints)

constraints들을 계산 및 설정!

 

 

 

 

 일반적으로 유저는 updateCycle이 상호작용하고 레이아웃이 변하는 것을 인지 하지 못합니다.  iOS 애플리케이션은 60fps이기 때문에! update Cycledms 프레임마다 실행되서 눈으로 인지할 수 없습니다.

 개발자는 runloop도중 updateCycle이 돌아가는 시간적 갭이 존재를 인지하고 코드를 짜야합니다.

 

layout, display, constraints는 앞의 블로깅한 layout과 비슷한 함수들 가지고 있음.

display

- draw()

layoutSubview와 유사한 역할을 합니다. 하지만 자식 view들의 draw() 메서드를 호출하지는 않습니다. 직접적으로 사용하는 것은 지양함!!

(draw() 비슷 layoutSubviews())

 

- setNeedsDisplay()

플래그 만들어서 update cycle에 그리게함. 일부만 그리고 싶으면 rect 파라미터를 통해 전달 가능

(setNeedsDisplay() 비슷 setNeedsLayout())

 

constraints

- updateConstraints()

동적으로 변하는 Constraints를 구현 직적 사용하는 것을 지양함!

 

- setNeedsUpdateConstraints()

플래그 만들어서 update cycle에 설정! 업데이트 되는 것을 보장해준다.!

 

- updateConstraintsIfNeeded()

Auto Layout을 사용하는 뷰에서만 유효

변경점이 있을 시 즉시 업데이트한다.

 

- invalidateIntrinsicContentSize()

몇몇의 View들은 intrinsicContentSize를 가지는데 이는 View가 갖고 있는 Content의 크기입니다.

 invalidateIntrinsicContentSize를 실행하면 contentSize를 다음 updateCycle에 업데이트 해줍니다.

 

 

생각

간단하게 layout, display, constraints들은 시스템이 자동으로 업데이트해주거나 개발자가 수동으로 업데이트해주거나! 가능하다는 것을 생각하자.

 

참고

tech.gc.com/demystifying-ios-layout/

 

Demystifying iOS Layout

Some of the most difficult issues to avoid or debug when you first start building iOS applications are those dealing with view layout and content. Often, these issues happen because of misconceptions about when view updates actually occur. Understanding ho

tech.gc.com