Assume you have a UIKit view that wants to decide about its own size (via intrinsicContentSize or layout constraints, the size might change). For example:
/// Some UIKit view that wants to have a specific size
class YellowBoxUIKitView : UIView {
    init() {
        super.init(frame: .zero)
        self.backgroundColor = .yellow
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) is not supported")
    }
    override var intrinsicContentSize: CGSize {
        return CGSize(width: 100, height: 100)
    }
}
How can you wrap this as a SwiftUI UIViewRepresentable and make it pass on the UIView size to SwiftUI automatically?
struct YellowBoxView : UIViewRepresentable {
    func makeUIView(context: Context) -> YellowBoxUIKitView {
        // TODO: How do you pass the size from UIKit up to SwiftUI?
        YellowBoxUIKitView()
    }
    func updateUIView(_ uiView: YellowBoxUIKitView, context: Context) {
    }
}
SwiftUI does not respect the size of the UIView and just give it maximum possible width/height.
Runnable example: SizedUIViewRepresentableView
There is a similiar question asked for a UITextView here: Update UIViewRepresentable size from UIKit in SwiftUI
The solution is to set explicitly compression/hugging priority for represented UIView
Tested with Xcode 11.4 / iOS 13.4
struct YellowBoxView : UIViewRepresentable {
    func makeUIView(context: Context) -> YellowBoxUIKitView {
        let view = YellowBoxUIKitView()
        view.setContentHuggingPriority(.required, for: .horizontal) // << here !!
        view.setContentHuggingPriority(.required, for: .vertical)
        // the same for compression if needed
        return view
    }
    func updateUIView(_ uiView: YellowBoxUIKitView, context: Context) {
    }
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With