├── StickyHeader ├── Assets.xcassets │ ├── Contents.json │ ├── AccentColor.colorset │ │ └── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json ├── StickyHeaderApp.swift └── Presentation │ └── Main │ └── MainScreen.swift ├── StickyHeader.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── leopold.xcuserdatad │ │ └── UserInterfaceState.xcuserstate ├── xcuserdata │ └── leopold.xcuserdatad │ │ └── xcschemes │ │ └── xcschememanagement.plist └── project.pbxproj └── README.md /StickyHeader/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /StickyHeader/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /StickyHeader.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /StickyHeader/StickyHeaderApp.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | @main 4 | struct StickyHeaderApp: App { 5 | var body: some Scene { 6 | WindowGroup { 7 | MainScreen() 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /StickyHeader/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 | -------------------------------------------------------------------------------- /StickyHeader.xcodeproj/project.xcworkspace/xcuserdata/leopold.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leopoldubzq/StickyHeader/HEAD/StickyHeader.xcodeproj/project.xcworkspace/xcuserdata/leopold.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /StickyHeader.xcodeproj/xcuserdata/leopold.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | StickyHeader.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /StickyHeader/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "platform" : "ios", 6 | "size" : "1024x1024" 7 | }, 8 | { 9 | "appearances" : [ 10 | { 11 | "appearance" : "luminosity", 12 | "value" : "dark" 13 | } 14 | ], 15 | "idiom" : "universal", 16 | "platform" : "ios", 17 | "size" : "1024x1024" 18 | }, 19 | { 20 | "appearances" : [ 21 | { 22 | "appearance" : "luminosity", 23 | "value" : "tinted" 24 | } 25 | ], 26 | "idiom" : "universal", 27 | "platform" : "ios", 28 | "size" : "1024x1024" 29 | } 30 | ], 31 | "info" : { 32 | "author" : "xcode", 33 | "version" : 1 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🚀 Sticky Header in SwiftUI using GeometryReader 2 | 3 | This repository demonstrates how to create a **sticky header** in SwiftUI using `GeometryReader` and `proxy.frame(in: .scrollView).minY`. The effect ensures that the header remains fixed at the top when scrolling up in a `ScrollView`. 4 | 5 | ## 📸 Demo Preview 6 | 7 | 8 | ## 📌 How It Works 9 | - **Tracking the header position** – `GeometryReader` allows us to monitor the header’s coordinates in the `ScrollView` space. 10 | - **Detecting when the header reaches the top** – If `minY <= 0`, we "stick" the header at the top. 11 | - **Smooth and efficient** – Achieves the sticky effect without unnecessary complexity. 12 | 13 | ## 🔹 Why Use This Approach? 14 | ✅ Lightweight and efficient solution using built-in SwiftUI tools. 15 | ✅ No need for custom scroll detection logic. 16 | ✅ Works seamlessly with other SwiftUI components. 17 | -------------------------------------------------------------------------------- /StickyHeader/Presentation/Main/MainScreen.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | struct MainScreen: View { 4 | 5 | @State private var scrollOffsetY: CGFloat = .zero 6 | @State private var colors: [Color] = [ 7 | .red, 8 | .green, 9 | .blue, 10 | .orange, 11 | .yellow, 12 | .brown, 13 | .teal, 14 | .purple, 15 | .cyan, 16 | .indigo, 17 | .pink 18 | ] 19 | 20 | var body: some View { 21 | GeometryReader { proxy in 22 | let safeArea = proxy.safeAreaInsets 23 | ScrollView { 24 | VStack(spacing: 0) { 25 | Header(safeArea: safeArea) 26 | .padding([.horizontal, .vertical]) 27 | ForEach(colors, id: \.self) { color in 28 | ColorCell(color) 29 | } 30 | } 31 | .padding(.vertical) 32 | .zIndex(0) 33 | .scrollTargetLayout() 34 | } 35 | .onScrollGeometryChange(for: CGFloat.self) { geometry in 36 | geometry.contentOffset.y + geometry.contentInsets.top 37 | } action: { _, newValue in 38 | scrollOffsetY = newValue 39 | } 40 | .background(Color(uiColor: .secondarySystemGroupedBackground)) 41 | } 42 | 43 | } 44 | 45 | @ViewBuilder 46 | private func ColorCell(_ color: Color) -> some View { 47 | GeometryReader { proxy in 48 | let minY = proxy.frame(in: .scrollView).minY 49 | Rectangle() 50 | .fill(color.gradient) 51 | .blur(radius: max(0, -minY * 0.05)) 52 | } 53 | .frame(height: 150) 54 | } 55 | 56 | @ViewBuilder 57 | private func Header(safeArea: EdgeInsets) -> some View { 58 | VStack { 59 | Text("Hello, Leopold!") 60 | .font(.largeTitle) 61 | .bold() 62 | .frame(maxWidth: .infinity, alignment: .leading) 63 | .opacity(1.0 - max(0, scrollOffsetY * 0.02)) 64 | 65 | SearchField() 66 | } 67 | .zIndex(1) 68 | } 69 | 70 | @ViewBuilder 71 | private func SearchField() -> some View { 72 | GeometryReader { proxy in 73 | let minY = proxy.frame(in: .scrollView).minY 74 | HStack { 75 | Image(systemName: "magnifyingglass") 76 | .fontWeight(.semibold) 77 | Text("What do you want to search for?") 78 | .font(.system(size: 15)) 79 | Spacer() 80 | } 81 | .foregroundStyle(.secondary) 82 | .padding(.horizontal) 83 | .frame(height: proxy.size.height) 84 | .background( 85 | Color(uiColor: .tertiarySystemGroupedBackground), 86 | in: .capsule 87 | ) 88 | .shadow(radius: 12) 89 | .offset(y: max(0, -minY)) 90 | } 91 | .frame(height: 50) 92 | } 93 | } 94 | 95 | #Preview { 96 | MainScreen() 97 | } 98 | -------------------------------------------------------------------------------- /StickyHeader.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 77; 7 | objects = { 8 | 9 | /* Begin PBXFileReference section */ 10 | 02D3BAA82D6646210091E114 /* StickyHeader.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StickyHeader.app; sourceTree = BUILT_PRODUCTS_DIR; }; 11 | /* End PBXFileReference section */ 12 | 13 | /* Begin PBXFileSystemSynchronizedRootGroup section */ 14 | 02D3BAAA2D6646210091E114 /* StickyHeader */ = { 15 | isa = PBXFileSystemSynchronizedRootGroup; 16 | path = StickyHeader; 17 | sourceTree = ""; 18 | }; 19 | /* End PBXFileSystemSynchronizedRootGroup section */ 20 | 21 | /* Begin PBXFrameworksBuildPhase section */ 22 | 02D3BAA52D6646210091E114 /* Frameworks */ = { 23 | isa = PBXFrameworksBuildPhase; 24 | buildActionMask = 2147483647; 25 | files = ( 26 | ); 27 | runOnlyForDeploymentPostprocessing = 0; 28 | }; 29 | /* End PBXFrameworksBuildPhase section */ 30 | 31 | /* Begin PBXGroup section */ 32 | 02D3BA9F2D6646210091E114 = { 33 | isa = PBXGroup; 34 | children = ( 35 | 02D3BAAA2D6646210091E114 /* StickyHeader */, 36 | 02D3BAA92D6646210091E114 /* Products */, 37 | ); 38 | sourceTree = ""; 39 | }; 40 | 02D3BAA92D6646210091E114 /* Products */ = { 41 | isa = PBXGroup; 42 | children = ( 43 | 02D3BAA82D6646210091E114 /* StickyHeader.app */, 44 | ); 45 | name = Products; 46 | sourceTree = ""; 47 | }; 48 | /* End PBXGroup section */ 49 | 50 | /* Begin PBXNativeTarget section */ 51 | 02D3BAA72D6646210091E114 /* StickyHeader */ = { 52 | isa = PBXNativeTarget; 53 | buildConfigurationList = 02D3BAB62D6646230091E114 /* Build configuration list for PBXNativeTarget "StickyHeader" */; 54 | buildPhases = ( 55 | 02D3BAA42D6646210091E114 /* Sources */, 56 | 02D3BAA52D6646210091E114 /* Frameworks */, 57 | 02D3BAA62D6646210091E114 /* Resources */, 58 | ); 59 | buildRules = ( 60 | ); 61 | dependencies = ( 62 | ); 63 | fileSystemSynchronizedGroups = ( 64 | 02D3BAAA2D6646210091E114 /* StickyHeader */, 65 | ); 66 | name = StickyHeader; 67 | packageProductDependencies = ( 68 | ); 69 | productName = StickyHeader; 70 | productReference = 02D3BAA82D6646210091E114 /* StickyHeader.app */; 71 | productType = "com.apple.product-type.application"; 72 | }; 73 | /* End PBXNativeTarget section */ 74 | 75 | /* Begin PBXProject section */ 76 | 02D3BAA02D6646210091E114 /* Project object */ = { 77 | isa = PBXProject; 78 | attributes = { 79 | BuildIndependentTargetsInParallel = 1; 80 | LastSwiftUpdateCheck = 1610; 81 | LastUpgradeCheck = 1610; 82 | TargetAttributes = { 83 | 02D3BAA72D6646210091E114 = { 84 | CreatedOnToolsVersion = 16.1; 85 | }; 86 | }; 87 | }; 88 | buildConfigurationList = 02D3BAA32D6646210091E114 /* Build configuration list for PBXProject "StickyHeader" */; 89 | developmentRegion = en; 90 | hasScannedForEncodings = 0; 91 | knownRegions = ( 92 | en, 93 | Base, 94 | ); 95 | mainGroup = 02D3BA9F2D6646210091E114; 96 | minimizedProjectReferenceProxies = 1; 97 | preferredProjectObjectVersion = 77; 98 | productRefGroup = 02D3BAA92D6646210091E114 /* Products */; 99 | projectDirPath = ""; 100 | projectRoot = ""; 101 | targets = ( 102 | 02D3BAA72D6646210091E114 /* StickyHeader */, 103 | ); 104 | }; 105 | /* End PBXProject section */ 106 | 107 | /* Begin PBXResourcesBuildPhase section */ 108 | 02D3BAA62D6646210091E114 /* Resources */ = { 109 | isa = PBXResourcesBuildPhase; 110 | buildActionMask = 2147483647; 111 | files = ( 112 | ); 113 | runOnlyForDeploymentPostprocessing = 0; 114 | }; 115 | /* End PBXResourcesBuildPhase section */ 116 | 117 | /* Begin PBXSourcesBuildPhase section */ 118 | 02D3BAA42D6646210091E114 /* Sources */ = { 119 | isa = PBXSourcesBuildPhase; 120 | buildActionMask = 2147483647; 121 | files = ( 122 | ); 123 | runOnlyForDeploymentPostprocessing = 0; 124 | }; 125 | /* End PBXSourcesBuildPhase section */ 126 | 127 | /* Begin XCBuildConfiguration section */ 128 | 02D3BAB42D6646230091E114 /* Debug */ = { 129 | isa = XCBuildConfiguration; 130 | buildSettings = { 131 | ALWAYS_SEARCH_USER_PATHS = NO; 132 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 133 | CLANG_ANALYZER_NONNULL = YES; 134 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 135 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 136 | CLANG_ENABLE_MODULES = YES; 137 | CLANG_ENABLE_OBJC_ARC = YES; 138 | CLANG_ENABLE_OBJC_WEAK = YES; 139 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 140 | CLANG_WARN_BOOL_CONVERSION = YES; 141 | CLANG_WARN_COMMA = YES; 142 | CLANG_WARN_CONSTANT_CONVERSION = YES; 143 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 144 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 145 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 146 | CLANG_WARN_EMPTY_BODY = YES; 147 | CLANG_WARN_ENUM_CONVERSION = YES; 148 | CLANG_WARN_INFINITE_RECURSION = YES; 149 | CLANG_WARN_INT_CONVERSION = YES; 150 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 151 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 152 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 153 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 154 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 155 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 156 | CLANG_WARN_STRICT_PROTOTYPES = YES; 157 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 158 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 159 | CLANG_WARN_UNREACHABLE_CODE = YES; 160 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 161 | COPY_PHASE_STRIP = NO; 162 | DEBUG_INFORMATION_FORMAT = dwarf; 163 | ENABLE_STRICT_OBJC_MSGSEND = YES; 164 | ENABLE_TESTABILITY = YES; 165 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 166 | GCC_C_LANGUAGE_STANDARD = gnu17; 167 | GCC_DYNAMIC_NO_PIC = NO; 168 | GCC_NO_COMMON_BLOCKS = YES; 169 | GCC_OPTIMIZATION_LEVEL = 0; 170 | GCC_PREPROCESSOR_DEFINITIONS = ( 171 | "DEBUG=1", 172 | "$(inherited)", 173 | ); 174 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 175 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 176 | GCC_WARN_UNDECLARED_SELECTOR = YES; 177 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 178 | GCC_WARN_UNUSED_FUNCTION = YES; 179 | GCC_WARN_UNUSED_VARIABLE = YES; 180 | IPHONEOS_DEPLOYMENT_TARGET = 18.1; 181 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 182 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 183 | MTL_FAST_MATH = YES; 184 | ONLY_ACTIVE_ARCH = YES; 185 | SDKROOT = iphoneos; 186 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; 187 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 188 | }; 189 | name = Debug; 190 | }; 191 | 02D3BAB52D6646230091E114 /* Release */ = { 192 | isa = XCBuildConfiguration; 193 | buildSettings = { 194 | ALWAYS_SEARCH_USER_PATHS = NO; 195 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 196 | CLANG_ANALYZER_NONNULL = YES; 197 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 198 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 199 | CLANG_ENABLE_MODULES = YES; 200 | CLANG_ENABLE_OBJC_ARC = YES; 201 | CLANG_ENABLE_OBJC_WEAK = YES; 202 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 203 | CLANG_WARN_BOOL_CONVERSION = YES; 204 | CLANG_WARN_COMMA = YES; 205 | CLANG_WARN_CONSTANT_CONVERSION = YES; 206 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 207 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 208 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 209 | CLANG_WARN_EMPTY_BODY = YES; 210 | CLANG_WARN_ENUM_CONVERSION = YES; 211 | CLANG_WARN_INFINITE_RECURSION = YES; 212 | CLANG_WARN_INT_CONVERSION = YES; 213 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 214 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 215 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 216 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 217 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 218 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 219 | CLANG_WARN_STRICT_PROTOTYPES = YES; 220 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 221 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 222 | CLANG_WARN_UNREACHABLE_CODE = YES; 223 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 224 | COPY_PHASE_STRIP = NO; 225 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 226 | ENABLE_NS_ASSERTIONS = NO; 227 | ENABLE_STRICT_OBJC_MSGSEND = YES; 228 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 229 | GCC_C_LANGUAGE_STANDARD = gnu17; 230 | GCC_NO_COMMON_BLOCKS = YES; 231 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 232 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 233 | GCC_WARN_UNDECLARED_SELECTOR = YES; 234 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 235 | GCC_WARN_UNUSED_FUNCTION = YES; 236 | GCC_WARN_UNUSED_VARIABLE = YES; 237 | IPHONEOS_DEPLOYMENT_TARGET = 18.1; 238 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 239 | MTL_ENABLE_DEBUG_INFO = NO; 240 | MTL_FAST_MATH = YES; 241 | SDKROOT = iphoneos; 242 | SWIFT_COMPILATION_MODE = wholemodule; 243 | VALIDATE_PRODUCT = YES; 244 | }; 245 | name = Release; 246 | }; 247 | 02D3BAB72D6646230091E114 /* Debug */ = { 248 | isa = XCBuildConfiguration; 249 | buildSettings = { 250 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 251 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 252 | CODE_SIGN_STYLE = Automatic; 253 | CURRENT_PROJECT_VERSION = 1; 254 | DEVELOPMENT_ASSET_PATHS = "\"StickyHeader/Preview Content\""; 255 | DEVELOPMENT_TEAM = 4G76GHV9RM; 256 | ENABLE_PREVIEWS = YES; 257 | GENERATE_INFOPLIST_FILE = YES; 258 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 259 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 260 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 261 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 262 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 263 | LD_RUNPATH_SEARCH_PATHS = ( 264 | "$(inherited)", 265 | "@executable_path/Frameworks", 266 | ); 267 | MARKETING_VERSION = 1.0; 268 | PRODUCT_BUNDLE_IDENTIFIER = com.leopoldromanowski.StickyHeader; 269 | PRODUCT_NAME = "$(TARGET_NAME)"; 270 | SWIFT_EMIT_LOC_STRINGS = YES; 271 | SWIFT_VERSION = 5.0; 272 | TARGETED_DEVICE_FAMILY = "1,2"; 273 | }; 274 | name = Debug; 275 | }; 276 | 02D3BAB82D6646230091E114 /* Release */ = { 277 | isa = XCBuildConfiguration; 278 | buildSettings = { 279 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 280 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 281 | CODE_SIGN_STYLE = Automatic; 282 | CURRENT_PROJECT_VERSION = 1; 283 | DEVELOPMENT_ASSET_PATHS = "\"StickyHeader/Preview Content\""; 284 | DEVELOPMENT_TEAM = 4G76GHV9RM; 285 | ENABLE_PREVIEWS = YES; 286 | GENERATE_INFOPLIST_FILE = YES; 287 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 288 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 289 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 290 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 291 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 292 | LD_RUNPATH_SEARCH_PATHS = ( 293 | "$(inherited)", 294 | "@executable_path/Frameworks", 295 | ); 296 | MARKETING_VERSION = 1.0; 297 | PRODUCT_BUNDLE_IDENTIFIER = com.leopoldromanowski.StickyHeader; 298 | PRODUCT_NAME = "$(TARGET_NAME)"; 299 | SWIFT_EMIT_LOC_STRINGS = YES; 300 | SWIFT_VERSION = 5.0; 301 | TARGETED_DEVICE_FAMILY = "1,2"; 302 | }; 303 | name = Release; 304 | }; 305 | /* End XCBuildConfiguration section */ 306 | 307 | /* Begin XCConfigurationList section */ 308 | 02D3BAA32D6646210091E114 /* Build configuration list for PBXProject "StickyHeader" */ = { 309 | isa = XCConfigurationList; 310 | buildConfigurations = ( 311 | 02D3BAB42D6646230091E114 /* Debug */, 312 | 02D3BAB52D6646230091E114 /* Release */, 313 | ); 314 | defaultConfigurationIsVisible = 0; 315 | defaultConfigurationName = Release; 316 | }; 317 | 02D3BAB62D6646230091E114 /* Build configuration list for PBXNativeTarget "StickyHeader" */ = { 318 | isa = XCConfigurationList; 319 | buildConfigurations = ( 320 | 02D3BAB72D6646230091E114 /* Debug */, 321 | 02D3BAB82D6646230091E114 /* Release */, 322 | ); 323 | defaultConfigurationIsVisible = 0; 324 | defaultConfigurationName = Release; 325 | }; 326 | /* End XCConfigurationList section */ 327 | }; 328 | rootObject = 02D3BAA02D6646210091E114 /* Project object */; 329 | } 330 | --------------------------------------------------------------------------------