В iOS 15 контроллер UIHostingController добавляет некоторые странные дополнительные дополнения в свой хостинг SwiftUI view (_UIHostingView)

#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
    }