Jaebi의 Binary는 호남선

SwiftUI에 UIKit 넣기 본문

Swift

SwiftUI에 UIKit 넣기

jaebijae 2024. 5. 6. 20:03

목차

SwiftUI에 UIKit 넣기

SwiftUI는 `struct`로 뷰를 표시하고 UIKit은 `class`로 뷰를 표시

  • 중간다리를 `UIViewRepresentable` 프로토콜과 `Coordinator`가 담당

UIView 관련 사용

  • `UIViewRepresentable` 채택
  • `typealias UIViewType`로 어떤 `UIViewType`인지 지정
  • `makeUIView`에 `UIViewType`을 리턴
  • `updateUIView`는 SwiftUI에서 뷰가 업데이트 될때 불리는 메소드로, 이곳에서 `delegate`와 같은 처리
  • `makeCoordinator`는 뷰의 변경사항을 SwiftUI 인터페이스에 전달하는데 사용
    • 뷰의 change가 앱의 다른 부분에 영향을 줄 경우 구현 (필수는 아님)
  • 예시: SwiftUI에서 `UIActivityIndicatorView` 사용
    • `makeUIView`에 `UIActivityIndicatorView`을 리턴
struct MyUIKitUIActivityIndicatorView: UIViewRepresentable {
    func makeUIView(context: Context) -> UIViewType {
        UIActivityIndicatorView(style: .large)
    }
    
    func updateUIView(_ uiView: UIViewType, context: Context) {}
    
    func makeCoordinator() -> Coordinator {}
    
    typealias UIViewType = UIActivityIndicatorView
}

UIViewController 관련 사용

  • `UIViewControllerRepresentable` 채택
  • `typealias UIViewControllerType`로 어떤 `UIViewControllerType`인지 지정
  • 위에서 본 `UIViewRepresentable` 원리와 동일하게 사용
  • 예시: SwiftUI에서 `IViewControllerRepresentable`를 준수하는 `MyActivityView` 사용
struct MySwiftUIViewController: UIViewControllerRepresentable {
    var activityItems: [Any]
    var applicationActivities: [UIActivity]? = nil
    
    func makeUIViewController(context: Context) -> UIViewControllerType {
        UIActivityViewController(activityItems: activityItems, applicationActivities: applicationActivities)
    }
    
    func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {}
    
    func makeCoordinator() -> Coordinator {}
    
    typealias UIViewControllerType = UIActivityViewController
}