View를 구성하고 레이아웃을 업데이트하는 메소드
1. draw()
2. layoutSubViews()
3. setNeedsDisplay()
4. setNeedsLayout()
5. displayIfNeeded()
6. layoutIfNeeded()
draw()
- 전달된 사각형안의 reciever의 이미지를 그린다.
- CoreGraphics 및 UIKit의 프레임워크에서 뷰를 그리는 하위클래스들은 draw() 오버라이딩하여 구현
- 배경만 표시하는 View이거나 기본 layer객체를 사용하여 직접 컨텐츠를 구성하는 경우엔 사용 안해도됨
- layoutSubView와 다르게 자식 view의 draw까지는 호출하지 않는다.
※ 이 메서드는 뷰가 처음 표시되거나 뷰의 보이는 부분을 무효화하는 이벤트가 발생할 때 호출된다.
이 메서드를 직접 호출해서는 안 된다. 해당 부분을 다시 그리려면 setNeedsDisplay() 또는 setNeedsDisplay(_:) 메소드를 대신 호출하여 사용해야 한다.
-> 뷰가 로드된 후 ViewDidLoad에서 View가 메모리에 올라가고 draw메소드가 호출되면서 View Update.
이때 draw메소드를 호출하면 안됨!! View의 업데이트가 필요하면 setNeedsDisplay() 또는 setNeedsDisplay(_:) 메소드를 호출하여 다음 드로잉사이클에 반영
layoutSubViews()
- 자신의 view와 subView의 레이아웃을 배치하는 메소드
- draw()와 마찬가지로 직접호출하면 안된다. 다음 드로잉 사이클에 그리는 setNeedsLayout()나 즉시 업데이트하는 layoutIfNeeded()를 호출하여 내부적으로 layoutSubViews를 호출해야한다.
※ 아래의 상황에선 예외적으로 시스템에서 자동으로 layoutSubViews()를 호출한다.
- Resizing a view
- Adding a subView
- Scroll
- rotate device
- update view constraints
setNeedsDisplay()
- 뷰가 다시 그려져야되는것을 알려야할때 사용하는 메소드
- 뷰 업데이트 되는 다음 드로잉 사이클까지 기다리기 때문에 실제로 바로 그려지지는 않는다.
- 즉 View가 업데이트됬다는 사실을 알려주기위해 사용
- 거의 모든 표준 UI 구성요소 View의 프로퍼티가 수정되면 내부적으로 setNeedsDisplay가 트리거되면서 자동으로 호출되고 View가 다시 그려진다.
- 내부적으로 draw(rect:)가 실행됨
언제 사용해야 되는가?
- 말그대로 커스텀 View를 구성하고 draw메소드를 재정의 하고 변경이 일어났을 때 명시적으로 업데이트 할 때 사용
setNeedsLayout()
- receiver의 현재 레이아웃을 무효화하고 다음 업데이트 주기 동안 레이아웃 업데이트를 트리거한다.
- setNeedsDisplay()와 비슷하게 바로 업데이트가 되지 않고 다음 주기에 레이아웃을 업데이트한다.
- 다음 주기에 언제 업데이트될지는 모르지만 setNeedsDisplay,setNeedsLayout모두 비동기 이벤트
- 내부적으로 layoutSubViews()가 실행됨
DisplayIfNeeded()
- 다음 업데이트 주기를 기다리지 않고 레이어의 내용을 강제로 업데이트
※ 레이어를 업데이트하는 가장 좋은 방법은 setNeedsDisplay()를 호출하고, 다음주기 동안 시스템이 레이어를 업데이트 하도록 하는 것
layoutIfNeeded()
- 다음 업데이트 주기를 기다리지 않고 즉시 레이아웃을 업데이트하는 메소드
- setNeedsDisplay와는 다르게 동기호출. 업데이트 주기를 기다리지 않고 바로 호출되고 바로 업데이트
layoutSubView 호출 시점
'swift' 카테고리의 다른 글
URLSession (0) | 2021.12.10 |
---|---|
Method Swizzling (0) | 2021.12.10 |
KVC, KVO (0) | 2021.12.08 |
Properties (0) | 2021.12.08 |
ARC(Auto Reference Count) (0) | 2021.12.07 |