Skip to content

Instantly share code, notes, and snippets.

@oianmol
Created May 19, 2023 10:01
Show Gist options
  • Save oianmol/52f25be2a0e8f0d9bd2ca16b5d308625 to your computer and use it in GitHub Desktop.
Save oianmol/52f25be2a0e8f0d9bd2ca16b5d308625 to your computer and use it in GitHub Desktop.
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()
)
@AldemirGomesDev
Copy link

Fiz esse implementação e só funcionou em Android

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment