Swift Utilities — Интеграция SwiftUI в UIKit

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

За годы работы разработчиком iOS, я собрал множество инструментов и полезных штук, которые облегчают процесс разработки. В этой статье, я хочу поделиться одним из таких инструментов. Это будет не большая статья. Я покажу, как пользоваться этой утилитой, продемонстрирую её в действии. Надеюсь, что статья окажется полезной для вас.

Как можно начать переезжать на SwiftUI? Постепенно. Переписывать целый экран слишком дорого по времени, а вот переписать ячейку или кнопку куда быстрее. Таким способом можно мигрировать на SwiftUI, шаг за шагом переписывая экран. В этом поможет класс HostingView.

/// HostingView allows you to use SwiftUI View in UIKit code
///
/// Example:
///
///```swift
///
/// // SwiftUI
/// struct SomeView: View {
///
///     var body: some View {
///         Text("Hello World!")
///     }
/// }
///
/// // UIKit
/// class RootViewController: UIViewController {
///
///     override func viewDidLoad() {
///         super.viewDidLoad()
///
///         // SwiftUI View -> UIView
///         let swiftUIView = SomeView()
///         let view = HostingView(rootView: swiftUIView)
///     }
/// }
/// ```
///
/// Warning:
/// In some iPhone models, SwiftUIView must be set to `.ignoresSafeArea()` otherwise the final UIView may be indented
public final class HostingView<T: View>: UIView {

    private(set) var hostingController: UIHostingController<T>

    public var rootView: T {
        get { hostingController.rootView }
        set { hostingController.rootView = newValue }
    }

    public init(rootView: T, frame: CGRect = .zero) {
        hostingController = UIHostingController(rootView: rootView)

        super.init(frame: frame)

        backgroundColor = .clear
        hostingController.view.backgroundColor = backgroundColor
        hostingController.view.frame = self.bounds
        hostingController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

        addSubview(hostingController.view)
    }

    public required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Пример Использования

Рассмотрим простой пример, демонстрирующий использование HostingView для встраивания SwiftUI View внутри класса UIViewController.

Создание SwiftUI View:

struct SomeView: View {
    var body: some View {
        Text("Hello World!")
    }
}

Интеграция в UIKit:

class RootViewController: UIViewController {
  
    override func viewDidLoad() {
        super.viewDidLoad()

        let swiftUIView = SomeView()
        let view = HostingView(rootView: swiftUIView)
    }
}

Особенности

  • Встроенный UIHostingController: HostingView использует UIHostingController для рендеринга SwiftUI Views. Это обеспечивает точное отображение и поведение SwiftUI компонентов внутри UIKit.

  • Поддержка Автоизменения Размеров: Компоненты SwiftUI автоматически изменяют свои размеры под контейнер UIKit, что обеспечивает гибкость и удобство при разработке.

Что нужно учитывать?

Важно учитывать особенности Safe Area на разных моделях iPhone. На моделях без safeArea может появиться отступ. Использование метода .ignoresSafeArea() в SwiftUI View помогает избежать этой проблемы.

Заключение

Этот подход позволяет разработчикам постепенно переходить к использованию SwiftUI, минимизируя риски и издержки, связанные с полной перепиской приложений.

Еще статьи Swift Utilities:

  • Swift Utilities — Работа с Динамическими Цветами

  • Swift Utilities — Упрощаем работу с UserDefaults

  • Swift Utilities — Потокобезопасное свойство

  • Swift Utilities — Equatable для сложных Enum

Источник: https://habr.com/ru/articles/778154/


Интересные статьи

Интересные статьи

Сегодня мы узнаем, как написать микросервис, который сохраняет данные в Apache Cassandra с помощью Java-драйвера DataStax и генерирует события для изменений данных в Apache Kafka.Этот пост основан на ...
Подключаем нагрудный пульсометр к IOS устройству на Swift по протоколу Bluetooth без смс и регистраций.У меня был китайский пульсометр CooSpo, MacBook, iPhone и немного с...
Привет! Меня зовут Александр Скворцов, я работаю в команде Яндекс.Браузера для iOS. Это очень большой проект, который насчитывает около тысячи clang-модулей и примерно 60...
В конце марта вышел релиз Swift 5.2 для Xcode 11.4. В нём улучшена диагностика ошибок, анализ зависимостей, расширен функционал SwiftPM. Обзор некоторых изменений уже был опубликован на Хабре, в ...
Всем привет. Сегодня хотим поделиться переводом подготовленным в преддверии запуска курса «iOS Разработчик. Продвинутый курс». Поехали! Одним из основных преимуществ протокольно-ориентированно...