├── .gitignore
├── Multi Platform Navigation
├── Multi Platform Navigation.entitlements
├── Multi Platform Navigation.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ └── xcshareddata
│ │ └── xcschemes
│ │ ├── Multi Platform Navigation (iOS).xcscheme
│ │ └── Multi Platform Navigation (macOS).xcscheme
├── Shared
│ ├── Assets.xcassets
│ │ ├── AccentColor.colorset
│ │ │ └── Contents.json
│ │ ├── AppIcon.appiconset
│ │ │ └── Contents.json
│ │ └── Contents.json
│ ├── ItemView.swift
│ ├── Items
│ │ └── ItemListRow.swift
│ ├── Multi_Platform_NavigationApp.swift
│ ├── Navigation
│ │ ├── ContentView.swift
│ │ ├── Sidebar.swift
│ │ └── TabBar.swift
│ └── Views
│ │ └── PageView.swift
├── iOS
│ ├── Info.plist
│ └── ListView.swift
└── macOS
│ ├── Info.plist
│ ├── ListView.swift
│ └── macOS.entitlements
├── README.md
├── Tab View (Custom)
├── Tab View (Custom).xcodeproj
│ ├── project.pbxproj
│ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── Tab View (Custom)
│ ├── Assets.xcassets
│ ├── AccentColor.colorset
│ │ └── Contents.json
│ ├── AppIcon.appiconset
│ │ └── Contents.json
│ └── Contents.json
│ ├── ContentView.swift
│ ├── Info.plist
│ ├── Preview Content
│ └── Preview Assets.xcassets
│ │ └── Contents.json
│ ├── Tab_View__Custom_App.swift
│ └── View
│ ├── TabOneView.swift
│ ├── TabThreeView.swift
│ └── TabTwoView.swift
├── Tab View
├── Tab View.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Tab View.xcscheme
└── Tab View
│ ├── Assets.xcassets
│ ├── AccentColor.colorset
│ │ └── Contents.json
│ ├── AppIcon.appiconset
│ │ └── Contents.json
│ └── Contents.json
│ ├── ContentView.swift
│ ├── Info.plist
│ ├── Preview Content
│ └── Preview Assets.xcassets
│ │ └── Contents.json
│ ├── Tab_ViewApp.swift
│ └── View
│ ├── TabFourView.swift
│ ├── TabOneView.swift
│ ├── TabThreeView.swift
│ └── TabTwoView.swift
└── Welcome Screen
├── Welcome Screen.xcodeproj
├── project.pbxproj
└── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ └── IDEWorkspaceChecks.plist
└── Welcome Screen
├── Assets.xcassets
├── AccentColor.colorset
│ └── Contents.json
├── AppIcon.appiconset
│ └── Contents.json
└── Contents.json
├── ContentView.swift
├── Preview Content
└── Preview Assets.xcassets
│ └── Contents.json
├── WelcomeView.swift
└── Welcome_ScreenApp.swift
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | ## User settings
6 | xcuserdata/
7 |
8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
9 | *.xcscmblueprint
10 | *.xccheckout
11 |
12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
13 | build/
14 | DerivedData/
15 | *.moved-aside
16 | *.pbxuser
17 | !default.pbxuser
18 | *.mode1v3
19 | !default.mode1v3
20 | *.mode2v3
21 | !default.mode2v3
22 | *.perspectivev3
23 | !default.perspectivev3
24 |
25 | ## Obj-C/Swift specific
26 | *.hmap
27 |
28 | ## App packaging
29 | *.ipa
30 | *.dSYM.zip
31 | *.dSYM
32 |
33 | ## Playgrounds
34 | timeline.xctimeline
35 | playground.xcworkspace
36 |
37 | # Swift Package Manager
38 | #
39 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
40 | # Packages/
41 | # Package.pins
42 | # Package.resolved
43 | # *.xcodeproj
44 | #
45 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
46 | # hence it is not needed unless you have added a package configuration file to your project
47 | # .swiftpm
48 |
49 | .build/
50 |
51 | # CocoaPods
52 | #
53 | # We recommend against adding the Pods directory to your .gitignore. However
54 | # you should judge for yourself, the pros and cons are mentioned at:
55 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
56 | #
57 | # Pods/
58 | #
59 | # Add this line if you want to avoid checking in source code from the Xcode workspace
60 | # *.xcworkspace
61 |
62 | # Carthage
63 | #
64 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
65 | # Carthage/Checkouts
66 |
67 | Carthage/Build/
68 |
69 | # Accio dependency management
70 | Dependencies/
71 | .accio/
72 |
73 | # fastlane
74 | #
75 | # It is recommended to not store the screenshots in the git repo.
76 | # Instead, use fastlane to re-generate the screenshots whenever they are needed.
77 | # For more information about the recommended setup visit:
78 | # https://docs.fastlane.tools/best-practices/source-control/#source-control
79 |
80 | fastlane/report.xml
81 | fastlane/Preview.html
82 | fastlane/screenshots/**/*.png
83 | fastlane/test_output
84 |
85 | # Code Injection
86 | #
87 | # After new code Injection tools there's a generated folder /iOSInjectionProject
88 | # https://github.com/johnno1962/injectionforxcode
89 |
90 | iOSInjectionProject/
91 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/Multi Platform Navigation.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.network.client
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/Multi Platform Navigation.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 50;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 27E4801D26C2C8A80079D987 /* PageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E4801C26C2C8A80079D987 /* PageView.swift */; };
11 | 27E4801E26C2C8A80079D987 /* PageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E4801C26C2C8A80079D987 /* PageView.swift */; };
12 | 27E4802426C2DEAA0079D987 /* ListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E4802226C2DEAA0079D987 /* ListView.swift */; };
13 | 27E5DF1426C256F600F9DBC6 /* Multi_Platform_NavigationApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E5DF0126C256F300F9DBC6 /* Multi_Platform_NavigationApp.swift */; };
14 | 27E5DF1526C256F600F9DBC6 /* Multi_Platform_NavigationApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E5DF0126C256F300F9DBC6 /* Multi_Platform_NavigationApp.swift */; };
15 | 27E5DF1626C256F600F9DBC6 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E5DF0226C256F300F9DBC6 /* ContentView.swift */; };
16 | 27E5DF1726C256F600F9DBC6 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E5DF0226C256F300F9DBC6 /* ContentView.swift */; };
17 | 27E5DF1826C256F600F9DBC6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 27E5DF0326C256F600F9DBC6 /* Assets.xcassets */; };
18 | 27E5DF1926C256F600F9DBC6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 27E5DF0326C256F600F9DBC6 /* Assets.xcassets */; };
19 | 27E5DF2326C257BB00F9DBC6 /* ListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E5DF2226C257BB00F9DBC6 /* ListView.swift */; };
20 | 27E5DF2626C2584000F9DBC6 /* Sidebar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E5DF2526C2584000F9DBC6 /* Sidebar.swift */; };
21 | 27E5DF2726C2584000F9DBC6 /* Sidebar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E5DF2526C2584000F9DBC6 /* Sidebar.swift */; };
22 | 27E5DF2926C26B7E00F9DBC6 /* ItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E5DF2826C26B7E00F9DBC6 /* ItemView.swift */; };
23 | 27E5DF2A26C26B7E00F9DBC6 /* ItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E5DF2826C26B7E00F9DBC6 /* ItemView.swift */; };
24 | 27E5DF2E26C2734E00F9DBC6 /* ItemListRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E5DF2D26C2734E00F9DBC6 /* ItemListRow.swift */; };
25 | 27E5DF2F26C2734E00F9DBC6 /* ItemListRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E5DF2D26C2734E00F9DBC6 /* ItemListRow.swift */; };
26 | 27E5DF3426C2855D00F9DBC6 /* TabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E5DF3326C2855D00F9DBC6 /* TabBar.swift */; };
27 | 27E5DF3526C2855D00F9DBC6 /* TabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E5DF3326C2855D00F9DBC6 /* TabBar.swift */; };
28 | /* End PBXBuildFile section */
29 |
30 | /* Begin PBXFileReference section */
31 | 27E4801C26C2C8A80079D987 /* PageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PageView.swift; sourceTree = ""; };
32 | 27E4802226C2DEAA0079D987 /* ListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListView.swift; sourceTree = ""; };
33 | 27E4802526C3BF550079D987 /* Multi Platform Navigation.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Multi Platform Navigation.entitlements"; sourceTree = ""; };
34 | 27E5DF0126C256F300F9DBC6 /* Multi_Platform_NavigationApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Multi_Platform_NavigationApp.swift; sourceTree = ""; };
35 | 27E5DF0226C256F300F9DBC6 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
36 | 27E5DF0326C256F600F9DBC6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
37 | 27E5DF0826C256F600F9DBC6 /* Multi Platform Navigation.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Multi Platform Navigation.app"; sourceTree = BUILT_PRODUCTS_DIR; };
38 | 27E5DF0B26C256F600F9DBC6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
39 | 27E5DF1026C256F600F9DBC6 /* Multi Platform Navigation.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Multi Platform Navigation.app"; sourceTree = BUILT_PRODUCTS_DIR; };
40 | 27E5DF1226C256F600F9DBC6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
41 | 27E5DF1326C256F600F9DBC6 /* macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = macOS.entitlements; sourceTree = ""; };
42 | 27E5DF2226C257BB00F9DBC6 /* ListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListView.swift; sourceTree = ""; };
43 | 27E5DF2526C2584000F9DBC6 /* Sidebar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sidebar.swift; sourceTree = ""; };
44 | 27E5DF2826C26B7E00F9DBC6 /* ItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemView.swift; sourceTree = ""; };
45 | 27E5DF2D26C2734E00F9DBC6 /* ItemListRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemListRow.swift; sourceTree = ""; };
46 | 27E5DF3326C2855D00F9DBC6 /* TabBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBar.swift; sourceTree = ""; };
47 | /* End PBXFileReference section */
48 |
49 | /* Begin PBXFrameworksBuildPhase section */
50 | 27E5DF0526C256F600F9DBC6 /* Frameworks */ = {
51 | isa = PBXFrameworksBuildPhase;
52 | buildActionMask = 2147483647;
53 | files = (
54 | );
55 | runOnlyForDeploymentPostprocessing = 0;
56 | };
57 | 27E5DF0D26C256F600F9DBC6 /* Frameworks */ = {
58 | isa = PBXFrameworksBuildPhase;
59 | buildActionMask = 2147483647;
60 | files = (
61 | );
62 | runOnlyForDeploymentPostprocessing = 0;
63 | };
64 | /* End PBXFrameworksBuildPhase section */
65 |
66 | /* Begin PBXGroup section */
67 | 27E4801B26C2C8700079D987 /* Views */ = {
68 | isa = PBXGroup;
69 | children = (
70 | 27E4801C26C2C8A80079D987 /* PageView.swift */,
71 | );
72 | path = Views;
73 | sourceTree = "";
74 | };
75 | 27E5DEFB26C256F300F9DBC6 = {
76 | isa = PBXGroup;
77 | children = (
78 | 27E4802526C3BF550079D987 /* Multi Platform Navigation.entitlements */,
79 | 27E5DF0026C256F300F9DBC6 /* Shared */,
80 | 27E5DF0A26C256F600F9DBC6 /* iOS */,
81 | 27E5DF1126C256F600F9DBC6 /* macOS */,
82 | 27E5DF0926C256F600F9DBC6 /* Products */,
83 | );
84 | sourceTree = "";
85 | };
86 | 27E5DF0026C256F300F9DBC6 /* Shared */ = {
87 | isa = PBXGroup;
88 | children = (
89 | 27E5DF0326C256F600F9DBC6 /* Assets.xcassets */,
90 | 27E5DF0126C256F300F9DBC6 /* Multi_Platform_NavigationApp.swift */,
91 | 27E5DF2B26C272DC00F9DBC6 /* Navigation */,
92 | 27E4801B26C2C8700079D987 /* Views */,
93 | 27E5DF2C26C2730E00F9DBC6 /* Items */,
94 | 27E5DF2826C26B7E00F9DBC6 /* ItemView.swift */,
95 | );
96 | path = Shared;
97 | sourceTree = "";
98 | };
99 | 27E5DF0926C256F600F9DBC6 /* Products */ = {
100 | isa = PBXGroup;
101 | children = (
102 | 27E5DF0826C256F600F9DBC6 /* Multi Platform Navigation.app */,
103 | 27E5DF1026C256F600F9DBC6 /* Multi Platform Navigation.app */,
104 | );
105 | name = Products;
106 | sourceTree = "";
107 | };
108 | 27E5DF0A26C256F600F9DBC6 /* iOS */ = {
109 | isa = PBXGroup;
110 | children = (
111 | 27E5DF2226C257BB00F9DBC6 /* ListView.swift */,
112 | 27E5DF0B26C256F600F9DBC6 /* Info.plist */,
113 | );
114 | path = iOS;
115 | sourceTree = "";
116 | };
117 | 27E5DF1126C256F600F9DBC6 /* macOS */ = {
118 | isa = PBXGroup;
119 | children = (
120 | 27E4802226C2DEAA0079D987 /* ListView.swift */,
121 | 27E5DF1226C256F600F9DBC6 /* Info.plist */,
122 | 27E5DF1326C256F600F9DBC6 /* macOS.entitlements */,
123 | );
124 | path = macOS;
125 | sourceTree = "";
126 | };
127 | 27E5DF2B26C272DC00F9DBC6 /* Navigation */ = {
128 | isa = PBXGroup;
129 | children = (
130 | 27E5DF0226C256F300F9DBC6 /* ContentView.swift */,
131 | 27E5DF2526C2584000F9DBC6 /* Sidebar.swift */,
132 | 27E5DF3326C2855D00F9DBC6 /* TabBar.swift */,
133 | );
134 | path = Navigation;
135 | sourceTree = "";
136 | };
137 | 27E5DF2C26C2730E00F9DBC6 /* Items */ = {
138 | isa = PBXGroup;
139 | children = (
140 | 27E5DF2D26C2734E00F9DBC6 /* ItemListRow.swift */,
141 | );
142 | path = Items;
143 | sourceTree = "";
144 | };
145 | /* End PBXGroup section */
146 |
147 | /* Begin PBXNativeTarget section */
148 | 27E5DF0726C256F600F9DBC6 /* Multi Platform Navigation (iOS) */ = {
149 | isa = PBXNativeTarget;
150 | buildConfigurationList = 27E5DF1C26C256F600F9DBC6 /* Build configuration list for PBXNativeTarget "Multi Platform Navigation (iOS)" */;
151 | buildPhases = (
152 | 27E5DF0426C256F600F9DBC6 /* Sources */,
153 | 27E5DF0526C256F600F9DBC6 /* Frameworks */,
154 | 27E5DF0626C256F600F9DBC6 /* Resources */,
155 | );
156 | buildRules = (
157 | );
158 | dependencies = (
159 | );
160 | name = "Multi Platform Navigation (iOS)";
161 | productName = "Multi Platform Navigation (iOS)";
162 | productReference = 27E5DF0826C256F600F9DBC6 /* Multi Platform Navigation.app */;
163 | productType = "com.apple.product-type.application";
164 | };
165 | 27E5DF0F26C256F600F9DBC6 /* Multi Platform Navigation (macOS) */ = {
166 | isa = PBXNativeTarget;
167 | buildConfigurationList = 27E5DF1F26C256F600F9DBC6 /* Build configuration list for PBXNativeTarget "Multi Platform Navigation (macOS)" */;
168 | buildPhases = (
169 | 27E5DF0C26C256F600F9DBC6 /* Sources */,
170 | 27E5DF0D26C256F600F9DBC6 /* Frameworks */,
171 | 27E5DF0E26C256F600F9DBC6 /* Resources */,
172 | );
173 | buildRules = (
174 | );
175 | dependencies = (
176 | );
177 | name = "Multi Platform Navigation (macOS)";
178 | productName = "Multi Platform Navigation (macOS)";
179 | productReference = 27E5DF1026C256F600F9DBC6 /* Multi Platform Navigation.app */;
180 | productType = "com.apple.product-type.application";
181 | };
182 | /* End PBXNativeTarget section */
183 |
184 | /* Begin PBXProject section */
185 | 27E5DEFC26C256F300F9DBC6 /* Project object */ = {
186 | isa = PBXProject;
187 | attributes = {
188 | LastSwiftUpdateCheck = 1250;
189 | LastUpgradeCheck = 1250;
190 | TargetAttributes = {
191 | 27E5DF0726C256F600F9DBC6 = {
192 | CreatedOnToolsVersion = 12.5.1;
193 | };
194 | 27E5DF0F26C256F600F9DBC6 = {
195 | CreatedOnToolsVersion = 12.5.1;
196 | };
197 | };
198 | };
199 | buildConfigurationList = 27E5DEFF26C256F300F9DBC6 /* Build configuration list for PBXProject "Multi Platform Navigation" */;
200 | compatibilityVersion = "Xcode 9.3";
201 | developmentRegion = en;
202 | hasScannedForEncodings = 0;
203 | knownRegions = (
204 | en,
205 | Base,
206 | );
207 | mainGroup = 27E5DEFB26C256F300F9DBC6;
208 | productRefGroup = 27E5DF0926C256F600F9DBC6 /* Products */;
209 | projectDirPath = "";
210 | projectRoot = "";
211 | targets = (
212 | 27E5DF0726C256F600F9DBC6 /* Multi Platform Navigation (iOS) */,
213 | 27E5DF0F26C256F600F9DBC6 /* Multi Platform Navigation (macOS) */,
214 | );
215 | };
216 | /* End PBXProject section */
217 |
218 | /* Begin PBXResourcesBuildPhase section */
219 | 27E5DF0626C256F600F9DBC6 /* Resources */ = {
220 | isa = PBXResourcesBuildPhase;
221 | buildActionMask = 2147483647;
222 | files = (
223 | 27E5DF1826C256F600F9DBC6 /* Assets.xcassets in Resources */,
224 | );
225 | runOnlyForDeploymentPostprocessing = 0;
226 | };
227 | 27E5DF0E26C256F600F9DBC6 /* Resources */ = {
228 | isa = PBXResourcesBuildPhase;
229 | buildActionMask = 2147483647;
230 | files = (
231 | 27E5DF1926C256F600F9DBC6 /* Assets.xcassets in Resources */,
232 | );
233 | runOnlyForDeploymentPostprocessing = 0;
234 | };
235 | /* End PBXResourcesBuildPhase section */
236 |
237 | /* Begin PBXSourcesBuildPhase section */
238 | 27E5DF0426C256F600F9DBC6 /* Sources */ = {
239 | isa = PBXSourcesBuildPhase;
240 | buildActionMask = 2147483647;
241 | files = (
242 | 27E5DF1626C256F600F9DBC6 /* ContentView.swift in Sources */,
243 | 27E4801D26C2C8A80079D987 /* PageView.swift in Sources */,
244 | 27E5DF1426C256F600F9DBC6 /* Multi_Platform_NavigationApp.swift in Sources */,
245 | 27E5DF2626C2584000F9DBC6 /* Sidebar.swift in Sources */,
246 | 27E5DF2E26C2734E00F9DBC6 /* ItemListRow.swift in Sources */,
247 | 27E5DF2926C26B7E00F9DBC6 /* ItemView.swift in Sources */,
248 | 27E5DF2326C257BB00F9DBC6 /* ListView.swift in Sources */,
249 | 27E5DF3426C2855D00F9DBC6 /* TabBar.swift in Sources */,
250 | );
251 | runOnlyForDeploymentPostprocessing = 0;
252 | };
253 | 27E5DF0C26C256F600F9DBC6 /* Sources */ = {
254 | isa = PBXSourcesBuildPhase;
255 | buildActionMask = 2147483647;
256 | files = (
257 | 27E5DF1726C256F600F9DBC6 /* ContentView.swift in Sources */,
258 | 27E4801E26C2C8A80079D987 /* PageView.swift in Sources */,
259 | 27E5DF1526C256F600F9DBC6 /* Multi_Platform_NavigationApp.swift in Sources */,
260 | 27E5DF2726C2584000F9DBC6 /* Sidebar.swift in Sources */,
261 | 27E5DF2F26C2734E00F9DBC6 /* ItemListRow.swift in Sources */,
262 | 27E5DF2A26C26B7E00F9DBC6 /* ItemView.swift in Sources */,
263 | 27E5DF3526C2855D00F9DBC6 /* TabBar.swift in Sources */,
264 | 27E4802426C2DEAA0079D987 /* ListView.swift in Sources */,
265 | );
266 | runOnlyForDeploymentPostprocessing = 0;
267 | };
268 | /* End PBXSourcesBuildPhase section */
269 |
270 | /* Begin XCBuildConfiguration section */
271 | 27E5DF1A26C256F600F9DBC6 /* Debug */ = {
272 | isa = XCBuildConfiguration;
273 | buildSettings = {
274 | ALWAYS_SEARCH_USER_PATHS = NO;
275 | CLANG_ANALYZER_NONNULL = YES;
276 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
277 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
278 | CLANG_CXX_LIBRARY = "libc++";
279 | CLANG_ENABLE_MODULES = YES;
280 | CLANG_ENABLE_OBJC_ARC = YES;
281 | CLANG_ENABLE_OBJC_WEAK = YES;
282 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
283 | CLANG_WARN_BOOL_CONVERSION = YES;
284 | CLANG_WARN_COMMA = YES;
285 | CLANG_WARN_CONSTANT_CONVERSION = YES;
286 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
287 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
288 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
289 | CLANG_WARN_EMPTY_BODY = YES;
290 | CLANG_WARN_ENUM_CONVERSION = YES;
291 | CLANG_WARN_INFINITE_RECURSION = YES;
292 | CLANG_WARN_INT_CONVERSION = YES;
293 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
294 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
295 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
296 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
297 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
298 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
299 | CLANG_WARN_STRICT_PROTOTYPES = YES;
300 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
301 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
302 | CLANG_WARN_UNREACHABLE_CODE = YES;
303 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
304 | COPY_PHASE_STRIP = NO;
305 | DEBUG_INFORMATION_FORMAT = dwarf;
306 | ENABLE_STRICT_OBJC_MSGSEND = YES;
307 | ENABLE_TESTABILITY = YES;
308 | GCC_C_LANGUAGE_STANDARD = gnu11;
309 | GCC_DYNAMIC_NO_PIC = NO;
310 | GCC_NO_COMMON_BLOCKS = YES;
311 | GCC_OPTIMIZATION_LEVEL = 0;
312 | GCC_PREPROCESSOR_DEFINITIONS = (
313 | "DEBUG=1",
314 | "$(inherited)",
315 | );
316 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
317 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
318 | GCC_WARN_UNDECLARED_SELECTOR = YES;
319 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
320 | GCC_WARN_UNUSED_FUNCTION = YES;
321 | GCC_WARN_UNUSED_VARIABLE = YES;
322 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
323 | MTL_FAST_MATH = YES;
324 | ONLY_ACTIVE_ARCH = YES;
325 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
326 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
327 | };
328 | name = Debug;
329 | };
330 | 27E5DF1B26C256F600F9DBC6 /* Release */ = {
331 | isa = XCBuildConfiguration;
332 | buildSettings = {
333 | ALWAYS_SEARCH_USER_PATHS = NO;
334 | CLANG_ANALYZER_NONNULL = YES;
335 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
336 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
337 | CLANG_CXX_LIBRARY = "libc++";
338 | CLANG_ENABLE_MODULES = YES;
339 | CLANG_ENABLE_OBJC_ARC = YES;
340 | CLANG_ENABLE_OBJC_WEAK = YES;
341 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
342 | CLANG_WARN_BOOL_CONVERSION = YES;
343 | CLANG_WARN_COMMA = YES;
344 | CLANG_WARN_CONSTANT_CONVERSION = YES;
345 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
346 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
347 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
348 | CLANG_WARN_EMPTY_BODY = YES;
349 | CLANG_WARN_ENUM_CONVERSION = YES;
350 | CLANG_WARN_INFINITE_RECURSION = YES;
351 | CLANG_WARN_INT_CONVERSION = YES;
352 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
353 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
354 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
355 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
356 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
357 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
358 | CLANG_WARN_STRICT_PROTOTYPES = YES;
359 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
360 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
361 | CLANG_WARN_UNREACHABLE_CODE = YES;
362 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
363 | COPY_PHASE_STRIP = NO;
364 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
365 | ENABLE_NS_ASSERTIONS = NO;
366 | ENABLE_STRICT_OBJC_MSGSEND = YES;
367 | GCC_C_LANGUAGE_STANDARD = gnu11;
368 | GCC_NO_COMMON_BLOCKS = YES;
369 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
370 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
371 | GCC_WARN_UNDECLARED_SELECTOR = YES;
372 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
373 | GCC_WARN_UNUSED_FUNCTION = YES;
374 | GCC_WARN_UNUSED_VARIABLE = YES;
375 | MTL_ENABLE_DEBUG_INFO = NO;
376 | MTL_FAST_MATH = YES;
377 | SWIFT_COMPILATION_MODE = wholemodule;
378 | SWIFT_OPTIMIZATION_LEVEL = "-O";
379 | };
380 | name = Release;
381 | };
382 | 27E5DF1D26C256F600F9DBC6 /* Debug */ = {
383 | isa = XCBuildConfiguration;
384 | buildSettings = {
385 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
386 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
387 | CODE_SIGN_ENTITLEMENTS = "Multi Platform Navigation.entitlements";
388 | CODE_SIGN_STYLE = Automatic;
389 | DEVELOPMENT_TEAM = Y2CV739CMW;
390 | ENABLE_PREVIEWS = YES;
391 | INFOPLIST_FILE = iOS/Info.plist;
392 | IPHONEOS_DEPLOYMENT_TARGET = 14.0;
393 | LD_RUNPATH_SEARCH_PATHS = (
394 | "$(inherited)",
395 | "@executable_path/Frameworks",
396 | );
397 | PRODUCT_BUNDLE_IDENTIFIER = "com.stugreenham.Multi-Platform-Navigation";
398 | PRODUCT_NAME = "Multi Platform Navigation";
399 | SDKROOT = iphoneos;
400 | SUPPORTS_MACCATALYST = NO;
401 | SWIFT_VERSION = 5.0;
402 | TARGETED_DEVICE_FAMILY = "1,2";
403 | };
404 | name = Debug;
405 | };
406 | 27E5DF1E26C256F600F9DBC6 /* Release */ = {
407 | isa = XCBuildConfiguration;
408 | buildSettings = {
409 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
410 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
411 | CODE_SIGN_ENTITLEMENTS = "Multi Platform Navigation.entitlements";
412 | CODE_SIGN_STYLE = Automatic;
413 | DEVELOPMENT_TEAM = Y2CV739CMW;
414 | ENABLE_PREVIEWS = YES;
415 | INFOPLIST_FILE = iOS/Info.plist;
416 | IPHONEOS_DEPLOYMENT_TARGET = 14.0;
417 | LD_RUNPATH_SEARCH_PATHS = (
418 | "$(inherited)",
419 | "@executable_path/Frameworks",
420 | );
421 | PRODUCT_BUNDLE_IDENTIFIER = "com.stugreenham.Multi-Platform-Navigation";
422 | PRODUCT_NAME = "Multi Platform Navigation";
423 | SDKROOT = iphoneos;
424 | SUPPORTS_MACCATALYST = NO;
425 | SWIFT_VERSION = 5.0;
426 | TARGETED_DEVICE_FAMILY = "1,2";
427 | VALIDATE_PRODUCT = YES;
428 | };
429 | name = Release;
430 | };
431 | 27E5DF2026C256F600F9DBC6 /* Debug */ = {
432 | isa = XCBuildConfiguration;
433 | buildSettings = {
434 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
435 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
436 | CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements;
437 | CODE_SIGN_STYLE = Automatic;
438 | COMBINE_HIDPI_IMAGES = YES;
439 | DEVELOPMENT_TEAM = Y2CV739CMW;
440 | ENABLE_HARDENED_RUNTIME = YES;
441 | ENABLE_PREVIEWS = YES;
442 | INFOPLIST_FILE = macOS/Info.plist;
443 | LD_RUNPATH_SEARCH_PATHS = (
444 | "$(inherited)",
445 | "@executable_path/../Frameworks",
446 | );
447 | MACOSX_DEPLOYMENT_TARGET = 11.0;
448 | PRODUCT_BUNDLE_IDENTIFIER = "com.stugreenham.Multi-Platform-Navigation";
449 | PRODUCT_NAME = "Multi Platform Navigation";
450 | SDKROOT = macosx;
451 | SWIFT_VERSION = 5.0;
452 | };
453 | name = Debug;
454 | };
455 | 27E5DF2126C256F600F9DBC6 /* Release */ = {
456 | isa = XCBuildConfiguration;
457 | buildSettings = {
458 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
459 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
460 | CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements;
461 | CODE_SIGN_STYLE = Automatic;
462 | COMBINE_HIDPI_IMAGES = YES;
463 | DEVELOPMENT_TEAM = Y2CV739CMW;
464 | ENABLE_HARDENED_RUNTIME = YES;
465 | ENABLE_PREVIEWS = YES;
466 | INFOPLIST_FILE = macOS/Info.plist;
467 | LD_RUNPATH_SEARCH_PATHS = (
468 | "$(inherited)",
469 | "@executable_path/../Frameworks",
470 | );
471 | MACOSX_DEPLOYMENT_TARGET = 11.0;
472 | PRODUCT_BUNDLE_IDENTIFIER = "com.stugreenham.Multi-Platform-Navigation";
473 | PRODUCT_NAME = "Multi Platform Navigation";
474 | SDKROOT = macosx;
475 | SWIFT_VERSION = 5.0;
476 | };
477 | name = Release;
478 | };
479 | /* End XCBuildConfiguration section */
480 |
481 | /* Begin XCConfigurationList section */
482 | 27E5DEFF26C256F300F9DBC6 /* Build configuration list for PBXProject "Multi Platform Navigation" */ = {
483 | isa = XCConfigurationList;
484 | buildConfigurations = (
485 | 27E5DF1A26C256F600F9DBC6 /* Debug */,
486 | 27E5DF1B26C256F600F9DBC6 /* Release */,
487 | );
488 | defaultConfigurationIsVisible = 0;
489 | defaultConfigurationName = Release;
490 | };
491 | 27E5DF1C26C256F600F9DBC6 /* Build configuration list for PBXNativeTarget "Multi Platform Navigation (iOS)" */ = {
492 | isa = XCConfigurationList;
493 | buildConfigurations = (
494 | 27E5DF1D26C256F600F9DBC6 /* Debug */,
495 | 27E5DF1E26C256F600F9DBC6 /* Release */,
496 | );
497 | defaultConfigurationIsVisible = 0;
498 | defaultConfigurationName = Release;
499 | };
500 | 27E5DF1F26C256F600F9DBC6 /* Build configuration list for PBXNativeTarget "Multi Platform Navigation (macOS)" */ = {
501 | isa = XCConfigurationList;
502 | buildConfigurations = (
503 | 27E5DF2026C256F600F9DBC6 /* Debug */,
504 | 27E5DF2126C256F600F9DBC6 /* Release */,
505 | );
506 | defaultConfigurationIsVisible = 0;
507 | defaultConfigurationName = Release;
508 | };
509 | /* End XCConfigurationList section */
510 | };
511 | rootObject = 27E5DEFC26C256F300F9DBC6 /* Project object */;
512 | }
513 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/Multi Platform Navigation.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/Multi Platform Navigation.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/Multi Platform Navigation.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/Multi Platform Navigation.xcodeproj/xcshareddata/xcschemes/Multi Platform Navigation (iOS).xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
45 |
51 |
52 |
53 |
54 |
60 |
62 |
68 |
69 |
70 |
71 |
73 |
74 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/Multi Platform Navigation.xcodeproj/xcshareddata/xcschemes/Multi Platform Navigation (macOS).xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
45 |
51 |
52 |
53 |
54 |
60 |
62 |
68 |
69 |
70 |
71 |
73 |
74 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/Shared/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/Shared/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "scale" : "2x",
6 | "size" : "20x20"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "scale" : "3x",
11 | "size" : "20x20"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "scale" : "2x",
16 | "size" : "29x29"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "scale" : "3x",
21 | "size" : "29x29"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "scale" : "2x",
26 | "size" : "40x40"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "scale" : "3x",
31 | "size" : "40x40"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "scale" : "2x",
36 | "size" : "60x60"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "scale" : "3x",
41 | "size" : "60x60"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "scale" : "1x",
46 | "size" : "20x20"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "scale" : "2x",
51 | "size" : "20x20"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "scale" : "1x",
56 | "size" : "29x29"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "scale" : "2x",
61 | "size" : "29x29"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "scale" : "1x",
66 | "size" : "40x40"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "scale" : "2x",
71 | "size" : "40x40"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "scale" : "1x",
76 | "size" : "76x76"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "scale" : "2x",
81 | "size" : "76x76"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "scale" : "2x",
86 | "size" : "83.5x83.5"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "scale" : "1x",
91 | "size" : "1024x1024"
92 | },
93 | {
94 | "idiom" : "mac",
95 | "scale" : "1x",
96 | "size" : "16x16"
97 | },
98 | {
99 | "idiom" : "mac",
100 | "scale" : "2x",
101 | "size" : "16x16"
102 | },
103 | {
104 | "idiom" : "mac",
105 | "scale" : "1x",
106 | "size" : "32x32"
107 | },
108 | {
109 | "idiom" : "mac",
110 | "scale" : "2x",
111 | "size" : "32x32"
112 | },
113 | {
114 | "idiom" : "mac",
115 | "scale" : "1x",
116 | "size" : "128x128"
117 | },
118 | {
119 | "idiom" : "mac",
120 | "scale" : "2x",
121 | "size" : "128x128"
122 | },
123 | {
124 | "idiom" : "mac",
125 | "scale" : "1x",
126 | "size" : "256x256"
127 | },
128 | {
129 | "idiom" : "mac",
130 | "scale" : "2x",
131 | "size" : "256x256"
132 | },
133 | {
134 | "idiom" : "mac",
135 | "scale" : "1x",
136 | "size" : "512x512"
137 | },
138 | {
139 | "idiom" : "mac",
140 | "scale" : "2x",
141 | "size" : "512x512"
142 | }
143 | ],
144 | "info" : {
145 | "author" : "xcode",
146 | "version" : 1
147 | }
148 | }
149 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/Shared/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/Shared/ItemView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ItemView.swift
3 | // Multi Platform Navigation
4 | //
5 | // Created by Stu Greenham on 10/08/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ItemView: View {
11 | var body: some View {
12 | Text("Item View")
13 | }
14 | }
15 |
16 | struct ItemView_Previews: PreviewProvider {
17 | static var previews: some View {
18 | ItemView()
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/Shared/Items/ItemListRow.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ItemListRow.swift
3 | // Multi Platform Navigation
4 | //
5 | // Created by Stu Greenham on 10/08/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ItemListRow: View {
11 | var body: some View {
12 | HStack {
13 | Text("List Item")
14 | }
15 | }
16 | }
17 |
18 | struct ListItemView_Previews: PreviewProvider {
19 | static var previews: some View {
20 | ItemListRow()
21 | .previewLayout(.sizeThatFits)
22 | .padding()
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/Shared/Multi_Platform_NavigationApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Multi_Platform_NavigationApp.swift
3 | // Shared
4 | //
5 | // Created by Stu Greenham on 10/08/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct Multi_Platform_NavigationApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | ContentView()
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/Shared/Navigation/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // Shared
4 | //
5 | // Created by Stu Greenham on 10/08/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ContentView: View {
11 |
12 | // This allows you to modify changes between iPhone and iPads
13 | #if os(iOS)
14 | @Environment(\.horizontalSizeClass) private var horizontalSizeClass
15 | #endif
16 |
17 | var body: some View {
18 | #if os(iOS)
19 | if horizontalSizeClass == .compact {
20 | TabBar() // coursesview()
21 | } else {
22 | Sidebar()
23 | // .frame(minWidth: 1000, maxWidth: .infinity, minHeight: 600, maxHeight: .infinity)
24 | }
25 | #else
26 | Sidebar()
27 | .frame(minWidth: 1000, maxWidth: .infinity, minHeight: 600, maxHeight: .infinity)
28 | #endif
29 | }
30 | }
31 |
32 | struct ContentView_Previews: PreviewProvider {
33 | static var previews: some View {
34 | ContentView()
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/Shared/Navigation/Sidebar.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Sidebar.swift
3 | // Multi Platform Navigation
4 | //
5 | // Created by Stu Greenham on 10/08/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | enum NavigationItem {
11 | case list
12 | case page
13 | }
14 |
15 | #if !os(iOS)
16 | func toggleSidebar() {
17 | NSApp.keyWindow?.firstResponder?.tryToPerform(#selector(NSSplitViewController.toggleSidebar(_:)), with: nil)
18 | }
19 | #endif
20 |
21 |
22 | struct Sidebar: View {
23 |
24 | @State var selection: Set = [.list]
25 |
26 | var body: some View {
27 |
28 | NavigationView {
29 | List(selection: $selection) {
30 | NavigationLink(destination: ListView()) {
31 | Label("List", systemImage: "book.closed")
32 | }
33 | .tag(NavigationItem.list)
34 |
35 | NavigationLink(destination: PageView(PageNum: 1)) {
36 | Label("Page", systemImage: "list.bullet.rectangle")
37 | }
38 | .tag(NavigationItem.page)
39 | }
40 | .listStyle(SidebarListStyle())
41 | .navigationTitle("Menu")
42 | .frame(minWidth: 200)
43 |
44 | ListView()
45 | }
46 | .toolbar {
47 | #if !os(iOS)
48 | ToolbarItem(placement: .navigation) {
49 | Button(action: toggleSidebar, label: {
50 | Image(systemName: "sidebar.left")
51 | })
52 | }
53 | #endif
54 | }
55 |
56 | }
57 | }
58 |
59 | struct Sidebar_Previews: PreviewProvider {
60 | static var previews: some View {
61 | Sidebar()
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/Shared/Navigation/TabBar.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TabBar.swift
3 | // Multi Platform Navigation
4 | //
5 | // Created by Stu Greenham on 10/08/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct TabBar: View {
11 |
12 | //@State var selection: Set = [.list]
13 |
14 | var body: some View {
15 | TabView {
16 | NavigationView {
17 | ListView()
18 | .navigationTitle("List")
19 | }
20 | .tabItem { Image(systemName: "book.closed")
21 | Text("List") }
22 |
23 | NavigationView {
24 | PageView(PageNum: 1)
25 | }
26 | .tabItem {
27 | Image(systemName: "list.bullet.rectangle")
28 | Text("Page")
29 | }
30 | }
31 | }
32 | }
33 |
34 | struct TabBar_Previews: PreviewProvider {
35 | static var previews: some View {
36 | TabBar()
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/Shared/Views/PageView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PageView.swift
3 | // Multi Platform Navigation
4 | //
5 | // Created by Stu Greenham on 10/08/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct PageView: View {
11 |
12 | @State var PageNum: Int
13 |
14 | var body: some View {
15 | Text("Page \(PageNum)")
16 | }
17 | }
18 |
19 | struct PageView_Previews: PreviewProvider {
20 | static var previews: some View {
21 | PageView(PageNum: 1)
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/iOS/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UIApplicationSceneManifest
24 |
25 | UIApplicationSupportsMultipleScenes
26 |
27 |
28 | UIApplicationSupportsIndirectInputEvents
29 |
30 | UILaunchScreen
31 |
32 | UIRequiredDeviceCapabilities
33 |
34 | armv7
35 |
36 | UISupportedInterfaceOrientations
37 |
38 | UIInterfaceOrientationPortrait
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UISupportedInterfaceOrientations~ipad
43 |
44 | UIInterfaceOrientationPortrait
45 | UIInterfaceOrientationPortraitUpsideDown
46 | UIInterfaceOrientationLandscapeLeft
47 | UIInterfaceOrientationLandscapeRight
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/iOS/ListView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ListView.swift
3 | // Multi Platform Navigation
4 | //
5 | // Created by Stu Greenham on 10/08/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ListView: View {
11 |
12 | @Environment(\.horizontalSizeClass) private var horizontalSizeClass
13 |
14 | var body: some View {
15 | if horizontalSizeClass == .compact {
16 | content
17 | } else {
18 | content
19 | }
20 | }
21 |
22 | var content: some View {
23 | List(0 ..< 50) { item in
24 | NavigationLink(destination: ItemView()) {
25 | ItemListRow()
26 | }
27 | }
28 | .navigationTitle("List")
29 | }
30 |
31 | }
32 |
33 | struct ListView_Previews: PreviewProvider {
34 | static var previews: some View {
35 | ListView()
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/macOS/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleVersion
22 | 1
23 | LSMinimumSystemVersion
24 | $(MACOSX_DEPLOYMENT_TARGET)
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/macOS/ListView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ListView.swift
3 | // Multi Platform Navigation
4 | //
5 | // Created by Stu Greenham on 10/08/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ListView: View {
11 | var body: some View {
12 | NavigationView {
13 | List(0 ..< 50) { item in
14 | NavigationLink(destination: ItemView()) {
15 | ItemListRow()
16 | }
17 | }
18 | //.listStyle(SidebarListStyle())
19 | .navigationTitle("List")
20 | }
21 | //.navigationViewStyle(StackNavigationViewStyle())
22 | }
23 | }
24 |
25 | struct ListView_Previews: PreviewProvider {
26 | static var previews: some View {
27 | ListView()
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Multi Platform Navigation/macOS/macOS.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.files.user-selected.read-only
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # SwiftUI Template Projects
2 |
3 | ## iOS
4 |
5 | ### [Creating a Simple TabView](https://github.com/stugreenham/swiftui-boilerplates/tree/main/Tab%20View)
6 | A basic TabView navigation setup.
7 |
8 | 
9 |
10 |
11 | ### [Creating a custom TabView]()
12 | This takes the standard TabView above, but gives it a custom sleek look. Credit for this solution goes to [Trailing Closure](https://trailingclosure.com/custom-tabbar/)
13 |
14 | 
15 |
16 |
17 | ### [Displaying a welcome screen on first launch](https://github.com/stugreenham/swiftui-boilerplates/tree/main/Welcome%20Screen)
18 | A welcome screen that launches when a user first opens your app. The welcome screen can be dismissed, and once dismissed, will never show again.
19 |
20 | 
21 |
22 | ---
23 |
24 | ## Multi Platform
25 |
26 | ### [Multi Platform Navigation](https://github.com/stugreenham/swiftui-boilerplates/tree/main/Multi%20Platform%20Navigation)
27 | This includes a tab bar navigation on the iPhone and a sidebar navigation on the iPad and macOS.
28 |
29 | 
30 |
31 |
--------------------------------------------------------------------------------
/Tab View (Custom)/Tab View (Custom).xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 50;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 27016A1D265D2C90003C77DB /* Tab_View__Custom_App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27016A1C265D2C90003C77DB /* Tab_View__Custom_App.swift */; };
11 | 27016A1F265D2C90003C77DB /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27016A1E265D2C90003C77DB /* ContentView.swift */; };
12 | 27016A21265D2C92003C77DB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 27016A20265D2C92003C77DB /* Assets.xcassets */; };
13 | 27016A24265D2C92003C77DB /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 27016A23265D2C92003C77DB /* Preview Assets.xcassets */; };
14 | 27016A2D265D2CE2003C77DB /* TabOneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27016A2C265D2CE2003C77DB /* TabOneView.swift */; };
15 | 27016A2F265D2D07003C77DB /* TabTwoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27016A2E265D2D07003C77DB /* TabTwoView.swift */; };
16 | 27016A31265D2D29003C77DB /* TabThreeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27016A30265D2D29003C77DB /* TabThreeView.swift */; };
17 | /* End PBXBuildFile section */
18 |
19 | /* Begin PBXFileReference section */
20 | 27016A19265D2C90003C77DB /* Tab View (Custom).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Tab View (Custom).app"; sourceTree = BUILT_PRODUCTS_DIR; };
21 | 27016A1C265D2C90003C77DB /* Tab_View__Custom_App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tab_View__Custom_App.swift; sourceTree = ""; };
22 | 27016A1E265D2C90003C77DB /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
23 | 27016A20265D2C92003C77DB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
24 | 27016A23265D2C92003C77DB /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
25 | 27016A25265D2C92003C77DB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
26 | 27016A2C265D2CE2003C77DB /* TabOneView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabOneView.swift; sourceTree = ""; };
27 | 27016A2E265D2D07003C77DB /* TabTwoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabTwoView.swift; sourceTree = ""; };
28 | 27016A30265D2D29003C77DB /* TabThreeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabThreeView.swift; sourceTree = ""; };
29 | /* End PBXFileReference section */
30 |
31 | /* Begin PBXFrameworksBuildPhase section */
32 | 27016A16265D2C90003C77DB /* Frameworks */ = {
33 | isa = PBXFrameworksBuildPhase;
34 | buildActionMask = 2147483647;
35 | files = (
36 | );
37 | runOnlyForDeploymentPostprocessing = 0;
38 | };
39 | /* End PBXFrameworksBuildPhase section */
40 |
41 | /* Begin PBXGroup section */
42 | 27016A10265D2C90003C77DB = {
43 | isa = PBXGroup;
44 | children = (
45 | 27016A1B265D2C90003C77DB /* Tab View (Custom) */,
46 | 27016A1A265D2C90003C77DB /* Products */,
47 | );
48 | sourceTree = "";
49 | };
50 | 27016A1A265D2C90003C77DB /* Products */ = {
51 | isa = PBXGroup;
52 | children = (
53 | 27016A19265D2C90003C77DB /* Tab View (Custom).app */,
54 | );
55 | name = Products;
56 | sourceTree = "";
57 | };
58 | 27016A1B265D2C90003C77DB /* Tab View (Custom) */ = {
59 | isa = PBXGroup;
60 | children = (
61 | 27016A1C265D2C90003C77DB /* Tab_View__Custom_App.swift */,
62 | 27016A1E265D2C90003C77DB /* ContentView.swift */,
63 | 27016A2B265D2CD7003C77DB /* View */,
64 | 27016A20265D2C92003C77DB /* Assets.xcassets */,
65 | 27016A25265D2C92003C77DB /* Info.plist */,
66 | 27016A22265D2C92003C77DB /* Preview Content */,
67 | );
68 | path = "Tab View (Custom)";
69 | sourceTree = "";
70 | };
71 | 27016A22265D2C92003C77DB /* Preview Content */ = {
72 | isa = PBXGroup;
73 | children = (
74 | 27016A23265D2C92003C77DB /* Preview Assets.xcassets */,
75 | );
76 | path = "Preview Content";
77 | sourceTree = "";
78 | };
79 | 27016A2B265D2CD7003C77DB /* View */ = {
80 | isa = PBXGroup;
81 | children = (
82 | 27016A2C265D2CE2003C77DB /* TabOneView.swift */,
83 | 27016A2E265D2D07003C77DB /* TabTwoView.swift */,
84 | 27016A30265D2D29003C77DB /* TabThreeView.swift */,
85 | );
86 | path = View;
87 | sourceTree = "";
88 | };
89 | /* End PBXGroup section */
90 |
91 | /* Begin PBXNativeTarget section */
92 | 27016A18265D2C90003C77DB /* Tab View (Custom) */ = {
93 | isa = PBXNativeTarget;
94 | buildConfigurationList = 27016A28265D2C92003C77DB /* Build configuration list for PBXNativeTarget "Tab View (Custom)" */;
95 | buildPhases = (
96 | 27016A15265D2C90003C77DB /* Sources */,
97 | 27016A16265D2C90003C77DB /* Frameworks */,
98 | 27016A17265D2C90003C77DB /* Resources */,
99 | );
100 | buildRules = (
101 | );
102 | dependencies = (
103 | );
104 | name = "Tab View (Custom)";
105 | productName = "Tab View (Custom)";
106 | productReference = 27016A19265D2C90003C77DB /* Tab View (Custom).app */;
107 | productType = "com.apple.product-type.application";
108 | };
109 | /* End PBXNativeTarget section */
110 |
111 | /* Begin PBXProject section */
112 | 27016A11265D2C90003C77DB /* Project object */ = {
113 | isa = PBXProject;
114 | attributes = {
115 | LastSwiftUpdateCheck = 1250;
116 | LastUpgradeCheck = 1250;
117 | TargetAttributes = {
118 | 27016A18265D2C90003C77DB = {
119 | CreatedOnToolsVersion = 12.5;
120 | };
121 | };
122 | };
123 | buildConfigurationList = 27016A14265D2C90003C77DB /* Build configuration list for PBXProject "Tab View (Custom)" */;
124 | compatibilityVersion = "Xcode 9.3";
125 | developmentRegion = en;
126 | hasScannedForEncodings = 0;
127 | knownRegions = (
128 | en,
129 | Base,
130 | );
131 | mainGroup = 27016A10265D2C90003C77DB;
132 | productRefGroup = 27016A1A265D2C90003C77DB /* Products */;
133 | projectDirPath = "";
134 | projectRoot = "";
135 | targets = (
136 | 27016A18265D2C90003C77DB /* Tab View (Custom) */,
137 | );
138 | };
139 | /* End PBXProject section */
140 |
141 | /* Begin PBXResourcesBuildPhase section */
142 | 27016A17265D2C90003C77DB /* Resources */ = {
143 | isa = PBXResourcesBuildPhase;
144 | buildActionMask = 2147483647;
145 | files = (
146 | 27016A24265D2C92003C77DB /* Preview Assets.xcassets in Resources */,
147 | 27016A21265D2C92003C77DB /* Assets.xcassets in Resources */,
148 | );
149 | runOnlyForDeploymentPostprocessing = 0;
150 | };
151 | /* End PBXResourcesBuildPhase section */
152 |
153 | /* Begin PBXSourcesBuildPhase section */
154 | 27016A15265D2C90003C77DB /* Sources */ = {
155 | isa = PBXSourcesBuildPhase;
156 | buildActionMask = 2147483647;
157 | files = (
158 | 27016A1F265D2C90003C77DB /* ContentView.swift in Sources */,
159 | 27016A2D265D2CE2003C77DB /* TabOneView.swift in Sources */,
160 | 27016A31265D2D29003C77DB /* TabThreeView.swift in Sources */,
161 | 27016A1D265D2C90003C77DB /* Tab_View__Custom_App.swift in Sources */,
162 | 27016A2F265D2D07003C77DB /* TabTwoView.swift in Sources */,
163 | );
164 | runOnlyForDeploymentPostprocessing = 0;
165 | };
166 | /* End PBXSourcesBuildPhase section */
167 |
168 | /* Begin XCBuildConfiguration section */
169 | 27016A26265D2C92003C77DB /* Debug */ = {
170 | isa = XCBuildConfiguration;
171 | buildSettings = {
172 | ALWAYS_SEARCH_USER_PATHS = NO;
173 | CLANG_ANALYZER_NONNULL = YES;
174 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
175 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
176 | CLANG_CXX_LIBRARY = "libc++";
177 | CLANG_ENABLE_MODULES = YES;
178 | CLANG_ENABLE_OBJC_ARC = YES;
179 | CLANG_ENABLE_OBJC_WEAK = YES;
180 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
181 | CLANG_WARN_BOOL_CONVERSION = YES;
182 | CLANG_WARN_COMMA = YES;
183 | CLANG_WARN_CONSTANT_CONVERSION = YES;
184 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
185 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
186 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
187 | CLANG_WARN_EMPTY_BODY = YES;
188 | CLANG_WARN_ENUM_CONVERSION = YES;
189 | CLANG_WARN_INFINITE_RECURSION = YES;
190 | CLANG_WARN_INT_CONVERSION = YES;
191 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
192 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
193 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
194 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
195 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
196 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
197 | CLANG_WARN_STRICT_PROTOTYPES = YES;
198 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
199 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
200 | CLANG_WARN_UNREACHABLE_CODE = YES;
201 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
202 | COPY_PHASE_STRIP = NO;
203 | DEBUG_INFORMATION_FORMAT = dwarf;
204 | ENABLE_STRICT_OBJC_MSGSEND = YES;
205 | ENABLE_TESTABILITY = YES;
206 | GCC_C_LANGUAGE_STANDARD = gnu11;
207 | GCC_DYNAMIC_NO_PIC = NO;
208 | GCC_NO_COMMON_BLOCKS = YES;
209 | GCC_OPTIMIZATION_LEVEL = 0;
210 | GCC_PREPROCESSOR_DEFINITIONS = (
211 | "DEBUG=1",
212 | "$(inherited)",
213 | );
214 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
215 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
216 | GCC_WARN_UNDECLARED_SELECTOR = YES;
217 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
218 | GCC_WARN_UNUSED_FUNCTION = YES;
219 | GCC_WARN_UNUSED_VARIABLE = YES;
220 | IPHONEOS_DEPLOYMENT_TARGET = 14.5;
221 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
222 | MTL_FAST_MATH = YES;
223 | ONLY_ACTIVE_ARCH = YES;
224 | SDKROOT = iphoneos;
225 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
226 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
227 | };
228 | name = Debug;
229 | };
230 | 27016A27265D2C92003C77DB /* Release */ = {
231 | isa = XCBuildConfiguration;
232 | buildSettings = {
233 | ALWAYS_SEARCH_USER_PATHS = NO;
234 | CLANG_ANALYZER_NONNULL = YES;
235 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
236 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
237 | CLANG_CXX_LIBRARY = "libc++";
238 | CLANG_ENABLE_MODULES = YES;
239 | CLANG_ENABLE_OBJC_ARC = YES;
240 | CLANG_ENABLE_OBJC_WEAK = YES;
241 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
242 | CLANG_WARN_BOOL_CONVERSION = YES;
243 | CLANG_WARN_COMMA = YES;
244 | CLANG_WARN_CONSTANT_CONVERSION = YES;
245 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
246 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
247 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
248 | CLANG_WARN_EMPTY_BODY = YES;
249 | CLANG_WARN_ENUM_CONVERSION = YES;
250 | CLANG_WARN_INFINITE_RECURSION = YES;
251 | CLANG_WARN_INT_CONVERSION = YES;
252 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
253 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
254 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
255 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
256 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
257 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
258 | CLANG_WARN_STRICT_PROTOTYPES = YES;
259 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
260 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
261 | CLANG_WARN_UNREACHABLE_CODE = YES;
262 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
263 | COPY_PHASE_STRIP = NO;
264 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
265 | ENABLE_NS_ASSERTIONS = NO;
266 | ENABLE_STRICT_OBJC_MSGSEND = YES;
267 | GCC_C_LANGUAGE_STANDARD = gnu11;
268 | GCC_NO_COMMON_BLOCKS = YES;
269 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
270 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
271 | GCC_WARN_UNDECLARED_SELECTOR = YES;
272 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
273 | GCC_WARN_UNUSED_FUNCTION = YES;
274 | GCC_WARN_UNUSED_VARIABLE = YES;
275 | IPHONEOS_DEPLOYMENT_TARGET = 14.5;
276 | MTL_ENABLE_DEBUG_INFO = NO;
277 | MTL_FAST_MATH = YES;
278 | SDKROOT = iphoneos;
279 | SWIFT_COMPILATION_MODE = wholemodule;
280 | SWIFT_OPTIMIZATION_LEVEL = "-O";
281 | VALIDATE_PRODUCT = YES;
282 | };
283 | name = Release;
284 | };
285 | 27016A29265D2C92003C77DB /* Debug */ = {
286 | isa = XCBuildConfiguration;
287 | buildSettings = {
288 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
289 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
290 | CODE_SIGN_STYLE = Automatic;
291 | DEVELOPMENT_ASSET_PATHS = "\"Tab View (Custom)/Preview Content\"";
292 | DEVELOPMENT_TEAM = Y2CV739CMW;
293 | ENABLE_PREVIEWS = YES;
294 | INFOPLIST_FILE = "Tab View (Custom)/Info.plist";
295 | IPHONEOS_DEPLOYMENT_TARGET = 14.0;
296 | LD_RUNPATH_SEARCH_PATHS = (
297 | "$(inherited)",
298 | "@executable_path/Frameworks",
299 | );
300 | PRODUCT_BUNDLE_IDENTIFIER = "com.stugreenham.Tab-View--Custom-";
301 | PRODUCT_NAME = "$(TARGET_NAME)";
302 | SWIFT_VERSION = 5.0;
303 | TARGETED_DEVICE_FAMILY = "1,2";
304 | };
305 | name = Debug;
306 | };
307 | 27016A2A265D2C92003C77DB /* Release */ = {
308 | isa = XCBuildConfiguration;
309 | buildSettings = {
310 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
311 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
312 | CODE_SIGN_STYLE = Automatic;
313 | DEVELOPMENT_ASSET_PATHS = "\"Tab View (Custom)/Preview Content\"";
314 | DEVELOPMENT_TEAM = Y2CV739CMW;
315 | ENABLE_PREVIEWS = YES;
316 | INFOPLIST_FILE = "Tab View (Custom)/Info.plist";
317 | IPHONEOS_DEPLOYMENT_TARGET = 14.0;
318 | LD_RUNPATH_SEARCH_PATHS = (
319 | "$(inherited)",
320 | "@executable_path/Frameworks",
321 | );
322 | PRODUCT_BUNDLE_IDENTIFIER = "com.stugreenham.Tab-View--Custom-";
323 | PRODUCT_NAME = "$(TARGET_NAME)";
324 | SWIFT_VERSION = 5.0;
325 | TARGETED_DEVICE_FAMILY = "1,2";
326 | };
327 | name = Release;
328 | };
329 | /* End XCBuildConfiguration section */
330 |
331 | /* Begin XCConfigurationList section */
332 | 27016A14265D2C90003C77DB /* Build configuration list for PBXProject "Tab View (Custom)" */ = {
333 | isa = XCConfigurationList;
334 | buildConfigurations = (
335 | 27016A26265D2C92003C77DB /* Debug */,
336 | 27016A27265D2C92003C77DB /* Release */,
337 | );
338 | defaultConfigurationIsVisible = 0;
339 | defaultConfigurationName = Release;
340 | };
341 | 27016A28265D2C92003C77DB /* Build configuration list for PBXNativeTarget "Tab View (Custom)" */ = {
342 | isa = XCConfigurationList;
343 | buildConfigurations = (
344 | 27016A29265D2C92003C77DB /* Debug */,
345 | 27016A2A265D2C92003C77DB /* Release */,
346 | );
347 | defaultConfigurationIsVisible = 0;
348 | defaultConfigurationName = Release;
349 | };
350 | /* End XCConfigurationList section */
351 | };
352 | rootObject = 27016A11265D2C90003C77DB /* Project object */;
353 | }
354 |
--------------------------------------------------------------------------------
/Tab View (Custom)/Tab View (Custom).xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Tab View (Custom)/Tab View (Custom).xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Tab View (Custom)/Tab View (Custom)/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Tab View (Custom)/Tab View (Custom)/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "scale" : "2x",
6 | "size" : "20x20"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "scale" : "3x",
11 | "size" : "20x20"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "scale" : "2x",
16 | "size" : "29x29"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "scale" : "3x",
21 | "size" : "29x29"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "scale" : "2x",
26 | "size" : "40x40"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "scale" : "3x",
31 | "size" : "40x40"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "scale" : "2x",
36 | "size" : "60x60"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "scale" : "3x",
41 | "size" : "60x60"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "scale" : "1x",
46 | "size" : "20x20"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "scale" : "2x",
51 | "size" : "20x20"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "scale" : "1x",
56 | "size" : "29x29"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "scale" : "2x",
61 | "size" : "29x29"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "scale" : "1x",
66 | "size" : "40x40"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "scale" : "2x",
71 | "size" : "40x40"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "scale" : "1x",
76 | "size" : "76x76"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "scale" : "2x",
81 | "size" : "76x76"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "scale" : "2x",
86 | "size" : "83.5x83.5"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "scale" : "1x",
91 | "size" : "1024x1024"
92 | }
93 | ],
94 | "info" : {
95 | "author" : "xcode",
96 | "version" : 1
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/Tab View (Custom)/Tab View (Custom)/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Tab View (Custom)/Tab View (Custom)/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // Tab View (Custom)
4 | //
5 | // Created by Stu Greenham on 25/05/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ContentView: View {
11 |
12 |
13 | // Credit for this goes to: https://trailingclosure.com/custom-tabbar/
14 |
15 |
16 | // Hold the state for which tab is active/selected
17 | @State var selection: Int = 0
18 |
19 |
20 | var body: some View {
21 |
22 | // Your native TabView here
23 | TabView(selection: $selection) {
24 |
25 | TabOneView().tag(0)
26 |
27 | TabTwoView().tag(1)
28 |
29 | TabThreeView().tag(2)
30 |
31 | }
32 | .overlay( // Overlay the custom TabView component here
33 | Color.white // Base color for Tab Bar
34 | .edgesIgnoringSafeArea(.vertical)
35 | .frame(height: 50) // Match Height of native bar
36 | .overlay(HStack {
37 | Spacer()
38 |
39 | // First Tab Button
40 | Button(action: {
41 | self.selection = 0
42 | }, label: {
43 | Image(systemName: "house.fill")
44 | .resizable()
45 | .aspectRatio(contentMode: .fit)
46 | .frame(width: 25, height: 25, alignment: .center)
47 | .foregroundColor(Color(red: 32/255, green: 43/255, blue: 63/255))
48 | .opacity(selection == 0 ? 1 : 0.4)
49 | })
50 | Spacer()
51 |
52 | // Second Tab Button
53 | Button(action: {
54 | self.selection = 1
55 | }, label: {
56 | Image(systemName: "heart.fill")
57 | .resizable()
58 | .aspectRatio(contentMode: .fit)
59 | .frame(width: 25, height: 25, alignment: .center)
60 | .foregroundColor(Color(red: 32/255, green: 43/255, blue: 63/255))
61 | .opacity(selection == 1 ? 1 : 0.4)
62 | })
63 |
64 | Spacer()
65 |
66 | // Third Tab Button
67 | Button(action: {
68 | self.selection = 2
69 | }, label: {
70 | Image(systemName: "gear")
71 | .resizable()
72 | .aspectRatio(contentMode: .fit)
73 | .frame(width: 25, height: 25, alignment: .center)
74 | .foregroundColor(Color(red: 32/255, green: 43/255, blue: 63/255))
75 | .opacity(selection == 2 ? 1 : 0.4)
76 | })
77 | Spacer()
78 |
79 | })
80 | ,alignment: .bottom) // Align the overlay to bottom to ensure tab bar stays pinned.
81 |
82 | }
83 | }
84 |
85 | struct ContentView_Previews: PreviewProvider {
86 | static var previews: some View {
87 | ContentView()
88 | }
89 | }
90 |
--------------------------------------------------------------------------------
/Tab View (Custom)/Tab View (Custom)/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UIApplicationSceneManifest
24 |
25 | UIApplicationSupportsMultipleScenes
26 |
27 |
28 | UIApplicationSupportsIndirectInputEvents
29 |
30 | UILaunchScreen
31 |
32 | UIRequiredDeviceCapabilities
33 |
34 | armv7
35 |
36 | UISupportedInterfaceOrientations
37 |
38 | UIInterfaceOrientationPortrait
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UISupportedInterfaceOrientations~ipad
43 |
44 | UIInterfaceOrientationPortrait
45 | UIInterfaceOrientationPortraitUpsideDown
46 | UIInterfaceOrientationLandscapeLeft
47 | UIInterfaceOrientationLandscapeRight
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/Tab View (Custom)/Tab View (Custom)/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Tab View (Custom)/Tab View (Custom)/Tab_View__Custom_App.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Tab_View__Custom_App.swift
3 | // Tab View (Custom)
4 | //
5 | // Created by Stu Greenham on 25/05/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct Tab_View__Custom_App: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | ContentView()
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Tab View (Custom)/Tab View (Custom)/View/TabOneView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TabOneView.swift
3 | // Tab View (Custom)
4 | //
5 | // Created by Stu Greenham on 25/05/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct TabOneView: View {
11 | var body: some View {
12 | Text("Tab One")
13 | }
14 | }
15 |
16 | struct TabOneView_Previews: PreviewProvider {
17 | static var previews: some View {
18 | TabOneView()
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Tab View (Custom)/Tab View (Custom)/View/TabThreeView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TabThreeView.swift
3 | // Tab View (Custom)
4 | //
5 | // Created by Stu Greenham on 25/05/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct TabThreeView: View {
11 | var body: some View {
12 | Text("Tab Three")
13 | }
14 | }
15 |
16 | struct TabThreeView_Previews: PreviewProvider {
17 | static var previews: some View {
18 | TabThreeView()
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Tab View (Custom)/Tab View (Custom)/View/TabTwoView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TabTwoView.swift
3 | // Tab View (Custom)
4 | //
5 | // Created by Stu Greenham on 25/05/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct TabTwoView: View {
11 | var body: some View {
12 | Text("Tab Two")
13 | }
14 | }
15 |
16 | struct TabTwoView_Previews: PreviewProvider {
17 | static var previews: some View {
18 | TabTwoView()
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Tab View/Tab View.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 50;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 27896C19265BF5D8007F9A8F /* Tab_ViewApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27896C18265BF5D8007F9A8F /* Tab_ViewApp.swift */; };
11 | 27896C1B265BF5D8007F9A8F /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27896C1A265BF5D8007F9A8F /* ContentView.swift */; };
12 | 27896C1D265BF5D9007F9A8F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 27896C1C265BF5D9007F9A8F /* Assets.xcassets */; };
13 | 27896C20265BF5D9007F9A8F /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 27896C1F265BF5D9007F9A8F /* Preview Assets.xcassets */; };
14 | 27896C28265BF5FA007F9A8F /* TabOneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27896C27265BF5FA007F9A8F /* TabOneView.swift */; };
15 | 27896C2A265BF604007F9A8F /* TabTwoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27896C29265BF604007F9A8F /* TabTwoView.swift */; };
16 | 27896C2C265BF60F007F9A8F /* TabThreeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27896C2B265BF60F007F9A8F /* TabThreeView.swift */; };
17 | 27896C2E265BF617007F9A8F /* TabFourView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27896C2D265BF617007F9A8F /* TabFourView.swift */; };
18 | /* End PBXBuildFile section */
19 |
20 | /* Begin PBXFileReference section */
21 | 27896C15265BF5D8007F9A8F /* Tab View.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Tab View.app"; sourceTree = BUILT_PRODUCTS_DIR; };
22 | 27896C18265BF5D8007F9A8F /* Tab_ViewApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tab_ViewApp.swift; sourceTree = ""; };
23 | 27896C1A265BF5D8007F9A8F /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
24 | 27896C1C265BF5D9007F9A8F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
25 | 27896C1F265BF5D9007F9A8F /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
26 | 27896C21265BF5D9007F9A8F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
27 | 27896C27265BF5FA007F9A8F /* TabOneView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabOneView.swift; sourceTree = ""; };
28 | 27896C29265BF604007F9A8F /* TabTwoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabTwoView.swift; sourceTree = ""; };
29 | 27896C2B265BF60F007F9A8F /* TabThreeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabThreeView.swift; sourceTree = ""; };
30 | 27896C2D265BF617007F9A8F /* TabFourView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabFourView.swift; sourceTree = ""; };
31 | /* End PBXFileReference section */
32 |
33 | /* Begin PBXFrameworksBuildPhase section */
34 | 27896C12265BF5D8007F9A8F /* Frameworks */ = {
35 | isa = PBXFrameworksBuildPhase;
36 | buildActionMask = 2147483647;
37 | files = (
38 | );
39 | runOnlyForDeploymentPostprocessing = 0;
40 | };
41 | /* End PBXFrameworksBuildPhase section */
42 |
43 | /* Begin PBXGroup section */
44 | 27896C0C265BF5D8007F9A8F = {
45 | isa = PBXGroup;
46 | children = (
47 | 27896C17265BF5D8007F9A8F /* Tab View */,
48 | 27896C16265BF5D8007F9A8F /* Products */,
49 | );
50 | sourceTree = "";
51 | };
52 | 27896C16265BF5D8007F9A8F /* Products */ = {
53 | isa = PBXGroup;
54 | children = (
55 | 27896C15265BF5D8007F9A8F /* Tab View.app */,
56 | );
57 | name = Products;
58 | sourceTree = "";
59 | };
60 | 27896C17265BF5D8007F9A8F /* Tab View */ = {
61 | isa = PBXGroup;
62 | children = (
63 | 27896C18265BF5D8007F9A8F /* Tab_ViewApp.swift */,
64 | 27896C1A265BF5D8007F9A8F /* ContentView.swift */,
65 | 27896C2F265BF61D007F9A8F /* View */,
66 | 27896C1C265BF5D9007F9A8F /* Assets.xcassets */,
67 | 27896C21265BF5D9007F9A8F /* Info.plist */,
68 | 27896C1E265BF5D9007F9A8F /* Preview Content */,
69 | );
70 | path = "Tab View";
71 | sourceTree = "";
72 | };
73 | 27896C1E265BF5D9007F9A8F /* Preview Content */ = {
74 | isa = PBXGroup;
75 | children = (
76 | 27896C1F265BF5D9007F9A8F /* Preview Assets.xcassets */,
77 | );
78 | path = "Preview Content";
79 | sourceTree = "";
80 | };
81 | 27896C2F265BF61D007F9A8F /* View */ = {
82 | isa = PBXGroup;
83 | children = (
84 | 27896C27265BF5FA007F9A8F /* TabOneView.swift */,
85 | 27896C29265BF604007F9A8F /* TabTwoView.swift */,
86 | 27896C2D265BF617007F9A8F /* TabFourView.swift */,
87 | 27896C2B265BF60F007F9A8F /* TabThreeView.swift */,
88 | );
89 | path = View;
90 | sourceTree = "";
91 | };
92 | /* End PBXGroup section */
93 |
94 | /* Begin PBXNativeTarget section */
95 | 27896C14265BF5D8007F9A8F /* Tab View */ = {
96 | isa = PBXNativeTarget;
97 | buildConfigurationList = 27896C24265BF5D9007F9A8F /* Build configuration list for PBXNativeTarget "Tab View" */;
98 | buildPhases = (
99 | 27896C11265BF5D8007F9A8F /* Sources */,
100 | 27896C12265BF5D8007F9A8F /* Frameworks */,
101 | 27896C13265BF5D8007F9A8F /* Resources */,
102 | );
103 | buildRules = (
104 | );
105 | dependencies = (
106 | );
107 | name = "Tab View";
108 | productName = "Boilerplate Tab View";
109 | productReference = 27896C15265BF5D8007F9A8F /* Tab View.app */;
110 | productType = "com.apple.product-type.application";
111 | };
112 | /* End PBXNativeTarget section */
113 |
114 | /* Begin PBXProject section */
115 | 27896C0D265BF5D8007F9A8F /* Project object */ = {
116 | isa = PBXProject;
117 | attributes = {
118 | LastSwiftUpdateCheck = 1250;
119 | LastUpgradeCheck = 1250;
120 | TargetAttributes = {
121 | 27896C14265BF5D8007F9A8F = {
122 | CreatedOnToolsVersion = 12.5;
123 | };
124 | };
125 | };
126 | buildConfigurationList = 27896C10265BF5D8007F9A8F /* Build configuration list for PBXProject "Tab View" */;
127 | compatibilityVersion = "Xcode 9.3";
128 | developmentRegion = en;
129 | hasScannedForEncodings = 0;
130 | knownRegions = (
131 | en,
132 | Base,
133 | );
134 | mainGroup = 27896C0C265BF5D8007F9A8F;
135 | productRefGroup = 27896C16265BF5D8007F9A8F /* Products */;
136 | projectDirPath = "";
137 | projectRoot = "";
138 | targets = (
139 | 27896C14265BF5D8007F9A8F /* Tab View */,
140 | );
141 | };
142 | /* End PBXProject section */
143 |
144 | /* Begin PBXResourcesBuildPhase section */
145 | 27896C13265BF5D8007F9A8F /* Resources */ = {
146 | isa = PBXResourcesBuildPhase;
147 | buildActionMask = 2147483647;
148 | files = (
149 | 27896C20265BF5D9007F9A8F /* Preview Assets.xcassets in Resources */,
150 | 27896C1D265BF5D9007F9A8F /* Assets.xcassets in Resources */,
151 | );
152 | runOnlyForDeploymentPostprocessing = 0;
153 | };
154 | /* End PBXResourcesBuildPhase section */
155 |
156 | /* Begin PBXSourcesBuildPhase section */
157 | 27896C11265BF5D8007F9A8F /* Sources */ = {
158 | isa = PBXSourcesBuildPhase;
159 | buildActionMask = 2147483647;
160 | files = (
161 | 27896C1B265BF5D8007F9A8F /* ContentView.swift in Sources */,
162 | 27896C28265BF5FA007F9A8F /* TabOneView.swift in Sources */,
163 | 27896C2C265BF60F007F9A8F /* TabThreeView.swift in Sources */,
164 | 27896C19265BF5D8007F9A8F /* Tab_ViewApp.swift in Sources */,
165 | 27896C2E265BF617007F9A8F /* TabFourView.swift in Sources */,
166 | 27896C2A265BF604007F9A8F /* TabTwoView.swift in Sources */,
167 | );
168 | runOnlyForDeploymentPostprocessing = 0;
169 | };
170 | /* End PBXSourcesBuildPhase section */
171 |
172 | /* Begin XCBuildConfiguration section */
173 | 27896C22265BF5D9007F9A8F /* Debug */ = {
174 | isa = XCBuildConfiguration;
175 | buildSettings = {
176 | ALWAYS_SEARCH_USER_PATHS = NO;
177 | CLANG_ANALYZER_NONNULL = YES;
178 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
179 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
180 | CLANG_CXX_LIBRARY = "libc++";
181 | CLANG_ENABLE_MODULES = YES;
182 | CLANG_ENABLE_OBJC_ARC = YES;
183 | CLANG_ENABLE_OBJC_WEAK = YES;
184 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
185 | CLANG_WARN_BOOL_CONVERSION = YES;
186 | CLANG_WARN_COMMA = YES;
187 | CLANG_WARN_CONSTANT_CONVERSION = YES;
188 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
189 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
190 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
191 | CLANG_WARN_EMPTY_BODY = YES;
192 | CLANG_WARN_ENUM_CONVERSION = YES;
193 | CLANG_WARN_INFINITE_RECURSION = YES;
194 | CLANG_WARN_INT_CONVERSION = YES;
195 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
196 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
197 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
198 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
199 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
200 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
201 | CLANG_WARN_STRICT_PROTOTYPES = YES;
202 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
203 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
204 | CLANG_WARN_UNREACHABLE_CODE = YES;
205 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
206 | COPY_PHASE_STRIP = NO;
207 | DEBUG_INFORMATION_FORMAT = dwarf;
208 | ENABLE_STRICT_OBJC_MSGSEND = YES;
209 | ENABLE_TESTABILITY = YES;
210 | GCC_C_LANGUAGE_STANDARD = gnu11;
211 | GCC_DYNAMIC_NO_PIC = NO;
212 | GCC_NO_COMMON_BLOCKS = YES;
213 | GCC_OPTIMIZATION_LEVEL = 0;
214 | GCC_PREPROCESSOR_DEFINITIONS = (
215 | "DEBUG=1",
216 | "$(inherited)",
217 | );
218 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
219 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
220 | GCC_WARN_UNDECLARED_SELECTOR = YES;
221 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
222 | GCC_WARN_UNUSED_FUNCTION = YES;
223 | GCC_WARN_UNUSED_VARIABLE = YES;
224 | IPHONEOS_DEPLOYMENT_TARGET = 14.5;
225 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
226 | MTL_FAST_MATH = YES;
227 | ONLY_ACTIVE_ARCH = YES;
228 | SDKROOT = iphoneos;
229 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
230 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
231 | };
232 | name = Debug;
233 | };
234 | 27896C23265BF5D9007F9A8F /* Release */ = {
235 | isa = XCBuildConfiguration;
236 | buildSettings = {
237 | ALWAYS_SEARCH_USER_PATHS = NO;
238 | CLANG_ANALYZER_NONNULL = YES;
239 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
240 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
241 | CLANG_CXX_LIBRARY = "libc++";
242 | CLANG_ENABLE_MODULES = YES;
243 | CLANG_ENABLE_OBJC_ARC = YES;
244 | CLANG_ENABLE_OBJC_WEAK = YES;
245 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
246 | CLANG_WARN_BOOL_CONVERSION = YES;
247 | CLANG_WARN_COMMA = YES;
248 | CLANG_WARN_CONSTANT_CONVERSION = YES;
249 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
250 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
251 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
252 | CLANG_WARN_EMPTY_BODY = YES;
253 | CLANG_WARN_ENUM_CONVERSION = YES;
254 | CLANG_WARN_INFINITE_RECURSION = YES;
255 | CLANG_WARN_INT_CONVERSION = YES;
256 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
257 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
258 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
259 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
260 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
261 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
262 | CLANG_WARN_STRICT_PROTOTYPES = YES;
263 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
264 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
265 | CLANG_WARN_UNREACHABLE_CODE = YES;
266 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
267 | COPY_PHASE_STRIP = NO;
268 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
269 | ENABLE_NS_ASSERTIONS = NO;
270 | ENABLE_STRICT_OBJC_MSGSEND = YES;
271 | GCC_C_LANGUAGE_STANDARD = gnu11;
272 | GCC_NO_COMMON_BLOCKS = YES;
273 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
274 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
275 | GCC_WARN_UNDECLARED_SELECTOR = YES;
276 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
277 | GCC_WARN_UNUSED_FUNCTION = YES;
278 | GCC_WARN_UNUSED_VARIABLE = YES;
279 | IPHONEOS_DEPLOYMENT_TARGET = 14.5;
280 | MTL_ENABLE_DEBUG_INFO = NO;
281 | MTL_FAST_MATH = YES;
282 | SDKROOT = iphoneos;
283 | SWIFT_COMPILATION_MODE = wholemodule;
284 | SWIFT_OPTIMIZATION_LEVEL = "-O";
285 | VALIDATE_PRODUCT = YES;
286 | };
287 | name = Release;
288 | };
289 | 27896C25265BF5D9007F9A8F /* Debug */ = {
290 | isa = XCBuildConfiguration;
291 | buildSettings = {
292 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
293 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
294 | CODE_SIGN_STYLE = Automatic;
295 | DEVELOPMENT_ASSET_PATHS = "\"Tab View/Preview Content\"";
296 | DEVELOPMENT_TEAM = Y2CV739CMW;
297 | ENABLE_PREVIEWS = YES;
298 | INFOPLIST_FILE = "Tab View/Info.plist";
299 | IPHONEOS_DEPLOYMENT_TARGET = 14.0;
300 | LD_RUNPATH_SEARCH_PATHS = (
301 | "$(inherited)",
302 | "@executable_path/Frameworks",
303 | );
304 | PRODUCT_BUNDLE_IDENTIFIER = "com.stugreenham.Tab-View";
305 | PRODUCT_NAME = "$(TARGET_NAME)";
306 | SWIFT_VERSION = 5.0;
307 | TARGETED_DEVICE_FAMILY = "1,2";
308 | };
309 | name = Debug;
310 | };
311 | 27896C26265BF5D9007F9A8F /* Release */ = {
312 | isa = XCBuildConfiguration;
313 | buildSettings = {
314 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
315 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
316 | CODE_SIGN_STYLE = Automatic;
317 | DEVELOPMENT_ASSET_PATHS = "\"Tab View/Preview Content\"";
318 | DEVELOPMENT_TEAM = Y2CV739CMW;
319 | ENABLE_PREVIEWS = YES;
320 | INFOPLIST_FILE = "Tab View/Info.plist";
321 | IPHONEOS_DEPLOYMENT_TARGET = 14.0;
322 | LD_RUNPATH_SEARCH_PATHS = (
323 | "$(inherited)",
324 | "@executable_path/Frameworks",
325 | );
326 | PRODUCT_BUNDLE_IDENTIFIER = "com.stugreenham.Tab-View";
327 | PRODUCT_NAME = "$(TARGET_NAME)";
328 | SWIFT_VERSION = 5.0;
329 | TARGETED_DEVICE_FAMILY = "1,2";
330 | };
331 | name = Release;
332 | };
333 | /* End XCBuildConfiguration section */
334 |
335 | /* Begin XCConfigurationList section */
336 | 27896C10265BF5D8007F9A8F /* Build configuration list for PBXProject "Tab View" */ = {
337 | isa = XCConfigurationList;
338 | buildConfigurations = (
339 | 27896C22265BF5D9007F9A8F /* Debug */,
340 | 27896C23265BF5D9007F9A8F /* Release */,
341 | );
342 | defaultConfigurationIsVisible = 0;
343 | defaultConfigurationName = Release;
344 | };
345 | 27896C24265BF5D9007F9A8F /* Build configuration list for PBXNativeTarget "Tab View" */ = {
346 | isa = XCConfigurationList;
347 | buildConfigurations = (
348 | 27896C25265BF5D9007F9A8F /* Debug */,
349 | 27896C26265BF5D9007F9A8F /* Release */,
350 | );
351 | defaultConfigurationIsVisible = 0;
352 | defaultConfigurationName = Release;
353 | };
354 | /* End XCConfigurationList section */
355 | };
356 | rootObject = 27896C0D265BF5D8007F9A8F /* Project object */;
357 | }
358 |
--------------------------------------------------------------------------------
/Tab View/Tab View.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Tab View/Tab View.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Tab View/Tab View.xcodeproj/xcshareddata/xcschemes/Tab View.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
45 |
51 |
52 |
53 |
54 |
60 |
62 |
68 |
69 |
70 |
71 |
73 |
74 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/Tab View/Tab View/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Tab View/Tab View/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "scale" : "2x",
6 | "size" : "20x20"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "scale" : "3x",
11 | "size" : "20x20"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "scale" : "2x",
16 | "size" : "29x29"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "scale" : "3x",
21 | "size" : "29x29"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "scale" : "2x",
26 | "size" : "40x40"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "scale" : "3x",
31 | "size" : "40x40"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "scale" : "2x",
36 | "size" : "60x60"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "scale" : "3x",
41 | "size" : "60x60"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "scale" : "1x",
46 | "size" : "20x20"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "scale" : "2x",
51 | "size" : "20x20"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "scale" : "1x",
56 | "size" : "29x29"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "scale" : "2x",
61 | "size" : "29x29"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "scale" : "1x",
66 | "size" : "40x40"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "scale" : "2x",
71 | "size" : "40x40"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "scale" : "1x",
76 | "size" : "76x76"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "scale" : "2x",
81 | "size" : "76x76"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "scale" : "2x",
86 | "size" : "83.5x83.5"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "scale" : "1x",
91 | "size" : "1024x1024"
92 | }
93 | ],
94 | "info" : {
95 | "author" : "xcode",
96 | "version" : 1
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/Tab View/Tab View/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Tab View/Tab View/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // Boilerplate Tab View
4 | //
5 | // Created by Stu Greenham on 24/05/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ContentView: View {
11 | var body: some View {
12 |
13 | TabView {
14 |
15 | TabOneView().tabItem {
16 | Image(systemName: "house.fill")
17 | Text("Tab Label 1")
18 | }
19 |
20 | TabTwoView().tabItem {
21 | Image(systemName: "gamecontroller.fill")
22 | Text("Tab Label 2")
23 | }
24 |
25 | TabThreeView().tabItem {
26 | Image(systemName: "bolt.fill")
27 | Text("Tab Label 3")
28 | }
29 |
30 | TabFourView().tabItem {
31 | Image(systemName: "graduationcap.fill")
32 | Text("Tab Label 4")
33 | }
34 |
35 | }
36 |
37 | }
38 | }
39 |
40 | struct ContentView_Previews: PreviewProvider {
41 | static var previews: some View {
42 | ContentView()
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/Tab View/Tab View/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UIApplicationSceneManifest
24 |
25 | UIApplicationSupportsMultipleScenes
26 |
27 |
28 | UIApplicationSupportsIndirectInputEvents
29 |
30 | UILaunchScreen
31 |
32 | UIRequiredDeviceCapabilities
33 |
34 | armv7
35 |
36 | UISupportedInterfaceOrientations
37 |
38 | UIInterfaceOrientationPortrait
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UISupportedInterfaceOrientations~ipad
43 |
44 | UIInterfaceOrientationPortrait
45 | UIInterfaceOrientationPortraitUpsideDown
46 | UIInterfaceOrientationLandscapeLeft
47 | UIInterfaceOrientationLandscapeRight
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/Tab View/Tab View/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Tab View/Tab View/Tab_ViewApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Tab_ViewApp.swift
3 | // Tab View
4 | //
5 | // Created by Stu Greenham on 24/05/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct Tab_ViewApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | ContentView()
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Tab View/Tab View/View/TabFourView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TabFourView.swift
3 | // Boilerplate Tab View
4 | //
5 | // Created by Stu Greenham on 24/05/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct TabFourView: View {
11 | var body: some View {
12 | Text("Tab Three")
13 | }
14 | }
15 |
16 | struct TabFourView_Previews: PreviewProvider {
17 | static var previews: some View {
18 | TabFourView()
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Tab View/Tab View/View/TabOneView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TabOneView.swift
3 | // Boilerplate Tab View
4 | //
5 | // Created by Stu Greenham on 24/05/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct TabOneView: View {
11 | var body: some View {
12 | Text("Tab One")
13 | }
14 | }
15 |
16 | struct TabOneView_Previews: PreviewProvider {
17 | static var previews: some View {
18 | TabOneView()
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Tab View/Tab View/View/TabThreeView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TabThreeView.swift
3 | // Boilerplate Tab View
4 | //
5 | // Created by Stu Greenham on 24/05/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct TabThreeView: View {
11 | var body: some View {
12 | Text("Tab Four")
13 | }
14 | }
15 |
16 | struct TabThreeView_Previews: PreviewProvider {
17 | static var previews: some View {
18 | TabThreeView()
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Tab View/Tab View/View/TabTwoView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TabTwoView.swift
3 | // Boilerplate Tab View
4 | //
5 | // Created by Stu Greenham on 24/05/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct TabTwoView: View {
11 | var body: some View {
12 | Text("Tab Two")
13 | }
14 | }
15 |
16 | struct TabTwoView_Previews: PreviewProvider {
17 | static var previews: some View {
18 | TabTwoView()
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Welcome Screen/Welcome Screen.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 55;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 27E7AD8E27AF24E0002202DE /* Welcome_ScreenApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E7AD8D27AF24E0002202DE /* Welcome_ScreenApp.swift */; };
11 | 27E7AD9027AF24E0002202DE /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E7AD8F27AF24E0002202DE /* ContentView.swift */; };
12 | 27E7AD9227AF24E2002202DE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 27E7AD9127AF24E2002202DE /* Assets.xcassets */; };
13 | 27E7AD9527AF24E2002202DE /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 27E7AD9427AF24E2002202DE /* Preview Assets.xcassets */; };
14 | 27E7AD9C27AF270B002202DE /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E7AD9B27AF270B002202DE /* WelcomeView.swift */; };
15 | /* End PBXBuildFile section */
16 |
17 | /* Begin PBXFileReference section */
18 | 27E7AD8A27AF24E0002202DE /* Welcome Screen.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Welcome Screen.app"; sourceTree = BUILT_PRODUCTS_DIR; };
19 | 27E7AD8D27AF24E0002202DE /* Welcome_ScreenApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Welcome_ScreenApp.swift; sourceTree = ""; };
20 | 27E7AD8F27AF24E0002202DE /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
21 | 27E7AD9127AF24E2002202DE /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
22 | 27E7AD9427AF24E2002202DE /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
23 | 27E7AD9B27AF270B002202DE /* WelcomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeView.swift; sourceTree = ""; };
24 | /* End PBXFileReference section */
25 |
26 | /* Begin PBXFrameworksBuildPhase section */
27 | 27E7AD8727AF24E0002202DE /* Frameworks */ = {
28 | isa = PBXFrameworksBuildPhase;
29 | buildActionMask = 2147483647;
30 | files = (
31 | );
32 | runOnlyForDeploymentPostprocessing = 0;
33 | };
34 | /* End PBXFrameworksBuildPhase section */
35 |
36 | /* Begin PBXGroup section */
37 | 27E7AD8127AF24E0002202DE = {
38 | isa = PBXGroup;
39 | children = (
40 | 27E7AD8C27AF24E0002202DE /* Welcome Screen */,
41 | 27E7AD8B27AF24E0002202DE /* Products */,
42 | );
43 | sourceTree = "";
44 | };
45 | 27E7AD8B27AF24E0002202DE /* Products */ = {
46 | isa = PBXGroup;
47 | children = (
48 | 27E7AD8A27AF24E0002202DE /* Welcome Screen.app */,
49 | );
50 | name = Products;
51 | sourceTree = "";
52 | };
53 | 27E7AD8C27AF24E0002202DE /* Welcome Screen */ = {
54 | isa = PBXGroup;
55 | children = (
56 | 27E7AD8D27AF24E0002202DE /* Welcome_ScreenApp.swift */,
57 | 27E7AD8F27AF24E0002202DE /* ContentView.swift */,
58 | 27E7AD9B27AF270B002202DE /* WelcomeView.swift */,
59 | 27E7AD9127AF24E2002202DE /* Assets.xcassets */,
60 | 27E7AD9327AF24E2002202DE /* Preview Content */,
61 | );
62 | path = "Welcome Screen";
63 | sourceTree = "";
64 | };
65 | 27E7AD9327AF24E2002202DE /* Preview Content */ = {
66 | isa = PBXGroup;
67 | children = (
68 | 27E7AD9427AF24E2002202DE /* Preview Assets.xcassets */,
69 | );
70 | path = "Preview Content";
71 | sourceTree = "";
72 | };
73 | /* End PBXGroup section */
74 |
75 | /* Begin PBXNativeTarget section */
76 | 27E7AD8927AF24E0002202DE /* Welcome Screen */ = {
77 | isa = PBXNativeTarget;
78 | buildConfigurationList = 27E7AD9827AF24E2002202DE /* Build configuration list for PBXNativeTarget "Welcome Screen" */;
79 | buildPhases = (
80 | 27E7AD8627AF24E0002202DE /* Sources */,
81 | 27E7AD8727AF24E0002202DE /* Frameworks */,
82 | 27E7AD8827AF24E0002202DE /* Resources */,
83 | );
84 | buildRules = (
85 | );
86 | dependencies = (
87 | );
88 | name = "Welcome Screen";
89 | productName = "Welcome Screen";
90 | productReference = 27E7AD8A27AF24E0002202DE /* Welcome Screen.app */;
91 | productType = "com.apple.product-type.application";
92 | };
93 | /* End PBXNativeTarget section */
94 |
95 | /* Begin PBXProject section */
96 | 27E7AD8227AF24E0002202DE /* Project object */ = {
97 | isa = PBXProject;
98 | attributes = {
99 | BuildIndependentTargetsInParallel = 1;
100 | LastSwiftUpdateCheck = 1320;
101 | LastUpgradeCheck = 1320;
102 | TargetAttributes = {
103 | 27E7AD8927AF24E0002202DE = {
104 | CreatedOnToolsVersion = 13.2.1;
105 | };
106 | };
107 | };
108 | buildConfigurationList = 27E7AD8527AF24E0002202DE /* Build configuration list for PBXProject "Welcome Screen" */;
109 | compatibilityVersion = "Xcode 13.0";
110 | developmentRegion = en;
111 | hasScannedForEncodings = 0;
112 | knownRegions = (
113 | en,
114 | Base,
115 | );
116 | mainGroup = 27E7AD8127AF24E0002202DE;
117 | productRefGroup = 27E7AD8B27AF24E0002202DE /* Products */;
118 | projectDirPath = "";
119 | projectRoot = "";
120 | targets = (
121 | 27E7AD8927AF24E0002202DE /* Welcome Screen */,
122 | );
123 | };
124 | /* End PBXProject section */
125 |
126 | /* Begin PBXResourcesBuildPhase section */
127 | 27E7AD8827AF24E0002202DE /* Resources */ = {
128 | isa = PBXResourcesBuildPhase;
129 | buildActionMask = 2147483647;
130 | files = (
131 | 27E7AD9527AF24E2002202DE /* Preview Assets.xcassets in Resources */,
132 | 27E7AD9227AF24E2002202DE /* Assets.xcassets in Resources */,
133 | );
134 | runOnlyForDeploymentPostprocessing = 0;
135 | };
136 | /* End PBXResourcesBuildPhase section */
137 |
138 | /* Begin PBXSourcesBuildPhase section */
139 | 27E7AD8627AF24E0002202DE /* Sources */ = {
140 | isa = PBXSourcesBuildPhase;
141 | buildActionMask = 2147483647;
142 | files = (
143 | 27E7AD9027AF24E0002202DE /* ContentView.swift in Sources */,
144 | 27E7AD9C27AF270B002202DE /* WelcomeView.swift in Sources */,
145 | 27E7AD8E27AF24E0002202DE /* Welcome_ScreenApp.swift in Sources */,
146 | );
147 | runOnlyForDeploymentPostprocessing = 0;
148 | };
149 | /* End PBXSourcesBuildPhase section */
150 |
151 | /* Begin XCBuildConfiguration section */
152 | 27E7AD9627AF24E2002202DE /* Debug */ = {
153 | isa = XCBuildConfiguration;
154 | buildSettings = {
155 | ALWAYS_SEARCH_USER_PATHS = NO;
156 | CLANG_ANALYZER_NONNULL = YES;
157 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
158 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
159 | CLANG_CXX_LIBRARY = "libc++";
160 | CLANG_ENABLE_MODULES = YES;
161 | CLANG_ENABLE_OBJC_ARC = YES;
162 | CLANG_ENABLE_OBJC_WEAK = YES;
163 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
164 | CLANG_WARN_BOOL_CONVERSION = YES;
165 | CLANG_WARN_COMMA = YES;
166 | CLANG_WARN_CONSTANT_CONVERSION = YES;
167 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
168 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
169 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
170 | CLANG_WARN_EMPTY_BODY = YES;
171 | CLANG_WARN_ENUM_CONVERSION = YES;
172 | CLANG_WARN_INFINITE_RECURSION = YES;
173 | CLANG_WARN_INT_CONVERSION = YES;
174 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
175 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
176 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
177 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
178 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
179 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
180 | CLANG_WARN_STRICT_PROTOTYPES = YES;
181 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
182 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
183 | CLANG_WARN_UNREACHABLE_CODE = YES;
184 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
185 | COPY_PHASE_STRIP = NO;
186 | DEBUG_INFORMATION_FORMAT = dwarf;
187 | ENABLE_STRICT_OBJC_MSGSEND = YES;
188 | ENABLE_TESTABILITY = YES;
189 | GCC_C_LANGUAGE_STANDARD = gnu11;
190 | GCC_DYNAMIC_NO_PIC = NO;
191 | GCC_NO_COMMON_BLOCKS = YES;
192 | GCC_OPTIMIZATION_LEVEL = 0;
193 | GCC_PREPROCESSOR_DEFINITIONS = (
194 | "DEBUG=1",
195 | "$(inherited)",
196 | );
197 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
198 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
199 | GCC_WARN_UNDECLARED_SELECTOR = YES;
200 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
201 | GCC_WARN_UNUSED_FUNCTION = YES;
202 | GCC_WARN_UNUSED_VARIABLE = YES;
203 | IPHONEOS_DEPLOYMENT_TARGET = 15.2;
204 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
205 | MTL_FAST_MATH = YES;
206 | ONLY_ACTIVE_ARCH = YES;
207 | SDKROOT = iphoneos;
208 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
209 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
210 | };
211 | name = Debug;
212 | };
213 | 27E7AD9727AF24E2002202DE /* Release */ = {
214 | isa = XCBuildConfiguration;
215 | buildSettings = {
216 | ALWAYS_SEARCH_USER_PATHS = NO;
217 | CLANG_ANALYZER_NONNULL = YES;
218 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
219 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
220 | CLANG_CXX_LIBRARY = "libc++";
221 | CLANG_ENABLE_MODULES = YES;
222 | CLANG_ENABLE_OBJC_ARC = YES;
223 | CLANG_ENABLE_OBJC_WEAK = YES;
224 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
225 | CLANG_WARN_BOOL_CONVERSION = YES;
226 | CLANG_WARN_COMMA = YES;
227 | CLANG_WARN_CONSTANT_CONVERSION = YES;
228 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
229 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
230 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
231 | CLANG_WARN_EMPTY_BODY = YES;
232 | CLANG_WARN_ENUM_CONVERSION = YES;
233 | CLANG_WARN_INFINITE_RECURSION = YES;
234 | CLANG_WARN_INT_CONVERSION = YES;
235 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
236 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
237 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
238 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
239 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
240 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
241 | CLANG_WARN_STRICT_PROTOTYPES = YES;
242 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
243 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
244 | CLANG_WARN_UNREACHABLE_CODE = YES;
245 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
246 | COPY_PHASE_STRIP = NO;
247 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
248 | ENABLE_NS_ASSERTIONS = NO;
249 | ENABLE_STRICT_OBJC_MSGSEND = YES;
250 | GCC_C_LANGUAGE_STANDARD = gnu11;
251 | GCC_NO_COMMON_BLOCKS = YES;
252 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
253 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
254 | GCC_WARN_UNDECLARED_SELECTOR = YES;
255 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
256 | GCC_WARN_UNUSED_FUNCTION = YES;
257 | GCC_WARN_UNUSED_VARIABLE = YES;
258 | IPHONEOS_DEPLOYMENT_TARGET = 15.2;
259 | MTL_ENABLE_DEBUG_INFO = NO;
260 | MTL_FAST_MATH = YES;
261 | SDKROOT = iphoneos;
262 | SWIFT_COMPILATION_MODE = wholemodule;
263 | SWIFT_OPTIMIZATION_LEVEL = "-O";
264 | VALIDATE_PRODUCT = YES;
265 | };
266 | name = Release;
267 | };
268 | 27E7AD9927AF24E2002202DE /* Debug */ = {
269 | isa = XCBuildConfiguration;
270 | buildSettings = {
271 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
272 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
273 | CODE_SIGN_STYLE = Automatic;
274 | CURRENT_PROJECT_VERSION = 1;
275 | DEVELOPMENT_ASSET_PATHS = "\"Welcome Screen/Preview Content\"";
276 | DEVELOPMENT_TEAM = Y2CV739CMW;
277 | ENABLE_PREVIEWS = YES;
278 | GENERATE_INFOPLIST_FILE = YES;
279 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
280 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
281 | INFOPLIST_KEY_UILaunchScreen_Generation = YES;
282 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
283 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
284 | LD_RUNPATH_SEARCH_PATHS = (
285 | "$(inherited)",
286 | "@executable_path/Frameworks",
287 | );
288 | MARKETING_VERSION = 1.0;
289 | PRODUCT_BUNDLE_IDENTIFIER = "com.stugreenham.Welcome-Screen";
290 | PRODUCT_NAME = "$(TARGET_NAME)";
291 | SWIFT_EMIT_LOC_STRINGS = YES;
292 | SWIFT_VERSION = 5.0;
293 | TARGETED_DEVICE_FAMILY = "1,2";
294 | };
295 | name = Debug;
296 | };
297 | 27E7AD9A27AF24E2002202DE /* Release */ = {
298 | isa = XCBuildConfiguration;
299 | buildSettings = {
300 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
301 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
302 | CODE_SIGN_STYLE = Automatic;
303 | CURRENT_PROJECT_VERSION = 1;
304 | DEVELOPMENT_ASSET_PATHS = "\"Welcome Screen/Preview Content\"";
305 | DEVELOPMENT_TEAM = Y2CV739CMW;
306 | ENABLE_PREVIEWS = YES;
307 | GENERATE_INFOPLIST_FILE = YES;
308 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
309 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
310 | INFOPLIST_KEY_UILaunchScreen_Generation = YES;
311 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
312 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
313 | LD_RUNPATH_SEARCH_PATHS = (
314 | "$(inherited)",
315 | "@executable_path/Frameworks",
316 | );
317 | MARKETING_VERSION = 1.0;
318 | PRODUCT_BUNDLE_IDENTIFIER = "com.stugreenham.Welcome-Screen";
319 | PRODUCT_NAME = "$(TARGET_NAME)";
320 | SWIFT_EMIT_LOC_STRINGS = YES;
321 | SWIFT_VERSION = 5.0;
322 | TARGETED_DEVICE_FAMILY = "1,2";
323 | };
324 | name = Release;
325 | };
326 | /* End XCBuildConfiguration section */
327 |
328 | /* Begin XCConfigurationList section */
329 | 27E7AD8527AF24E0002202DE /* Build configuration list for PBXProject "Welcome Screen" */ = {
330 | isa = XCConfigurationList;
331 | buildConfigurations = (
332 | 27E7AD9627AF24E2002202DE /* Debug */,
333 | 27E7AD9727AF24E2002202DE /* Release */,
334 | );
335 | defaultConfigurationIsVisible = 0;
336 | defaultConfigurationName = Release;
337 | };
338 | 27E7AD9827AF24E2002202DE /* Build configuration list for PBXNativeTarget "Welcome Screen" */ = {
339 | isa = XCConfigurationList;
340 | buildConfigurations = (
341 | 27E7AD9927AF24E2002202DE /* Debug */,
342 | 27E7AD9A27AF24E2002202DE /* Release */,
343 | );
344 | defaultConfigurationIsVisible = 0;
345 | defaultConfigurationName = Release;
346 | };
347 | /* End XCConfigurationList section */
348 | };
349 | rootObject = 27E7AD8227AF24E0002202DE /* Project object */;
350 | }
351 |
--------------------------------------------------------------------------------
/Welcome Screen/Welcome Screen.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Welcome Screen/Welcome Screen.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Welcome Screen/Welcome Screen/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Welcome Screen/Welcome Screen/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "scale" : "2x",
6 | "size" : "20x20"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "scale" : "3x",
11 | "size" : "20x20"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "scale" : "2x",
16 | "size" : "29x29"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "scale" : "3x",
21 | "size" : "29x29"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "scale" : "2x",
26 | "size" : "40x40"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "scale" : "3x",
31 | "size" : "40x40"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "scale" : "2x",
36 | "size" : "60x60"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "scale" : "3x",
41 | "size" : "60x60"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "scale" : "1x",
46 | "size" : "20x20"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "scale" : "2x",
51 | "size" : "20x20"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "scale" : "1x",
56 | "size" : "29x29"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "scale" : "2x",
61 | "size" : "29x29"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "scale" : "1x",
66 | "size" : "40x40"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "scale" : "2x",
71 | "size" : "40x40"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "scale" : "1x",
76 | "size" : "76x76"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "scale" : "2x",
81 | "size" : "76x76"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "scale" : "2x",
86 | "size" : "83.5x83.5"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "scale" : "1x",
91 | "size" : "1024x1024"
92 | }
93 | ],
94 | "info" : {
95 | "author" : "xcode",
96 | "version" : 1
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/Welcome Screen/Welcome Screen/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Welcome Screen/Welcome Screen/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // Welcome Screen
4 | //
5 | // Created by Stu Greenham on 05/02/2022.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ContentView: View {
11 |
12 | //: MARK: - PROPERTIES
13 | @AppStorage("displayWelcomeScreen") var displayWelcomeScreen: Bool = true
14 |
15 | //: MARK: - BODY
16 | var body: some View {
17 |
18 | if displayWelcomeScreen {
19 | WelcomeView()
20 | } else {
21 | Text("Hello, world!")
22 | .padding()
23 | }
24 |
25 | }
26 | }
27 |
28 |
29 | //: MARK: - PREVIEW
30 | struct ContentView_Previews: PreviewProvider {
31 | static var previews: some View {
32 | ContentView()
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Welcome Screen/Welcome Screen/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Welcome Screen/Welcome Screen/WelcomeView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // WelcomeView.swift
3 | // Welcome Screen
4 | //
5 | // Created by Stu Greenham on 05/02/2022.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct WelcomeView: View {
11 |
12 | //: MARK: - PROPERTIES
13 | @AppStorage("displayWelcomeScreen") var displayWelcomeScreen: Bool = true
14 |
15 | //: MARK: - BODY
16 | var body: some View {
17 |
18 | VStack(alignment: .center) {
19 |
20 | Spacer()
21 |
22 | // Title
23 | Text("Welcome to my app")
24 | .font(.title)
25 | .fontWeight(.heavy)
26 | .multilineTextAlignment(.center)
27 | .padding(.top, 32)
28 |
29 | // Features
30 | VStack(alignment: .leading) {
31 |
32 | WelcomeRow(
33 | title: "Slick User Interface",
34 | subCopy: "Navigate our app with ease, using it's simple and intuitive UI.",
35 | imageName: "wand.and.stars")
36 |
37 | WelcomeRow(
38 | title: "Dark Mode Support",
39 | subCopy: "Pick the theme that works for you, or let us automate it.",
40 | imageName: "switch.2")
41 |
42 | WelcomeRow(
43 | title: "Multi Device",
44 | subCopy: "Sync content across all your devices using iCloud.",
45 | imageName: "icloud")
46 |
47 | }
48 | .padding(.horizontal)
49 | .padding(.top, 24)
50 |
51 | Spacer()
52 |
53 | // Button
54 | Button(action: {
55 | displayWelcomeScreen = false
56 | }) {
57 | Text("Get Started")
58 | }
59 | .foregroundColor(.white)
60 | .font(.headline)
61 | .padding()
62 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .center)
63 | .background(RoundedRectangle(cornerRadius: 15, style: .continuous)
64 | .fill(Color.accentColor))
65 |
66 | } // VStack
67 | .padding(.horizontal)
68 |
69 | }
70 | }
71 |
72 |
73 | struct WelcomeRow: View {
74 | var title: String = "Title"
75 | var subCopy: String = "Sub Title"
76 | var imageName: String = "car"
77 |
78 | //: MARK: - BODY
79 | var body: some View {
80 | HStack(alignment: .center) {
81 | Image(systemName: imageName)
82 | .font(.largeTitle)
83 | .foregroundColor(.gray)
84 | .padding(12)
85 | .accessibility(hidden: true)
86 |
87 | VStack(alignment: .leading) {
88 | Text(title)
89 | .font(.headline)
90 | .fontWeight(.bold)
91 | .foregroundColor(.primary)
92 | .accessibility(addTraits: .isHeader)
93 |
94 | Text(subCopy)
95 | .font(.body)
96 | .foregroundColor(.secondary)
97 | .fixedSize(horizontal: false, vertical: true)
98 | }
99 | }
100 | .padding(.top, 4)
101 | }
102 | }
103 |
104 |
105 | //: MARK: - PROPERTIES
106 | struct WelcomeView_Previews: PreviewProvider {
107 | static var previews: some View {
108 | WelcomeView()
109 | }
110 | }
111 |
--------------------------------------------------------------------------------
/Welcome Screen/Welcome Screen/Welcome_ScreenApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Welcome_ScreenApp.swift
3 | // Welcome Screen
4 | //
5 | // Created by Stu Greenham on 05/02/2022.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct Welcome_ScreenApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | ContentView()
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------