├── .gitattributes ├── .gitignore ├── README.md ├── Shared ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── Contents.json ├── ContentView.swift └── d3_custom_navigation_swiftuiApp.swift ├── d3-custom-navigation-swiftui.xcodeproj ├── project.pbxproj └── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ └── IDEWorkspaceChecks.plist └── macOS └── macOS.entitlements /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | /*.xcodeproj 5 | xcuserdata/ 6 | DerivedData/ 7 | .swiftpm/ 8 | *.pbxproj 9 | d3-custom-navigation-swiftui.xcodeproj/project.pbxproj 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Custom navigation swiftui 2 | 3 | 4 | Experimenting with navigation link. if you find this idea interesting you can take and expend it into a more powerful solution. 5 | [Live youtube](https://youtu.be/_wbJqWjqCO0) 6 | 7 | ## The result navigation 8 | ```swift 9 | 10 | @State var route : Router = .empty 11 | 12 | var body: some View { 13 | NavigationView{ 14 | VStack{ 15 | Button("go1") { route = .go1} 16 | Button("go2") { route = .go2} 17 | Button("go3") { route = .go3} 18 | }.navigation(route: $route) 19 | 20 | }.navigationViewStyle(.stack) 21 | } 22 | ``` 23 | 24 | ### 1. Define sub view 25 | ```swift 26 | struct SubView: View { 27 | 28 | let text: String 29 | 30 | var body: some View { 31 | Text("\(text)") 32 | } 33 | } 34 | ``` 35 | 36 | ### 2. Define routes 37 | ```swift 38 | enum Router { 39 | case go1 40 | case go2 41 | case go3 42 | case empty 43 | 44 | @ViewBuilder 45 | var builder: some View { 46 | switch(self) { 47 | case .go1: SubView(text: "go1") 48 | case .go2: SubView(text: "go2") 49 | case .go3: SubView(text: "go3") 50 | default: EmptyView() 51 | } 52 | } 53 | } 54 | ``` 55 | ### 3. Define view modifier 56 | ```swift 57 | struct NavigationModifire : ViewModifier{ 58 | 59 | @State var isActive : Bool = true 60 | 61 | @Binding var route : Router 62 | 63 | func body(content: Content) -> some View { 64 | content 65 | .background{ 66 | NavigationLink(destination : route.builder, isActive: $isActive ){ 67 | EmptyView() 68 | }.hidden() 69 | } 70 | .onChange(of: isActive){ 71 | if $0 == false { route = .empty } 72 | } 73 | } 74 | 75 | } 76 | 77 | extension View{ 78 | @ViewBuilder 79 | func navigation(route : Binding) -> some View{ 80 | if route.wrappedValue != .empty{ 81 | modifier(NavigationModifire(route: route)) 82 | }else { self } 83 | } 84 | } 85 | ``` 86 | 87 | 88 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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" : "2x", 76 | "size" : "76x76" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "scale" : "2x", 81 | "size" : "83.5x83.5" 82 | }, 83 | { 84 | "idiom" : "ios-marketing", 85 | "scale" : "1x", 86 | "size" : "1024x1024" 87 | }, 88 | { 89 | "idiom" : "mac", 90 | "scale" : "1x", 91 | "size" : "16x16" 92 | }, 93 | { 94 | "idiom" : "mac", 95 | "scale" : "2x", 96 | "size" : "16x16" 97 | }, 98 | { 99 | "idiom" : "mac", 100 | "scale" : "1x", 101 | "size" : "32x32" 102 | }, 103 | { 104 | "idiom" : "mac", 105 | "scale" : "2x", 106 | "size" : "32x32" 107 | }, 108 | { 109 | "idiom" : "mac", 110 | "scale" : "1x", 111 | "size" : "128x128" 112 | }, 113 | { 114 | "idiom" : "mac", 115 | "scale" : "2x", 116 | "size" : "128x128" 117 | }, 118 | { 119 | "idiom" : "mac", 120 | "scale" : "1x", 121 | "size" : "256x256" 122 | }, 123 | { 124 | "idiom" : "mac", 125 | "scale" : "2x", 126 | "size" : "256x256" 127 | }, 128 | { 129 | "idiom" : "mac", 130 | "scale" : "1x", 131 | "size" : "512x512" 132 | }, 133 | { 134 | "idiom" : "mac", 135 | "scale" : "2x", 136 | "size" : "512x512" 137 | } 138 | ], 139 | "info" : { 140 | "author" : "xcode", 141 | "version" : 1 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Shared/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // Shared 4 | // 5 | // Created by Igor Shelopaev on 09.06.2022. 6 | // The link to the code is under the video 7 | // 8 | 9 | import SwiftUI 10 | 11 | // experimenting with nav link 12 | struct ContentView: View { 13 | @State var route: Router = .empty 14 | 15 | var body: some View { 16 | NavigationView { 17 | VStack { 18 | Button("go1") { route = .go1 } 19 | Button("go2") { route = .go2 } 20 | Button("go3") { route = .go3 } 21 | }.navigation(route: $route) 22 | }.navigationViewStyle(.stack) 23 | } 24 | } 25 | 26 | extension View { 27 | @ViewBuilder 28 | func navigation(route: Binding) -> some View { 29 | if route.wrappedValue != .empty { 30 | modifier(NavigationModifire(route: route)) 31 | } else { self } 32 | } 33 | } 34 | 35 | // MARK: - define view modifire 36 | 37 | struct NavigationModifire: ViewModifier { 38 | @State var isActive: Bool = true 39 | 40 | @Binding var route: Router 41 | 42 | func body(content: Content) -> some View { 43 | content 44 | .background { 45 | NavigationLink(destination: route.builder, isActive: $isActive) { 46 | EmptyView() 47 | }.hidden() 48 | } 49 | .onChange(of: isActive) { 50 | if $0 == false { route = .empty } 51 | } 52 | } 53 | } 54 | 55 | // MARK: - Define routes 56 | 57 | enum Router { 58 | case go1 59 | case go2 60 | case go3 61 | case empty 62 | 63 | @ViewBuilder 64 | var builder: some View { 65 | switch self { 66 | case .go1: SubView(text: "go1") 67 | case .go2: SubView(text: "go2") 68 | case .go3: SubView(text: "go3") 69 | default: EmptyView() 70 | } 71 | } 72 | } 73 | 74 | // MARK: - Define sub view 75 | 76 | struct SubView: View { 77 | let text: String 78 | 79 | var body: some View { 80 | Text("\(text)") 81 | } 82 | } 83 | 84 | struct ContentView_Previews: PreviewProvider { 85 | static var previews: some View { 86 | ContentView() 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /Shared/d3_custom_navigation_swiftuiApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // d3_custom_navigation_swiftuiApp.swift 3 | // Shared 4 | // 5 | // Created by Igor Shelopaev on 09.06.2022. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct d3_custom_navigation_swiftuiApp: App { 12 | var body: some Scene { 13 | WindowGroup { 14 | ContentView() 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /d3-custom-navigation-swiftui.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 55; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | B2C7168F2851E09F0020B958 /* d3_custom_navigation_swiftuiApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2C7167F2851E09E0020B958 /* d3_custom_navigation_swiftuiApp.swift */; }; 11 | B2C716902851E09F0020B958 /* d3_custom_navigation_swiftuiApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2C7167F2851E09E0020B958 /* d3_custom_navigation_swiftuiApp.swift */; }; 12 | B2C716912851E09F0020B958 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2C716802851E09E0020B958 /* ContentView.swift */; }; 13 | B2C716922851E09F0020B958 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2C716802851E09E0020B958 /* ContentView.swift */; }; 14 | B2C716932851E09F0020B958 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B2C716812851E09F0020B958 /* Assets.xcassets */; }; 15 | B2C716942851E09F0020B958 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B2C716812851E09F0020B958 /* Assets.xcassets */; }; 16 | B2C7169E285200510020B958 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = B2C7169D285200510020B958 /* README.md */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXFileReference section */ 20 | B2C7167F2851E09E0020B958 /* d3_custom_navigation_swiftuiApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = d3_custom_navigation_swiftuiApp.swift; sourceTree = ""; }; 21 | B2C716802851E09E0020B958 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 22 | B2C716812851E09F0020B958 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 23 | B2C716862851E09F0020B958 /* d3-custom-navigation-swiftui.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "d3-custom-navigation-swiftui.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 24 | B2C7168C2851E09F0020B958 /* d3-custom-navigation-swiftui.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "d3-custom-navigation-swiftui.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 25 | B2C7168E2851E09F0020B958 /* macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = macOS.entitlements; sourceTree = ""; }; 26 | B2C7169D285200510020B958 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 27 | /* End PBXFileReference section */ 28 | 29 | /* Begin PBXFrameworksBuildPhase section */ 30 | B2C716832851E09F0020B958 /* Frameworks */ = { 31 | isa = PBXFrameworksBuildPhase; 32 | buildActionMask = 2147483647; 33 | files = ( 34 | ); 35 | runOnlyForDeploymentPostprocessing = 0; 36 | }; 37 | B2C716892851E09F0020B958 /* Frameworks */ = { 38 | isa = PBXFrameworksBuildPhase; 39 | buildActionMask = 2147483647; 40 | files = ( 41 | ); 42 | runOnlyForDeploymentPostprocessing = 0; 43 | }; 44 | /* End PBXFrameworksBuildPhase section */ 45 | 46 | /* Begin PBXGroup section */ 47 | B2C716792851E09E0020B958 = { 48 | isa = PBXGroup; 49 | children = ( 50 | B2C7169D285200510020B958 /* README.md */, 51 | B2C7167E2851E09E0020B958 /* Shared */, 52 | B2C7168D2851E09F0020B958 /* macOS */, 53 | B2C716872851E09F0020B958 /* Products */, 54 | ); 55 | sourceTree = ""; 56 | }; 57 | B2C7167E2851E09E0020B958 /* Shared */ = { 58 | isa = PBXGroup; 59 | children = ( 60 | B2C7167F2851E09E0020B958 /* d3_custom_navigation_swiftuiApp.swift */, 61 | B2C716802851E09E0020B958 /* ContentView.swift */, 62 | B2C716812851E09F0020B958 /* Assets.xcassets */, 63 | ); 64 | path = Shared; 65 | sourceTree = ""; 66 | }; 67 | B2C716872851E09F0020B958 /* Products */ = { 68 | isa = PBXGroup; 69 | children = ( 70 | B2C716862851E09F0020B958 /* d3-custom-navigation-swiftui.app */, 71 | B2C7168C2851E09F0020B958 /* d3-custom-navigation-swiftui.app */, 72 | ); 73 | name = Products; 74 | sourceTree = ""; 75 | }; 76 | B2C7168D2851E09F0020B958 /* macOS */ = { 77 | isa = PBXGroup; 78 | children = ( 79 | B2C7168E2851E09F0020B958 /* macOS.entitlements */, 80 | ); 81 | path = macOS; 82 | sourceTree = ""; 83 | }; 84 | /* End PBXGroup section */ 85 | 86 | /* Begin PBXNativeTarget section */ 87 | B2C716852851E09F0020B958 /* d3-custom-navigation-swiftui (iOS) */ = { 88 | isa = PBXNativeTarget; 89 | buildConfigurationList = B2C716972851E09F0020B958 /* Build configuration list for PBXNativeTarget "d3-custom-navigation-swiftui (iOS)" */; 90 | buildPhases = ( 91 | B2C716822851E09F0020B958 /* Sources */, 92 | B2C716832851E09F0020B958 /* Frameworks */, 93 | B2C716842851E09F0020B958 /* Resources */, 94 | ); 95 | buildRules = ( 96 | ); 97 | dependencies = ( 98 | ); 99 | name = "d3-custom-navigation-swiftui (iOS)"; 100 | productName = "d3-custom-navigation-swiftui (iOS)"; 101 | productReference = B2C716862851E09F0020B958 /* d3-custom-navigation-swiftui.app */; 102 | productType = "com.apple.product-type.application"; 103 | }; 104 | B2C7168B2851E09F0020B958 /* d3-custom-navigation-swiftui (macOS) */ = { 105 | isa = PBXNativeTarget; 106 | buildConfigurationList = B2C7169A2851E09F0020B958 /* Build configuration list for PBXNativeTarget "d3-custom-navigation-swiftui (macOS)" */; 107 | buildPhases = ( 108 | B2C716882851E09F0020B958 /* Sources */, 109 | B2C716892851E09F0020B958 /* Frameworks */, 110 | B2C7168A2851E09F0020B958 /* Resources */, 111 | ); 112 | buildRules = ( 113 | ); 114 | dependencies = ( 115 | ); 116 | name = "d3-custom-navigation-swiftui (macOS)"; 117 | productName = "d3-custom-navigation-swiftui (macOS)"; 118 | productReference = B2C7168C2851E09F0020B958 /* d3-custom-navigation-swiftui.app */; 119 | productType = "com.apple.product-type.application"; 120 | }; 121 | /* End PBXNativeTarget section */ 122 | 123 | /* Begin PBXProject section */ 124 | B2C7167A2851E09E0020B958 /* Project object */ = { 125 | isa = PBXProject; 126 | attributes = { 127 | BuildIndependentTargetsInParallel = 1; 128 | LastSwiftUpdateCheck = 1340; 129 | LastUpgradeCheck = 1340; 130 | TargetAttributes = { 131 | B2C716852851E09F0020B958 = { 132 | CreatedOnToolsVersion = 13.4.1; 133 | }; 134 | B2C7168B2851E09F0020B958 = { 135 | CreatedOnToolsVersion = 13.4.1; 136 | }; 137 | }; 138 | }; 139 | buildConfigurationList = B2C7167D2851E09E0020B958 /* Build configuration list for PBXProject "d3-custom-navigation-swiftui" */; 140 | compatibilityVersion = "Xcode 13.0"; 141 | developmentRegion = en; 142 | hasScannedForEncodings = 0; 143 | knownRegions = ( 144 | en, 145 | Base, 146 | ); 147 | mainGroup = B2C716792851E09E0020B958; 148 | productRefGroup = B2C716872851E09F0020B958 /* Products */; 149 | projectDirPath = ""; 150 | projectRoot = ""; 151 | targets = ( 152 | B2C716852851E09F0020B958 /* d3-custom-navigation-swiftui (iOS) */, 153 | B2C7168B2851E09F0020B958 /* d3-custom-navigation-swiftui (macOS) */, 154 | ); 155 | }; 156 | /* End PBXProject section */ 157 | 158 | /* Begin PBXResourcesBuildPhase section */ 159 | B2C716842851E09F0020B958 /* Resources */ = { 160 | isa = PBXResourcesBuildPhase; 161 | buildActionMask = 2147483647; 162 | files = ( 163 | B2C7169E285200510020B958 /* README.md in Resources */, 164 | B2C716932851E09F0020B958 /* Assets.xcassets in Resources */, 165 | ); 166 | runOnlyForDeploymentPostprocessing = 0; 167 | }; 168 | B2C7168A2851E09F0020B958 /* Resources */ = { 169 | isa = PBXResourcesBuildPhase; 170 | buildActionMask = 2147483647; 171 | files = ( 172 | B2C716942851E09F0020B958 /* Assets.xcassets in Resources */, 173 | ); 174 | runOnlyForDeploymentPostprocessing = 0; 175 | }; 176 | /* End PBXResourcesBuildPhase section */ 177 | 178 | /* Begin PBXSourcesBuildPhase section */ 179 | B2C716822851E09F0020B958 /* Sources */ = { 180 | isa = PBXSourcesBuildPhase; 181 | buildActionMask = 2147483647; 182 | files = ( 183 | B2C716912851E09F0020B958 /* ContentView.swift in Sources */, 184 | B2C7168F2851E09F0020B958 /* d3_custom_navigation_swiftuiApp.swift in Sources */, 185 | ); 186 | runOnlyForDeploymentPostprocessing = 0; 187 | }; 188 | B2C716882851E09F0020B958 /* Sources */ = { 189 | isa = PBXSourcesBuildPhase; 190 | buildActionMask = 2147483647; 191 | files = ( 192 | B2C716922851E09F0020B958 /* ContentView.swift in Sources */, 193 | B2C716902851E09F0020B958 /* d3_custom_navigation_swiftuiApp.swift in Sources */, 194 | ); 195 | runOnlyForDeploymentPostprocessing = 0; 196 | }; 197 | /* End PBXSourcesBuildPhase section */ 198 | 199 | /* Begin XCBuildConfiguration section */ 200 | B2C716952851E09F0020B958 /* Debug */ = { 201 | isa = XCBuildConfiguration; 202 | buildSettings = { 203 | ALWAYS_SEARCH_USER_PATHS = NO; 204 | CLANG_ANALYZER_NONNULL = YES; 205 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 206 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; 207 | CLANG_ENABLE_MODULES = YES; 208 | CLANG_ENABLE_OBJC_ARC = YES; 209 | CLANG_ENABLE_OBJC_WEAK = YES; 210 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 211 | CLANG_WARN_BOOL_CONVERSION = YES; 212 | CLANG_WARN_COMMA = YES; 213 | CLANG_WARN_CONSTANT_CONVERSION = YES; 214 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 215 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 216 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 217 | CLANG_WARN_EMPTY_BODY = YES; 218 | CLANG_WARN_ENUM_CONVERSION = YES; 219 | CLANG_WARN_INFINITE_RECURSION = YES; 220 | CLANG_WARN_INT_CONVERSION = YES; 221 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 222 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 223 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 224 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 225 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 226 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 227 | CLANG_WARN_STRICT_PROTOTYPES = YES; 228 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 229 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 230 | CLANG_WARN_UNREACHABLE_CODE = YES; 231 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 232 | COPY_PHASE_STRIP = NO; 233 | DEBUG_INFORMATION_FORMAT = dwarf; 234 | ENABLE_STRICT_OBJC_MSGSEND = YES; 235 | ENABLE_TESTABILITY = YES; 236 | GCC_C_LANGUAGE_STANDARD = gnu11; 237 | GCC_DYNAMIC_NO_PIC = NO; 238 | GCC_NO_COMMON_BLOCKS = YES; 239 | GCC_OPTIMIZATION_LEVEL = 0; 240 | GCC_PREPROCESSOR_DEFINITIONS = ( 241 | "DEBUG=1", 242 | "$(inherited)", 243 | ); 244 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 245 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 246 | GCC_WARN_UNDECLARED_SELECTOR = YES; 247 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 248 | GCC_WARN_UNUSED_FUNCTION = YES; 249 | GCC_WARN_UNUSED_VARIABLE = YES; 250 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 251 | MTL_FAST_MATH = YES; 252 | ONLY_ACTIVE_ARCH = YES; 253 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 254 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 255 | }; 256 | name = Debug; 257 | }; 258 | B2C716962851E09F0020B958 /* Release */ = { 259 | isa = XCBuildConfiguration; 260 | buildSettings = { 261 | ALWAYS_SEARCH_USER_PATHS = NO; 262 | CLANG_ANALYZER_NONNULL = YES; 263 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 264 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; 265 | CLANG_ENABLE_MODULES = YES; 266 | CLANG_ENABLE_OBJC_ARC = YES; 267 | CLANG_ENABLE_OBJC_WEAK = YES; 268 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 269 | CLANG_WARN_BOOL_CONVERSION = YES; 270 | CLANG_WARN_COMMA = YES; 271 | CLANG_WARN_CONSTANT_CONVERSION = YES; 272 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 273 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 274 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 275 | CLANG_WARN_EMPTY_BODY = YES; 276 | CLANG_WARN_ENUM_CONVERSION = YES; 277 | CLANG_WARN_INFINITE_RECURSION = YES; 278 | CLANG_WARN_INT_CONVERSION = YES; 279 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 280 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 281 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 282 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 283 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 284 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 285 | CLANG_WARN_STRICT_PROTOTYPES = YES; 286 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 287 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 288 | CLANG_WARN_UNREACHABLE_CODE = YES; 289 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 290 | COPY_PHASE_STRIP = NO; 291 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 292 | ENABLE_NS_ASSERTIONS = NO; 293 | ENABLE_STRICT_OBJC_MSGSEND = YES; 294 | GCC_C_LANGUAGE_STANDARD = gnu11; 295 | GCC_NO_COMMON_BLOCKS = YES; 296 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 297 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 298 | GCC_WARN_UNDECLARED_SELECTOR = YES; 299 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 300 | GCC_WARN_UNUSED_FUNCTION = YES; 301 | GCC_WARN_UNUSED_VARIABLE = YES; 302 | MTL_ENABLE_DEBUG_INFO = NO; 303 | MTL_FAST_MATH = YES; 304 | SWIFT_COMPILATION_MODE = wholemodule; 305 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 306 | }; 307 | name = Release; 308 | }; 309 | B2C716982851E09F0020B958 /* Debug */ = { 310 | isa = XCBuildConfiguration; 311 | buildSettings = { 312 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 313 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 314 | CODE_SIGN_STYLE = Automatic; 315 | CURRENT_PROJECT_VERSION = 1; 316 | DEVELOPMENT_TEAM = FZ42RW4USG; 317 | ENABLE_PREVIEWS = YES; 318 | GENERATE_INFOPLIST_FILE = YES; 319 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 320 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 321 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 322 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 323 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 324 | IPHONEOS_DEPLOYMENT_TARGET = 15.5; 325 | LD_RUNPATH_SEARCH_PATHS = ( 326 | "$(inherited)", 327 | "@executable_path/Frameworks", 328 | ); 329 | MARKETING_VERSION = 1.0; 330 | PRODUCT_BUNDLE_IDENTIFIER = "ishelopaev.d3-custom-navigation-swiftui"; 331 | PRODUCT_NAME = "d3-custom-navigation-swiftui"; 332 | SDKROOT = iphoneos; 333 | SWIFT_EMIT_LOC_STRINGS = YES; 334 | SWIFT_VERSION = 5.0; 335 | TARGETED_DEVICE_FAMILY = "1,2"; 336 | }; 337 | name = Debug; 338 | }; 339 | B2C716992851E09F0020B958 /* Release */ = { 340 | isa = XCBuildConfiguration; 341 | buildSettings = { 342 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 343 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 344 | CODE_SIGN_STYLE = Automatic; 345 | CURRENT_PROJECT_VERSION = 1; 346 | DEVELOPMENT_TEAM = FZ42RW4USG; 347 | ENABLE_PREVIEWS = YES; 348 | GENERATE_INFOPLIST_FILE = YES; 349 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 350 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 351 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 352 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 353 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 354 | IPHONEOS_DEPLOYMENT_TARGET = 15.5; 355 | LD_RUNPATH_SEARCH_PATHS = ( 356 | "$(inherited)", 357 | "@executable_path/Frameworks", 358 | ); 359 | MARKETING_VERSION = 1.0; 360 | PRODUCT_BUNDLE_IDENTIFIER = "ishelopaev.d3-custom-navigation-swiftui"; 361 | PRODUCT_NAME = "d3-custom-navigation-swiftui"; 362 | SDKROOT = iphoneos; 363 | SWIFT_EMIT_LOC_STRINGS = YES; 364 | SWIFT_VERSION = 5.0; 365 | TARGETED_DEVICE_FAMILY = "1,2"; 366 | VALIDATE_PRODUCT = YES; 367 | }; 368 | name = Release; 369 | }; 370 | B2C7169B2851E09F0020B958 /* Debug */ = { 371 | isa = XCBuildConfiguration; 372 | buildSettings = { 373 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 374 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 375 | CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements; 376 | CODE_SIGN_STYLE = Automatic; 377 | COMBINE_HIDPI_IMAGES = YES; 378 | CURRENT_PROJECT_VERSION = 1; 379 | DEVELOPMENT_TEAM = FZ42RW4USG; 380 | ENABLE_HARDENED_RUNTIME = YES; 381 | ENABLE_PREVIEWS = YES; 382 | GENERATE_INFOPLIST_FILE = YES; 383 | INFOPLIST_KEY_NSHumanReadableCopyright = ""; 384 | LD_RUNPATH_SEARCH_PATHS = ( 385 | "$(inherited)", 386 | "@executable_path/../Frameworks", 387 | ); 388 | MACOSX_DEPLOYMENT_TARGET = 12.3; 389 | MARKETING_VERSION = 1.0; 390 | PRODUCT_BUNDLE_IDENTIFIER = "ishelopaev.d3-custom-navigation-swiftui"; 391 | PRODUCT_NAME = "d3-custom-navigation-swiftui"; 392 | SDKROOT = macosx; 393 | SWIFT_EMIT_LOC_STRINGS = YES; 394 | SWIFT_VERSION = 5.0; 395 | }; 396 | name = Debug; 397 | }; 398 | B2C7169C2851E09F0020B958 /* Release */ = { 399 | isa = XCBuildConfiguration; 400 | buildSettings = { 401 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 402 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 403 | CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements; 404 | CODE_SIGN_STYLE = Automatic; 405 | COMBINE_HIDPI_IMAGES = YES; 406 | CURRENT_PROJECT_VERSION = 1; 407 | DEVELOPMENT_TEAM = FZ42RW4USG; 408 | ENABLE_HARDENED_RUNTIME = YES; 409 | ENABLE_PREVIEWS = YES; 410 | GENERATE_INFOPLIST_FILE = YES; 411 | INFOPLIST_KEY_NSHumanReadableCopyright = ""; 412 | LD_RUNPATH_SEARCH_PATHS = ( 413 | "$(inherited)", 414 | "@executable_path/../Frameworks", 415 | ); 416 | MACOSX_DEPLOYMENT_TARGET = 12.3; 417 | MARKETING_VERSION = 1.0; 418 | PRODUCT_BUNDLE_IDENTIFIER = "ishelopaev.d3-custom-navigation-swiftui"; 419 | PRODUCT_NAME = "d3-custom-navigation-swiftui"; 420 | SDKROOT = macosx; 421 | SWIFT_EMIT_LOC_STRINGS = YES; 422 | SWIFT_VERSION = 5.0; 423 | }; 424 | name = Release; 425 | }; 426 | /* End XCBuildConfiguration section */ 427 | 428 | /* Begin XCConfigurationList section */ 429 | B2C7167D2851E09E0020B958 /* Build configuration list for PBXProject "d3-custom-navigation-swiftui" */ = { 430 | isa = XCConfigurationList; 431 | buildConfigurations = ( 432 | B2C716952851E09F0020B958 /* Debug */, 433 | B2C716962851E09F0020B958 /* Release */, 434 | ); 435 | defaultConfigurationIsVisible = 0; 436 | defaultConfigurationName = Release; 437 | }; 438 | B2C716972851E09F0020B958 /* Build configuration list for PBXNativeTarget "d3-custom-navigation-swiftui (iOS)" */ = { 439 | isa = XCConfigurationList; 440 | buildConfigurations = ( 441 | B2C716982851E09F0020B958 /* Debug */, 442 | B2C716992851E09F0020B958 /* Release */, 443 | ); 444 | defaultConfigurationIsVisible = 0; 445 | defaultConfigurationName = Release; 446 | }; 447 | B2C7169A2851E09F0020B958 /* Build configuration list for PBXNativeTarget "d3-custom-navigation-swiftui (macOS)" */ = { 448 | isa = XCConfigurationList; 449 | buildConfigurations = ( 450 | B2C7169B2851E09F0020B958 /* Debug */, 451 | B2C7169C2851E09F0020B958 /* Release */, 452 | ); 453 | defaultConfigurationIsVisible = 0; 454 | defaultConfigurationName = Release; 455 | }; 456 | /* End XCConfigurationList section */ 457 | }; 458 | rootObject = B2C7167A2851E09E0020B958 /* Project object */; 459 | } 460 | -------------------------------------------------------------------------------- /d3-custom-navigation-swiftui.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /d3-custom-navigation-swiftui.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------