개발을 잘하고 싶은 주니어?

UIView 공부하기 - 1 본문

개발/iOS

UIView 공부하기 - 1

데쿠! 2021. 10. 12. 02:55
반응형

생성자

UIView를 서브 클래싱 할 때는 두 개의 생성자를 구현할 수 있습니다.

1. init(frame:) : 특정 frame으로 뷰를 생성하고 싶을 때 사용합니다. 코드로 뷰를 추가할 때 사용됩니다. 구현 가장 첫 줄에는 super.init(frame: frame)을 추가해줍니다. 

2. init(coder:) : 스토리보드나 .xib파일로 뷰가 생성될 때 사용됩니다.

 

 

Main Run Loop

UIApplication 객체는 앱이 실행될 때 Main Run Loop를 실행하고, 이 Run Loop로 이벤트를 처리합니다. (메인 스레드에서 작동)

Main Run Loop 레이아웃 위치의 변화, 터치와 같은 이벤트들을 처리합니다.

이벤트를 모두 처리하면 Main Run Loop로 돌아오게 되고 이 시점을 update cycle이라고 합니다. 

 

update cycle

Main Run Loop에서 이벤트가 처리되는 과정에서 Layout이 바뀌거나 position값이 변경되는 이벤트가 추가되는 경우에는 바로바로 이벤트가 반영이 되는 것이 아니라 이미 진행 중인 이벤트가 모두 완료되고 나서 다시 Main Run Loop로 돌아오는 시점인 update cycle에서 위의 변화를 적용시킵니다.

position이나 layout값을 변경하는 코드와 실제로 변경된 값이 반영되는 시점에는 시간차가 존재한다는 의미입니다. 

 

 

layoutSubviews()

이 메소드를메서드를 호출하면 바로 view의 값이 바뀝니다. 또한 호출하는 즉시 이 view의 subview들도 이 메서드를 재귀적으로 호출하기 때문에 비용이 많이 듭니다. 그래서 바로 뷰의 모습을 바꾸고 싶다면 다른 방법을 사용합니다.

UIView를 서브클래싱하는 경우에, 서브 뷰의 레이아웃을 추가로 수정하고 싶을 때는 이 메서드를 override를 하면 됩니다.

중요한 것은 auto resizing 이나 constraints-based 이 원하는 기능을 제공하지 않을 때만 오버라이딩 해야 한다는 것입니다.

예를 들어서 서브 뷰의 사각 프레임을 다른 것으로 설정하고 싶을 때 이 메소드를 오버라이딩 합니다.

 

layoutSubViews()가 호출되고 나서 view의 값이 바뀌고 나면 UIViewController의 viewDidLayoutSubviews()가 호출됩니다.

그래서 바뀐 view에 의존하는 행동은 이 메서드에서 명시해주면 됩니다.

이것을 update cycle에서 layoutSubViews의 호출을 미리 예약한다라고 표현합니다.

수동으로 예약하는 방법도 있는데 다음과 같습니다.

 

setNeedsLayout()

receiver의 현재 레이아웃을 무효화하고, 다음 update cycle에서 레이아웃 업데이트를 하도록 합니다.

현재 뷰의 서브 뷰에서 레이아웃을 조정하고 싶을 때 메인 스레드에서 이 메서드를 호출합니다.

이 메소드를 호출한 뷰의 레이아웃이나 위치가 바뀌어야 한다고 수동으로 체크되며, update cycle에서 layoutSubviews가 호출됩니다.

이 메서드는 즉각적인 업데이트를 강제하지 않고, 다음 update cycle을 기다려서 한꺼번에 업데이트를 하기 때문에 성능 향상에도 도움이 됩니다. (모든 레이아웃 업데이트를 한 번에 업데이트하기 때문에 하나의 업데이트 주기로 통합할 수 있음)

 

layoutIfNeeded()

서브 뷰의 레이아웃을 바로 변경하도록 강제하는 메서드입니다.

만약 레이아웃 갱신이 없는 경우에는, 레이아웃을 변경하거나 레이아웃 관련 콜백을 호출하지 않습니다. 

setNeedsLayout()은 예약을 걸어놓고 바로 종료되기 때문에 비동기이고, 
layoutIfNeeded()은 바로 레이아웃을 업데이트하기 때문에 동기입니다.

 

 

 

 

[Layout 공부 출처 : 애플 개발자 문서] https://developer.apple.com/documentation/uikit/uiview

[Layout 공부 출처 : 이동건의 이유있는 코드] https://baked-corn.tistory.com/105

반응형
Comments