SwiftUI 2个问题但很简单,关于searchBar和list的backgroundImage

Posted

技术标签:

【中文标题】SwiftUI 2个问题但很简单,关于searchBar和list的backgroundImage【英文标题】:SwiftUI 2 questions but very simple, about searchBar and the backgroundImage for List 【发布时间】:2019-11-30 17:19:23 【问题描述】:

SwiftUI 很简单的 2 个问题

1、如何让searchBar置顶,这样在使用向下滚动时仍然可以看到自己的searchBar

2,我正在使用 List 并使用 TabView,我希望 List 或 VStack 也许(或持有 List 的东西)有一个背景图像(我的 Assets.xcassets 中已经有一个 png )。我试过ZStack.background(Image("...")),但都没有奏效。

这是图片,我希望背景是蓝绿色的 png 图片。

这是 TabView 的其中一个视图的代码:

 struct Discover: View 
    @State private var keywords: String = ""
    var names = ["Yu Song", "ZhangYuan", "Kotoyama"]
    var body: some View 
        ZStack 
            List 
                HStack 
                    SearchBar(text: $keywords)
                    Image(systemName: "person")
                    Image(systemName: "bell")
                
                ForEach(self.names.filter 
                    self.keywords.isEmpty ? true : $0.localizedCaseInsensitiveContains(self.keywords)
                , id: \.self)  name in
                    Text(name)
                
            .background(Image("bg_global"))
        .edgesIgnoringSafeArea(.all)
    

这里是您说服的预览:

请注意,我已经在 List 和 VSrack 中添加了 .background(Image("bg_global")),但图像从未显示。

非常感谢。

【问题讨论】:

【参考方案1】:

要使背景可见,需要使List 及其内容透明。例如可以在init 中完成,

init() 
    UITableView.appearance().backgroundColor = .clear
    UITableViewCell.appearance().backgroundColor = .clear

【讨论】:

【参考方案2】:

使用VStack 而不是ZStack 使SearchBar 保持在顶部。并确保SearchBar 不是List 视图的一部分。

struct ContentView: View 
    init() 
        UITableView.appearance().backgroundColor = .clear
        UITableViewCell.appearance().backgroundColor = .clear
    

    @State private var keywords: String = ""
    var names = ["Yu Song", "ZhangYuan", "Kotoyama"]
    var body: some View 
        VStack
            // Your Search Bar View
            HStack
                Spacer()
                Text("Search")
                Spacer()
            .padding().background(Color.red)

            List 
                ForEach(self.names.filter 
                    self.keywords.isEmpty ? true : $0.localizedCaseInsensitiveContains(self.keywords)
                , id: \.self)  name in
                    Text(name)
                
            
        .offset(x: 0, y: 45).background(Color.yellow).edgesIgnoringSafeArea(.all)
    

由于您还想在安全区域中显示背景,因此您需要使用offset 下推视图。

【讨论】:

以上是关于SwiftUI 2个问题但很简单,关于searchBar和list的backgroundImage的主要内容,如果未能解决你的问题,请参考以下文章

如何将上下文菜单应用于 SwiftUI 表格行?

SwiftUI在多个HStacks中对齐不同长度的文本

试图写一个 IRC 客户端,但很难找到关于代码和连接协议的好资源

SwiftUI 无限 TabView 项

简单但很好的 EJB 模式

如何使用 SwiftUI 沿圆形路径绘制文本