HIT해

[iOS/Swift] UIViewRepresentable 이 무엇일까? 본문

Swift/Swift CS

[iOS/Swift] UIViewRepresentable 이 무엇일까?

힛해 2024. 8. 20. 10:21
728x90

https://developer.apple.com/documentation/swiftui/uiviewrepresentable

 

UIViewRepresentable | Apple Developer Documentation

A wrapper for a UIKit view that you use to integrate that view into your SwiftUI view hierarchy.

developer.apple.com

 

개발하면서 자주 보이는 이녀석 무엇일까?

 

UIViewRepresentable이란?

해당 뷰를 SwiftUI 뷰 계층 구조에 통합하는데 사용하는 UIKit 뷰에 대한 래퍼.

즉 SwiftUI와 UIKit를 함께 사용하는 상황에서 다리역할을 하는 프로토콜이다.

 

예를 들어 SceneKit 의 SCNView 는 UIKit에서 제공하는 3D 콘텐츠를 렌더링 하는 뷰인데 이 SCNView 를 SwiftUI에서 사용하려면 UIViewRepresentable 을 사용해 SwiftUI로 변환해주어야한다.

 

@MainActor @preconcurrency
protocol UIViewRepresentable : View where Self.Body == Never

 

 

UIViewRepresentable 필수 메서드

  1. makeUIView(context:)
  2. updateUIView(_:context:)

 

1. makeUIView

UIView를 생성하고 초기화 하는데 사용한다.

SwiftUI에서 이 메서드를 호출해 UIKit 뷰를 생성하고 여기서 반환한 UIView 는 SwiftUI 뷰 계층 구조에 포함된다.

func makeUIView(context: Context) -> SCNView {
    let scnView = SCNView()
    scnView.scene = loadScene()  // 3D 씬 로드
    scnView.backgroundColor = UIColor.clear  // 투명한 배경 설정
    scnView.allowsCameraControl = true  // 카메라 제어 허용
    return scnView
}

 

2. updateUIView

SwiftUI 에서 뷰의 상태가 변경될때 호출된다.

SwiftUI의 뷰가 변경될때 UIKit의 뷰가 해당 변경사항을 반영하도록 업데이트를 할 수 있다.

func updateUIView(_ uiView: SCNView, context: Context) {
    // 필요 시, SCNView를 업데이트하는 로직을 추가
}

 

 

UIViewRepresentable을 사용하는 이유

SwiftUI가 매우 강력하고 직관적이지만, UIKit이 제공하는 모든 기능을 완전히 대체할 수는 없습니다. 특히 3D 렌더링, 지도 뷰, 또는 복잡한 사용자 정의 뷰 같은 특정 상황에서는 여전히 UIKit을 사용해야 합니다. 이럴 때, UIViewRepresentable을 사용하면 SwiftUI 프로젝트 내에서 UIKit의 기능을 활용할 수 있습니다.

 

예를 들어, 복잡한 3D 모델을 보여주고자 SceneKit SCNView 사용해야 합니다. SCNView UIKit 뷰이므로, SwiftUI에서 바로 사용할 없습니다. 이때 UIViewRepresentable 사용하여 SCNView SwiftUI에서 활용할 있게 됩니다.

 

 

정리하자면

Swift로 다양한 기능을 활용하려면 SwiftUI 뿐만아니라 UIKit에 대한 이해와 결합 방법을 숙지해두는것이 좋을 것 같다!

'Swift > Swift CS' 카테고리의 다른 글

[iOS/SwiftUI] TCA 프로젝트 뜯어보기  (0) 2024.08.26
[iOS/UIKit] UIKit 란 무엇일까  (0) 2024.08.25
[iOS/Swift] Alamofire  (0) 2024.08.22
[iOS/Swift] TCA  (0) 2024.08.20
[Swift 기초문법 - 37] 디자인패턴 Builder  (0) 2024.08.15