개요
스유는 불완전하다. 아직도 업데이트중이다.
UIKit의 뷰, 뷰컨을 스유에서 사용해야하는 경우가 있다.
그 방법에 대해 알아보겠다.
언제 사용하나??
당장 독사 프로젝트에서도 qr 스캐너 만들 때, pdfkit을 사용할 때, 네비게이션바의 색을 바꿀 때에 사용한다.
- SwiftUI가 지원하지 않는 컴포넌트일 때
- UIImagePickerController같은 경우
- import한 라이브러리가 UIKit 기반일 때
- AVKit, PDFKit같은 경우
- 커스터마이징
- 네비게이션 바의 색을 바꿀 경우
- UIKit과 SwiftUI를 혼용할 때
등등등…
어떻게 사용하나??
- UIView -> UIViewRepresentable 채택
- UIButton, UILabel, UIImageView와 같은 단일 뷰
- UIViewController -> UIViewControllerRepresentable 채택
- UINAvigationController, UIImagePickerController와 같은 뷰컨트롤러
UIViewRepresentable
1 |
|
- 이 프로토콜을 채택한 구조체는 View의 속성을 가지며 SwiftUI의 뷰처럼 다룰 수 있음
- 해당 구조체 안에서 뷰의 생성과 업데이트, tear down(스유 뷰 계층에서 나온다는 말인듯)할 수 있음
- SwiftUI -> UIKit으로의 데이터 흐름은 @Binding으로 가능
- 이 구조체 안에서 스유에서 바뀌는 데이터를 감지하고 ReadOnly임
- UIKit -> SwiftUI의 데이터 흐름은 Coordinator로 가능
- makeUIView, updateUIView 이 두개의 메서드를 필수 구현해야함
makeUIView
- 뷰의 객체를 생성하고 초기화하는 메서드로 만들어질 때 한번만 호출됨
context
파라메터는 뷰가 생성될 때 시스템이 호출함- UIKit 뷰를 리턴함
updateUIView
- 앱의 상태가 바뀌면 SwiftUI는 그 변화에 영향을 받는 UI를 업데이트 시킴
- SwiftUI가 관리하는 뷰에 대응하는 UIView로 makeUIView의 리턴값
dismantleUIView
- deinit과 같은 역할로 자동으로 생성됨
makeCoordinator
- UIView의 이벤트 처리
- SwiftUI로의 데이터 전달
- Corrdinator 클래스를 구현해야함
UIViewRepresentableContext
- UIKit뷰를 생성하고 업데이트하는 시스템의 상태를 담고 있는 정보
- coordinator, transaction, environment의 데이터를 담고 잇음
예시
1 |
|
UIViewControllerRepresentable
- 프로토콜 개념과 사용법, 필수 구현 목록은 UIViewRepresentable과 같음
- UIKit의 생명주기를 사용하고 싶을 때 사용