iOS15中.fullScreenCover弹出视图如何修改状态栏文字颜色
iOS15 SwiftUI
fullScreenCover 弹出页状态栏文字颜色修改方案 前置配置
- 首先确保项目
Info.plist中View controller-based status bar appearance配置项的值为YES,这是允许单页面控制状态栏样式的必要前提。
方案1:适配无导航栏的全屏弹出页
iOS15 下全屏模态弹出的视图会单独走自己的控制器状态栏逻辑,默认的SwiftUI视图没有暴露状态栏样式配置,需要自定义UIHostingController子类重写样式属性:
- 先自定义控制器类:
class StatusBarHostingController<Content: View>: UIHostingController<Content> { var statusBarStyle: UIStatusBarStyle = .default override var preferredStatusBarStyle: UIStatusBarStyle { statusBarStyle } }
- 封装SwiftUI可用的包装器:
struct StatusBarStyleView<Content: View>: UIViewControllerRepresentable { var style: UIStatusBarStyle @ViewBuilder var content: () -> Content func makeUIViewController(context: Context) -> StatusBarHostingController<Content> { let hostController = StatusBarHostingController(rootView: content()) hostController.statusBarStyle = style return hostController } func updateUIViewController(_ uiViewController: StatusBarHostingController<Content>, context: Context) { uiViewController.statusBarStyle = style uiViewController.setNeedsStatusBarAppearanceUpdate() } }
- 使用方式:在
fullScreenCover的内容外层包裹该包装器即可,示例如下:
.fullScreenCover(isPresented: $isShowFullPage) { StatusBarStyleView(style: .lightContent) { // 此处放你的全屏页面内容 Text("深色背景全屏页") .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.black.ignoresSafeArea()) } .ignoresSafeArea() }
如果需要修改为黑色文字,将style参数改为.default即可。
方案2:适配带导航栏的全屏弹出页
如果你的弹出页本身需要集成导航栏,不需要自定义控制器,直接配置导航栏样式即可自动同步状态栏文字颜色:
.fullScreenCover(isPresented: $isShowFullPage) { NavigationView { // Xcode13 适配iOS15用NavigationView即可 Text("带导航栏的全屏页") .navigationTitle("页面标题") .navigationBarTitleDisplayMode(.inline) // 导航栏背景设为深色,状态栏文字自动变为白色 .toolbarBackground(Color.darkGray, for: .navigationBar) .toolbarColorScheme(.dark, for: .navigationBar) } }
注意事项
不要使用已废弃的UIApplication.shared.statusBarStyle全局修改状态栏样式,该属性从iOS13开始被标记为废弃,iOS15下对全屏模态弹出的页面完全不生效。
内容的提问来源于stack exchange,提问作者nelson PARRILLA
相关产品推荐
相关产品推荐

