【问题标题】:How do I make my SwiftUI UIViewRepresentable respect intrinsicContentSize in previews?如何让我的 SwiftUI UIViewRepresentable 在预览中尊重intrinsicContentSize?
【发布时间】:2019-11-02 00:55:53
【问题描述】:

当我在 SwiftUI 中创建一个视图并在 Xcode 预览中渲染它时,使用 PreviewLayout.sizeThatFits,预览会根据其内容调整其大小。当我使用 UIViewRepresentable 导入 UIKIt 视图时,它会出现一个完整的设备大小的框架。

有没有办法让 SwiftUI 尊重 intrinsicContentSizeUIView 子类?

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

【问题讨论】:

    标签: xcode swiftui xcode11 intrinsic-content-size


    【解决方案1】:

    将以下内容添加到您的 updateUIView 函数中:

    uiView.setContentHuggingPriority(.defaultHigh, for: .vertical)
    uiView.setContentHuggingPriority(.defaultHigh, for: .horizontal)
    

    【讨论】:

    • 谢谢,这非常有帮助。事实证明,在创建视图后在makeUIView 中设置 contentHuggingPriorities 时它也有效。对我来说感觉更干净一些,因为这只需要配置一次,而不是每次更新视图时......
    • 我在func makeUIView(context: Context) -&gt; UIViewType中添加了这个设置,效果很好。感谢您的建议!
    【解决方案2】:

    您还可以从 SwiftUI 方面限制UIViewRepresentable 的大小

    为此,您可以使用fixedSize:

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

    您也可以只固定一维的视图大小:

    .fixedSize(horizontal: false, vertical: true)
    

    【讨论】:

      猜你喜欢
      • 2013-06-26
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      相关资源
      最近更新 更多