Compare commits
No commits in common. "927ac45ec85b0ef35e50428e0a28c4dca22071dd" and "478020f6f2a21d88fb6699545bfa036ff9415b05" have entirely different histories.
927ac45ec8
...
478020f6f2
@ -10,9 +10,8 @@ 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 {
|
||||||
@ -23,14 +22,10 @@ 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(alignment: .leading) { // Выравниваем ZStack по левому краю
|
ZStack {
|
||||||
// Основной контент
|
// Основной контент
|
||||||
VStack(spacing: 0) {
|
VStack(spacing: 0) {
|
||||||
TopBarView(
|
TopBarView(
|
||||||
@ -61,70 +56,35 @@ 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)
|
||||||
if isSideMenuPresented {
|
.onTapGesture {
|
||||||
Color.black.opacity(0.4 * Double(((menuWidth + menuOffset) / menuWidth)))
|
if isSideMenuPresented {
|
||||||
.ignoresSafeArea()
|
withAnimation {
|
||||||
.onTapGesture {
|
isSideMenuPresented = false
|
||||||
withAnimation(.easeInOut) {
|
|
||||||
isSideMenuPresented = false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Боковое меню
|
// Боковое меню
|
||||||
SideMenuView(isPresented: $isSideMenuPresented)
|
if isSideMenuPresented {
|
||||||
.frame(width: menuWidth)
|
HStack {
|
||||||
.offset(x: -menuWidth + menuOffset) // Новая логика смещения
|
SideMenuView(isPresented: $isSideMenuPresented)
|
||||||
.ignoresSafeArea(edges: .vertical)
|
.frame(width: UIScreen.main.bounds.width * 0.8)
|
||||||
|
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user