У меня есть проект с представлениями вкладок. Я пытаюсь реализовать переход сцены или навигацию с одного экрана на другой. У меня есть несколько вкладок и некоторые другие представления, встроенные в ZStack. Я пытаюсь сделать навигацию, но NavigationLink не запускает навигацию, хотя она выглядит правильно подключенной к navigationDestination, который должен обрабатывать переход.
Вот code;
var body: some View {
NavigationStack {
ZStack {
// ViewPager alternative
TabView(selection: $selectedTab) {
ForEach(0..<3) { index in
switch index {
case 0:
CollectionTabView()
case 1:
ExploreTabView()
.background {
if !offsetObserver.isObserving {
FindCollectionView {
offsetObserver.collectionView = $0
offsetObserver.observe()
}
}
}
case 2:
FavoriteTabView()
default: ExploreTabView()
}
}
}
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
.frame(maxWidth: .infinity, maxHeight: .infinity)
.onChange(of: selectedTab) {
isSelected = true
}
VStack(spacing: 0) {
// Top header section
VStack(spacing: 0) {
Spacer().frame(height: 48)
HStack(spacing: 8) {
NavigationLink(value: "PROFILE") {
imageActionView(imageName: .aiProfile, tint: .icon)
}
Spacer()
NavigationLink(value: "PROFILE") {
imageActionView(imageName: .aiSearch, tint: .icon)
}
}
.padding(.horizontal, 24)
.padding(.vertical, 16)
}
.frame(height: 100)
.background(LinearGradient(colors: [Color.bgdDark, Color.clear], startPoint: .top, endPoint: .bottom))
Spacer()
}
// Bottom AppBar
VStack {
Spacer()
VStack {
ZStack {
Tabbar(.app)
.overlay {
GeometryReader {
let width = $0.size.width
let tabCount: CGFloat = 3
let capsuleWidth = width / 3
// Determine progress based on whether the tab is selected or not
let progress = isSelected
? offsetObserver.offset / (offsetObserver.collectionView?.bounds.width ?? 1)
: CGFloat(selectedTab) / CGFloat(tabCount - 2)
Circle()
.fill(.app)
.frame(width: capsuleWidth)
.offset(x: progress * capsuleWidth)
Tabbar(.white)
.mask(alignment: .leading) {
Circle()
.frame(width: capsuleWidth)
.offset(x: progress * capsuleWidth)
}
}
.allowsTightening(false)
}
.padding([.top, .bottom], 8)
.padding(.horizontal, 24)
}
.background(Color.bgdDark)
.clipShape(RoundedRectangle(cornerRadius: 18))
.padding(.horizontal, 74)
.shadow(color: Color("txtLightColor").opacity(0.3), radius: 3, x: 0, y: 3)
Spacer().frame(height: 24)
}
.frame(maxWidth: .infinity)
.background(LinearGradient(colors: [Color.bgdDark, Color.clear], startPoint: .bottom, endPoint: .top))
}
}
.background(Color.bgdDark)
.edgesIgnoringSafeArea(.all)
}
.navigationDestination(for: String.self) { value in
if value == "PROFILE" {
LoginView()
}
}
}
Емельян
Вопрос задан16 августа 2024 г.