UIView를 공부하고 나만의 Custom View만드는 법을 생각해봅시다.
View는 앱 UI의 기본 구성 요소이며, UIView 클래스는 모든 뷰에 공통적인 동작을 정의합니다.
뷰 개체는 정해진 범위의 사각형 내에서 컨텐츠를 렌더링하고 해당 컨텐츠와의 모든 상호 작용을 처리합니다.
더 정교한 컨텐츠를 위해 하위 클래스(SubClass)를 만들 수 있습니다.
view objects는 유저와 어플리케이션이 상호작용하는 주요 방법이므로, 다음과 같은 특징과 책임이 있습니다.
- Drawing 및 애니메이션
- View는 UIKit 또는 Core Graphics를 사용하여 직사각형 영역에 콘텐츠를 그립니다.
- 일부 view의 프로퍼티는 새 값으로 애니메이션 할 수 있습니다.
- 레이아웃 및 하위view 관리
- View는 0개 또는 그 이상의 subviews가 포함될 수 있습니다.
- View는 subview의 크기와 위치를 조정할 수 있습니다.
- AutoLayout을 사용하여 뷰 계층 구조의 변경에 따라 뷰의 크기 및 위치를 조정하는 규칙을 정의할 수 있습니다.
- Event handling
- 뷰는 UIResponder의 하위 클래스이며 터치 및 기타 유형의 이벤트에 응답 할 수 있습니다.
- 뷰는 일반적인 제스처를 처리하기 위해 gesture recognizer를(swipe 등 touch gesture인식) 설치 가능
보통 UIView라는 단어의 느낌만 생각해보면 뷰를 그리거나 애니메이션 기능 등이 사용될거라는 것을
유추할 수 있고, 또 실제 프로젝트에서도 많이 사용하게 됩니다.
하지만 UIView는 사각형 내에서 컨텐츠를 렌더링 할뿐만 아니라, UIResponder의 서브 클래스 이므로 사용자의 터치 또는 제스처 이벤트까지도 처리 할 수 있습니다.
한줄요약) UIView는 사각형내에서 여러 컨텐츠를 그리고 애니메이션 및 크기 위치 조정 가능, 또한 UIResponder의 하위클래스로서 유저 이벤트에 대한 핸들링도 가능!
View Drawing Cycle은 다음에....
OpenGL ES 프레임워크를 사용하지만, iOS 12에선 삭제되고 Metal 이란 GPU 프레임 워크를 사용.
CustomView
custom view는 크게 스토리보드, 코드 그리고 Xib로 구성할 수 있다.
UIView는 반드시 두개의 생성자를 갖는다. init(coder: NSCoder): 스토리보드로 UIView를 만들때
init(frame: CGRect): 코드로 뷰를 만들때의 생성자. CGRect로 프레임을 정해주고 크기만큼 UIView 생성
awakeFromNib() 객체가 초기화된후 호출, init()이 호출된 후
- init() 단계 frame or Layer 관련 없는 값들 설정
- awakeFromNib 단계에는 frame 이나 Layer 관련된 값들을 설정하고 구현
- autoLayout 설정은 awakeFromNib 이후
ViewLifeCycle과 위의 초기화 되는 메소드들의 순서를 고려해서, 사이즈 조정 및 아이템들을 커스텀화 한다.
custom 해야할 view가 공통적인 컨텐츠 요소가 있다면 UIView를 custom한 class를 만들어서 여러 View들이 상속을 받을 수 있게 한다. - View의 모듈화
유저의 상호작용 이벤트가 없다면, 코드 or Xib로 보여지는 View만을 구성해도된다.
테이블뷰의 셀이나 섹션부분을 커스텀하기 위해선 Xib로 View를 구성하고 하위뷰로 추가해도 되며, 코드로 구성을 해도된다.
다양한 컨텐츠를 보여주고 스크롤이 많은 View라면 주로 CollectionView를 커스텀해서 만든다.
CollectionView 안에 CollectionView가 들어가는 구조도 만들어질 수 있지만, 구조가 복잡하지 않고 직관적이며 성능까지 고려해서 Custom 하는 것이 개발자의 몫이라 생각한다.
'Deep Dive iOS' 카테고리의 다른 글
Thread Safe한 Core Data 환경 구성하기 (0) | 2022.01.17 |
---|---|
iOS 계층구조? 4단계로 나누어 생각해보기 (iOS Structure) (0) | 2020.12.26 |
앱이 inactive 상태가 되는 경우 (0) | 2020.11.11 |
iOS/Swift) UIKit 이란? (0) | 2020.11.10 |
시뮬레이터에서 할 수 없는 것과 실제 iPhone과의 차이 (0) | 2020.11.05 |