Разработан нативный Sheet для SwiftUI, автоматически подстраивающий высоту под контент, совместимый с iOS 15 и выше. Для реализации использованы UIKit, UIViewControllerRepresentable, UIHostingController и Objective-C.
![Динамические Sheet-ы в SwiftUI с автоматическим определением высоты для iOS 15+](/images/topic/8766.jpg)
Решение включает использование UIKit для создания кастомного UISheetPresentationController, UIViewControllerRepresentable для интеграции в SwiftUI и UIHostingController для управления контентом и его размерами. Objective-C применяется для расширения возможностей UISheetPresentationControllerDetent.
Основной проблемой был динамический подсчёт высоты, решённый с помощью метода
Готовый компонент оформлен как Swift Package. В репозитории на GitHub доступны примеры использования, включая базовый пример и пример с закрытием через кастомный
![Динамические Sheet-ы в SwiftUI с автоматическим определением высоты для iOS 15+](/images/topic/8766.jpg)
Изображение носит иллюстративный характер
Решение включает использование UIKit для создания кастомного UISheetPresentationController, UIViewControllerRepresentable для интеграции в SwiftUI и UIHostingController для управления контентом и его размерами. Objective-C применяется для расширения возможностей UISheetPresentationControllerDetent.
Основной проблемой был динамический подсчёт высоты, решённый с помощью метода
systemLayoutSizeFitting
. Также решена проблема с приватным API для постоянной высоты Sheet в iOS 15 через Objective-C и обход ограничений Environment(\.dismiss)
путём создания кастомного EnvironmentKey
. Готовый компонент оформлен как Swift Package. В репозитории на GitHub доступны примеры использования, включая базовый пример и пример с закрытием через кастомный
EnvironmentKey
. При использовании ScrollView внутри dynamicSheet он автоматически растягивается на весь экран.