对 .toolbarBackground SwiftUI 使用渐变

问题描述 投票:0回答:2

我正在尝试为导航 .toolbarBackground 设置自定义渐变,但任何时候我都只使用 LinearGradient 中的第一种颜色运行它。

.toolbar {
    ToolbarItem(placement: .navigationBarTrailing) {
        Menu {
            // MARK: 2 Actions
            // 1. logout
            // 2. Delete Account
            Button("Logout",action: logOutUser)
            
            Button("Delete Account",role: .destructive,action: deleteAccount)
        } label: {
            Image(systemName: "slider.horizontal.3")
                .rotationEffect(.init(degrees: 90))
                .tint(.white)
                .scaleEffect(0.8)
        }
    }
}
.navigationBarTitleDisplayMode(.inline)
.navigationTitle("My Garden")
.toolbarColorScheme(.dark, for: .navigationBar)
.toolbarBackground(.visible, for: .navigationBar)
.toolbarBackground(LinearGradient(gradient: Gradient(colors: [Color("Green1"), Color("Green2")]),startPoint: .bottomLeading,endPoint: .topTrailing))
ios swift swiftui
2个回答
4
投票

我最近遇到了同样的问题,根据 Sarunw 的博客文章,从 iOS 16 开始这是不可能的:

在当前的测试版中,我们无法使用其他

ShapeStyle
,例如
LinearGradient

我已经提交了一份错误报告,一旦我知道它是错误的,我就会更新该帖子 预期的行为或错误。

https://sarunw.com/posts/swiftui-navigation-bar-color/#basic-usage

替代解决方案

如果你不想等待 iOS 17 也许解决这个问题,你可以回退到 UIKit 并使用

UINavigationBarAppearance
并使用渐变图像。我想你甚至可以在代码中创建渐变图像,但我只是最终将渐变图像放入资产目录中(默认,不切片)并将其作为
backgroundImage
.

提供给导航栏。

有很多教程都展示了这种方式,例如 thisthisthis 视频。最后他们都得到了某种形式的代码:

struct MainNavigationBar: ViewModifier {
    init() {
        let appearance = UINavigationBarAppearance()
        
        // Custom gradient background
        appearance.backgroundImage = UIImage(named: "NavigationBarBackground")
        
        // Apply custom styling to all bar states
        UINavigationBar.appearance().standardAppearance = appearance
        UINavigationBar.appearance().scrollEdgeAppearance = appearance
        UINavigationBar.appearance().compactAppearance = appearance
        
        // Custom button color tinting
        // (buggy and not working for me for some reason)
        UINavigationBar.appearance().tintColor = .white
    }
    
    func body(content: Content) -> some View {
        content
    }
}

现在您可以在

NavigationStack
上使用此修饰符将此样式附加到视图和所有子视图。

NavigationStack {
     // Your Content
}
.modifier(MainNavigationBar())

0
投票

如上所述,我无法使用 SwiftUI 来实现此功能

.toolbarBackground

我的解决方案是添加一个覆盖层......


struct MyView: View {
  var body: some View {
    GeometryReader { geo in
      ScrollView {
        VStack {
          Text("Hello")
          Text("World")
        }
      }
      .toolbar(content: toolbarContent)
      .toolbarBackground(.hidden, for: .navigationBar)
      .overlay(alignment: .top) {
        toolbarBackground(height: geo.safeAreaInsets.top)
      }
    }
  }

  @ViewBuilder
  private func toolbarBackground(height: CGFloat) -> some View {
    Rectangle()
      .fill(
        LinearGradient(
          gradient: Gradient(colors: [.black, .clear]),
          startPoint: .top,
          endPoint: .bottom
        )
      )
      .frame(height: height)
      .edgesIgnoringSafeArea(.top)
  }

  @ToolbarContentBuilder
  private func toolbarContent() -> some ToolbarContent {
    // toolbar stuff
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.