Compare commits

...

3 Commits

Author SHA1 Message Date
cheykrym
927ac45ec8 burger menu pos 2025-08-14 02:27:34 +03:00
cheykrym
f172e33123 burger menu fix pos 2025-08-14 02:21:34 +03:00
cheykrym
05a0d85c09 burger menu swipe 2025-08-14 02:19:09 +03:00

View File

@ -10,8 +10,9 @@ struct MainView: View {
@State private var accounts = ["@user1", "@user2", "@user3"] @State private var accounts = ["@user1", "@user2", "@user3"]
@State private var sheetType: ProfileTab.SheetType? = nil @State private var sheetType: ProfileTab.SheetType? = nil
// Состояние для бокового меню // Состояния для бокового меню
@State private var isSideMenuPresented = false @State private var isSideMenuPresented = false
@State private var menuOffset: CGFloat = 0
private var tabTitle: String { private var tabTitle: String {
switch selectedTab { switch selectedTab {
@ -22,10 +23,14 @@ struct MainView: View {
default: return "Home" default: return "Home"
} }
} }
private var menuWidth: CGFloat {
UIScreen.main.bounds.width * 0.8
}
var body: some View { var body: some View {
NavigationView { NavigationView {
ZStack { ZStack(alignment: .leading) { // Выравниваем ZStack по левому краю
// Основной контент // Основной контент
VStack(spacing: 0) { VStack(spacing: 0) {
TopBarView( TopBarView(
@ -56,35 +61,70 @@ struct MainView: View {
print("Create button tapped") print("Create button tapped")
} }
} }
.frame(maxWidth: .infinity, maxHeight: .infinity) // Убедимся, что основной контент занимает все пространство
.ignoresSafeArea(edges: .bottom) .ignoresSafeArea(edges: .bottom)
.navigationBarHidden(true) .navigationBarHidden(true)
.sheet(item: $sheetType) { type in .sheet(item: $sheetType) { type in
// ... sheet presentation logic // ... sheet presentation logic
} }
// Затемнение фона при открытом меню
.background(isSideMenuPresented ? Color.black.opacity(0.4) : Color.clear) // Затемнение и закрытие по тапу
.onTapGesture { if isSideMenuPresented {
if isSideMenuPresented { Color.black.opacity(0.4 * Double(((menuWidth + menuOffset) / menuWidth)))
withAnimation { .ignoresSafeArea()
isSideMenuPresented = false .onTapGesture {
withAnimation(.easeInOut) {
isSideMenuPresented = false
}
} }
}
} }
// Боковое меню // Боковое меню
if isSideMenuPresented { SideMenuView(isPresented: $isSideMenuPresented)
HStack { .frame(width: menuWidth)
SideMenuView(isPresented: $isSideMenuPresented) .offset(x: -menuWidth + menuOffset) // Новая логика смещения
.frame(width: UIScreen.main.bounds.width * 0.8) .ignoresSafeArea(edges: .vertical)
Spacer()
}
.ignoresSafeArea(edges: .vertical) // Игнорируем safe area
.transition(.move(edge: .leading))
.zIndex(1) // Убедимся, что меню поверх всего
}
} }
.gesture(
DragGesture()
.onChanged { gesture in
if !isSideMenuPresented && gesture.startLocation.x > 60 { return }
let translation = gesture.translation.width
// Определяем базовое смещение в зависимости от того, открыто меню или нет
let baseOffset = isSideMenuPresented ? menuWidth : 0
// Новое смещение это база плюс текущий свайп
let newOffset = baseOffset + translation
// Жестко ограничиваем итоговое смещение между 0 и шириной меню
self.menuOffset = max(0, min(menuWidth, newOffset))
}
.onEnded { gesture in
if !isSideMenuPresented && gesture.startLocation.x > 60 { return }
let threshold = menuWidth * 0.4
withAnimation(.easeInOut) {
if self.menuOffset > threshold {
isSideMenuPresented = true
} else {
isSideMenuPresented = false
}
// Устанавливаем финальное смещение после анимации
self.menuOffset = isSideMenuPresented ? menuWidth : 0
}
}
)
} }
.navigationViewStyle(StackNavigationViewStyle()) .navigationViewStyle(StackNavigationViewStyle())
.onChange(of: isSideMenuPresented) { presented in
// Плавная анимация при нажатии на кнопку, а не только при жесте
withAnimation(.easeInOut) {
menuOffset = presented ? menuWidth : 0
}
}
} }
} }