Swift - View

이원석·2024년 12월 12일

Swift

목록 보기
31/38

View

View는 UIView 클래스의 인스턴스로, 윈도우 위에서 컨텐츠를 보여준다. 즉, 화면에 나타나는 거의 모든 요소를 뷰의 컨텐츠라고 봐도 무방하다. 뷰는 컨텐츠를 나타내고 터치, 하위 뷰의 배치등의 역할을 수행한다.
뷰는 사각영역이며, 좌표 공간으로 정의. 드로잉이나 입력처리등을 할 때 정의된 좌표 공간이 필요하다.

ViewController 에 있는 view 변수는 최상위 계층에 있는 UIView로 향하는 포인터

View Hierarchy

View Hierarachy(뷰의 계층구도)
뷰는 다른 컨텐츠를 담는 역할도 수행하지만, 다른 뷰를 담을 수도 있다. 이때 포함되는 뷰를 서브 뷰 또는 자식 뷰, 포함하는 뷰를 슈퍼 뷰 또는 부모 뷰 라고 부른다.

자식뷰는 UIView의 subViews라는 변수로 확인할 수 있음

superView.subviews.forEach {$0.removeFromSuperview() } // 하위뷰 한번에 제거
  • UIWindow는 화면에 나타나는 View를 묶고, UI의 배경을 제공하고, 이벤트 처리행동을 제공하는 객체. 외부 스크린이 있을 경우 여러개이나 일반적으로 하나.

뷰의 계층구조는 drawing 순서를 결정 지음

superView가 먼저 그려지고 subView가 그려짐.
동일한 계층의 뷰는 먼저 addSUbview가 된 순으로 drawing 됨. 먼저 drawing된 view가 가려짐.

SuperView와 SubView의 계층구조에 따른 몇가지 특징

  • superView를 제거하면 subView도 함께 제거
  • superView의 투명도는 subView에도 적용
  • superView의 size가 변하면 subView의 size도 함께 변함
  • superView는 subView를 array로 관리

subView 관리를 위한 methods

  • addSUbView(_ :)로 subView 추가
  • removeFromSuperView()를 통해 제거
  • subView에는 tag를 붙일 수 있고 viewWithTag(_ :)메서드를 통해 subView를 사용할 수 있음
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 추가 가능

좌표계

뷰는 두가지의 좌표계가 있다.

  • frame과 뷰의 중점은 그 상위 뷰의 좌표계를 중점으로 정의
  • bounds와 하위뷰는 해당 뷰의 좌표계를 기준으로 정의

UIView의 초기화

UIView의 직접 초기화는 피하는게 좋음

  • init(frame: CGRect) : 뷰를 코드에서 만들 때 호출. 이생성자에 입력되는 프레임은 슈퍼뷰 안에 있는 뷰 프레임
  • init(coder: NSCoder) : 필수적인 생성자. 스토리보드에서 나오면서 UIView를 만들 때 사용. 만약 뷰를 스토리보드에서 드래그 해서 만들었는데 앱이 실행될 때 스토리보드가 재구성 된다면 호출
  • awakeFromNib() : 이 메소드는 스토리보드에서 나오는 모든 객체 호출 가능. 코드에서 객체를 생성하는 경우에는 호출X

참조
레드의 노트
yongchul.log
조원호의 행복공간

0개의 댓글