Как сделать так, чтобы мой SwiftUI UIViewRepresentable уважал intrinsicContentSize в превью?

Когда я создаю представление в SwiftUI и визуализирую его в предварительном просмотре Xcode, используя PreviewLayout.sizeThatFits, предварительный просмотр регулирует его размер в соответствии с его содержимым. Когда я импортирую представление UIKIt с помощью UIViewRepresentable, оно отображается с фреймом полного размера устройства.

Есть ли способ заставить SwiftUI уважать intrinsicContentSize подклассов UIView?

struct Label: UIViewRepresentable {

    func makeUIView(context: UIViewRepresentableContext<Label>) -> UILabel {
        return UILabel()
    }

    func updateUIView(_ uiView: UILabel, context: UIViewRepresentableContext<Label>) {
        uiView.text = "Some text"
    }
}

#if DEBUG
struct Label_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            Label().previewLayout(.sizeThatFits)
        }
    }
}
#endif

person knellr    schedule 19.06.2019    source источник


Ответы (2)


Добавьте в функцию updateUIView следующее:

uiView.setContentHuggingPriority(.defaultHigh, for: .vertical)
uiView.setContentHuggingPriority(.defaultHigh, for: .horizontal)
person dwitt    schedule 24.06.2019
comment
Спасибо, это очень полезно. Оказывается, это также работает при установке contentHuggingPriorities в makeUIView после создания представления. Мне это кажется немного чище, потому что это нужно настраивать только один раз, а не каждый раз, когда обновляется представление ... - person nils; 04.12.2020
comment
Я добавил эти настройки в func makeUIView(context: Context) -> UIViewType, работает хорошо. Спасибо за предложение! - person Honghao Zhang; 24.05.2021

Вы также можете ограничить размер UIViewRepresentable со стороны SwiftUI.

Для этого вы можете использовать fixedSize:

struct Label_Previews: PreviewProvider {
    static var previews: some View {
        Label()
            .fixedSize()
            .previewLayout(.sizeThatFits)
    }
}

Вы также можете зафиксировать размер вида только в одном измерении:

.fixedSize(horizontal: false, vertical: true)
person pawello2222    schedule 18.01.2021