如何使用 SwiftUI 更改 iOS 16 上的底部工具栏背景?

ale*_*our 5 background toolbar swiftui

从 iOS 16 开始,我们可以轻松地自定义导航栏的背景:

.toolbarBackground(barBackgroundGradient, for: .navigationBar)
.toolbarBackground(.visible, for: .navigationBar)
Run Code Online (Sandbox Code Playgroud)

运作良好。

但是,我无法使其适用于底部工具栏:

.toolbarBackground(barBackgroundGradient, for: .bottomBar)
.toolbarBackground(.visible, for: .bottomBar)
Run Code Online (Sandbox Code Playgroud)

它正在编译,但应用程序上没有任何变化。

查看开发人员文档,它应该可以工作......

我也尝试过:

.toolbarBackground(barBackgroundGradient, for: .navigationBar, .bottomBar)
Run Code Online (Sandbox Code Playgroud)

它不会改变任何东西。

任何想法 ?

nil*_*lue 0

在寻找类似问题的答案后,我的解决方案是创建一个UIToolbar 扩展,如下所示:

extension UIToolbar {
    static func changeAppearance(clear: Bool) {
        let appearance = UIToolbarAppearance()
        
        if clear {
            appearance.configureWithOpaqueBackground()
        } else {
            appearance.configureWithDefaultBackground()
        }

        // customize appearance for your needs here
        appearance.shadowColor = .clear
        appearance.backgroundColor = .clear
        appearance.backgroundImage = UIImage(named: "imageName")
        
        UIToolbar.appearance().standardAppearance = appearance
        UIToolbar.appearance().compactAppearance = appearance
        UIToolbar.appearance().scrollEdgeAppearance = appearance
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,我认为,在您的情况下,可以先使用 CAGradientLayer 创建 barBackgroundGradient ,然后将转换UIImage并在外观.backgroundImage中使用它。

毕竟,在视图的初始化程序中调用changeAppearance :

init() {
    UIToolbar.changeAppearance(clear: true)
}
Run Code Online (Sandbox Code Playgroud)

可能这不是最优雅的方式,特别是关于渐变部分,所以也许在苹果修复这个问题之前你会找到其他解决方案,因为它似乎是一个错误。