Skip to content

Instantly share code, notes, and snippets.

@oianmol
Created May 19, 2023 10:01
  • Star 8 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Embed
What would you like to do?
Jetpack Compose Side Effect to update Android or iOS status-bar and navigation-bar color
@Composable
actual fun PlatformColors(statusBarColor: Color, navBarColor: Color){
val sysUiController = rememberSystemUiController()
SideEffect {
sysUiController.setSystemBarsColor(color = topColor)
sysUiController.setNavigationBarColor(color = bottomColor)
}
}
@Composable
expect fun PlatformColors(statusBarColor: Color, navBarColor: Color)
@Composable
private fun statusBarView() = remember {
val keyWindow: UIWindow? =
UIApplication.sharedApplication.windows.firstOrNull { (it as? UIWindow)?.isKeyWindow() == true } as? UIWindow
val tag = 3848245L // https://stackoverflow.com/questions/56651245/how-to-change-the-status-bar-background-color-and-text-color-on-ios-13
keyWindow?.viewWithTag(tag)?.let {
it
} ?: run {
val height =
keyWindow?.windowScene?.statusBarManager?.statusBarFrame ?: zeroValue<CGRect>()
val statusBarView = UIView(frame = height)
statusBarView.tag = tag
statusBarView.layer.zPosition = 999999.0
keyWindow?.addSubview(statusBarView)
statusBarView
}
}
@Composable
actual fun PlatformColors(
statusBarColor: Color,
navBarColor: Color
) {
val statusBar = statusBarView()
SideEffect {
statusBar?.backgroundColor = topColor.toUIColor()
UINavigationBar.appearance().backgroundColor = bottomColor.toUIColor()
}
}
private fun Color.toUIColor(): UIColor = UIColor(
red = this.red.toDouble(),
green = this.green.toDouble(),
blue = this.blue.toDouble(),
alpha = this.alpha.toDouble()
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment