#swiftui #ios15 #uihostingcontroller #uihostingview
Вопрос:
В iOS 15 UIHostingController
добавляется какое-то странное дополнительное дополнение к своему хостингу SwiftUI view ( _UIHostingView
).
Смотрите скриншот ниже (Синий = дополнительное пространство, красный = фактический вид):
Кто — нибудь знает, почему это происходит?
Я сообщил об этой ошибке, люди из Apple: FB9641883
PD: У меня есть рабочий проект, воспроизводящий проблему, которую я прикрепил к проблеме Помощника по обратной связи. Если кому-то это нужно, я могу загрузить его тоже.
Ответ №1:
Я обнаружил, что подклассы UIHostingController
следующим образом устраняют проблему с дополнительным заполнением:
final class HostingController<Content: View>: UIHostingController<Content> {
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
view.setNeedsUpdateConstraints()
}
}
Это также устраняет проблему неправильного изменения размера контроллера UIHostingController при изменении размера его представления SwiftUI.
Комментарии:
1. вау, это действительно работает
Почему я не подумал об этом, очень умно попробовать, спасибо, Себастьян!
2. Я пытаюсь создать изображение UI из представления SwiftUI, и все вышеперечисленное по-прежнему приводит к смещению/обрезке изображения.
3. Это не сработало для меня
4. Это не работает, если представление содержимого становится больше.
Ответ №2:
Я пытался понять, почему это происходит, но безуспешно. Единственное, что я нашел, чтобы исправить это, — это установить ограничение по высоте для его внутреннего размера содержимого в подклассе UIHostingController
:
private var heightConstraint: NSLayoutConstraint?
override open func viewDidLoad() {
super.viewDidLoad()
if #available(iOS 15.0, *) {
heightConstraint = view.heightAnchor.constraint(equalToConstant: view.intrinsicContentSize.height)
NSLayoutConstraint.activate([
heightConstraint!,
])
}
}
override open func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
heightConstraint?.constant = view.intrinsicContentSize.height
}