Compare commits
	
		
			3 Commits
		
	
	
		
			478020f6f2
			...
			927ac45ec8
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					927ac45ec8 | ||
| 
						 | 
					f172e33123 | ||
| 
						 | 
					05a0d85c09 | 
@ -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
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user