samsung-ga / woody-iOS-tip

🐶 iOS에 대한 소소한 팁들과 개발하다 마주친 버그 해결기, 그리고 오늘 배운 것들을 모아둔 레포
19 stars 0 forks source link

[TIL] SwiftUI in UIKit & UIKit in SwiftUI #8

Open samsung-ga opened 2 years ago

samsung-ga commented 2 years ago

SwiftUI in UIKit

import UIKit
import SwiftUI

// ✅ ContentView는 스유
class ViewController: UIViewController {

    let contentView = UIHostingController(rootView: ContentView())
    override func viewDidLoad() {
        super.viewDidLoad()
        addChild(contentView)
        view.addSubview(contentView.view)

        contentView.view.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            contentView.view.topAnchor.constraint(equalTo: view.topAnchor),
            contentView.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            contentView.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            contentView.view.trailingAnchor.constraint(equalTo: view.trailingAnchor)
        ])
    }
}

UIKit in SwiftUI

UIViewControllerType을 이용하는 방법


import PhotosUI
import SwiftUI
// ✅ PHPickerViewController에 대한 예제
struct ImagePicker: UIViewControllerRepresentable {
    @Binding var image: UIImage?

    func makeUIViewController(context: Context) -> PHPickerViewController {
        var config = PHPickerConfiguration()
        config.filter = .images

        let picker = PHPickerViewController(configuration: config)
        picker.delegate = context.coordinator
        return picker
    }

    func updateUIViewController(_ uiViewController: PHPickerViewController, context: Context) {

    }

    typealias UIViewControllerType = PHPickerViewController

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, PHPickerViewControllerDelegate {

        var parent: ImagePicker

        init(_ parent: ImagePicker) {
            self.parent = parent
        }
        func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
            picker.dismiss(animated: true)

            guard let provider = results.first?.itemProvider else { return }

            if provider.canLoadObject(ofClass: UIImage.self) {
                provider.loadObject(ofClass: UIImage.self) { image, _ in
                    self.parent.image = image as? UIImage
                }
            }
        }

    }
}

UIViewControllerType을 이용하지 않는 방법

import Foundation
import SwiftUI

struct StoryboardViewController: UIViewControllerRepresentable {
    @Binding var text: String?

    func makeUIViewController(context: Context) -> some UIViewController {
        let storyboardName = String(describing: "ChildViewController")
        let storyboard = UIStoryboard.init(name: storyboardName, bundle: nil)
        let controller = storyboard.instantiateViewController(identifier: storyboardName)
        guard let child = controller as? ChildViewController else { fatalError() }
        child.delegate = self
        return controller
    }

    func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {

    }
}
extension StoryboardViewController: ChildDelegate {
    func pressButton() {
        text = "프로토콜을 이용한 pressButton"
    }
}

Reference

UIKit in SwiftUI

SwiftUI in UIKit