【问题标题】:Make SwiftUI navigation bar transparent让 SwiftUI 导航栏透明
【发布时间】:2019-08-22 20:09:48
【问题描述】:

我正在寻找一种使 NavigationBar 透明的方法。我的 NavigationView 位于 ContentView 的根视图中,其中包含一个 TabView。

import SwiftUI

struct ContentView: View {
var body: some View {
    TabView {
       HomeView().tabItem {
            Image(systemName: "house.fill")
            Text("Home")
        }.tag(1)
        NavigationView {
        SearchView()
            }

        .tabItem {
            Image(systemName: "magnifyingglass")
            Text("Search")
        }.tag(2)
}

即使在根视图中添加以下修饰符后,导航视图栏也会显示。

init() { 
UINavigationBar.appearance().backgroundColor = .clear
UINavigationBar.appearance().isHidden = false

}

下面是我试图隐藏导航栏背景的子视图。

import SwiftUI

struct FacilityView: View {


var perks = "Badge_NoPerks"
var image = "Image_Course6"
var courseName = "Course"

var body: some View {
    VStack {
        HStack {
            Image(image)
                .resizable()
                .aspectRatio(contentMode: .fill)
                .frame(width: UIScreen.main.bounds.width, height: 260)
        }
        VStack(alignment: .leading) {
            HStack {
                Image(perks)
            }
            HStack {
                Text(courseName)
                Spacer()
            }
        }
        .padding(.horizontal)
        Spacer()
    }.padding(.horizontal)
       .edgesIgnoringSafeArea(.top)
      .navigationBarTitle("Facility Details")


}

}

【问题讨论】:

  • 您是否要使 整个 栏透明、前景和所有内容? (我问是因为您尝试了 isHidden 修饰符。)
  • 只是背景。我需要保留某人点击“返回”的能力
  • 噢。这个问题可能有帮助,但我不确定:stackoverflow.com/questions/57508983/…

标签: uinavigationbar swiftui


【解决方案1】:

尝试将这些添加到您的 init() 修饰符中:

UINavigationBar.appearance().barTintColor = .clear
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)

它在 Xcode 11.2.1、iOS 13.2 中对我有用

【讨论】:

  • 好像不用设置barTintColor。只需设置 backgroundImage 即可。
  • 太糟糕了,这是全球性的。我只想在主屏幕上执行此操作
  • 我还会将 shadowImage 添加到此逻辑中,否则您将在透明导航栏后看到一行。 UINavigationBar.appearance().barTintColor = .clear UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default) UINavigationBar.appearance().shadowImage = UIImage()
【解决方案2】:

您可以使用 UINavigationBar 的此扩展在透明和默认外观之间切换。

extension UINavigationBar {
    static func changeAppearance(clear: Bool) {
        let appearance = UINavigationBarAppearance()
        
        if clear {
            appearance.configureWithTransparentBackground()
        } else {
            appearance.configureWithDefaultBackground()
        }
        
        UINavigationBar.appearance().standardAppearance = appearance
        UINavigationBar.appearance().compactAppearance = appearance
        UINavigationBar.appearance().scrollEdgeAppearance = appearance
    }
}

在你看来结构:

struct ContentView: View {
    init() {
        UINavigationBar.changeAppearance(clear: true)
    }
    var body: some View {
        NavigationView {
            ...
        }
    }
}

【讨论】:

  • 如果这对我有用,它将解决我所有的问题。但似乎它对导航栏没有任何影响。我做错了什么?
  • @LateNate 我已经修改了答案以将其作为扩展名。在你的结构中试试这个,看看它是否有效。对我来说很好。
  • 啊,我明白了。非常感谢。这太棒了!
  • 谨慎使用这种方法。 SwiftUI 有时会为不可见的屏幕初始化结构,例如当 NavigationLink 指向时。
  • 除了在滚动过程中改变 init 之外,我们可以在其他部分使用它吗?
【解决方案3】:

对于没有阴影的透明背景:

init() {
    UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
    UINavigationBar.appearance().shadowImage = UIImage()
}

如果第一个解决方案不起作用,那么:

init() {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithTransparentBackground()
    appearance.backgroundColor = .clear
    appearance.shadowColor = .clear
    UINavigationBar.appearance().standardAppearance = appearance
 }

【讨论】:

    【解决方案4】:
    var body: some View {
        NavigationView {
            ZStack {
                Color.red
                Text("View1")
                    .navigationBarHidden(false)
                    .navigationBarTitle("Title")
            }
            .edgesIgnoringSafeArea(.top)
        }
    }
    

    更新:1.9.2022

    NavigationView {
        ZStack {
            Color.red
            Text("View1")
    
        }
        .navigationBarTitleDisplayMode(.inline)
        .toolbar{
            ToolbarItem(placement: .principal) {
                Text("Title")
                    .opacity(0.5)
            }
        }
        .edgesIgnoringSafeArea(.top)
    }
    

    【讨论】:

    • 此解决方案只有在您没有任何垂直可滚动视图时才有效。
    • 只需用简单文本列表替换您的文本
    • 这只是内容倒序的视图(Color.red),不是透明的 NavigationView。
    • @jason-tremain 我添加了另一个解决方案。
    猜你喜欢
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2018-10-13
    • 2020-07-23
    相关资源
    最近更新 更多