big update
This commit is contained in:
@ -3,10 +3,12 @@ import SwiftUI
|
||||
struct ContentView: View {
|
||||
@EnvironmentObject var appState: AppState
|
||||
@State private var showMenu = false
|
||||
@State private var isLoading = true // состояние загрузки
|
||||
|
||||
var body: some View {
|
||||
NavigationStack {
|
||||
ZStack {
|
||||
// Основной контент
|
||||
VStack(spacing: 10) {
|
||||
HStack(spacing: 10) {
|
||||
RouteView()
|
||||
@ -22,8 +24,10 @@ struct ContentView: View {
|
||||
}
|
||||
}
|
||||
.padding()
|
||||
.blur(radius: isLoading ? 5 : 0) // слегка размываем, пока загрузка
|
||||
.disabled(isLoading) // блокируем взаимодействие с контентом при загрузке
|
||||
|
||||
// Плавающая кнопка в правом нижнем углу
|
||||
// Плавающая кнопка
|
||||
VStack {
|
||||
Spacer()
|
||||
HStack {
|
||||
@ -33,35 +37,60 @@ struct ContentView: View {
|
||||
showMenu.toggle()
|
||||
}
|
||||
}) {
|
||||
Image(systemName: "line.3.horizontal")
|
||||
.font(.system(size: 24, weight: .bold))
|
||||
.foregroundColor(.white)
|
||||
.padding()
|
||||
.background(Color.blue)
|
||||
Image("open_menu_icon")
|
||||
.resizable()
|
||||
.aspectRatio(contentMode: .fit)
|
||||
.frame(width: 24, height: 24)
|
||||
.padding(10)
|
||||
.background(Color(hex: 0x806C59))
|
||||
.clipShape(Circle())
|
||||
.shadow(radius: 5)
|
||||
}
|
||||
.padding(.trailing, 20)
|
||||
// .padding(.bottom, -20) // Убираем отрицательный паддинг
|
||||
.padding(.bottom, -20) // Добавляем паддинг, чтобы кнопка не перекрывалась
|
||||
|
||||
.padding(.bottom, -20)
|
||||
}
|
||||
}
|
||||
|
||||
// Используем кастомное BottomMenu
|
||||
// BottomMenu
|
||||
if showMenu {
|
||||
// Используем Binding для двусторонней связи
|
||||
BottomMenu(isPresented: $showMenu)
|
||||
.transition(.move(edge: .bottom))
|
||||
// Добавляем игнорирование safe area сверху, если BottomMenu
|
||||
// должно полностью закрывать контент, но обычно для
|
||||
// BottomSheet это не требуется, GeometryReader в BottomMenu
|
||||
// уже делает нужное растяжение.
|
||||
.animation(.spring(response: 0.35, dampingFraction: 0.9), value: showMenu)
|
||||
}
|
||||
|
||||
// Экран загрузки
|
||||
if isLoading {
|
||||
ZStack {
|
||||
Color(hex: 0x806C59)
|
||||
.edgesIgnoringSafeArea(.all)
|
||||
ProgressView()
|
||||
.progressViewStyle(CircularProgressViewStyle(tint: .white))
|
||||
.scaleEffect(1.5)
|
||||
VStack {
|
||||
Spacer()
|
||||
HStack {
|
||||
Spacer()
|
||||
Image("waiting_screen_logo")
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.frame(width: 200)
|
||||
.padding(20)
|
||||
}
|
||||
}
|
||||
}
|
||||
.transition(.opacity)
|
||||
.zIndex(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
.task {
|
||||
await fetchRoutes()
|
||||
// Убираем экран загрузки через 2 секунды
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
|
||||
withAnimation(.easeOut(duration: 0.5)) {
|
||||
isLoading = false
|
||||
}
|
||||
}
|
||||
}
|
||||
.preferredColorScheme(.light)
|
||||
}
|
||||
|
Reference in New Issue
Block a user