SwiftUI Tabbar将导航Bartitle位置保持在tab';s的观点

SwiftUI Tabbar将导航Bartitle位置保持在tab';s的观点,swiftui,Swiftui,如何阻止一个选项卡的滚动视图偏移量受到其他选项卡偏移量的影响 我不想每次显示新选项卡时都将滚动视图强制到顶部,只希望新选项卡不受我查看的上一个选项卡的滚动位置的影响 import SwiftUI enum Tab { case First, Second, Third var title: String { switch self { case .First: return "First"

如何阻止一个选项卡的滚动视图偏移量受到其他选项卡偏移量的影响

我不想每次显示新选项卡时都将滚动视图强制到顶部,只希望新选项卡不受我查看的上一个选项卡的滚动位置的影响

import SwiftUI

enum Tab {
    case First, Second, Third
    
    var title: String {
        switch self {
        case .First:
            return "First"
        case .Second:
            return "Second"
        case .Third:
            return "Third"
        }
    }
}

struct ContentView: View {
    @State var selectedTab = Tab.First
    var body: some View {
        NavigationView {
            TabView(selection: $selectedTab) {
                FirstView()
                    .tabItem {
                        Text("First")
                    }.tag(Tab.First)
                SecondView()
                    .tabItem {
                        Text("Second")
                    }.tag(Tab.Second)
                ThirdView()
                    .tabItem {
                        Text("Third")
                    }.tag(Tab.Third)
            }.navigationBarTitle(selectedTab.title, displayMode: .automatic)
            .navigationBarHidden(false)
        }
    }
}

struct FirstView: View {
    let data = [1,2,3,4,5,6,7,8,9,10]
    var body: some View {
        ScrollView(showsIndicators: true) {
            VStack {
                ForEach(data, id: \.self) { item in
                    Text("\(item)")
                        .frame(minWidth: 0, idealWidth: 100, maxWidth: .infinity, minHeight: 0, idealHeight: 100, maxHeight: .infinity, alignment: .center)
                }
            }
        }
    }
}

struct SecondView: View {
    let data = [1,2,3,4,5,6,7,8,9,10]
    var body: some View {
        ScrollView(showsIndicators: true) {
            VStack {
                ForEach(data, id: \.self) { item in
                    Text("\(item)")
                        .frame(minWidth: 0, idealWidth: 100, maxWidth: .infinity, minHeight: 0, idealHeight: 100, maxHeight: .infinity, alignment: .center)
                }
            }
        }
    }
}

struct ThirdView: View {
    let data = [1,2,3,4,5,6,7,8,9,10]
    var body: some View {
        ScrollView(showsIndicators: true) {
            VStack {
                ForEach(data, id: \.self) { item in
                    Text("\(item)")
                        .frame(minWidth: 0, idealWidth: 100, maxWidth: .infinity, minHeight: 0, idealHeight: 100, maxHeight: .infinity, alignment: .center)
                }
            }
        }
    }
}

这是因为您使用了一个
导航视图
,所以它保留了自己的状态。使每个选项卡的导航视图独立

使用Xcode 12/iOS 14进行测试


那么,是否要恢复滚动距离的状态?我有点困惑,多描述一下会有用的。另外,“只希望新选项卡受最后一个选项卡的影响”对我来说也没有意义。对不起,输入错误“只希望新选项卡不受最后一个选项卡的影响”我仍然不清楚您是想从顶部开始每个新打开的选项卡,还是从最后打开的选项卡的滚动位置开始。这句话似乎有点矛盾。好吧,我想我明白了-导航栏根据上次查看的选项卡改变了形式?我之所以让NavigationView包装选项卡视图,是因为我想在从(比如)FirstView中推送细节视图时隐藏选项卡栏。上述解决方案不会隐藏选项卡栏。如何实现这两个目标,滚动视图内容问题和在导航链接到详细视图时隐藏选项卡栏,在最初的问题中没有给出任何想法。。。无论如何,下面我的回答可能会有所帮助
struct ContentView: View {
    @State var selectedTab = Tab.First
    var body: some View {
        TabView(selection: $selectedTab) {
            NavigationView {
                FirstView()
                    .navigationBarTitle(Tab.First.title)
            }
            .tabItem {
                Text("First")
            }.tag(Tab.First)
            NavigationView {
                SecondView()
                    .navigationBarTitle(Tab.Second.title)
            }
            .tabItem {
                Text("Second")
            }.tag(Tab.Second)
            NavigationView {
                ThirdView()
                    .navigationBarTitle(Tab.Third.title)
            }
            .tabItem {
                Text("Third")
            }.tag(Tab.Third)
        }
    }
}