View는 UIView 클래스의 인스턴스로, 윈도우 위에서 컨텐츠를 보여준다. 즉, 화면에 나타나는 거의 모든 요소를 뷰의 컨텐츠라고 봐도 무방하다. 뷰는 컨텐츠를 나타내고 터치, 하위 뷰의 배치등의 역할을 수행한다.
뷰는 사각영역이며, 좌표 공간으로 정의. 드로잉이나 입력처리등을 할 때 정의된 좌표 공간이 필요하다.
ViewController 에 있는 view 변수는 최상위 계층에 있는 UIView로 향하는 포인터
View Hierarachy(뷰의 계층구도)
뷰는 다른 컨텐츠를 담는 역할도 수행하지만, 다른 뷰를 담을 수도 있다. 이때 포함되는 뷰를 서브 뷰 또는 자식 뷰, 포함하는 뷰를 슈퍼 뷰 또는 부모 뷰 라고 부른다.
자식뷰는 UIView의 subViews라는 변수로 확인할 수 있음
superView.subviews.forEach {$0.removeFromSuperview() } // 하위뷰 한번에 제거
superView가 먼저 그려지고 subView가 그려짐.
동일한 계층의 뷰는 먼저 addSUbview가 된 순으로 drawing 됨. 먼저 drawing된 view가 가려짐.
subView.tag = 1
let assignSubView = superView.viewWithTag(1) // assignSubView는 subView을 가리킴
isDescendant(of:)를 사용하여 특정 view가 superView인지 확인 할 수 있음
let superView = UIView()
let subView = UIView()
superView.addSubview(subView)
let isSuperView: Bool = subView.isDescendant(of: superView)
print(isSuperView) // true
willRemoveSubview(:) : 하위뷰 를 목록에서 제거하기 직전에 상위 뷰에게 전달하는 콜백
willMoveToWindow(:) : 윈도우 위치를 이동하기 직전에 발생
didAddSubView(:) : 하위 뷰를 추가하는데 성공했을 경우, 하위 뷰 목록을 갱신한 상위뷰에서 실행하는 콜백
didMoveToSuperview(:) : 다른 상위 뷰 아래로 이동한 하위 뷰에게, 바뀐 상태에서 상위 뷰와 연계하에 반응을 처리할 수 있게 전달하는 콜백. 상위 뷰 목록에서 제거된 경우에도 같은 콜백 사용. 삭제시 상위뷰를 nil 로 전달.
willMoveToSuperview(:) : 상위 뷰 위치를 이동하기 직전에 발생.
didMoveToWindow(:) : didMoveToSuperview와 동일하지만 단순 상위 뷰가 아니라 애플리케이션 윈도우 구성이 바뀐 뷰에 전달
insertSubview를 사용하여 원하는 위치에 subView 추가 가능
뷰는 두가지의 좌표계가 있다.
UIView의 직접 초기화는 피하는게 좋음