원문: https://medium.com/stackademic/uiview-life-cycle-df1a76cbdc43
UI퍼포먼스 최적화:
각 페이스의 병목현상을 해결할 수 있고 렌더링 효율을 높일 수 있다
메모리 누수 관리:
UI요소들에 대한 적절한 메모리 해제는 렌더링 효율과 리소스소비를 감소시킬 수 있다
디버그 UI이슈:
UI요소들에 대한 라이프사이클을 추적해서 렌더링 문제에 대한 디버깅 솔루션을 내놓을 수 있다
UIView 생성구문: `init(frame:), init?(coder:)
init(frame:)
메서드는 특정 프레임이나 부모 뷰 안에서의 해당뷰의 포지션,사이즈를 잡아주는 메서드이다 -> 코드로 UI element를 만들 때 사용하는 메서드이다
개발자는 초기 생성할 때 위치나 z축 디멘션을 설정해 줄 수 있다.
init?(coder:)
위 메서드는 뷰의 nibFile을 생성한다
(nibFile이 궁금하다면 이글로)
따라서 UI 요소들을 생성해주는 것이라 볼 수 있다
awakeFromNib()
메서드
뷰가 Nib파일을 로드할 때 awakeFromNib()
메서드가 호출된다.
개발자는 이 메서드에서 Interface Builder-based views(스토리보드)들을 연결시키거나 셋업할 수 있다
생성구문에서 설정하는 대표적인 속성은 아래와 같다
a. backgroundColor
b. contentMode
c. clipsToBounds
d. userInteractionEnabled
생성구문에서 설정하는 대표적인 UI 렌더링 관련 메서드는 아래와 같다
a. addingSubviews
b. configureLayoutConstraints
c. Delegate
/Datasources
코드 예시
//Initializing and Configuring a UILabel:
let label = UILabel()
label.text = "Hello, World!"
label.textColor = .black
label.backgroundColor = .white
layoutSubviews()
메서드bounds
나 constraints
가 바뀔 때마다 호출된다//Handling User Interaction with a UIButton:
let button = UIButton()
button.setTitle("Click Me", for: .normal)
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
Drawing Phase에서는 뷰의 데이터나 상태가 바뀌어 스크린에 표현해야 할 때 사용하는 구간이다
뷰 프레임 만들어지고, 위치잡고, 사이즈도 잡히면 스크린에 렌더링해주는 막타치는 구간이라고 볼 수 있다
draw(_:)
메서드
DrawingPhase에서 핵심 메서드는 draw(_:)
이다.
위 함수는 최종적으로 스크린에 렌더링해주는 책임을 가지고 있다
개발자는 이 함수를 override()
해서 shape, gradient, animation 효과를 줄 수 있다
UIViewContext는 드로잉 환경을 관리해주는 객체로 shape, line, text and image를 뷰 표면에 어떻게 그릴지 조정할 수 있다
UI를 그리는 것 자체가 고비용이고 복잡한 작업이기 때문에 이곳에서 최적화를 잘시켜야한다. 이러한 최적화 방법은 아래와 같다
a. CoreGraphics사용하기
b. 자주 그려지는 컨텐츠를 캐싱해놓기
c. 최대한 그리는 빈도를 줄이기
//Animating a UIView’s Position:
UIView.animate(withDuration: 0.5) {
self.view.center = CGPoint(x: 200, y: 200)
}