Раньше стабильным для iOS был только
ComposeUIViewController, и чтобы вставить кусок Compose в готовый экран, его приходилось оборачивать в контроллер. В CMP 1.11 появилась ComposeUIView(), которая сразу возвращает UIView, но она была экспериментальной. В 1.13.0-alpha02 с неё сняли @ExperimentalComposeUiApi.В Kotlin всё как с контроллером:
// iosMain/ComposeViews.kt
fun ProfileCardUIView(): UIView = ComposeUIView {
ProfileCard()
}
В SwiftUI оборачиваем в
UIViewRepresentable. Чтобы view подстраивалась под контент, на iOS 16+ передаём ей размер, который предлагает SwiftUI:struct ProfileCardView: UIViewRepresentable {
func makeUIView(context: Context) -> UIView {
ComposeViewsKt.ProfileCardUIView()
}
func updateUIView(_ uiView: UIView, context: Context) {}
@available(iOS 16.0, *)
func sizeThatFits(_ proposal: ProposedViewSize, uiView: UIView, context: Context) -> CGSize? {
uiView.sizeThatFits(CGSize(
width: proposal.width ?? UIView.noIntrinsicMetric,
height: proposal.height ?? UIView.noIntrinsicMetric
))
}
}Что важно знать:
👉 Настройки передаются через
configure с ComposeUIViewConfiguration. Стабильна только часть из них, например onFocusBehavior, а opaque, parallelRendering и preferredSizeReportingStrategy пока экспериментальные👉 Compose-сцена создаётся, когда view попадает в Window, и уничтожается, когда её оттуда убирают
👉
UIViewController в иерархии всё равно нужен, просто вручную привязывать к нему Compose больше не надо⚠️ Важно: это alpha, нужны Kotlin 2.4.20 и
compileSdk 37.1 для Android. В прод пока рано.🐱 Release notes CMP 1.13.0-alpha02
#Compose #CMP #iOS