markturnip
08/28/2025, 8:34 AMComposeUIViewController in the UINavigationController
However it seems @Kashismails has put together a working demo using Voyager.
I wonder if anyone else is using a setup like this and in production?
https://www.droidcon.com/2024/09/06/using-native-ios-navigation-from-compose-multiplatform/Jonathan
08/28/2025, 12:44 PMmarkturnip
08/28/2025, 1:05 PMJonathan
08/28/2025, 1:05 PMmarkturnip
08/28/2025, 1:05 PMmarkturnip
08/28/2025, 1:06 PMJonathan
08/28/2025, 1:07 PMmarkturnip
08/28/2025, 1:12 PMComposeUIViewControllerJonathan
08/28/2025, 1:22 PMNavHost? The animations look and feel native to my eyes (I’m an Android users so I don’t notice all nuances).markturnip
08/28/2025, 1:33 PMJonathan
08/28/2025, 1:34 PMmarkturnip
08/28/2025, 1:44 PMJonathan
08/28/2025, 1:55 PMChristopher Mederos
10/03/2025, 1:45 AMval tabEnter = scaleIn(
initialScale = .99f, animationSpec = bezierTween(delayMillis = 30)
) + slideInVertically(
initialOffsetY = { 5 }, animationSpec = bezierTween(delayMillis = 30)
) + fadeIn(
bezierTween(delayMillis = 30, durationMillis = 30)
)
val tabExit = scaleOut(
targetScale = .99f, animationSpec = bezierTween(durationMillis = 30)
) + slideOutVertically(
targetOffsetY = { 5 }, animationSpec = bezierTween(durationMillis = 30)
) + fadeOut(bezierTween(durationMillis = 30, delayMillis = 30))
fun <T> bezierTween(
durationMillis: Int = 400,
delayMillis: Int = 0,
) : TweenSpec<T> = tween(
durationMillis = durationMillis,
easing = CubicBezierEasing( 0.2833f, 0.99f, 0.31833f, 0.99f),
delayMillis = delayMillis
)Kevin van Mierlo
12/05/2025, 8:03 AMCsaba Szugyiczki
12/05/2025, 8:10 AMKevin van Mierlo
12/05/2025, 8:15 AMChristopher Mederos
12/05/2025, 8:19 AMmarkturnip
12/07/2025, 2:45 AMmarkturnip
12/07/2025, 2:47 AMmarkturnip
12/07/2025, 2:49 AMComposeUIViewController and using a Coordinator pattern in my iOS integration:
class AppCoordinator: Navigator {
private let navigationController: UINavigationController
private func navigateToHome() {
let vc = ComposeViewControllerKt.MainViewController(navigator: self)
navigationController.pushViewController(vc, animated: true)
}
func navigateToProfile() {
let vc = ComposeViewControllerKt.ProfileViewController(navigator: self)
navigationController.pushViewController(vc, animated: true)
}Kevin van Mierlo
12/08/2025, 7:36 AMmarkturnip
06/02/2026, 4:00 AMexpect/actual where by the iOS sourceset implements using native `UITabBarController`/`UINavigationController`
Personally feels so much better using native navigation (I know that not everyone agrees).
There’s also a doc which explains it, though needs some work…
https://github.com/markst/weatherdrive-app/blob/main/composeApp/src/iosMain/kotlin/com/weatherdrive/navigation/AppCoordinator.ktmarkturnip
07/02/2026, 12:54 PM