Ios 具有UIViewRepresentable的多行标签

Ios 具有UIViewRepresentable的多行标签,ios,swift,swiftui,uikit,Ios,Swift,Swiftui,Uikit,我正试图通过使用UIViewRepresentable在SwiftUI中使用UIKit创建的组件。我想要实现的结果是在我的视图顶部有一个文本字段,在底部有一个自动高度的UIKit视图 问题是这个组件包含一个多行标签,据我所见,它很难让自动高度正常工作,因此我的UIKit组件占用了VStack中的所有可用空间 下面是我的代码,包含在一个操场中,用于测试它。我试着使用拥抱优先权,但没有任何效果,如果我使用快速UI视图进行测试,它会正常工作。。有什么想法吗 import UIKit import

我正试图通过使用
UIViewRepresentable
在SwiftUI中使用UIKit创建的组件。我想要实现的结果是在我的视图顶部有一个文本字段,在底部有一个自动高度的UIKit视图

问题是这个组件包含一个多行标签,据我所见,它很难让自动高度正常工作,因此我的UIKit组件占用了VStack中的所有可用空间

下面是我的代码,包含在一个操场中,用于测试它。我试着使用拥抱优先权,但没有任何效果,如果我使用快速UI视图进行测试,它会正常工作。。有什么想法吗

import UIKit
import Foundation
import SwiftUI
import PlaygroundSupport

class InformationView: UIView {
    lazy var label = UILabel()
    lazy var button = UIButton(type: .custom)

    override init(frame: CGRect) {
        super.init(frame: frame)

        backgroundColor = .red

        addSubview(label)
        addSubview(button)

        label.text = "zaeiof azoeinf aozienf oaizenf oazeinf oaziefj oazeijf oaziejf aozijf oaizje foazeafjoj"
        label.numberOfLines = 0
        label.setContentHuggingPriority(.required, for: .vertical)

        label.translatesAutoresizingMaskIntoConstraints = false
        button.translatesAutoresizingMaskIntoConstraints = false

        button.setTitle("My button title", for: .normal)
        button.setContentCompressionResistancePriority(.required, for: .horizontal)

        addConstraints([
            label.leadingAnchor.constraint(equalTo: leadingAnchor),
            label.topAnchor.constraint(equalTo: topAnchor),
            label.bottomAnchor.constraint(equalTo: bottomAnchor),
            label.trailingAnchor.constraint(equalTo: button.leadingAnchor, constant: -10),
            button.trailingAnchor.constraint(equalTo: trailingAnchor),
            button.centerYAnchor.constraint(equalTo: centerYAnchor)
        ])
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

struct InformationRepresenter: UIViewRepresentable {
    func makeUIView(context: Context) -> InformationView {
        let view = InformationView(frame: .zero)
        view.setContentHuggingPriority(.required, for: .vertical)

        return view
    }

    func updateUIView(_ uiView: InformationView, context: Context) {

    }
}

struct Info: View {
    var body: some View {
        return HStack {
            Text("zaeiof azoeinf aozienf oaizenf oazeinf oaziefj oazeijf oaziejf aozijf oaizje foazeafjoj")

            Button("My button title", action: {
                print("test")
            })
        }
    }
}

struct ContentView: View {
    @State var text = ""

    var body: some View {
        VStack {
            TextField("Field", text: $text)
                .padding()

            Spacer()

            // SwiftUI works
            // Info().background(Color.red).padding()

            // UIViewRepresentable doesn't
            InformationRepresenter().padding()
        }
    }
}

PlaygroundPage.current.setLiveView(ContentView().frame(width: 400, height: 800, alignment: .top))


这里发生了一些事情

  • InformationView
    没有
    intrinsicContentSize
    。SwiftUI依赖此属性来确定
    UIView
    的理想大小
  • fixedSize
    修改器。此修改器强制视图保持其理想大小,而不是增大以填充其父视图
无法添加
intrinsicContentSize
,因为内容大小是动态的;它基于标签中的行数

无法添加
fixedSize
修饰符,因为如果没有
intrinsicContentSize
,这会将大小设置为(0,0)


非常感谢您的回答,它确实帮助我了解了根本问题是什么以及如何解决它