在 SwiftUI 中放置在导航堆栈中时滚动视图的背景颜色

Posted

技术标签:

【中文标题】在 SwiftUI 中放置在导航堆栈中时滚动视图的背景颜色【英文标题】:Scroll Views background colour when placed in a Navigation Stack in SwiftUI 【发布时间】:2020-07-05 16:59:37 【问题描述】:

我在NavigationView 中有两个滚动视图。我希望两个 ScrollView 都继承 onAppear 修饰符中提到的颜色。

但是,当我导航到第二个 ScrollView 并返回到第一个 ScrollView 时,第一个视图会继承第二个 ScrollView 颜色。

struct ScrollView1: View 
    var body: some View 
        NavigationView 
            ScrollView 
                NavigationLink(destination: ScrollView2()) 
                    Text("First View").padding()
                .frame(maxWidth: .infinity)
            .navigationBarTitle("First")
            .onAppear 
                UIScrollView.appearance().backgroundColor = UIColor.green
            
        
    


struct ScrollView2: View 
    var body: some View 
        ScrollView 
            Text("Second View").frame(maxWidth: .infinity)
        
        .onAppear 
            UIScrollView.appearance().backgroundColor = UIColor.gray
        
    

有谁知道我的第一个 ScrollView 将如何始终继承绿色和第二个灰色?

通过包裹在 ZStack 中添加 ScrollView 颜色不会在滚动时将 NavigationBar 从大折叠到内联。

是否有任何其他解决方案可以同时实现这两者,即保留 navigationBar 反弹行为以及 ScrollView 颜色。

【问题讨论】:

【参考方案1】:

首先您可以从UITableViewUIScrollView 中删除backgroundColor(您可以在SceneDelegate 中执行此操作,因此只会执行一次):

UITableView.appearance().backgroundColor = UIColor.clear
UIScrollView.appearance().backgroundColor = UIColor.clear

然后使用ZStack添加背景颜色:

struct ScrollView1: View 
    var body: some View 
        NavigationView 
            ZStack 
                Color.green
                ScrollView 
                    NavigationLink(destination: ScrollView2()) 
                        Text("First View").padding()
                    .frame(maxWidth: .infinity)
                .navigationBarTitle("asdasd")
            
        
    

struct ScrollView2: View 
    var body: some View 
        ZStack 
            Color.gray
            ScrollView 
                Text("Second View").frame(maxWidth: .infinity)
            
        
    

【讨论】:

在 ZStack 中包装滚动视图并添加颜色,破坏了 navigationBarTitle 反弹行为。这就是我尝试在 onAppear 修饰符中添加滚动视图颜色的原因。如果两者都可以同时实现,请帮助我。 :) 您可以为您的NavigationView 执行相同的操作。只需使用UITableView 删除背景颜色即可。我用这个修复更新了我的代码。 这仍然不会在滚动时将导航栏从大折叠到内联。颜色变化按预期工作。 pawello 是正确的,如果您想处理导航栏,请使用 NavigationBarTitle("title", displayMode: automatic) @BeeEm97 您的问题目前似乎没有解决方案:How change background color if using NavigationView in SwiftUI?, Screen Background Color With ScrollView And Navigation Bar SwiftUI。

以上是关于在 SwiftUI 中放置在导航堆栈中时滚动视图的背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中将绑定传递给导航堆栈中每个视图的最佳方法是啥

SwiftUI - ScrollView 的宽度为 0,我的内容不可见

SwiftUI - 在导航堆栈中弹回不会取消分配视图

SwiftUI:NavigationLink 奇怪的行为

包含在嵌入导航控制器的视图控制器中时,UIScrollView 不滚动

如何使用滚动视图单击列表部分内的项目以导航到详细信息页面 SwiftUI