오늘은 iOS 생명주기의 마지막 단계인 View의 생명주기에 대해 알아보자.
전체적인 생명주기는 다음 그림과 같다.
init
1) init((coder:))
스토리보드나 xib파일은 활용하여 화면을 만들 때 컴파일러가 인식할 수 있게 코드로 변환해주는 과정에서 사용한다.
코드 base로 작성했을 때는 required init 형태로 선언만 해줘야한다. 어차피 호출되지 않는다.
2) awakeFromNib()
인터페이스 빌더 또는 nib 파일에서 로드된 후 생성되는 메소드이다.
Nib/Xib 파일이 언아카이브되고 나서 init(coder: NSCoder)로 모든 객체가 초기화가 완료되었을 때 호출된다.
마찬가지로 코드 base로 작성되었을 때는 호출되지 않는다.
3) init((frame: ))
View의 인스턴스를 만들기 위해 지정된 이니셜라이저이다.
스토리보드나 xib 파일을 사용하지 않고 코드로 만들었을 때 사용해야하는 이니셜라이저이다.
Subview
1) didAddSubview()
view에게 subview가 추가됨을 알린다.
addSubview를 사용할 때 마다 호출된다.
2) willRemoveSubview()
view에게 subview가 제거된다고 알린다.
removeFromSuperview를 사용할 때 마다 호출된다.
3) willMove( (toSuperView: ) )
슈퍼뷰가 변경될 것이라고 알려주는 메소드이다.
이 메소드는 기본적으로 기능을 구현하지 않는다. 슈퍼뷰가 변경될 때마다 추가 작업을 수행하도록 재정의할 수 있다.
4) didMoveToSuperview( )
슈퍼뷰가 변경되었다는 것을 알려주는 메소드이다.
Window
1) willMove( (toWindow: ) )
window가 변경될 것이라고 알려주는 메소드이다.
이 메소드는 기본적으로 기능을 구현하지 않는다. 윈도우가 변경될 때마다 추가 작업을 수행하도록 재정의할 수 있다.
2) didMoveToWindow( )
window가 변경되었다는 것을 알려주는 메소드이다.
update Cycle
1) updateConstraints()
뷰의 제약조건을 업데이트하는 메소드이다.
제약조건을 제자리에서 변경하는 것이 너무 느리거나 뷰가 많은 중복 변경을 하는 경우에 사용한다.
버튼 이벤트로 제약조건을 변경하는 경우에는 버튼 이벤트 메서드에서 직접 변경하는 것이 좋다.
2) layoutSubviews()
하위 뷰를 배치하는 메소드이다.
해당 메소드는 직접 호출하면 안된다.
모든 하위 뷰의 메소드도 호출이 되기 때문에 뷰가 쌓였을 때 호출하면 큰 부하가 생긴다.
레아이웃의 제약조건이 완료가 되었을 때 ViewController의 viewDidLayoutSubviews 에 호출한다.
레이아웃을 강제로 업데이트하려면 setNeedsLayout() 을 사용하고 [다음 사이클에 적용]
즉시 업데이트하려면 layoutIfNeeded() 를 사용해야 한다.
위 내용은 다음 포스팅에서 다루겠다.
3) draw( )
전달된 CGRect rect 사각형으로 뷰를 그리는 메소드이다.
뷰가 처음 표시되거나 뷰의 보이는 부부을 무효화하는 이벤트가 발생할 때 호출된다.
해당 메소드는 직접 호출하면 안된다.
뷰의 일부를 무효화하여 해당 부분을 다시 그리게 하려면
setNeedsDisplay() 또는 setNeedsDisplay(_ :)를 사용해야 한다.
결과
'iOS > UIKit' 카테고리의 다른 글
frame vs bounds (1) [ CGPoint, CGSize, CGRect ] (0) | 2024.09.02 |
---|---|
생명주기 (4) [ 업데이트 Cycle ] (2) | 2024.09.01 |
UIKit 코드 베이스 셋팅 (0) | 2024.09.01 |
생명주기 (2) [ ViewController 생명주기 ] (0) | 2024.08.31 |
생명주기 (1) [ iOS 앱 생명주기, Scene 생명주기 ] (2) | 2024.08.31 |