This help me
I had uikit scrollView and inside it swiftuiView
iOS 16+
hostingController.sizingOptions = [.intrinsicContentSize]
Other
ParentViewController:
public override func viewDidLoad() {
super.viewDidLoad()
...
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.delegate = self
view.addSubview(scrollView)
...
let mainVC = AutoLayoutHostingController(rootView: MainView(viewModel: viewModel))
addChild(mainVC) /// Important
guard let childView = mainVC.view else { return }
childView.backgroundColor = .clear
childView.translatesAutoresizingMaskIntoConstraints = false
scrollView.addSubview(childView)
mainVC.didMove(toParent: self) /// Important
childView.setContentHuggingPriority(.required, for: .vertical)
childView.setContentCompressionResistancePriority(.required, for: .vertical)
NSLayoutConstraint.activate([
....
scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
scrollView.topAnchor.constraint(equalTo: view.topAnchor),
scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
childView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor, constant: 28),
childView.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 16),
childView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: -20),
childView.widthAnchor.constraint(equalTo: scrollView.widthAnchor, constant: -56),
....
])
}
// MARK: - AutoLayoutHostingController
public final class AutoLayoutHostingController<OriginalContent: View>: UIHostingController<AnyView> {
// MARK: - Initializers
public init(rootView: OriginalContent, onChangeHeight: ((CGFloat) -> Void)? = nil) {
super.init(rootView: AnyView(rootView))
self.rootView = rootView
.background(
SizeObserver { [weak self] height in
onChangeHeight?(height)
self?.view.invalidateIntrinsicContentSize()
}
)
.eraseToAnyView()
}
@available(*, unavailable)
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}