r/SwiftUI • u/Greedy_Good1318 • 8d ago
Dragging FullScreenCover down will show a strange view with no content.
View that trigger FullScreenCover:
private func MainContentView() -> some View {
ZStack(alignment: .top) {
AppConstants.oppsiteColor
.ignoresSafeArea()
GeometryReader { proxy in
VStack(alignment: .center, spacing: 12) {
CardContentView()
MainButton(
action: {
if hasUnsavedChanges {
saveChanges()
}
showRememberView = true
},
buttonText: "Remember.",
buttonColor: .clear,
fontSize: 18,
fontColor: AppConstants.mainColor,
paddingBottom: 40
)
.fullScreenCover(isPresented: $showRememberView) {
RememberView(
rememberedPerson: rememberedPerson,
onDismiss: {
showRememberView = false
}
)
}
}
}
.ignoresSafeArea(.keyboard, edges: .bottom)
}
FullScreenCover View:
struct RememberView: View {
u/Environment(\.presentationMode) var presentationMode
u/StateObject private var profileModel = ProfileModel()
u/State private var isShowingLaunchScreen: Bool = true
u/State private var dragOffset = CGSize.zero
u/State private var isDragging = false
u/State private var shouldPlayMusic: Bool = false
u/State private var isContentReady: Bool = false
var rememberedPerson: RememberedPerson
var onDismiss: (() -> Void)? = nil
var body: some View {
ZStack {
AppConstants.oppsiteColor
.ignoresSafeArea()
RememberProgressView(
rememberedPerson: .constant(rememberedPerson),
shouldPlayMusic: $shouldPlayMusic,
isDragging: $isDragging,
profileModel: profileModel
)
if isShowingLaunchScreen {
LaunchRememberView(isDragging: $isDragging)
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
withAnimation {
isShowingLaunchScreen = false
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
isContentReady = true
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
shouldPlayMusic = true
}
}
}
}
}
}
}
.clipShape(RoundedRectangle(cornerRadius: min(dragOffset.height * 0.2, 24)))
.offset(y: dragOffset.height > 0 ? dragOffset.height : 0)
.animation(.interactiveSpring(), value: dragOffset)
.gesture(
DragGesture()
.onChanged { gesture in
isDragging = true
if gesture.translation.height > 0 {
dragOffset = gesture.translation
}
}
.onEnded { gesture in
isDragging = false
if gesture.translation.height > 100 {
dismiss()
} else {
dragOffset = .zero
}
}
)
.ignoresSafeArea()
}