개발일기/IOS

[UiKit] 뷰 레이아웃 관련 메서드 정리...

코딩하는빵친자 2024. 6. 25. 15:22
  • View와 ViewController 레이아웃 사이클
    • ViewController 를 표시했을 때, 3단계로 호출이된다
    1. 업데이트 : 오토레이아웃의 Constraints를 갱신한다. Constraints의 갱신은 SubView로부터 SuperView의 순서대로 호출된다.
    2. 레이아웃 : Constraints를 바탕으로 레이아웃을 실행한다. 여기에서 view의 center와 bounds를 결정한다. 레이아웃의 갱신은 superview로 부터 subview의 순서로 호출된다.
    3. 그리기 : 레이아웃 후, UIView의 drawRect(rect:CGRect)가 호출된다. 이때는 CoreGraphics를 사용하여 그린다.
  • viewController에서 레이아웃이 결정되는 과정
    1. viewWillLayoutSubViews() 메서드 호출
    2. ViewController의 컨텐트 뷰가 layoutSubViews()메서드 호출
    3. layoutSubViews() : 현재 레이아웃 정보들을 바탕으로 새로운 레이아웃 정보를 계산, 이후 뷰 계층 구조를 순회하면서 모든 하위 뷰들이 동일한 메서드를 호출
    4. 레이아웃 정보의 변경사항을 뷰들에 반영
    5. viewDidLayoutSubViews() 메서드 호출
  • 관련 메서드
    • viewWillLayoutSubviews()뷰가 자신의 서브뷰들의 배치를 조정하기 전에 하고 싶은게 있으면 이 메서드를 오버라이드하면 된다.
      • 다음과 같은 작업을 수행하고자 할 때 이 메서드를 오버라이드
        • 뷰들을 추가하거나 제거
        • 뷰들의 크기나 위치를 업데이트
        • 레이아웃 constraints를 업데이트
        • 뷰와 관련된 기타 프로퍼티들을 업데이트
    • → 뷰의 bounds(자기자신)가 변하면, 하위 뷰들의 위치를 조정하게 된다. 이 메서드는 뷰의 bounds가 변해서 뷰가 서브뷰의 배치를 조정하기 직전임을 뷰 컨트롤러에게 알리는 메서드이다.
    • layoutSubviews()
    • → 뷰의 크기가 변경될 때마다 이에 대응하여 하위 뷰들의 크기와 위치가 변경되어야한다. 뷰의 크기에 변경이 발생하면 우선 하위 뷰들의 autoresizing 동작을 적용하는데, 변경사항을 반영하기 위하여 layoutSubViews()메서드를 호출한다.
    • viewDidLayoutSubViews()
      • 다음과 같은 작업을 수행하고자 할 때 이 메서드를 오버라이드
        • 다른 뷰들의 컨텐트 업데이트
        • 뷰들의 크기나 위치를 최종적으로 조정
    • → 뷰가 서브 뷰의 배치를 다했다는 소식을 뷰 컨트롤러에게 알린다. 뷰가 서브뷰들의 배치를 조정한 직후에 하고 싶은 작업이 있다면 이 메서드를 오버라이드 하면 된다.
728x90