我有3个视图是完全独立的。此外,我不希望ultraThinMaterial添加为视图堆叠在对方。
当视图2从底部边缘出现在视图1上时,它也应该从底部边缘删除。
当我尝试时,要么只有一个简单的不透明动画运行,要么后面的视图也通过底部边缘过渡。
基本上是针对ZStack的视图,比如iOS默认导航是如何工作的,或者苹果Map中的工作表是如何相互叠加的。
enum ViewToShow: Identifiable {
var id: ViewToShow {
return self
}
case view1
case view2
case view3
}
@Observable
class SheetStackModel {
var viewsItemManagedByThisSheet: [ViewToShow] = []
init() {
pushIntoStack(view: .view1)
}
func getLastView() -> ViewToShow? {
return viewsItemManagedByThisSheet.last
}
func pushIntoStack(view: ViewToShow) {
withAnimation(.default.speed(1.8)) {
viewsItemManagedByThisSheet.append(view)
}
}
func popOutOfStack() {
withAnimation(.default.speed(1.8)) {
_ = viewsItemManagedByThisSheet.removeLast()
}
}
}
struct View1: View {
@Environment(SheetStackModel.self) var sheetStackModel
var body: some View {
GeometryReader { localGeo in
VStack {
Text("View 1")
Button(action: {
sheetStackModel.pushIntoStack(view: .view2)
}, label: {
Text("Go to View 2")
})
}
}
}
}
struct View2: View {
@Environment(SheetStackModel.self) var sheetStackModel
var body: some View {
GeometryReader { localGeo in
VStack {
Text("View 2")
Button(action: {
sheetStackModel.popOutOfStack()
}, label: {
Text("Go back to View 1")
})
Button("Go to Detail 3") {
sheetStackModel.pushIntoStack(view: .view3)
}
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(.ultraThinMaterial)
}
}
struct DetailView3: View {
@Environment(SheetStackModel.self) var sheetStackModel
var body: some View {
VStack {
Text("Even more detail View")
Button("go back to view 2") {
sheetStackModel.popOutOfStack()
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(.ultraThinMaterial)
}
}
struct ContentView: View {
var body: some View {
ZStack {
if let lastView = sheetStackModel.getLastView() {
switch lastView {
case .view1:
View1()
case .view2:
View2()
case .view3:
DetailView3()
}
}
}
.transition(.asymmetric(insertion: .move(edge: .bottom), removal: .move(edge: .bottom)))
}
}
字符串
1条答案
按热度按时间des4xlb01#
我建议作以下修改:
ZStack
。GeometryReader
,这是不需要的动画。.frame(maxWidth: .infinity, maxHeight: .infinity)
应用于各个视图,以便它们填满屏幕。.ultraThinMaterial
在每一层上都被看到,那就把它应用到ZStack
上。就像这样:
字符串
希望这能让你更接近你想要达到的效果。