tab bar update
This commit is contained in:
parent
0cd38f3922
commit
4f46f715aa
84
Shared/Views/Tab/CustomTabBar.swift
Normal file
84
Shared/Views/Tab/CustomTabBar.swift
Normal file
@ -0,0 +1,84 @@
|
||||
import SwiftUI
|
||||
|
||||
struct CustomTabBar: View {
|
||||
@Binding var selectedTab: Int
|
||||
var onCreate: () -> Void
|
||||
|
||||
var body: some View {
|
||||
HStack {
|
||||
// Tab 1: Feed
|
||||
TabBarButton(systemName: "list.bullet.rectangle", text: "Лента", isSelected: selectedTab == 0) {
|
||||
selectedTab = 0
|
||||
}
|
||||
|
||||
// Tab 2: Search
|
||||
TabBarButton(systemName: "magnifyingglass", text: "Поиск", isSelected: selectedTab == 1) {
|
||||
selectedTab = 1
|
||||
}
|
||||
|
||||
// Create Button
|
||||
CreateButton {
|
||||
onCreate()
|
||||
}
|
||||
|
||||
// Tab 3: Chats
|
||||
TabBarButton(systemName: "bubble.left.and.bubble.right.fill", text: "Чаты", isSelected: selectedTab == 2) {
|
||||
selectedTab = 2
|
||||
}
|
||||
|
||||
// Tab 4: Profile
|
||||
TabBarButton(systemName: "person.crop.square", text: "Лицо", isSelected: selectedTab == 3) {
|
||||
selectedTab = 3
|
||||
}
|
||||
}
|
||||
.padding(.horizontal)
|
||||
.padding(.top, 1)
|
||||
.padding(.bottom, 18) // Добавляем отступ снизу
|
||||
.background(Color(.systemGray6))
|
||||
}
|
||||
}
|
||||
|
||||
struct TabBarButton: View {
|
||||
let systemName: String
|
||||
let text: String
|
||||
let isSelected: Bool
|
||||
let action: () -> Void
|
||||
|
||||
var body: some View {
|
||||
Button(action: action) {
|
||||
VStack(spacing: 4) {
|
||||
Image(systemName: systemName)
|
||||
.font(.system(size: 22))
|
||||
Text(text)
|
||||
// .font(.caption)
|
||||
.font(.system(size: 12))
|
||||
}
|
||||
.foregroundColor(isSelected ? .accentColor : .gray)
|
||||
}
|
||||
.frame(maxWidth: .infinity)
|
||||
}
|
||||
}
|
||||
|
||||
struct CreateButton: View {
|
||||
let action: () -> Void
|
||||
|
||||
var body: some View {
|
||||
Button(action: action) {
|
||||
Image(systemName: "plus")
|
||||
.font(.system(size: 24, weight: .bold))
|
||||
.foregroundColor(.white)
|
||||
.padding(16)
|
||||
// .background(Color.accentColor)
|
||||
.background(
|
||||
LinearGradient(
|
||||
gradient: Gradient(colors: [.blue, .white]),
|
||||
startPoint: .top,
|
||||
endPoint: .bottom
|
||||
)
|
||||
)
|
||||
.clipShape(Circle())
|
||||
.shadow(radius: 4)
|
||||
}
|
||||
.offset(y: -3)
|
||||
}
|
||||
}
|
||||
@ -12,42 +12,35 @@ struct MainView: View {
|
||||
@State private var selectedTab: Int = 0
|
||||
|
||||
var body: some View {
|
||||
TabView(selection: $selectedTab) {
|
||||
HomeTab()
|
||||
.tabItem {
|
||||
Image(systemName: "list.bullet.rectangle")
|
||||
Text("Лента")
|
||||
VStack(spacing: 0) {
|
||||
ZStack {
|
||||
switch selectedTab {
|
||||
case 0:
|
||||
HomeTab()
|
||||
case 1:
|
||||
SearchTab()
|
||||
case 2:
|
||||
ChatsTab()
|
||||
case 3:
|
||||
ProfileTab(viewModel: viewModel)
|
||||
default:
|
||||
HomeTab()
|
||||
}
|
||||
.tag(0)
|
||||
|
||||
SearchTab()
|
||||
.tabItem {
|
||||
Image(systemName: "magnifyingglass")
|
||||
Text("Поиск")
|
||||
}
|
||||
.tag(1)
|
||||
|
||||
// PublicsTab()
|
||||
// .tabItem {
|
||||
// Image(systemName: "")
|
||||
// Text("Свайп")
|
||||
// }
|
||||
// .tag(1)
|
||||
|
||||
ChatsTab()
|
||||
.tabItem {
|
||||
Image(systemName: "bubble.left.and.bubble.right.fill")
|
||||
Text("Чаты")
|
||||
}
|
||||
.tag(2)
|
||||
|
||||
ProfileTab(viewModel: viewModel)
|
||||
.tabItem {
|
||||
Image(systemName: "person.crop.square")
|
||||
Text("Лицо")
|
||||
}
|
||||
.tag(3)
|
||||
}
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||
|
||||
CustomTabBar(selectedTab: $selectedTab) {
|
||||
// Действие для кнопки "Создать"
|
||||
print("Create button tapped")
|
||||
}
|
||||
}
|
||||
.ignoresSafeArea(edges: .bottom)
|
||||
}
|
||||
}
|
||||
|
||||
struct MainView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
let mockViewModel = LoginViewModel()
|
||||
MainView(viewModel: mockViewModel)
|
||||
}
|
||||
}
|
||||
|
||||
@ -10,6 +10,7 @@
|
||||
1A0276032DF909F900D8BC53 /* refreshtokenex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A0276022DF909F900D8BC53 /* refreshtokenex.swift */; };
|
||||
1A0276112DF9247000D8BC53 /* CustomTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A0276102DF9247000D8BC53 /* CustomTextField.swift */; };
|
||||
1A2302112E3050C60067BF4F /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A2302102E3050C60067BF4F /* SearchViewModel.swift */; };
|
||||
1A6FB9552E32D2B200E89EBE /* CustomTabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A6FB9542E32D2B200E89EBE /* CustomTabBar.swift */; };
|
||||
1A79408D2DF77BC3002569DA /* yobbleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A79407A2DF77BC2002569DA /* yobbleApp.swift */; };
|
||||
1A79408F2DF77BC3002569DA /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A79407B2DF77BC2002569DA /* ContentView.swift */; };
|
||||
1A7940902DF77BC3002569DA /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A79407B2DF77BC2002569DA /* ContentView.swift */; };
|
||||
@ -51,6 +52,7 @@
|
||||
1A0276022DF909F900D8BC53 /* refreshtokenex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = refreshtokenex.swift; sourceTree = "<group>"; };
|
||||
1A0276102DF9247000D8BC53 /* CustomTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTextField.swift; sourceTree = "<group>"; };
|
||||
1A2302102E3050C60067BF4F /* SearchViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = "<group>"; };
|
||||
1A6FB9542E32D2B200E89EBE /* CustomTabBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomTabBar.swift; sourceTree = "<group>"; };
|
||||
1A79407A2DF77BC2002569DA /* yobbleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = yobbleApp.swift; sourceTree = "<group>"; };
|
||||
1A79407B2DF77BC2002569DA /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
||||
1A79407C2DF77BC3002569DA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
@ -250,6 +252,7 @@
|
||||
1AEE5EA92E21A4FC00A3DCA3 /* Tab */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1A6FB9542E32D2B200E89EBE /* CustomTabBar.swift */,
|
||||
1A7940B52DF77F21002569DA /* MainView.swift */,
|
||||
1AEE5EAA2E21A83200A3DCA3 /* HomeTab.swift */,
|
||||
1AEE5EB22E21A85800A3DCA3 /* SearchTab.swift */,
|
||||
@ -392,6 +395,7 @@
|
||||
1A7940DE2DF7B0D7002569DA /* config.swift in Sources */,
|
||||
1A2302112E3050C60067BF4F /* SearchViewModel.swift in Sources */,
|
||||
1AE587252E23337000254F06 /* ProfileContentGrid.swift in Sources */,
|
||||
1A6FB9552E32D2B200E89EBE /* CustomTabBar.swift in Sources */,
|
||||
1A0276032DF909F900D8BC53 /* refreshtokenex.swift in Sources */,
|
||||
1A7940B62DF77F21002569DA /* MainView.swift in Sources */,
|
||||
1A7940E22DF7B1C5002569DA /* KeychainService.swift in Sources */,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user