TIL
🌱 난 오늘 무엇을 공부했을까?
📌 View Update Cycle
- Update Cycle은 애플리케이션이 유저로부터의 모든 이벤트 핸들링 코드를 수행하고 다시 main run loop로 컨트롤을 반환하는 지점이다
- iOS 애플리케이션은 초당 60프레임을 보여주기 때문에, 한 번의 Update Cycle은 1/60초 밖에 걸리지 않는다. 하지만,
이벤트가 처리되는 시점과 실제로 View가 다시 그려지는 시점에 차이가 있기 때문에, 우리가 원하는 시점에 View가 업데이트 되지 않을수도 있다
(이번에 스크롤뷰를 내리는 함수를 사용하면서 문제가 발생했었다.)
- 이럴 경우를 위해 UIView의 메서드을 사용해 문제를 해결 할 수 있다.
📍 layoutSubviews()
- View와 자식 View들의 위치와 크기를 재조정
재귀적으로 모든 자식 뷰의 layoutSubviews까지 호출해야 하기 때문에 실행 시에 부하가 큰 메서드
- layoutSubviews를 직접 호출하는 것은 금지되었다.
- layoutSubviews를 시스템이 호출하도록 유도할 수 있는 여러 개의 방식들이 존재한다.
- layoutSubviews가 완료될 때, viewDidLayoutSubviews가 View를 소유한 ViewController에서 호출
📍 Automatic refresh triggers
- layoutSubviews가 자동으로 호출되는 이벤트
- View를 Resizing
- SubView를 추가
- UIScrollView를 스크롤할 때, UIScrollView와 그것의 부모뷰에 layoutSubviews 호출
- Device를 회전(orientation change)
- View의 Constraint를 변경
📍 setNeedsLayout
- layoutSubviews를 가장 적은 부하로 호출할 수 있는 메서드
setNeedsLayout은 즉시 반환되지 않음, 실제로 View를 업데이트해주는 것은 아님
- 시스템이 다음 Update Cycle에서 layoutSubviews를 View와 자식 View들에게 호출하게 하고 그 시점에 setNeedsLayout이 호출된 부들은 Update Cycle에서 업데이트가 되도록 해준다.
📍 layoutIfNeeded
layoutIfNeeded는 만약 View가 layout이 재조정되어야 한다면, 즉시 layoutSubviews를 호출한다.
- layoutIfNeeded를 호출했는데 View가 재조정되어야 하는 이유가 없다면, layoutSubviews는 호출되지 않는다.
- setNeedsLayout 과는 다르게, 이 메서드는 다음 Update Cycle까지 뷰의 변화를 기다릴 수 없는 상황에 유용하지만 이러한 상황이 아니라면 그냥 setNeedsLayout을 호출해서 다음
Update Cycle에 뷰가 업데이트되어 run loop 한번 당 View업데이트가 한 번만 이루어지게 하는 것이 이상적이다.
참고