@@ -97,8 +97,8 @@ internal class ComposeContainer(
9797 transparentForTouches = false ,
9898 useOpaqueConfiguration = configuration.opaque,
9999 ).apply {
100- onSizeThatFits = ::onSizeThatFits
101- onIntrinsicContentSize = ::onIntrinsicContentSize
100+ onSizeThatFits = { composeSceneSizeSynchronizer?.onSizeThatFitsRequest(it) }
101+ onIntrinsicContentSize = { composeSceneSizeSynchronizer?.preferredCGSize }
102102 }
103103
104104 private var mediator: ComposeSceneMediator ? = null
@@ -126,15 +126,23 @@ internal class ComposeContainer(
126126 getTopLeftOffsetInWindow = { IntOffset .Zero }, // full screen
127127 endEdgePanGestureBehavior = configuration.endEdgePanGestureBehavior
128128 )
129- private val composeSceneSizeSynchronizer = ComposeSceneSizeSynchronizer (
130- view = view,
131- composeSceneSize = { constraints ->
132- mediator?.constrainedSceneSize(constraints) ? : IntSize .Zero
133- },
134- invalidateComposeSceneContainerSize = {
135- view.superview?.invalidateIntrinsicContentSize()
129+
130+ private val composeSceneSizeSynchronizer: ComposeSceneSizeSynchronizer ? =
131+ if (configuration.useSelfSizing) {
132+ ComposeSceneSizeSynchronizer (
133+ view = view,
134+ composeSceneSize = { constraints ->
135+ mediator?.constrainedSceneSize(constraints) ? : IntSize .Zero
136+ },
137+ invalidateComposeSceneContainerSize = {
138+ // SwiftUI observes the hosting view’s intrinsic size, not the internal Compose
139+ // container view.
140+ view.superview?.invalidateIntrinsicContentSize()
141+ }
142+ )
143+ } else {
144+ null
136145 }
137- )
138146
139147 val hasInteropViews: Boolean get() = mediator?.hasInteropViews ? : false
140148
@@ -199,14 +207,6 @@ internal class ComposeContainer(
199207 lifecycleDelegate.windowScene = window.windowScene
200208 }
201209
202- private fun onSizeThatFits (size : CValue <CGSize >): CValue <CGSize >? {
203- return composeSceneSizeSynchronizer.onSizeThatFitsRequest(size)
204- }
205-
206- private fun onIntrinsicContentSize (): CValue <CGSize >? {
207- return composeSceneSizeSynchronizer.preferredCGSize
208- }
209-
210210 fun updateInterfaceOrientationState () {
211211 currentInterfaceOrientation?.let {
212212 interfaceOrientationState.value = it
@@ -287,9 +287,9 @@ internal class ComposeContainer(
287287 }
288288
289289 onLayoutCompletedListenerHandle?.close()
290- onLayoutCompletedListenerHandle = mediator?.registerOnLayoutCompletedListener(
291- composeSceneSizeSynchronizer ::onComposeLayoutCompleted
292- )
290+ onLayoutCompletedListenerHandle = composeSceneSizeSynchronizer?. let {
291+ mediator?.registerOnLayoutCompletedListener(it ::onComposeLayoutCompleted)
292+ }
293293
294294 activeStateListener = SceneActiveStateListener (
295295 getScene = ::windowScene
0 commit comments