diff --git a/smartClass.xcodeproj/project.pbxproj b/smartClass.xcodeproj/project.pbxproj index 16ead9d..76e7854 100644 --- a/smartClass.xcodeproj/project.pbxproj +++ b/smartClass.xcodeproj/project.pbxproj @@ -7,6 +7,13 @@ objects = { /* Begin PBXBuildFile section */ + 08A2C2772A24E6AD00B8FA6D /* TabBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2C2762A24E6AD00B8FA6D /* TabBarView.swift */; }; + 08A2C2792A24E6D800B8FA6D /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2C2782A24E6D800B8FA6D /* Colors.swift */; }; + 08A2C27B2A24EA1800B8FA6D /* Icons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2C27A2A24EA1800B8FA6D /* Icons.swift */; }; + 08A2C27D2A24F03700B8FA6D /* TabBarModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2C27C2A24F03700B8FA6D /* TabBarModel.swift */; }; + 08A2C27F2A25065700B8FA6D /* CalendarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2C27E2A25065700B8FA6D /* CalendarView.swift */; }; + 08A2C2812A25066A00B8FA6D /* ClockView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2C2802A25066A00B8FA6D /* ClockView.swift */; }; + 08A2C2832A25067C00B8FA6D /* ProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2C2822A25067B00B8FA6D /* ProfileView.swift */; }; A8700DF32A1DDAD500D60253 /* smartClassApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8700DF22A1DDAD500D60253 /* smartClassApp.swift */; }; A8700DF52A1DDAD500D60253 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8700DF42A1DDAD500D60253 /* ContentView.swift */; }; A8700DF72A1DDAD600D60253 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A8700DF62A1DDAD600D60253 /* Assets.xcassets */; }; @@ -18,6 +25,13 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 08A2C2762A24E6AD00B8FA6D /* TabBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarView.swift; sourceTree = ""; }; + 08A2C2782A24E6D800B8FA6D /* Colors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = ""; }; + 08A2C27A2A24EA1800B8FA6D /* Icons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Icons.swift; sourceTree = ""; }; + 08A2C27C2A24F03700B8FA6D /* TabBarModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarModel.swift; sourceTree = ""; }; + 08A2C27E2A25065700B8FA6D /* CalendarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarView.swift; sourceTree = ""; }; + 08A2C2802A25066A00B8FA6D /* ClockView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClockView.swift; sourceTree = ""; }; + 08A2C2822A25067B00B8FA6D /* ProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileView.swift; sourceTree = ""; }; A8700DEF2A1DDAD500D60253 /* smartClass.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = smartClass.app; sourceTree = BUILT_PRODUCTS_DIR; }; A8700DF22A1DDAD500D60253 /* smartClassApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = smartClassApp.swift; sourceTree = ""; }; A8700DF42A1DDAD500D60253 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; @@ -41,6 +55,58 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 08A2C2842A250A5000B8FA6D /* Resource */ = { + isa = PBXGroup; + children = ( + 08A2C2782A24E6D800B8FA6D /* Colors.swift */, + 08A2C27A2A24EA1800B8FA6D /* Icons.swift */, + ); + path = Resource; + sourceTree = ""; + }; + 08A2C2852A250A5E00B8FA6D /* View */ = { + isa = PBXGroup; + children = ( + 08A2C2882A250A9400B8FA6D /* TabBar */, + A8700DF42A1DDAD500D60253 /* ContentView.swift */, + ); + path = View; + sourceTree = ""; + }; + 08A2C2862A250A6500B8FA6D /* Model */ = { + isa = PBXGroup; + children = ( + 08A2C2892A250AB800B8FA6D /* TabBar */, + ); + path = Model; + sourceTree = ""; + }; + 08A2C2872A250A6900B8FA6D /* ViewModel */ = { + isa = PBXGroup; + children = ( + ); + path = ViewModel; + sourceTree = ""; + }; + 08A2C2882A250A9400B8FA6D /* TabBar */ = { + isa = PBXGroup; + children = ( + 08A2C2762A24E6AD00B8FA6D /* TabBarView.swift */, + 08A2C27E2A25065700B8FA6D /* CalendarView.swift */, + 08A2C2802A25066A00B8FA6D /* ClockView.swift */, + 08A2C2822A25067B00B8FA6D /* ProfileView.swift */, + ); + path = TabBar; + sourceTree = ""; + }; + 08A2C2892A250AB800B8FA6D /* TabBar */ = { + isa = PBXGroup; + children = ( + 08A2C27C2A24F03700B8FA6D /* TabBarModel.swift */, + ); + path = TabBar; + sourceTree = ""; + }; A8700DE62A1DDAD500D60253 = { isa = PBXGroup; children = ( @@ -60,12 +126,15 @@ A8700DF12A1DDAD500D60253 /* smartClass */ = { isa = PBXGroup; children = ( + 08A2C2852A250A5E00B8FA6D /* View */, + 08A2C2872A250A6900B8FA6D /* ViewModel */, + 08A2C2862A250A6500B8FA6D /* Model */, + 08A2C2842A250A5000B8FA6D /* Resource */, A8700E092A1DDC9D00D60253 /* Extension */, A8700E062A1DDC4900D60253 /* Modifiers */, A8700E032A1DDBFC00D60253 /* Info.plist */, A8700E002A1DDB6B00D60253 /* Fonts */, A8700DF22A1DDAD500D60253 /* smartClassApp.swift */, - A8700DF42A1DDAD500D60253 /* ContentView.swift */, A8700DF62A1DDAD600D60253 /* Assets.xcassets */, A8700DF82A1DDAD600D60253 /* Preview Content */, ); @@ -176,8 +245,15 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 08A2C27F2A25065700B8FA6D /* CalendarView.swift in Sources */, + 08A2C2772A24E6AD00B8FA6D /* TabBarView.swift in Sources */, A8700DF52A1DDAD500D60253 /* ContentView.swift in Sources */, + 08A2C2812A25066A00B8FA6D /* ClockView.swift in Sources */, + 08A2C2832A25067C00B8FA6D /* ProfileView.swift in Sources */, + 08A2C27D2A24F03700B8FA6D /* TabBarModel.swift in Sources */, + 08A2C27B2A24EA1800B8FA6D /* Icons.swift in Sources */, A8700E082A1DDC6100D60253 /* CustomFont.swift in Sources */, + 08A2C2792A24E6D800B8FA6D /* Colors.swift in Sources */, A8700E052A1DDC2A00D60253 /* FontManager.swift in Sources */, A8700DF32A1DDAD500D60253 /* smartClassApp.swift in Sources */, A8700E0B2A1DDCAD00D60253 /* View.ext.swift in Sources */, diff --git a/smartClass.xcodeproj/project.xcworkspace/xcuserdata/idevnva.xcuserdatad/UserInterfaceState.xcuserstate b/smartClass.xcodeproj/project.xcworkspace/xcuserdata/idevnva.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..31b8720 Binary files /dev/null and b/smartClass.xcodeproj/project.xcworkspace/xcuserdata/idevnva.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/smartClass/Assets.xcassets/iconCalendar.imageset/Contents.json b/smartClass/Assets.xcassets/iconCalendar.imageset/Contents.json new file mode 100644 index 0000000..733376f --- /dev/null +++ b/smartClass/Assets.xcassets/iconCalendar.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "iconCalendar.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/smartClass/Assets.xcassets/iconCalendar.imageset/iconCalendar.png b/smartClass/Assets.xcassets/iconCalendar.imageset/iconCalendar.png new file mode 100644 index 0000000..eecc2b8 Binary files /dev/null and b/smartClass/Assets.xcassets/iconCalendar.imageset/iconCalendar.png differ diff --git a/smartClass/Assets.xcassets/iconClock.imageset/Contents.json b/smartClass/Assets.xcassets/iconClock.imageset/Contents.json new file mode 100644 index 0000000..f3077c9 --- /dev/null +++ b/smartClass/Assets.xcassets/iconClock.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "iconClock.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/smartClass/Assets.xcassets/iconClock.imageset/iconClock.png b/smartClass/Assets.xcassets/iconClock.imageset/iconClock.png new file mode 100644 index 0000000..5e1e38b Binary files /dev/null and b/smartClass/Assets.xcassets/iconClock.imageset/iconClock.png differ diff --git a/smartClass/Assets.xcassets/iconProfile.imageset/Contents.json b/smartClass/Assets.xcassets/iconProfile.imageset/Contents.json new file mode 100644 index 0000000..d62eb6f --- /dev/null +++ b/smartClass/Assets.xcassets/iconProfile.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "iconProfile.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/smartClass/Assets.xcassets/iconProfile.imageset/iconProfile.png b/smartClass/Assets.xcassets/iconProfile.imageset/iconProfile.png new file mode 100644 index 0000000..34b1762 Binary files /dev/null and b/smartClass/Assets.xcassets/iconProfile.imageset/iconProfile.png differ diff --git a/smartClass/Assets.xcassets/iconTabCalendar.imageset/Contents.json b/smartClass/Assets.xcassets/iconTabCalendar.imageset/Contents.json new file mode 100644 index 0000000..aa64746 --- /dev/null +++ b/smartClass/Assets.xcassets/iconTabCalendar.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "iconTapCalendar.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/smartClass/Assets.xcassets/iconTabCalendar.imageset/iconTapCalendar.png b/smartClass/Assets.xcassets/iconTabCalendar.imageset/iconTapCalendar.png new file mode 100644 index 0000000..c5ec5cd Binary files /dev/null and b/smartClass/Assets.xcassets/iconTabCalendar.imageset/iconTapCalendar.png differ diff --git a/smartClass/Assets.xcassets/iconTabClock.imageset/Contents.json b/smartClass/Assets.xcassets/iconTabClock.imageset/Contents.json new file mode 100644 index 0000000..3ad9a8a --- /dev/null +++ b/smartClass/Assets.xcassets/iconTabClock.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "iconTapClock.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/smartClass/Assets.xcassets/iconTabClock.imageset/iconTapClock.png b/smartClass/Assets.xcassets/iconTabClock.imageset/iconTapClock.png new file mode 100644 index 0000000..6cf150a Binary files /dev/null and b/smartClass/Assets.xcassets/iconTabClock.imageset/iconTapClock.png differ diff --git a/smartClass/Assets.xcassets/iconTabProfile.imageset/Contents.json b/smartClass/Assets.xcassets/iconTabProfile.imageset/Contents.json new file mode 100644 index 0000000..dba5b67 --- /dev/null +++ b/smartClass/Assets.xcassets/iconTabProfile.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "iconTapProfile.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/smartClass/Assets.xcassets/iconTabProfile.imageset/iconTapProfile.png b/smartClass/Assets.xcassets/iconTabProfile.imageset/iconTapProfile.png new file mode 100644 index 0000000..c9355a3 Binary files /dev/null and b/smartClass/Assets.xcassets/iconTabProfile.imageset/iconTapProfile.png differ diff --git a/smartClass/Model/TabBar/TabBarModel.swift b/smartClass/Model/TabBar/TabBarModel.swift new file mode 100644 index 0000000..f580c0a --- /dev/null +++ b/smartClass/Model/TabBar/TabBarModel.swift @@ -0,0 +1,21 @@ +// +// TapBarModel.swift +// smartClass +// +// Created by Vladislav Novoshinskiy on 29.05.2023. +// + +import Foundation + +struct TabBarModel: Hashable { + let text: String + let icon: String + let tapIcon: String + + static let exampleTapBar: [TabBarModel] = + [ + TabBarModel(text: "Календарь", icon: Icons.iconCalendar, tapIcon: Icons.iconTabCalendar), + TabBarModel(text: "Уведомления", icon: Icons.iconClock, tapIcon: Icons.iconTabClock), + TabBarModel(text: "Профиль", icon: Icons.iconProfile, tapIcon: Icons.iconTabProfile) + ] +} diff --git a/smartClass/Resource/Colors.swift b/smartClass/Resource/Colors.swift new file mode 100644 index 0000000..4784794 --- /dev/null +++ b/smartClass/Resource/Colors.swift @@ -0,0 +1,14 @@ +// +// Colors.swift +// smartClass +// +// Created by Vladislav Novoshinskiy on 29.05.2023. +// + +import SwiftUI + +struct Colors { + static let iconColorBG = Color(red: 153/255, green: 153/255, blue: 153/255, opacity: 1) + static let tabIconColor = Color(red: 38/255, green: 110/255, blue: 241/255, opacity: 1) + static let buttonTabBG = Color(red: 244/255, green: 244/255, blue: 244/255, opacity: 1) +} diff --git a/smartClass/Resource/Icons.swift b/smartClass/Resource/Icons.swift new file mode 100644 index 0000000..1c6e286 --- /dev/null +++ b/smartClass/Resource/Icons.swift @@ -0,0 +1,17 @@ +// +// Icons.swift +// smartClass +// +// Created by Vladislav Novoshinskiy on 29.05.2023. +// + +import Foundation + +struct Icons { + static let iconCalendar: String = "iconCalendar" + static let iconTabCalendar: String = "iconTabCalendar" + static let iconClock: String = "iconClock" + static let iconTabClock: String = "iconTabClock" + static let iconProfile: String = "iconProfile" + static let iconTabProfile: String = "iconTabProfile" +} diff --git a/smartClass/ContentView.swift b/smartClass/View/ContentView.swift similarity index 84% rename from smartClass/ContentView.swift rename to smartClass/View/ContentView.swift index 9c02f9a..ce69487 100644 --- a/smartClass/ContentView.swift +++ b/smartClass/View/ContentView.swift @@ -15,8 +15,6 @@ struct ContentView: View { .foregroundColor(.accentColor) Text("Hello, world!") .customFont(font: FontManager.Nunito.black, size: 20) - Text("Hello, world!") - .customFont(font: FontManager.Nunito.black, size: 20) } .padding() } diff --git a/smartClass/View/TabBar/CalendarView.swift b/smartClass/View/TabBar/CalendarView.swift new file mode 100644 index 0000000..094fa9a --- /dev/null +++ b/smartClass/View/TabBar/CalendarView.swift @@ -0,0 +1,20 @@ +// +// CalendarView.swift +// smartClass +// +// Created by Vladislav Novoshinskiy on 29.05.2023. +// + +import SwiftUI + +struct CalendarView: View { + var body: some View { + Text("Hello, Calendar!") + } +} + +struct CalendarView_Previews: PreviewProvider { + static var previews: some View { + CalendarView() + } +} diff --git a/smartClass/View/TabBar/ClockView.swift b/smartClass/View/TabBar/ClockView.swift new file mode 100644 index 0000000..4096404 --- /dev/null +++ b/smartClass/View/TabBar/ClockView.swift @@ -0,0 +1,20 @@ +// +// ClockView.swift +// smartClass +// +// Created by Vladislav Novoshinskiy on 29.05.2023. +// + +import SwiftUI + +struct ClockView: View { + var body: some View { + Text("Hello, Clock!") + } +} + +struct ClockView_Previews: PreviewProvider { + static var previews: some View { + ClockView() + } +} diff --git a/smartClass/View/TabBar/ProfileView.swift b/smartClass/View/TabBar/ProfileView.swift new file mode 100644 index 0000000..16853bc --- /dev/null +++ b/smartClass/View/TabBar/ProfileView.swift @@ -0,0 +1,20 @@ +// +// ProfileView.swift +// smartClass +// +// Created by Vladislav Novoshinskiy on 29.05.2023. +// + +import SwiftUI + +struct ProfileView: View { + var body: some View { + Text("Hello, Profile!") + } +} + +struct ProfileView_Previews: PreviewProvider { + static var previews: some View { + ProfileView() + } +} diff --git a/smartClass/View/TabBar/TabBarView.swift b/smartClass/View/TabBar/TabBarView.swift new file mode 100644 index 0000000..bb345fe --- /dev/null +++ b/smartClass/View/TabBar/TabBarView.swift @@ -0,0 +1,76 @@ +// +// TapBarView.swift +// smartClass +// +// Created by Vladislav Novoshinskiy on 29.05.2023. +// + +import SwiftUI + +struct TabBarView: View { + @State var selectedTab: TabBarModel = TabBarModel(text: "Календарь", icon: Icons.iconCalendar, tapIcon: Icons.iconTabCalendar) + @State var selected: String = "Календарь" + + init() { + UITabBar.appearance().isHidden = true + } + + var body: some View { + ZStack(alignment: .bottom) { + TabView(selection: $selected) { + CalendarView() + .tag("Календарь") + ClockView() + .tag("Уведомления") + ProfileView() + .tag("Профиль") + } + + HStack { + Spacer() + ForEach(TabBarModel.exampleTapBar, id: \.self) { tap in + TapBarItemView(tab: tap.self, selected: $selected) + Spacer() + } + } + .padding() + .frame(maxWidth: .infinity) + .background(.white) + } + } +} + +struct TapBarItemView: View { + @State var tab: TabBarModel + @Binding var selected: String + + var body: some View { + VStack { + Button { + withAnimation(.spring()) { + selected = tab.text + } + } label: { + HStack { + Image(selected == tab.text ? tab.tapIcon : tab.icon) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 21, height: 21) + if selected == tab.text { + Text(tab.text) + .foregroundColor(Colors.tabIconColor) + } + } + } + } + .padding() + .background(selected == tab.text ? Colors.buttonTabBG : .white) + .clipShape(Capsule()) + } +} + +struct TapBarView_Previews: PreviewProvider { + static var previews: some View { + TabBarView() + } +} diff --git a/smartClass/smartClassApp.swift b/smartClass/smartClassApp.swift index 86e1f79..8cd144b 100644 --- a/smartClass/smartClassApp.swift +++ b/smartClass/smartClassApp.swift @@ -11,7 +11,7 @@ import SwiftUI struct smartClassApp: App { var body: some Scene { WindowGroup { - ContentView() + TabBarView() } } }