Layout Methods

sanghee·2022년 5월 2일
0

🍀인턴 스터디

목록 보기
7/12

Layout Methods

setNeedsLayout vs layoutIfNeeded

Main Run Loop

어플리케이션이 실행되면 UIApplication이 메인 스레드에서 main run loop가 실행한다.

터치 이벤트, 위치의 변화, 디바이스 회전 등 각종 이벤트에게 알맞는 핸들러를 찾아 그들에게 권한을 위임하며 처리한다.

처리한 후 권한이 다시 main run loop로 돌아오게 되고, 이 시점을 update cycle이라고 한다.

Update Cycle

Untitled

main run loop에서 이벤트가 처리되는 과정에서 레이아웃이나 위치값을 변경할 수도 있다.

예를 들어 버튼을 누르면 뷰의 색상을 바꿀 수도 있다. 시스템은 이렇게 변화하는 뷰를 체크한다.

그리고 모든 핸들러가 종료되고 main run loop로 권한이 다시 돌아오는 update cycle에서 이런 뷰들을 업데이트한다.

즉 미세한 시간차가 존재한다.

layoutSubViews

호출한 즉시 뷰를 변경하는 메소드이다. 호출하면 해당 뷰의 모든 하위뷰들이 layoutSubViews를 연달아 호출한다.

비용이 많이 드는 메소드이므로 직접 호출은 지양한다. 직접 호출이 아닌, update cycle에서 layoutSubViews의 호출을 예약할 수 있다.

뷰컨트롤러 내의 뷰가 재계산되어 다시 그려진다면,

즉 layoutSubViews가 호출되고 뷰의 값이 갱신되고 나면 뒤이어 뷰컨트롤러의 viewDidLayoutSubViews가 호출된다.

그렇기에 갱신된 뷰의 값에 의존하는 행위들은 viewDidLayoutSubViews에 명시해야 한다.

예를 들어, Layer의 값은 자동으로 변경되지 않기 때문에 속한 View의 frame이 변경되면

viewDidLayoutSubviews 안에 Layer의 frame을 변경하는 코드를 작성해야 한다.

setNeedsLayout

layoutSubviews를 예약하는 행위 중 setNeedsLayout을 호출하는 것이 가장 비용이 적게 든다.

재계산되어야 한느 뷰를 수동으로 체크하며 update cycle에서 layoutSubViews가 호출되게 된다.

layoutIfNeeded

역시 수동으로 layoutSubviews를 예약하는 행위이지만 setNeedsLayout과는 달리 즉시 실행시킨다.

즉시 값이 변경되어야 하는 애니메이션에서 많이 사용된다.

layoutManager

layoutManager는 레이어의 하위 레이어 레이아웃을 담당하는 개체이다.



Methods

setNeedsLayout

레이어의 레이아웃을 무효화하고 업데이트가 필요한 것으로 표시한다.

이 메서드를 호출하여 하위 레이어 레이아웃을 업데이트해야 함을 나타낼 수 있다. 레이어의 경계나 하위 레이어가 변경될 때 자동으로 호출된다.

layoutIfNeeded

필요한 경우 레이아웃을 다시 계산한다.

이 메세지가 수신되면 레이아웃이 필요하지 않은 상위 계층을 찾을 때까지 순회한다.

그 후 해당 조상 아래의 전체 레이어 트리에서 레이아웃을 수행된다.

layoutsublayers

레이어가 레이아웃을 업데이트하도록 지시한다. 하위 클래스에서 이 메서드를 재정의하고 레이아웃 알고리즘을 구현할 수 있다.

layoutsubviews

하위 뷰를 배치한다. 이 메서드를 직접 호출하면 안된다.

뷰의 레이아웃을 즉시 업데이트하려면 setNeedsLayout이나 layoutIfNeeded를 호출한다.

layoutMarginsDidChange

레이아웃 여백이 변경되었음을 알린다. 이 메서드는 아무것도 수행하지 않는다.

서브클래스에서 이 메서드를 재정의하고 뷰의 속성 값이 변경될 때 응답하는 데 사용할 수 있다.

예를 들어, 서브클래스가 레이아웃을 수동으로 처리하거나 그리는 동안 레이아웃 여백을 사용하는 경우가 있다. 이때에 레이아웃 여백이 변경되면,

다시 그려야 하므로 이 메서드를 사용하여 업데이트할 수 있다.

  • layoutMargins: 뷰에 content를 배치할 때 사용되는 기본 마진값이다.



참고문서

profile
👩‍💻

0개의 댓글