【问题标题】:Scroll Views background colour when placed in a Navigation Stack in SwiftUI在 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 颜色。

【问题讨论】:

    标签: swiftui swiftui-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)
    猜你喜欢
    • 2019-12-24
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 2020-03-02
    • 2020-05-15
    • 2018-06-02
    相关资源
    最近更新 更多