我使用SwiftUI制作了一个自定义modal。它能正常工作,但动画效果不佳。
如果以慢动作播放,你会发现当触发ModalOverlay
的点击操作后,ModalContent
的背景立即消失。然而,ModalContent
中的Text
视图保持可见状态。
请问有人知道如何防止ModalContent
的背景过早消失吗?
以下是慢动作视频和代码:
import SwiftUI
struct ContentView: View {
@State private var isShowingModal = false
var body: some View {
GeometryReader { geometry in
ZStack {
Button(
action: { withAnimation { self.isShowingModal = true } },
label: { Text("Show Modal") }
)
ZStack {
if self.isShowingModal {
ModalOverlay(tapAction: { withAnimation { self.isShowingModal = false } })
ModalContent().transition(.move(edge: .bottom))
}
}.edgesIgnoringSafeArea(.all)
}
}
}
}
struct ModalOverlay: View {
var color = Color.black.opacity(0.4)
var tapAction: (() -> Void)? = nil
var body: some View {
color.onTapGesture { self.tapAction?() }
}
}
struct ModalContent: View {
var body: some View {
GeometryReader { geometry in
VStack {
Spacer()
VStack(spacing: 16) {
Text("Item 1")
Text("Item 2")
Text("Item 3")
}
.frame(width: geometry.size.width)
.padding(.top, 16)
.padding(.bottom, geometry.safeAreaInsets.bottom)
.background(Color.white)
}
}
}
}
ModalContent
的背景在某些情况下会在只指定.move(edge: .bottom)
的情况下进行��渡时具有不透明度。我将使用 Feedback Assistant 提交一份报告。 - JWKModalContent
上設置zIndex
:ModalContent().transition(.move(edge: .bottom)).zIndex(1)
。由於某些原因,當狀態改變時,ModalContent
會落在ModalOverlay
的後面。我仍然同意這是個問題,但這似乎可以解決問題。 - JWK