├── .gitignore ├── Example ├── Base.lproj │ └── LaunchScreen.storyboard ├── Podfile ├── Podfile.lock ├── Pods │ ├── Local Podspecs │ │ └── StickyHeaderFlowLayout.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ └── project.pbxproj │ └── Target Support Files │ │ ├── Pods-Example │ │ ├── Pods-Example-Info.plist │ │ ├── Pods-Example-acknowledgements.markdown │ │ ├── Pods-Example-acknowledgements.plist │ │ ├── Pods-Example-dummy.m │ │ ├── Pods-Example-frameworks.sh │ │ ├── Pods-Example-umbrella.h │ │ ├── Pods-Example.debug.xcconfig │ │ ├── Pods-Example.modulemap │ │ └── Pods-Example.release.xcconfig │ │ └── StickyHeaderFlowLayout │ │ ├── StickyHeaderFlowLayout-Info.plist │ │ ├── StickyHeaderFlowLayout-dummy.m │ │ ├── StickyHeaderFlowLayout-prefix.pch │ │ ├── StickyHeaderFlowLayout-umbrella.h │ │ ├── StickyHeaderFlowLayout.modulemap │ │ └── StickyHeaderFlowLayout.xcconfig ├── StickyHeaderFlowLayout.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── Example.xcscheme ├── StickyHeaderFlowLayout.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── StickyHeaderFlowLayout │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Contents.json │ └── success-baby.imageset │ │ ├── Contents.json │ │ └── success-baby.png │ ├── CollectionParallaxHeader.swift │ ├── CollectionViewCell.swift │ ├── CollectionViewController.swift │ ├── CollectionViewSectionHeader.swift │ ├── Info.plist │ └── LaunchScreen.storyboard ├── LICENSE ├── README.md ├── Resources ├── design.sketch └── logo.svg ├── StickyHeaderFlowLayout.podspec └── StickyHeaderFlowLayout ├── Assets └── .gitkeep └── Classes ├── .gitkeep ├── StickyHeaderFlowLayout.swift └── StickyHeaderFlowLayoutAttributes.swift /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | # 37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 38 | # Packages/ 39 | # Package.pins 40 | # Package.resolved 41 | .build/ 42 | 43 | # CocoaPods 44 | # 45 | # We recommend against adding the Pods directory to your .gitignore. However 46 | # you should judge for yourself, the pros and cons are mentioned at: 47 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 48 | # 49 | # Pods/ 50 | 51 | # Carthage 52 | # 53 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 54 | # Carthage/Checkouts 55 | 56 | Carthage/Build 57 | 58 | # fastlane 59 | # 60 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 61 | # screenshots whenever they are needed. 62 | # For more information about the recommended setup visit: 63 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 64 | 65 | fastlane/report.xml 66 | fastlane/Preview.html 67 | fastlane/screenshots/**/*.png 68 | fastlane/test_output 69 | 70 | ## macOS 71 | 72 | # General 73 | .DS_Store 74 | .AppleDouble 75 | .LSOverride 76 | 77 | # Icon must end with two \r 78 | Icon 79 | 80 | 81 | # Thumbnails 82 | ._* 83 | 84 | # Files that might appear in the root of a volume 85 | .DocumentRevisions-V100 86 | .fseventsd 87 | .Spotlight-V100 88 | .TemporaryItems 89 | .Trashes 90 | .VolumeIcon.icns 91 | .com.apple.timemachine.donotpresent 92 | 93 | # Directories potentially created on remote AFP share 94 | .AppleDB 95 | .AppleDesktop 96 | Network Trash Folder 97 | Temporary Items 98 | .apdisk 99 | -------------------------------------------------------------------------------- /Example/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | platform :ios, '9.0' 2 | use_frameworks! 3 | 4 | target 'Example' do 5 | pod 'StickyHeaderFlowLayout', :path => '../' 6 | end 7 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - StickyHeaderFlowLayout (0.9.4) 3 | 4 | DEPENDENCIES: 5 | - StickyHeaderFlowLayout (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | StickyHeaderFlowLayout: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | StickyHeaderFlowLayout: 4727f28b5ba0db05bd18a98ce64f5c4c72f661ff 13 | 14 | PODFILE CHECKSUM: 67487ba5ff9f8b7257b17b91ed243eda8a5a2ef6 15 | 16 | COCOAPODS: 1.7.0.beta.3 17 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/StickyHeaderFlowLayout.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "StickyHeaderFlowLayout", 3 | "version": "0.9.4", 4 | "summary": "Sticky headers for UICollectionView written in pure Swift (based on CSStickyHeaderFlowLayout)", 5 | "homepage": "https://github.com/bernikovich/StickyHeaderFlowLayout", 6 | "license": { 7 | "type": "MIT", 8 | "file": "LICENSE" 9 | }, 10 | "authors": { 11 | "Timur Bernikovich": "bernikowich@icloud.com" 12 | }, 13 | "platforms": { 14 | "ios": "9.0" 15 | }, 16 | "swift_versions": "5.0", 17 | "frameworks": "UIKit", 18 | "source": { 19 | "git": "https://github.com/bernikovich/StickyHeaderFlowLayout.git", 20 | "tag": "0.9.4" 21 | }, 22 | "source_files": "StickyHeaderFlowLayout/Classes/**/*.swift", 23 | "module_name": "StickyHeaderFlowLayout" 24 | } 25 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - StickyHeaderFlowLayout (0.9.4) 3 | 4 | DEPENDENCIES: 5 | - StickyHeaderFlowLayout (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | StickyHeaderFlowLayout: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | StickyHeaderFlowLayout: 4727f28b5ba0db05bd18a98ce64f5c4c72f661ff 13 | 14 | PODFILE CHECKSUM: 67487ba5ff9f8b7257b17b91ed243eda8a5a2ef6 15 | 16 | COCOAPODS: 1.7.0.beta.3 17 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 35D94D0268DE4634F556D0CBE356B8D7 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ECF2A2B0720AE923C22BED3192888BE0 /* UIKit.framework */; }; 11 | 3A8648419C331474F84021A4E27CBD83 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40CB39E715FBCDAA142E6513E126200A /* Foundation.framework */; }; 12 | 3D7432320C2F3F7185362CA06E8EFABB /* StickyHeaderFlowLayout-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FB0ED361338A7A71E22E09690474E3F /* StickyHeaderFlowLayout-dummy.m */; }; 13 | 4CFEADD797100CA9D6DB1501FF9BE968 /* StickyHeaderFlowLayout-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C32DA58D5E552F7D09C95A2FABF5188D /* StickyHeaderFlowLayout-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 14 | 764B240ADC02EE30314FA73C9E7082EE /* Pods-Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D6D7C498FA339E02BD53ECB8916CEA8E /* Pods-Example-dummy.m */; }; 15 | 765870CB7746D953C8CFAE11471949B0 /* Pods-Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7825A90E082A1582EB16256B0E722B3F /* Pods-Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16 | 8968E2442AAFDDB89A5EC3F7BF58D731 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40CB39E715FBCDAA142E6513E126200A /* Foundation.framework */; }; 17 | 94289C8EDDA9C7E031F50AC578194760 /* StickyHeaderFlowLayoutAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 118019065266EA5F0BFA412E8F391AFA /* StickyHeaderFlowLayoutAttributes.swift */; }; 18 | F0B8EA7457D900BC48E412EB53859F94 /* StickyHeaderFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F5C33F5BE0F521E45DB02145225156 /* StickyHeaderFlowLayout.swift */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | FF19EE9A03D7821E892AD4D9FBCE08BB /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = 40C945FB80B39872735EB9619BDC1A3C; 27 | remoteInfo = StickyHeaderFlowLayout; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 118019065266EA5F0BFA412E8F391AFA /* StickyHeaderFlowLayoutAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StickyHeaderFlowLayoutAttributes.swift; path = StickyHeaderFlowLayout/Classes/StickyHeaderFlowLayoutAttributes.swift; sourceTree = ""; }; 33 | 243410B9535472556EA4BB6DBC133A0D /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.release.xcconfig"; sourceTree = ""; }; 34 | 31C1D37707DFAA5E6A164BCC07834264 /* Pods-Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-Info.plist"; sourceTree = ""; }; 35 | 35C305D3797C284E6F5BAA1D3E6F9BF8 /* Pods-Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-Example.modulemap"; sourceTree = ""; }; 36 | 3692CDCE37798947D45B8637B4A32038 /* StickyHeaderFlowLayout.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = StickyHeaderFlowLayout.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 37 | 4047B086DF31E43AA06F1F60CC9EC6E5 /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_Example.framework; path = "Pods-Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 38 | 40CB39E715FBCDAA142E6513E126200A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 39 | 441854E35F81731E63E53DC7E4EEAD9D /* Pods-Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Example-acknowledgements.markdown"; sourceTree = ""; }; 40 | 4EFC56309689F8EBE110DD3A622C93AD /* StickyHeaderFlowLayout-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "StickyHeaderFlowLayout-prefix.pch"; sourceTree = ""; }; 41 | 50F5C33F5BE0F521E45DB02145225156 /* StickyHeaderFlowLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StickyHeaderFlowLayout.swift; path = StickyHeaderFlowLayout/Classes/StickyHeaderFlowLayout.swift; sourceTree = ""; }; 42 | 6CE353BD73513B79D3E4F128A1AE0A20 /* StickyHeaderFlowLayout.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = StickyHeaderFlowLayout.modulemap; sourceTree = ""; }; 43 | 6FB0ED361338A7A71E22E09690474E3F /* StickyHeaderFlowLayout-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "StickyHeaderFlowLayout-dummy.m"; sourceTree = ""; }; 44 | 7825A90E082A1582EB16256B0E722B3F /* Pods-Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Example-umbrella.h"; sourceTree = ""; }; 45 | 7D9FA451C4851D8F443B3D2E046D9FD1 /* StickyHeaderFlowLayout-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "StickyHeaderFlowLayout-Info.plist"; sourceTree = ""; }; 46 | 7E9B3B42659383A023F0305F91B658AA /* StickyHeaderFlowLayout.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = StickyHeaderFlowLayout.xcconfig; sourceTree = ""; }; 47 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 48 | AFECBC24E09D0D25F822C27BD944AFD4 /* Pods-Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Example-frameworks.sh"; sourceTree = ""; }; 49 | B45138496B85A072654D1D0F8EBBEDE5 /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.debug.xcconfig"; sourceTree = ""; }; 50 | C32DA58D5E552F7D09C95A2FABF5188D /* StickyHeaderFlowLayout-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "StickyHeaderFlowLayout-umbrella.h"; sourceTree = ""; }; 51 | D6D7C498FA339E02BD53ECB8916CEA8E /* Pods-Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Example-dummy.m"; sourceTree = ""; }; 52 | DFA2D66FDD3A69D8678878A660D22DF3 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; 53 | E54195536749EADE9D3704B9F5D44D65 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; 54 | EA21B344259B58996DB73382B1B1521F /* Pods-Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-acknowledgements.plist"; sourceTree = ""; }; 55 | EAF95A22DBB4BFFEA63EF28CFBA9A425 /* StickyHeaderFlowLayout.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = StickyHeaderFlowLayout.framework; path = StickyHeaderFlowLayout.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 56 | ECF2A2B0720AE923C22BED3192888BE0 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; 57 | /* End PBXFileReference section */ 58 | 59 | /* Begin PBXFrameworksBuildPhase section */ 60 | 442902C53954A478CE3924BCDD95C564 /* Frameworks */ = { 61 | isa = PBXFrameworksBuildPhase; 62 | buildActionMask = 2147483647; 63 | files = ( 64 | 8968E2442AAFDDB89A5EC3F7BF58D731 /* Foundation.framework in Frameworks */, 65 | 35D94D0268DE4634F556D0CBE356B8D7 /* UIKit.framework in Frameworks */, 66 | ); 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | CA3F0DDAE98C61BDE899719B6A2DF63C /* Frameworks */ = { 70 | isa = PBXFrameworksBuildPhase; 71 | buildActionMask = 2147483647; 72 | files = ( 73 | 3A8648419C331474F84021A4E27CBD83 /* Foundation.framework in Frameworks */, 74 | ); 75 | runOnlyForDeploymentPostprocessing = 0; 76 | }; 77 | /* End PBXFrameworksBuildPhase section */ 78 | 79 | /* Begin PBXGroup section */ 80 | 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = { 81 | isa = PBXGroup; 82 | children = ( 83 | E169A450ED27AC725DF52953F66D11E0 /* iOS */, 84 | ); 85 | name = Frameworks; 86 | sourceTree = ""; 87 | }; 88 | 1B1580ACE84F4547E4F23158A2A5DA24 /* Pod */ = { 89 | isa = PBXGroup; 90 | children = ( 91 | E54195536749EADE9D3704B9F5D44D65 /* LICENSE */, 92 | DFA2D66FDD3A69D8678878A660D22DF3 /* README.md */, 93 | 3692CDCE37798947D45B8637B4A32038 /* StickyHeaderFlowLayout.podspec */, 94 | ); 95 | name = Pod; 96 | sourceTree = ""; 97 | }; 98 | 565E83AFD614E3387B40F3BE9A33971B /* Development Pods */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | A23E54343CDDBFFACC210E582FBD6379 /* StickyHeaderFlowLayout */, 102 | ); 103 | name = "Development Pods"; 104 | sourceTree = ""; 105 | }; 106 | 602AEF7352306B01699DA697382A0B20 /* Products */ = { 107 | isa = PBXGroup; 108 | children = ( 109 | 4047B086DF31E43AA06F1F60CC9EC6E5 /* Pods_Example.framework */, 110 | EAF95A22DBB4BFFEA63EF28CFBA9A425 /* StickyHeaderFlowLayout.framework */, 111 | ); 112 | name = Products; 113 | sourceTree = ""; 114 | }; 115 | 9BDBD95ED116334D1B2835202D8D3060 /* Pods-Example */ = { 116 | isa = PBXGroup; 117 | children = ( 118 | 35C305D3797C284E6F5BAA1D3E6F9BF8 /* Pods-Example.modulemap */, 119 | 441854E35F81731E63E53DC7E4EEAD9D /* Pods-Example-acknowledgements.markdown */, 120 | EA21B344259B58996DB73382B1B1521F /* Pods-Example-acknowledgements.plist */, 121 | D6D7C498FA339E02BD53ECB8916CEA8E /* Pods-Example-dummy.m */, 122 | AFECBC24E09D0D25F822C27BD944AFD4 /* Pods-Example-frameworks.sh */, 123 | 31C1D37707DFAA5E6A164BCC07834264 /* Pods-Example-Info.plist */, 124 | 7825A90E082A1582EB16256B0E722B3F /* Pods-Example-umbrella.h */, 125 | B45138496B85A072654D1D0F8EBBEDE5 /* Pods-Example.debug.xcconfig */, 126 | 243410B9535472556EA4BB6DBC133A0D /* Pods-Example.release.xcconfig */, 127 | ); 128 | name = "Pods-Example"; 129 | path = "Target Support Files/Pods-Example"; 130 | sourceTree = ""; 131 | }; 132 | A23E54343CDDBFFACC210E582FBD6379 /* StickyHeaderFlowLayout */ = { 133 | isa = PBXGroup; 134 | children = ( 135 | 50F5C33F5BE0F521E45DB02145225156 /* StickyHeaderFlowLayout.swift */, 136 | 118019065266EA5F0BFA412E8F391AFA /* StickyHeaderFlowLayoutAttributes.swift */, 137 | 1B1580ACE84F4547E4F23158A2A5DA24 /* Pod */, 138 | FA715227E1FE8BEAC05C1AC6A61EF39E /* Support Files */, 139 | ); 140 | name = StickyHeaderFlowLayout; 141 | path = ../..; 142 | sourceTree = ""; 143 | }; 144 | CE2E825F08D3AD0FD76E6D78D7512ED0 /* Targets Support Files */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | 9BDBD95ED116334D1B2835202D8D3060 /* Pods-Example */, 148 | ); 149 | name = "Targets Support Files"; 150 | sourceTree = ""; 151 | }; 152 | CF1408CF629C7361332E53B88F7BD30C = { 153 | isa = PBXGroup; 154 | children = ( 155 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 156 | 565E83AFD614E3387B40F3BE9A33971B /* Development Pods */, 157 | 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */, 158 | 602AEF7352306B01699DA697382A0B20 /* Products */, 159 | CE2E825F08D3AD0FD76E6D78D7512ED0 /* Targets Support Files */, 160 | ); 161 | sourceTree = ""; 162 | }; 163 | E169A450ED27AC725DF52953F66D11E0 /* iOS */ = { 164 | isa = PBXGroup; 165 | children = ( 166 | 40CB39E715FBCDAA142E6513E126200A /* Foundation.framework */, 167 | ECF2A2B0720AE923C22BED3192888BE0 /* UIKit.framework */, 168 | ); 169 | name = iOS; 170 | sourceTree = ""; 171 | }; 172 | FA715227E1FE8BEAC05C1AC6A61EF39E /* Support Files */ = { 173 | isa = PBXGroup; 174 | children = ( 175 | 6CE353BD73513B79D3E4F128A1AE0A20 /* StickyHeaderFlowLayout.modulemap */, 176 | 7E9B3B42659383A023F0305F91B658AA /* StickyHeaderFlowLayout.xcconfig */, 177 | 6FB0ED361338A7A71E22E09690474E3F /* StickyHeaderFlowLayout-dummy.m */, 178 | 7D9FA451C4851D8F443B3D2E046D9FD1 /* StickyHeaderFlowLayout-Info.plist */, 179 | 4EFC56309689F8EBE110DD3A622C93AD /* StickyHeaderFlowLayout-prefix.pch */, 180 | C32DA58D5E552F7D09C95A2FABF5188D /* StickyHeaderFlowLayout-umbrella.h */, 181 | ); 182 | name = "Support Files"; 183 | path = "Example/Pods/Target Support Files/StickyHeaderFlowLayout"; 184 | sourceTree = ""; 185 | }; 186 | /* End PBXGroup section */ 187 | 188 | /* Begin PBXHeadersBuildPhase section */ 189 | 03A142ED7D799F26E58BCEA441775788 /* Headers */ = { 190 | isa = PBXHeadersBuildPhase; 191 | buildActionMask = 2147483647; 192 | files = ( 193 | 4CFEADD797100CA9D6DB1501FF9BE968 /* StickyHeaderFlowLayout-umbrella.h in Headers */, 194 | ); 195 | runOnlyForDeploymentPostprocessing = 0; 196 | }; 197 | 37C0208891D6CBF287A0C99D3FDDA92F /* Headers */ = { 198 | isa = PBXHeadersBuildPhase; 199 | buildActionMask = 2147483647; 200 | files = ( 201 | 765870CB7746D953C8CFAE11471949B0 /* Pods-Example-umbrella.h in Headers */, 202 | ); 203 | runOnlyForDeploymentPostprocessing = 0; 204 | }; 205 | /* End PBXHeadersBuildPhase section */ 206 | 207 | /* Begin PBXNativeTarget section */ 208 | 0AEE99A309977BD12A049FF48AF9BA4B /* Pods-Example */ = { 209 | isa = PBXNativeTarget; 210 | buildConfigurationList = DE3C3176A50A910BD91ACE691894E3CB /* Build configuration list for PBXNativeTarget "Pods-Example" */; 211 | buildPhases = ( 212 | 37C0208891D6CBF287A0C99D3FDDA92F /* Headers */, 213 | F5B455B3E6E6E38997A0411B3642B650 /* Sources */, 214 | CA3F0DDAE98C61BDE899719B6A2DF63C /* Frameworks */, 215 | 26BD2736A609DBD9918160CE9061D52C /* Resources */, 216 | ); 217 | buildRules = ( 218 | ); 219 | dependencies = ( 220 | 14F0A6918C39E169D6ADD18BDA061285 /* PBXTargetDependency */, 221 | ); 222 | name = "Pods-Example"; 223 | productName = "Pods-Example"; 224 | productReference = 4047B086DF31E43AA06F1F60CC9EC6E5 /* Pods_Example.framework */; 225 | productType = "com.apple.product-type.framework"; 226 | }; 227 | 40C945FB80B39872735EB9619BDC1A3C /* StickyHeaderFlowLayout */ = { 228 | isa = PBXNativeTarget; 229 | buildConfigurationList = 80D83C628FAF9A8B854DECD22874808F /* Build configuration list for PBXNativeTarget "StickyHeaderFlowLayout" */; 230 | buildPhases = ( 231 | 03A142ED7D799F26E58BCEA441775788 /* Headers */, 232 | 8BBB14DB6503D5D5F83B7C01C7DDA7CB /* Sources */, 233 | 442902C53954A478CE3924BCDD95C564 /* Frameworks */, 234 | 31FA0054C9683F0E892FD0475AE95F7A /* Resources */, 235 | ); 236 | buildRules = ( 237 | ); 238 | dependencies = ( 239 | ); 240 | name = StickyHeaderFlowLayout; 241 | productName = StickyHeaderFlowLayout; 242 | productReference = EAF95A22DBB4BFFEA63EF28CFBA9A425 /* StickyHeaderFlowLayout.framework */; 243 | productType = "com.apple.product-type.framework"; 244 | }; 245 | /* End PBXNativeTarget section */ 246 | 247 | /* Begin PBXProject section */ 248 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = { 249 | isa = PBXProject; 250 | attributes = { 251 | LastSwiftUpdateCheck = 0930; 252 | LastUpgradeCheck = 0930; 253 | }; 254 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; 255 | compatibilityVersion = "Xcode 3.2"; 256 | developmentRegion = English; 257 | hasScannedForEncodings = 0; 258 | knownRegions = ( 259 | en, 260 | ); 261 | mainGroup = CF1408CF629C7361332E53B88F7BD30C; 262 | productRefGroup = 602AEF7352306B01699DA697382A0B20 /* Products */; 263 | projectDirPath = ""; 264 | projectRoot = ""; 265 | targets = ( 266 | 0AEE99A309977BD12A049FF48AF9BA4B /* Pods-Example */, 267 | 40C945FB80B39872735EB9619BDC1A3C /* StickyHeaderFlowLayout */, 268 | ); 269 | }; 270 | /* End PBXProject section */ 271 | 272 | /* Begin PBXResourcesBuildPhase section */ 273 | 26BD2736A609DBD9918160CE9061D52C /* Resources */ = { 274 | isa = PBXResourcesBuildPhase; 275 | buildActionMask = 2147483647; 276 | files = ( 277 | ); 278 | runOnlyForDeploymentPostprocessing = 0; 279 | }; 280 | 31FA0054C9683F0E892FD0475AE95F7A /* Resources */ = { 281 | isa = PBXResourcesBuildPhase; 282 | buildActionMask = 2147483647; 283 | files = ( 284 | ); 285 | runOnlyForDeploymentPostprocessing = 0; 286 | }; 287 | /* End PBXResourcesBuildPhase section */ 288 | 289 | /* Begin PBXSourcesBuildPhase section */ 290 | 8BBB14DB6503D5D5F83B7C01C7DDA7CB /* Sources */ = { 291 | isa = PBXSourcesBuildPhase; 292 | buildActionMask = 2147483647; 293 | files = ( 294 | 3D7432320C2F3F7185362CA06E8EFABB /* StickyHeaderFlowLayout-dummy.m in Sources */, 295 | F0B8EA7457D900BC48E412EB53859F94 /* StickyHeaderFlowLayout.swift in Sources */, 296 | 94289C8EDDA9C7E031F50AC578194760 /* StickyHeaderFlowLayoutAttributes.swift in Sources */, 297 | ); 298 | runOnlyForDeploymentPostprocessing = 0; 299 | }; 300 | F5B455B3E6E6E38997A0411B3642B650 /* Sources */ = { 301 | isa = PBXSourcesBuildPhase; 302 | buildActionMask = 2147483647; 303 | files = ( 304 | 764B240ADC02EE30314FA73C9E7082EE /* Pods-Example-dummy.m in Sources */, 305 | ); 306 | runOnlyForDeploymentPostprocessing = 0; 307 | }; 308 | /* End PBXSourcesBuildPhase section */ 309 | 310 | /* Begin PBXTargetDependency section */ 311 | 14F0A6918C39E169D6ADD18BDA061285 /* PBXTargetDependency */ = { 312 | isa = PBXTargetDependency; 313 | name = StickyHeaderFlowLayout; 314 | target = 40C945FB80B39872735EB9619BDC1A3C /* StickyHeaderFlowLayout */; 315 | targetProxy = FF19EE9A03D7821E892AD4D9FBCE08BB /* PBXContainerItemProxy */; 316 | }; 317 | /* End PBXTargetDependency section */ 318 | 319 | /* Begin XCBuildConfiguration section */ 320 | 07488D4657FB0A78086563621D425F8A /* Debug */ = { 321 | isa = XCBuildConfiguration; 322 | buildSettings = { 323 | ALWAYS_SEARCH_USER_PATHS = NO; 324 | CLANG_ANALYZER_NONNULL = YES; 325 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 326 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 327 | CLANG_CXX_LIBRARY = "libc++"; 328 | CLANG_ENABLE_MODULES = YES; 329 | CLANG_ENABLE_OBJC_ARC = YES; 330 | CLANG_ENABLE_OBJC_WEAK = YES; 331 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 332 | CLANG_WARN_BOOL_CONVERSION = YES; 333 | CLANG_WARN_COMMA = YES; 334 | CLANG_WARN_CONSTANT_CONVERSION = YES; 335 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 336 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 337 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 338 | CLANG_WARN_EMPTY_BODY = YES; 339 | CLANG_WARN_ENUM_CONVERSION = YES; 340 | CLANG_WARN_INFINITE_RECURSION = YES; 341 | CLANG_WARN_INT_CONVERSION = YES; 342 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 343 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 344 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 345 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 346 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 347 | CLANG_WARN_STRICT_PROTOTYPES = YES; 348 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 349 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 350 | CLANG_WARN_UNREACHABLE_CODE = YES; 351 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 352 | COPY_PHASE_STRIP = NO; 353 | DEBUG_INFORMATION_FORMAT = dwarf; 354 | ENABLE_STRICT_OBJC_MSGSEND = YES; 355 | ENABLE_TESTABILITY = YES; 356 | GCC_C_LANGUAGE_STANDARD = gnu11; 357 | GCC_DYNAMIC_NO_PIC = NO; 358 | GCC_NO_COMMON_BLOCKS = YES; 359 | GCC_OPTIMIZATION_LEVEL = 0; 360 | GCC_PREPROCESSOR_DEFINITIONS = ( 361 | "POD_CONFIGURATION_DEBUG=1", 362 | "DEBUG=1", 363 | "$(inherited)", 364 | ); 365 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 366 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 367 | GCC_WARN_UNDECLARED_SELECTOR = YES; 368 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 369 | GCC_WARN_UNUSED_FUNCTION = YES; 370 | GCC_WARN_UNUSED_VARIABLE = YES; 371 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 372 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 373 | MTL_FAST_MATH = YES; 374 | ONLY_ACTIVE_ARCH = YES; 375 | PRODUCT_NAME = "$(TARGET_NAME)"; 376 | STRIP_INSTALLED_PRODUCT = NO; 377 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 378 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 379 | SWIFT_VERSION = 4.2; 380 | SYMROOT = "${SRCROOT}/../build"; 381 | }; 382 | name = Debug; 383 | }; 384 | 39D8A9594A66C91A9FE0795BE5A56A2E /* Debug */ = { 385 | isa = XCBuildConfiguration; 386 | baseConfigurationReference = 7E9B3B42659383A023F0305F91B658AA /* StickyHeaderFlowLayout.xcconfig */; 387 | buildSettings = { 388 | CODE_SIGN_IDENTITY = ""; 389 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 390 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 391 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 392 | CURRENT_PROJECT_VERSION = 1; 393 | DEFINES_MODULE = YES; 394 | DYLIB_COMPATIBILITY_VERSION = 1; 395 | DYLIB_CURRENT_VERSION = 1; 396 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 397 | GCC_PREFIX_HEADER = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-prefix.pch"; 398 | INFOPLIST_FILE = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-Info.plist"; 399 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 400 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 401 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 402 | MODULEMAP_FILE = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout.modulemap"; 403 | PRODUCT_MODULE_NAME = StickyHeaderFlowLayout; 404 | PRODUCT_NAME = StickyHeaderFlowLayout; 405 | SDKROOT = iphoneos; 406 | SKIP_INSTALL = YES; 407 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 408 | SWIFT_VERSION = 5.0; 409 | TARGETED_DEVICE_FAMILY = "1,2"; 410 | VERSIONING_SYSTEM = "apple-generic"; 411 | VERSION_INFO_PREFIX = ""; 412 | }; 413 | name = Debug; 414 | }; 415 | 489FB0F4199BDFD03C93BB88711A2D06 /* Release */ = { 416 | isa = XCBuildConfiguration; 417 | baseConfigurationReference = 7E9B3B42659383A023F0305F91B658AA /* StickyHeaderFlowLayout.xcconfig */; 418 | buildSettings = { 419 | CODE_SIGN_IDENTITY = ""; 420 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 421 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 422 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 423 | CURRENT_PROJECT_VERSION = 1; 424 | DEFINES_MODULE = YES; 425 | DYLIB_COMPATIBILITY_VERSION = 1; 426 | DYLIB_CURRENT_VERSION = 1; 427 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 428 | GCC_PREFIX_HEADER = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-prefix.pch"; 429 | INFOPLIST_FILE = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-Info.plist"; 430 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 431 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 432 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 433 | MODULEMAP_FILE = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout.modulemap"; 434 | PRODUCT_MODULE_NAME = StickyHeaderFlowLayout; 435 | PRODUCT_NAME = StickyHeaderFlowLayout; 436 | SDKROOT = iphoneos; 437 | SKIP_INSTALL = YES; 438 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 439 | SWIFT_VERSION = 5.0; 440 | TARGETED_DEVICE_FAMILY = "1,2"; 441 | VALIDATE_PRODUCT = YES; 442 | VERSIONING_SYSTEM = "apple-generic"; 443 | VERSION_INFO_PREFIX = ""; 444 | }; 445 | name = Release; 446 | }; 447 | A1962E6FF39BBAC201A2E5DDF99557DF /* Release */ = { 448 | isa = XCBuildConfiguration; 449 | buildSettings = { 450 | ALWAYS_SEARCH_USER_PATHS = NO; 451 | CLANG_ANALYZER_NONNULL = YES; 452 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 453 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 454 | CLANG_CXX_LIBRARY = "libc++"; 455 | CLANG_ENABLE_MODULES = YES; 456 | CLANG_ENABLE_OBJC_ARC = YES; 457 | CLANG_ENABLE_OBJC_WEAK = YES; 458 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 459 | CLANG_WARN_BOOL_CONVERSION = YES; 460 | CLANG_WARN_COMMA = YES; 461 | CLANG_WARN_CONSTANT_CONVERSION = YES; 462 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 463 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 464 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 465 | CLANG_WARN_EMPTY_BODY = YES; 466 | CLANG_WARN_ENUM_CONVERSION = YES; 467 | CLANG_WARN_INFINITE_RECURSION = YES; 468 | CLANG_WARN_INT_CONVERSION = YES; 469 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 470 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 471 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 472 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 473 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 474 | CLANG_WARN_STRICT_PROTOTYPES = YES; 475 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 476 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 477 | CLANG_WARN_UNREACHABLE_CODE = YES; 478 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 479 | COPY_PHASE_STRIP = NO; 480 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 481 | ENABLE_NS_ASSERTIONS = NO; 482 | ENABLE_STRICT_OBJC_MSGSEND = YES; 483 | GCC_C_LANGUAGE_STANDARD = gnu11; 484 | GCC_NO_COMMON_BLOCKS = YES; 485 | GCC_PREPROCESSOR_DEFINITIONS = ( 486 | "POD_CONFIGURATION_RELEASE=1", 487 | "$(inherited)", 488 | ); 489 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 490 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 491 | GCC_WARN_UNDECLARED_SELECTOR = YES; 492 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 493 | GCC_WARN_UNUSED_FUNCTION = YES; 494 | GCC_WARN_UNUSED_VARIABLE = YES; 495 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 496 | MTL_ENABLE_DEBUG_INFO = NO; 497 | MTL_FAST_MATH = YES; 498 | PRODUCT_NAME = "$(TARGET_NAME)"; 499 | STRIP_INSTALLED_PRODUCT = NO; 500 | SWIFT_COMPILATION_MODE = wholemodule; 501 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 502 | SWIFT_VERSION = 4.2; 503 | SYMROOT = "${SRCROOT}/../build"; 504 | }; 505 | name = Release; 506 | }; 507 | AF8FCDD68146ABABC8EB48D487668CBD /* Debug */ = { 508 | isa = XCBuildConfiguration; 509 | baseConfigurationReference = B45138496B85A072654D1D0F8EBBEDE5 /* Pods-Example.debug.xcconfig */; 510 | buildSettings = { 511 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 512 | CODE_SIGN_IDENTITY = ""; 513 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 514 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 515 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 516 | CURRENT_PROJECT_VERSION = 1; 517 | DEFINES_MODULE = YES; 518 | DYLIB_COMPATIBILITY_VERSION = 1; 519 | DYLIB_CURRENT_VERSION = 1; 520 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 521 | INFOPLIST_FILE = "Target Support Files/Pods-Example/Pods-Example-Info.plist"; 522 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 523 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 524 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 525 | MACH_O_TYPE = staticlib; 526 | MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.modulemap"; 527 | OTHER_LDFLAGS = ""; 528 | OTHER_LIBTOOLFLAGS = ""; 529 | PODS_ROOT = "$(SRCROOT)"; 530 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 531 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 532 | SDKROOT = iphoneos; 533 | SKIP_INSTALL = YES; 534 | TARGETED_DEVICE_FAMILY = "1,2"; 535 | VERSIONING_SYSTEM = "apple-generic"; 536 | VERSION_INFO_PREFIX = ""; 537 | }; 538 | name = Debug; 539 | }; 540 | CCAE0C4C334BD450CDD3C30C5E1B4999 /* Release */ = { 541 | isa = XCBuildConfiguration; 542 | baseConfigurationReference = 243410B9535472556EA4BB6DBC133A0D /* Pods-Example.release.xcconfig */; 543 | buildSettings = { 544 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 545 | CODE_SIGN_IDENTITY = ""; 546 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 547 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 548 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 549 | CURRENT_PROJECT_VERSION = 1; 550 | DEFINES_MODULE = YES; 551 | DYLIB_COMPATIBILITY_VERSION = 1; 552 | DYLIB_CURRENT_VERSION = 1; 553 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 554 | INFOPLIST_FILE = "Target Support Files/Pods-Example/Pods-Example-Info.plist"; 555 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 556 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 557 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 558 | MACH_O_TYPE = staticlib; 559 | MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.modulemap"; 560 | OTHER_LDFLAGS = ""; 561 | OTHER_LIBTOOLFLAGS = ""; 562 | PODS_ROOT = "$(SRCROOT)"; 563 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 564 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 565 | SDKROOT = iphoneos; 566 | SKIP_INSTALL = YES; 567 | TARGETED_DEVICE_FAMILY = "1,2"; 568 | VALIDATE_PRODUCT = YES; 569 | VERSIONING_SYSTEM = "apple-generic"; 570 | VERSION_INFO_PREFIX = ""; 571 | }; 572 | name = Release; 573 | }; 574 | /* End XCBuildConfiguration section */ 575 | 576 | /* Begin XCConfigurationList section */ 577 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { 578 | isa = XCConfigurationList; 579 | buildConfigurations = ( 580 | 07488D4657FB0A78086563621D425F8A /* Debug */, 581 | A1962E6FF39BBAC201A2E5DDF99557DF /* Release */, 582 | ); 583 | defaultConfigurationIsVisible = 0; 584 | defaultConfigurationName = Release; 585 | }; 586 | 80D83C628FAF9A8B854DECD22874808F /* Build configuration list for PBXNativeTarget "StickyHeaderFlowLayout" */ = { 587 | isa = XCConfigurationList; 588 | buildConfigurations = ( 589 | 39D8A9594A66C91A9FE0795BE5A56A2E /* Debug */, 590 | 489FB0F4199BDFD03C93BB88711A2D06 /* Release */, 591 | ); 592 | defaultConfigurationIsVisible = 0; 593 | defaultConfigurationName = Release; 594 | }; 595 | DE3C3176A50A910BD91ACE691894E3CB /* Build configuration list for PBXNativeTarget "Pods-Example" */ = { 596 | isa = XCConfigurationList; 597 | buildConfigurations = ( 598 | AF8FCDD68146ABABC8EB48D487668CBD /* Debug */, 599 | CCAE0C4C334BD450CDD3C30C5E1B4999 /* Release */, 600 | ); 601 | defaultConfigurationIsVisible = 0; 602 | defaultConfigurationName = Release; 603 | }; 604 | /* End XCConfigurationList section */ 605 | }; 606 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; 607 | } 608 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## StickyHeaderFlowLayout 5 | 6 | MIT License 7 | 8 | Copyright (c) 2018 Timur Bernikowich 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | 28 | Generated by CocoaPods - https://cocoapods.org 29 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | MIT License 18 | 19 | Copyright (c) 2018 Timur Bernikowich 20 | 21 | Permission is hereby granted, free of charge, to any person obtaining a copy 22 | of this software and associated documentation files (the "Software"), to deal 23 | in the Software without restriction, including without limitation the rights 24 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 25 | copies of the Software, and to permit persons to whom the Software is 26 | furnished to do so, subject to the following conditions: 27 | 28 | The above copyright notice and this permission notice shall be included in all 29 | copies or substantial portions of the Software. 30 | 31 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 32 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 33 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 34 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 35 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 36 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 37 | SOFTWARE. 38 | 39 | License 40 | MIT 41 | Title 42 | StickyHeaderFlowLayout 43 | Type 44 | PSGroupSpecifier 45 | 46 | 47 | FooterText 48 | Generated by CocoaPods - https://cocoapods.org 49 | Title 50 | 51 | Type 52 | PSGroupSpecifier 53 | 54 | 55 | StringsTable 56 | Acknowledgements 57 | Title 58 | Acknowledgements 59 | 60 | 61 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | 23 | # Used as a return value for each invocation of `strip_invalid_archs` function. 24 | STRIP_BINARY_RETVAL=0 25 | 26 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 27 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 28 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 29 | 30 | # Copies and strips a vendored framework 31 | install_framework() 32 | { 33 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 34 | local source="${BUILT_PRODUCTS_DIR}/$1" 35 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 36 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 37 | elif [ -r "$1" ]; then 38 | local source="$1" 39 | fi 40 | 41 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 42 | 43 | if [ -L "${source}" ]; then 44 | echo "Symlinked..." 45 | source="$(readlink "${source}")" 46 | fi 47 | 48 | # Use filter instead of exclude so missing patterns don't throw errors. 49 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 50 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 51 | 52 | local basename 53 | basename="$(basename -s .framework "$1")" 54 | binary="${destination}/${basename}.framework/${basename}" 55 | 56 | if ! [ -r "$binary" ]; then 57 | binary="${destination}/${basename}" 58 | elif [ -L "${binary}" ]; then 59 | echo "Destination binary is symlinked..." 60 | dirname="$(dirname "${binary}")" 61 | binary="${dirname}/$(readlink "${binary}")" 62 | fi 63 | 64 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 65 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 66 | strip_invalid_archs "$binary" 67 | fi 68 | 69 | # Resign the code if required by the build settings to avoid unstable apps 70 | code_sign_if_enabled "${destination}/$(basename "$1")" 71 | 72 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 73 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 74 | local swift_runtime_libs 75 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 76 | for lib in $swift_runtime_libs; do 77 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 78 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 79 | code_sign_if_enabled "${destination}/${lib}" 80 | done 81 | fi 82 | } 83 | 84 | # Copies and strips a vendored dSYM 85 | install_dsym() { 86 | local source="$1" 87 | if [ -r "$source" ]; then 88 | # Copy the dSYM into a the targets temp dir. 89 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 90 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 91 | 92 | local basename 93 | basename="$(basename -s .framework.dSYM "$source")" 94 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 95 | 96 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 97 | if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then 98 | strip_invalid_archs "$binary" 99 | fi 100 | 101 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 102 | # Move the stripped file into its final destination. 103 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 104 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 105 | else 106 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 107 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 108 | fi 109 | fi 110 | } 111 | 112 | # Copies the bcsymbolmap files of a vendored framework 113 | install_bcsymbolmap() { 114 | local bcsymbolmap_path="$1" 115 | local destination="${BUILT_PRODUCTS_DIR}" 116 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" 117 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" 118 | } 119 | 120 | # Signs a framework with the provided identity 121 | code_sign_if_enabled() { 122 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 123 | # Use the current code_sign_identity 124 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 125 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 126 | 127 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 128 | code_sign_cmd="$code_sign_cmd &" 129 | fi 130 | echo "$code_sign_cmd" 131 | eval "$code_sign_cmd" 132 | fi 133 | } 134 | 135 | # Strip invalid architectures 136 | strip_invalid_archs() { 137 | binary="$1" 138 | # Get architectures for current target binary 139 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 140 | # Intersect them with the architectures we are building for 141 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 142 | # If there are no archs supported by this binary then warn the user 143 | if [[ -z "$intersected_archs" ]]; then 144 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 145 | STRIP_BINARY_RETVAL=0 146 | return 147 | fi 148 | stripped="" 149 | for arch in $binary_archs; do 150 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 151 | # Strip non-valid architectures in-place 152 | lipo -remove "$arch" -output "$binary" "$binary" 153 | stripped="$stripped $arch" 154 | fi 155 | done 156 | if [[ "$stripped" ]]; then 157 | echo "Stripped $binary of architectures:$stripped" 158 | fi 159 | STRIP_BINARY_RETVAL=1 160 | } 161 | 162 | 163 | if [[ "$CONFIGURATION" == "Debug" ]]; then 164 | install_framework "${BUILT_PRODUCTS_DIR}/StickyHeaderFlowLayout/StickyHeaderFlowLayout.framework" 165 | fi 166 | if [[ "$CONFIGURATION" == "Release" ]]; then 167 | install_framework "${BUILT_PRODUCTS_DIR}/StickyHeaderFlowLayout/StickyHeaderFlowLayout.framework" 168 | fi 169 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 170 | wait 171 | fi 172 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StickyHeaderFlowLayout" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StickyHeaderFlowLayout/StickyHeaderFlowLayout.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "StickyHeaderFlowLayout" -framework "UIKit" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_Example { 2 | umbrella header "Pods-Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StickyHeaderFlowLayout" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StickyHeaderFlowLayout/StickyHeaderFlowLayout.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "StickyHeaderFlowLayout" -framework "UIKit" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.9.4 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_StickyHeaderFlowLayout : NSObject 3 | @end 4 | @implementation PodsDummy_StickyHeaderFlowLayout 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double StickyHeaderFlowLayoutVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char StickyHeaderFlowLayoutVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout.modulemap: -------------------------------------------------------------------------------- 1 | framework module StickyHeaderFlowLayout { 2 | umbrella header "StickyHeaderFlowLayout-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/StickyHeaderFlowLayout 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_LDFLAGS = $(inherited) -framework "UIKit" 4 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | -------------------------------------------------------------------------------- /Example/StickyHeaderFlowLayout.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1DF50A82E927EBA871BEE3A2 /* Pods_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 514C3341BE0F2FB319962E4C /* Pods_Example.framework */; }; 11 | 967CE8A22270B799005F851A /* CollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967CE8972270B798005F851A /* CollectionViewController.swift */; }; 12 | 967CE8A42270B799005F851A /* CollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967CE8992270B798005F851A /* CollectionViewCell.swift */; }; 13 | 967CE8A52270B799005F851A /* CollectionViewSectionHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967CE89A2270B798005F851A /* CollectionViewSectionHeader.swift */; }; 14 | 967CE8A62270B799005F851A /* CollectionParallaxHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967CE89B2270B798005F851A /* CollectionParallaxHeader.swift */; }; 15 | 967CE8A92270B799005F851A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967CE89F2270B799005F851A /* AppDelegate.swift */; }; 16 | 967CE8AA2270B799005F851A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 967CE8A02270B799005F851A /* Assets.xcassets */; }; 17 | 96DA112A2270BC26003B77DC /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 96DA11292270BC26003B77DC /* LaunchScreen.storyboard */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXFileReference section */ 21 | 056025ED3BFCB320B751B192 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 22 | 1B364769CDC0DD15980521CF /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 23 | 24E13AA71E2BF397464604DC /* Pods-Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests.debug.xcconfig"; path = "Target Support Files/Pods-Tests/Pods-Tests.debug.xcconfig"; sourceTree = ""; }; 24 | 27976B1CDD09415C9AB6AE4F /* Pods-StickyHeaderFlowLayout_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StickyHeaderFlowLayout_Example.debug.xcconfig"; path = "Target Support Files/Pods-StickyHeaderFlowLayout_Example/Pods-StickyHeaderFlowLayout_Example.debug.xcconfig"; sourceTree = ""; }; 25 | 514C3341BE0F2FB319962E4C /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 26 | 527832DE83E5F5843A269CB4 /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.release.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.release.xcconfig"; sourceTree = ""; }; 27 | 607FACD01AFB9204008FA782 /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 28 | 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 29 | 607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; 30 | 967CE8972270B798005F851A /* CollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewController.swift; sourceTree = ""; }; 31 | 967CE8982270B798005F851A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 32 | 967CE8992270B798005F851A /* CollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewCell.swift; sourceTree = ""; }; 33 | 967CE89A2270B798005F851A /* CollectionViewSectionHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewSectionHeader.swift; sourceTree = ""; }; 34 | 967CE89B2270B798005F851A /* CollectionParallaxHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionParallaxHeader.swift; sourceTree = ""; }; 35 | 967CE89F2270B799005F851A /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 36 | 967CE8A02270B799005F851A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 37 | 96DA11292270BC26003B77DC /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; 38 | A00CD01A851EBED0B9482915 /* StickyHeaderFlowLayout.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = StickyHeaderFlowLayout.podspec; path = ../StickyHeaderFlowLayout.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 39 | DB39E3C87DC2534CEE820EE1 /* Pods-StickyHeaderFlowLayout_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StickyHeaderFlowLayout_Tests.debug.xcconfig"; path = "Target Support Files/Pods-StickyHeaderFlowLayout_Tests/Pods-StickyHeaderFlowLayout_Tests.debug.xcconfig"; sourceTree = ""; }; 40 | DDBA37BF865EF3B64D1AB8BE /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.debug.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.debug.xcconfig"; sourceTree = ""; }; 41 | EACC21754180AA58C578D590 /* Pods-StickyHeaderFlowLayout_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StickyHeaderFlowLayout_Example.release.xcconfig"; path = "Target Support Files/Pods-StickyHeaderFlowLayout_Example/Pods-StickyHeaderFlowLayout_Example.release.xcconfig"; sourceTree = ""; }; 42 | EF9CF16FB3025C88380AFE48 /* Pods-StickyHeaderFlowLayout_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StickyHeaderFlowLayout_Tests.release.xcconfig"; path = "Target Support Files/Pods-StickyHeaderFlowLayout_Tests/Pods-StickyHeaderFlowLayout_Tests.release.xcconfig"; sourceTree = ""; }; 43 | FB177CF1351843140B33325E /* Pods-Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests.release.xcconfig"; path = "Target Support Files/Pods-Tests/Pods-Tests.release.xcconfig"; sourceTree = ""; }; 44 | /* End PBXFileReference section */ 45 | 46 | /* Begin PBXFrameworksBuildPhase section */ 47 | 607FACCD1AFB9204008FA782 /* Frameworks */ = { 48 | isa = PBXFrameworksBuildPhase; 49 | buildActionMask = 2147483647; 50 | files = ( 51 | 1DF50A82E927EBA871BEE3A2 /* Pods_Example.framework in Frameworks */, 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 1920E13B220F9436402627E5 /* Frameworks */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 514C3341BE0F2FB319962E4C /* Pods_Example.framework */, 62 | ); 63 | name = Frameworks; 64 | sourceTree = ""; 65 | }; 66 | 607FACC71AFB9204008FA782 = { 67 | isa = PBXGroup; 68 | children = ( 69 | 607FACF51AFB993E008FA782 /* Podspec Metadata */, 70 | 607FACD21AFB9204008FA782 /* Example */, 71 | 607FACE81AFB9204008FA782 /* Tests */, 72 | 607FACD11AFB9204008FA782 /* Products */, 73 | 66E40A9ED0C4CAE6427DA592 /* Pods */, 74 | 1920E13B220F9436402627E5 /* Frameworks */, 75 | ); 76 | sourceTree = ""; 77 | }; 78 | 607FACD11AFB9204008FA782 /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 607FACD01AFB9204008FA782 /* Example.app */, 82 | ); 83 | name = Products; 84 | sourceTree = ""; 85 | }; 86 | 607FACD21AFB9204008FA782 /* Example */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 967CE89F2270B799005F851A /* AppDelegate.swift */, 90 | 967CE8A02270B799005F851A /* Assets.xcassets */, 91 | 967CE89B2270B798005F851A /* CollectionParallaxHeader.swift */, 92 | 967CE8992270B798005F851A /* CollectionViewCell.swift */, 93 | 967CE8972270B798005F851A /* CollectionViewController.swift */, 94 | 967CE89A2270B798005F851A /* CollectionViewSectionHeader.swift */, 95 | 96DA11292270BC26003B77DC /* LaunchScreen.storyboard */, 96 | 967CE8982270B798005F851A /* Info.plist */, 97 | ); 98 | name = Example; 99 | path = StickyHeaderFlowLayout; 100 | sourceTree = ""; 101 | }; 102 | 607FACE81AFB9204008FA782 /* Tests */ = { 103 | isa = PBXGroup; 104 | children = ( 105 | 607FACEB1AFB9204008FA782 /* Tests.swift */, 106 | 607FACE91AFB9204008FA782 /* Supporting Files */, 107 | ); 108 | path = Tests; 109 | sourceTree = ""; 110 | }; 111 | 607FACE91AFB9204008FA782 /* Supporting Files */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | 607FACEA1AFB9204008FA782 /* Info.plist */, 115 | ); 116 | name = "Supporting Files"; 117 | sourceTree = ""; 118 | }; 119 | 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | A00CD01A851EBED0B9482915 /* StickyHeaderFlowLayout.podspec */, 123 | 1B364769CDC0DD15980521CF /* README.md */, 124 | 056025ED3BFCB320B751B192 /* LICENSE */, 125 | ); 126 | name = "Podspec Metadata"; 127 | sourceTree = ""; 128 | }; 129 | 66E40A9ED0C4CAE6427DA592 /* Pods */ = { 130 | isa = PBXGroup; 131 | children = ( 132 | 27976B1CDD09415C9AB6AE4F /* Pods-StickyHeaderFlowLayout_Example.debug.xcconfig */, 133 | EACC21754180AA58C578D590 /* Pods-StickyHeaderFlowLayout_Example.release.xcconfig */, 134 | DB39E3C87DC2534CEE820EE1 /* Pods-StickyHeaderFlowLayout_Tests.debug.xcconfig */, 135 | EF9CF16FB3025C88380AFE48 /* Pods-StickyHeaderFlowLayout_Tests.release.xcconfig */, 136 | DDBA37BF865EF3B64D1AB8BE /* Pods-Example.debug.xcconfig */, 137 | 527832DE83E5F5843A269CB4 /* Pods-Example.release.xcconfig */, 138 | 24E13AA71E2BF397464604DC /* Pods-Tests.debug.xcconfig */, 139 | FB177CF1351843140B33325E /* Pods-Tests.release.xcconfig */, 140 | ); 141 | path = Pods; 142 | sourceTree = ""; 143 | }; 144 | /* End PBXGroup section */ 145 | 146 | /* Begin PBXNativeTarget section */ 147 | 607FACCF1AFB9204008FA782 /* Example */ = { 148 | isa = PBXNativeTarget; 149 | buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Example" */; 150 | buildPhases = ( 151 | DD959C1DB21E05A87C22353D /* [CP] Check Pods Manifest.lock */, 152 | 607FACCC1AFB9204008FA782 /* Sources */, 153 | 607FACCD1AFB9204008FA782 /* Frameworks */, 154 | 607FACCE1AFB9204008FA782 /* Resources */, 155 | 33B0495725065F5ADB199F6C /* [CP] Embed Pods Frameworks */, 156 | ); 157 | buildRules = ( 158 | ); 159 | dependencies = ( 160 | ); 161 | name = Example; 162 | productName = StickyHeaderFlowLayout; 163 | productReference = 607FACD01AFB9204008FA782 /* Example.app */; 164 | productType = "com.apple.product-type.application"; 165 | }; 166 | /* End PBXNativeTarget section */ 167 | 168 | /* Begin PBXProject section */ 169 | 607FACC81AFB9204008FA782 /* Project object */ = { 170 | isa = PBXProject; 171 | attributes = { 172 | LastSwiftUpdateCheck = 0830; 173 | LastUpgradeCheck = 1020; 174 | ORGANIZATIONNAME = CocoaPods; 175 | TargetAttributes = { 176 | 607FACCF1AFB9204008FA782 = { 177 | CreatedOnToolsVersion = 6.3.1; 178 | DevelopmentTeam = PV29U2ZFSB; 179 | LastSwiftMigration = 1020; 180 | }; 181 | }; 182 | }; 183 | buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "StickyHeaderFlowLayout" */; 184 | compatibilityVersion = "Xcode 3.2"; 185 | developmentRegion = en; 186 | hasScannedForEncodings = 0; 187 | knownRegions = ( 188 | en, 189 | Base, 190 | ); 191 | mainGroup = 607FACC71AFB9204008FA782; 192 | productRefGroup = 607FACD11AFB9204008FA782 /* Products */; 193 | projectDirPath = ""; 194 | projectRoot = ""; 195 | targets = ( 196 | 607FACCF1AFB9204008FA782 /* Example */, 197 | ); 198 | }; 199 | /* End PBXProject section */ 200 | 201 | /* Begin PBXResourcesBuildPhase section */ 202 | 607FACCE1AFB9204008FA782 /* Resources */ = { 203 | isa = PBXResourcesBuildPhase; 204 | buildActionMask = 2147483647; 205 | files = ( 206 | 967CE8AA2270B799005F851A /* Assets.xcassets in Resources */, 207 | 96DA112A2270BC26003B77DC /* LaunchScreen.storyboard in Resources */, 208 | ); 209 | runOnlyForDeploymentPostprocessing = 0; 210 | }; 211 | /* End PBXResourcesBuildPhase section */ 212 | 213 | /* Begin PBXShellScriptBuildPhase section */ 214 | 33B0495725065F5ADB199F6C /* [CP] Embed Pods Frameworks */ = { 215 | isa = PBXShellScriptBuildPhase; 216 | buildActionMask = 2147483647; 217 | files = ( 218 | ); 219 | inputPaths = ( 220 | "${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh", 221 | "${BUILT_PRODUCTS_DIR}/StickyHeaderFlowLayout/StickyHeaderFlowLayout.framework", 222 | ); 223 | name = "[CP] Embed Pods Frameworks"; 224 | outputPaths = ( 225 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/StickyHeaderFlowLayout.framework", 226 | ); 227 | runOnlyForDeploymentPostprocessing = 0; 228 | shellPath = /bin/sh; 229 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh\"\n"; 230 | showEnvVarsInLog = 0; 231 | }; 232 | DD959C1DB21E05A87C22353D /* [CP] Check Pods Manifest.lock */ = { 233 | isa = PBXShellScriptBuildPhase; 234 | buildActionMask = 2147483647; 235 | files = ( 236 | ); 237 | inputFileListPaths = ( 238 | ); 239 | inputPaths = ( 240 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 241 | "${PODS_ROOT}/Manifest.lock", 242 | ); 243 | name = "[CP] Check Pods Manifest.lock"; 244 | outputFileListPaths = ( 245 | ); 246 | outputPaths = ( 247 | "$(DERIVED_FILE_DIR)/Pods-Example-checkManifestLockResult.txt", 248 | ); 249 | runOnlyForDeploymentPostprocessing = 0; 250 | shellPath = /bin/sh; 251 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 252 | showEnvVarsInLog = 0; 253 | }; 254 | /* End PBXShellScriptBuildPhase section */ 255 | 256 | /* Begin PBXSourcesBuildPhase section */ 257 | 607FACCC1AFB9204008FA782 /* Sources */ = { 258 | isa = PBXSourcesBuildPhase; 259 | buildActionMask = 2147483647; 260 | files = ( 261 | 967CE8A42270B799005F851A /* CollectionViewCell.swift in Sources */, 262 | 967CE8A22270B799005F851A /* CollectionViewController.swift in Sources */, 263 | 967CE8A52270B799005F851A /* CollectionViewSectionHeader.swift in Sources */, 264 | 967CE8A92270B799005F851A /* AppDelegate.swift in Sources */, 265 | 967CE8A62270B799005F851A /* CollectionParallaxHeader.swift in Sources */, 266 | ); 267 | runOnlyForDeploymentPostprocessing = 0; 268 | }; 269 | /* End PBXSourcesBuildPhase section */ 270 | 271 | /* Begin XCBuildConfiguration section */ 272 | 607FACED1AFB9204008FA782 /* Debug */ = { 273 | isa = XCBuildConfiguration; 274 | buildSettings = { 275 | ALWAYS_SEARCH_USER_PATHS = NO; 276 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 277 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 278 | CLANG_CXX_LIBRARY = "libc++"; 279 | CLANG_ENABLE_MODULES = YES; 280 | CLANG_ENABLE_OBJC_ARC = YES; 281 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 282 | CLANG_WARN_BOOL_CONVERSION = YES; 283 | CLANG_WARN_COMMA = YES; 284 | CLANG_WARN_CONSTANT_CONVERSION = YES; 285 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 286 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 287 | CLANG_WARN_EMPTY_BODY = YES; 288 | CLANG_WARN_ENUM_CONVERSION = YES; 289 | CLANG_WARN_INFINITE_RECURSION = YES; 290 | CLANG_WARN_INT_CONVERSION = YES; 291 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 292 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 293 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 294 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 295 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 296 | CLANG_WARN_STRICT_PROTOTYPES = YES; 297 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 298 | CLANG_WARN_UNREACHABLE_CODE = YES; 299 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 300 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 301 | COPY_PHASE_STRIP = NO; 302 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 303 | ENABLE_STRICT_OBJC_MSGSEND = YES; 304 | ENABLE_TESTABILITY = YES; 305 | GCC_C_LANGUAGE_STANDARD = gnu99; 306 | GCC_DYNAMIC_NO_PIC = NO; 307 | GCC_NO_COMMON_BLOCKS = YES; 308 | GCC_OPTIMIZATION_LEVEL = 0; 309 | GCC_PREPROCESSOR_DEFINITIONS = ( 310 | "DEBUG=1", 311 | "$(inherited)", 312 | ); 313 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 314 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 315 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 316 | GCC_WARN_UNDECLARED_SELECTOR = YES; 317 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 318 | GCC_WARN_UNUSED_FUNCTION = YES; 319 | GCC_WARN_UNUSED_VARIABLE = YES; 320 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 321 | MTL_ENABLE_DEBUG_INFO = YES; 322 | ONLY_ACTIVE_ARCH = YES; 323 | SDKROOT = iphoneos; 324 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 325 | SWIFT_VERSION = 5.0; 326 | }; 327 | name = Debug; 328 | }; 329 | 607FACEE1AFB9204008FA782 /* Release */ = { 330 | isa = XCBuildConfiguration; 331 | buildSettings = { 332 | ALWAYS_SEARCH_USER_PATHS = NO; 333 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 334 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 335 | CLANG_CXX_LIBRARY = "libc++"; 336 | CLANG_ENABLE_MODULES = YES; 337 | CLANG_ENABLE_OBJC_ARC = YES; 338 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 339 | CLANG_WARN_BOOL_CONVERSION = YES; 340 | CLANG_WARN_COMMA = YES; 341 | CLANG_WARN_CONSTANT_CONVERSION = YES; 342 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 343 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 344 | CLANG_WARN_EMPTY_BODY = YES; 345 | CLANG_WARN_ENUM_CONVERSION = YES; 346 | CLANG_WARN_INFINITE_RECURSION = YES; 347 | CLANG_WARN_INT_CONVERSION = YES; 348 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 349 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 350 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 351 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 352 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 353 | CLANG_WARN_STRICT_PROTOTYPES = YES; 354 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 355 | CLANG_WARN_UNREACHABLE_CODE = YES; 356 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 357 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 358 | COPY_PHASE_STRIP = NO; 359 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 360 | ENABLE_NS_ASSERTIONS = NO; 361 | ENABLE_STRICT_OBJC_MSGSEND = YES; 362 | GCC_C_LANGUAGE_STANDARD = gnu99; 363 | GCC_NO_COMMON_BLOCKS = YES; 364 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 365 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 366 | GCC_WARN_UNDECLARED_SELECTOR = YES; 367 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 368 | GCC_WARN_UNUSED_FUNCTION = YES; 369 | GCC_WARN_UNUSED_VARIABLE = YES; 370 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 371 | MTL_ENABLE_DEBUG_INFO = NO; 372 | SDKROOT = iphoneos; 373 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 374 | SWIFT_VERSION = 5.0; 375 | VALIDATE_PRODUCT = YES; 376 | }; 377 | name = Release; 378 | }; 379 | 607FACF01AFB9204008FA782 /* Debug */ = { 380 | isa = XCBuildConfiguration; 381 | baseConfigurationReference = DDBA37BF865EF3B64D1AB8BE /* Pods-Example.debug.xcconfig */; 382 | buildSettings = { 383 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 384 | CLANG_ENABLE_MODULES = YES; 385 | DEVELOPMENT_TEAM = PV29U2ZFSB; 386 | INFOPLIST_FILE = StickyHeaderFlowLayout/Info.plist; 387 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 388 | MODULE_NAME = ExampleApp; 389 | PRODUCT_BUNDLE_IDENTIFIER = bernikovich.StickyHeaderFlowLayout; 390 | PRODUCT_NAME = "$(TARGET_NAME)"; 391 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 392 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 393 | }; 394 | name = Debug; 395 | }; 396 | 607FACF11AFB9204008FA782 /* Release */ = { 397 | isa = XCBuildConfiguration; 398 | baseConfigurationReference = 527832DE83E5F5843A269CB4 /* Pods-Example.release.xcconfig */; 399 | buildSettings = { 400 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 401 | CLANG_ENABLE_MODULES = YES; 402 | DEVELOPMENT_TEAM = PV29U2ZFSB; 403 | INFOPLIST_FILE = StickyHeaderFlowLayout/Info.plist; 404 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 405 | MODULE_NAME = ExampleApp; 406 | PRODUCT_BUNDLE_IDENTIFIER = bernikovich.StickyHeaderFlowLayout; 407 | PRODUCT_NAME = "$(TARGET_NAME)"; 408 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 409 | }; 410 | name = Release; 411 | }; 412 | /* End XCBuildConfiguration section */ 413 | 414 | /* Begin XCConfigurationList section */ 415 | 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "StickyHeaderFlowLayout" */ = { 416 | isa = XCConfigurationList; 417 | buildConfigurations = ( 418 | 607FACED1AFB9204008FA782 /* Debug */, 419 | 607FACEE1AFB9204008FA782 /* Release */, 420 | ); 421 | defaultConfigurationIsVisible = 0; 422 | defaultConfigurationName = Release; 423 | }; 424 | 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Example" */ = { 425 | isa = XCConfigurationList; 426 | buildConfigurations = ( 427 | 607FACF01AFB9204008FA782 /* Debug */, 428 | 607FACF11AFB9204008FA782 /* Release */, 429 | ); 430 | defaultConfigurationIsVisible = 0; 431 | defaultConfigurationName = Release; 432 | }; 433 | /* End XCConfigurationList section */ 434 | }; 435 | rootObject = 607FACC81AFB9204008FA782 /* Project object */; 436 | } 437 | -------------------------------------------------------------------------------- /Example/StickyHeaderFlowLayout.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/StickyHeaderFlowLayout.xcodeproj/xcshareddata/xcschemes/Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 67 | 68 | 78 | 80 | 86 | 87 | 88 | 89 | 90 | 91 | 97 | 99 | 105 | 106 | 107 | 108 | 110 | 111 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /Example/StickyHeaderFlowLayout.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/StickyHeaderFlowLayout.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/StickyHeaderFlowLayout/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tsimur Bernikovich on 12/6/18. 3 | // Copyright © 2018 Tsimur Bernikovich. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | import StickyHeaderFlowLayout 8 | 9 | @UIApplicationMain 10 | class AppDelegate: UIResponder, UIApplicationDelegate { 11 | 12 | var window: UIWindow? 13 | 14 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 15 | let stickyHeaderFlowLayout = StickyHeaderFlowLayout() 16 | let collectionViewController = CollectionViewController(collectionViewLayout: stickyHeaderFlowLayout) 17 | 18 | let window = UIWindow(frame: UIScreen.main.bounds) 19 | window.rootViewController = collectionViewController 20 | window.makeKeyAndVisible() 21 | self.window = window 22 | 23 | return true 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /Example/StickyHeaderFlowLayout/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /Example/StickyHeaderFlowLayout/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Example/StickyHeaderFlowLayout/Assets.xcassets/success-baby.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "success-baby.png" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Example/StickyHeaderFlowLayout/Assets.xcassets/success-baby.imageset/success-baby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bernikovich/StickyHeaderFlowLayout/161e36bf77d7d3a16bb96866f26b74079480f140/Example/StickyHeaderFlowLayout/Assets.xcassets/success-baby.imageset/success-baby.png -------------------------------------------------------------------------------- /Example/StickyHeaderFlowLayout/CollectionParallaxHeader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tsimur Bernikovich on 12/6/18. 3 | // Copyright © 2018 Tsimur Bernikovich. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | 8 | class CollectionParallaxHeader: UICollectionReusableView { 9 | 10 | private var imageView : UIImageView? 11 | 12 | override init(frame: CGRect) { 13 | super.init(frame: frame) 14 | self.backgroundColor = .lightGray 15 | self.clipsToBounds = true 16 | 17 | let bounds = CGRect(x: 0, y: 0, width: frame.maxX, height: frame.maxY) 18 | let imageView = UIImageView(frame: bounds) 19 | imageView.contentMode = .scaleAspectFill 20 | imageView.image = UIImage(named: "success-baby") 21 | self.imageView = imageView 22 | self.addSubview(imageView) 23 | } 24 | 25 | required init?(coder aDecoder: NSCoder) { 26 | super.init(coder: aDecoder) 27 | } 28 | 29 | override func layoutSubviews() { 30 | super.layoutSubviews() 31 | self.imageView?.frame = self.bounds 32 | } 33 | 34 | } 35 | 36 | -------------------------------------------------------------------------------- /Example/StickyHeaderFlowLayout/CollectionViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tsimur Bernikovich on 12/6/18. 3 | // Copyright © 2018 Tsimur Bernikovich. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | 8 | class CollectionViewCell: UICollectionViewCell { 9 | 10 | var text : String? { 11 | didSet { 12 | self.reloadData() 13 | } 14 | } 15 | 16 | private var textLabel : UILabel? 17 | 18 | override init(frame: CGRect) { 19 | super.init(frame: frame) 20 | 21 | backgroundColor = .white 22 | 23 | let bounds = CGRect(x: 0, y: 0, width: frame.maxX, height: frame.maxY) 24 | let label = UILabel(frame: bounds) 25 | label.autoresizingMask = [.flexibleHeight, .flexibleWidth] 26 | self.textLabel = label 27 | self.addSubview(label) 28 | } 29 | 30 | required init?(coder aDecoder: NSCoder) { 31 | super.init(coder: aDecoder) 32 | } 33 | 34 | func reloadData() { 35 | self.textLabel?.text = self.text 36 | } 37 | 38 | override func layoutSubviews() { 39 | super.layoutSubviews() 40 | self.textLabel?.frame = self.bounds 41 | } 42 | 43 | } 44 | 45 | -------------------------------------------------------------------------------- /Example/StickyHeaderFlowLayout/CollectionViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tsimur Bernikovich on 12/6/18. 3 | // Copyright © 2018 Tsimur Bernikovich. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | import StickyHeaderFlowLayout 8 | 9 | class CollectionViewController: UICollectionViewController { 10 | 11 | var items : [String] = ["StickyHeaderFlowLayout basic example", "Example to initialize in code", "Please Enjoy"] 12 | private var layout : StickyHeaderFlowLayout? { 13 | return collectionView?.collectionViewLayout as? StickyHeaderFlowLayout 14 | } 15 | 16 | override func viewDidLoad() { 17 | super.viewDidLoad() 18 | 19 | collectionView?.alwaysBounceVertical = true 20 | view.backgroundColor = .white 21 | 22 | // Setup Cell. 23 | collectionView?.register(CollectionViewCell.self, forCellWithReuseIdentifier: "cell") 24 | layout?.itemSize = CGSize(width: view.frame.size.width, height: 44) 25 | 26 | // Setup Header. 27 | collectionView?.register(CollectionParallaxHeader.self, forSupplementaryViewOfKind: StickyHeaderFlowLayout.parallaxHeaderIdentifier, withReuseIdentifier: "parallaxHeader") 28 | layout?.parallaxHeaderReferenceSize = CGSize(width: self.view.frame.size.width, height: 200) 29 | layout?.parallaxHeaderMinimumReferenceSize = CGSize(width: self.view.frame.size.width, height: 160) 30 | 31 | // Setup Section Header. 32 | collectionView?.register(CollectionViewSectionHeader.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "sectionHeader") 33 | layout?.headerReferenceSize = CGSize(width: view.frame.size.width, height: 40) 34 | } 35 | 36 | // Cells. 37 | override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 38 | return self.items.count 39 | } 40 | 41 | override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 42 | let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell 43 | cell.text = self.items[indexPath.row] 44 | return cell 45 | } 46 | 47 | // Parallax Header. 48 | override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 49 | if kind == StickyHeaderFlowLayout.parallaxHeaderIdentifier { 50 | let view = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "parallaxHeader", for: indexPath) 51 | return view 52 | } else if kind == UICollectionView.elementKindSectionHeader { 53 | let view = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "sectionHeader", for: indexPath) 54 | view.backgroundColor = .lightGray 55 | return view 56 | } 57 | 58 | return UICollectionReusableView() 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /Example/StickyHeaderFlowLayout/CollectionViewSectionHeader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tsimur Bernikovich on 12/6/18. 3 | // Copyright © 2018 Tsimur Bernikovich. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | 8 | class CollectionViewSectionHeader: UICollectionReusableView { 9 | 10 | let label = UILabel() 11 | override init(frame: CGRect) { 12 | super.init(frame: frame) 13 | commonInit() 14 | } 15 | 16 | required init?(coder aDecoder: NSCoder) { 17 | super.init(coder: aDecoder) 18 | commonInit() 19 | } 20 | 21 | func commonInit() { 22 | self.addSubview(label) 23 | label.frame = self.bounds 24 | label.text = UICollectionView.elementKindSectionHeader 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /Example/StickyHeaderFlowLayout/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 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIRequiredDeviceCapabilities 26 | 27 | armv7 28 | 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /Example/StickyHeaderFlowLayout/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Timur Bernikowich 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | StickyHeaderFlowLayout 3 |
4 |

StickyHeaderFlowLayout

5 |

Sticky headers for UICollectionView written in pure Swift

6 |

7 |
8 |

9 | 10 | Based on [CSStickyHeaderFlowLayout](https://github.com/CSStickyHeaderFlowLayout/CSStickyHeaderFlowLayout). `StickyHeaderFlowLayout` makes it easy to create sticky headers in `UICollectionView`. 11 | 12 | ## Integration 13 | 14 | #### CocoaPods 15 | 16 | You can use [CocoaPods](http://cocoapods.org/) to install `StickyHeaderFlowLayout` by adding it to your `Podfile`: 17 | 18 | ```ruby 19 | platform :ios, '9.0' 20 | 21 | target 'MyApp' do 22 | pod 'StickyHeaderFlowLayout' 23 | end 24 | ``` 25 | 26 | #### Manually 27 | 28 | To use this library in your project manually you may: 29 | 30 | Just drag `StickyHeaderFlowLayout.swift` and `StickyHeaderFlowLayoutAttributes.swift` to the project tree 31 | 32 | ## Usage 33 | 34 | #### Sample project 35 | 36 | Repository contains small sample project which shows basic integration. 37 | 38 | #### Basic idea 39 | 40 | 1. Create layout and collection view 41 | ```swift 42 | let layout = StickyHeaderFlowLayout() 43 | let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) 44 | ``` 45 | 46 | 2. Setup sticky header 47 | ```swift 48 | collectionView.register(CollectionParallaxHeader.self, forSupplementaryViewOfKind: StickyHeaderFlowLayout.parallaxHeaderIdentifier, withReuseIdentifier: "parallaxHeader") 49 | layout.parallaxHeaderReferenceSize = CGSize(width: view.frame.size.width, height: 200) 50 | layout.parallaxHeaderMinimumReferenceSize = CGSize(width: view.frame.size.width, height: 160) 51 | ``` 52 | 53 | 3. Return correct view in `viewForSupplementaryElementOfKind` function 54 | ```swift 55 | override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 56 | if kind == StickyHeaderFlowLayout.parallaxHeaderIdentifier { 57 | return collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "parallaxHeader", for: indexPath) 58 | } 59 | 60 | // Other views. 61 | ... 62 | } 63 | ``` 64 | 65 | ## License 66 | 67 | `StickyHeaderFlowLayout` is released under the MIT license. See `LICENSE` for details. 68 | -------------------------------------------------------------------------------- /Resources/design.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bernikovich/StickyHeaderFlowLayout/161e36bf77d7d3a16bb96866f26b74079480f140/Resources/design.sketch -------------------------------------------------------------------------------- /Resources/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Artboard 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /StickyHeaderFlowLayout.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |spec| 2 | spec.name = "StickyHeaderFlowLayout" 3 | spec.version = "0.9.4" 4 | spec.summary = "Sticky headers for UICollectionView written in pure Swift (based on CSStickyHeaderFlowLayout)" 5 | spec.homepage = "https://github.com/bernikovich/StickyHeaderFlowLayout" 6 | spec.license = { :type => "MIT", :file => "LICENSE" } 7 | spec.author = { "Timur Bernikovich" => "bernikowich@icloud.com" } 8 | spec.platform = :ios, "9.0" 9 | spec.swift_version = "5.0" 10 | spec.framework = "UIKit" 11 | spec.source = { :git => "https://github.com/bernikovich/StickyHeaderFlowLayout.git", :tag => spec.version.to_s } 12 | spec.source_files = "StickyHeaderFlowLayout/Classes/**/*.swift" 13 | spec.module_name = "StickyHeaderFlowLayout" 14 | end 15 | -------------------------------------------------------------------------------- /StickyHeaderFlowLayout/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bernikovich/StickyHeaderFlowLayout/161e36bf77d7d3a16bb96866f26b74079480f140/StickyHeaderFlowLayout/Assets/.gitkeep -------------------------------------------------------------------------------- /StickyHeaderFlowLayout/Classes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bernikovich/StickyHeaderFlowLayout/161e36bf77d7d3a16bb96866f26b74079480f140/StickyHeaderFlowLayout/Classes/.gitkeep -------------------------------------------------------------------------------- /StickyHeaderFlowLayout/Classes/StickyHeaderFlowLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tsimur Bernikovich on 12/6/18. 3 | // Copyright © 2018 Tsimur Bernikovich. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | 8 | open class StickyHeaderFlowLayout: UICollectionViewFlowLayout { 9 | 10 | open class var parallaxHeaderIdentifier: String { 11 | return "StickyHeaderParallexHeader" 12 | } 13 | private static let headerZIndex = 1024 14 | 15 | open var parallaxHeaderReferenceSize: CGSize = .zero 16 | open var parallaxHeaderMinimumReferenceSize: CGSize = .zero { 17 | didSet { 18 | invalidateLayout() 19 | } 20 | } 21 | 22 | open var parallaxHeaderAlwaysOnTop = false 23 | open var disableStickyHeaders = false 24 | open var disableStretching = false 25 | 26 | open override func prepare() { 27 | super.prepare() 28 | } 29 | 30 | open override func initialLayoutAttributesForAppearingSupplementaryElement(ofKind elementKind: String, at elementIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? { 31 | let attributes = super.initialLayoutAttributesForAppearingSupplementaryElement(ofKind: elementKind, at: elementIndexPath) 32 | if elementKind == type(of: self).parallaxHeaderIdentifier { 33 | // Sticky header do not need to offset. 34 | return nil 35 | } else { 36 | if var frame = attributes?.frame { 37 | frame.origin.y = parallaxHeaderReferenceSize.height 38 | attributes?.frame = frame 39 | } 40 | } 41 | return attributes 42 | } 43 | 44 | open override func finalLayoutAttributesForDisappearingSupplementaryElement(ofKind elementKind: String, at elementIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? { 45 | if elementKind == type(of: self).parallaxHeaderIdentifier { 46 | let attribute = layoutAttributesForSupplementaryView(ofKind: elementKind, at: elementIndexPath) 47 | if let attribute = attribute as? StickyHeaderFlowLayoutAttributes { 48 | updateParallaxHeaderAttribute(attribute) 49 | } 50 | return attribute 51 | } else { 52 | super.finalLayoutAttributesForDisappearingSupplementaryElement(ofKind: elementKind, at: elementIndexPath) 53 | } 54 | return nil 55 | } 56 | 57 | open override func layoutAttributesForSupplementaryView(ofKind elementKind: String, at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { 58 | var attrubutes = super.layoutAttributesForSupplementaryView(ofKind: elementKind, at: indexPath) 59 | if attrubutes == nil && elementKind == type(of: self).parallaxHeaderIdentifier { 60 | attrubutes = StickyHeaderFlowLayoutAttributes(forSupplementaryViewOfKind: elementKind, with: indexPath) 61 | } 62 | return attrubutes 63 | } 64 | 65 | open override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { 66 | guard collectionView?.dataSource != nil else { 67 | return nil 68 | } 69 | 70 | // The rect should compensate the header size 71 | var adjustedRect = rect 72 | adjustedRect.origin.y -= self.parallaxHeaderReferenceSize.height 73 | 74 | var allItems: [UICollectionViewLayoutAttributes] = [] 75 | // Perform a deep copy of the attributes returned from super. 76 | if let originalAttributes = super.layoutAttributesForElements(in: adjustedRect) { 77 | allItems = originalAttributes.compactMap { 78 | $0.copy() as? UICollectionViewLayoutAttributes 79 | } 80 | } 81 | 82 | var headers: [Int: UICollectionViewLayoutAttributes] = [:] 83 | var lastCells: [Int: UICollectionViewLayoutAttributes] = [:] 84 | var visibleParallaxHeader = false 85 | 86 | for item in allItems { 87 | let attributes = item 88 | var frame = attributes.frame 89 | frame.origin.y += parallaxHeaderReferenceSize.height 90 | attributes.frame = frame 91 | 92 | let indexPath = attributes.indexPath 93 | let isHeader = attributes.representedElementKind == UICollectionView.elementKindSectionHeader 94 | let isFooter = attributes.representedElementKind == UICollectionView.elementKindSectionFooter 95 | 96 | if isHeader { 97 | headers[indexPath.section] = attributes 98 | } else if isFooter { 99 | // Not implemeneted. 100 | } else { 101 | // Get the bottom most cell of that section. 102 | if let currentAttribute = lastCells[indexPath.section] { 103 | if indexPath.row > currentAttribute.indexPath.row { 104 | lastCells[indexPath.section] = attributes 105 | } 106 | } else { 107 | lastCells[indexPath.section] = attributes 108 | } 109 | 110 | if indexPath.item == 0 && indexPath.section == 0 { 111 | visibleParallaxHeader = true 112 | } 113 | } 114 | 115 | if isHeader { 116 | attributes.zIndex = type(of: self).headerZIndex 117 | } else { 118 | // For iOS 7.0, the cell zIndex should be above sticky section header. 119 | attributes.zIndex = 1 120 | } 121 | } 122 | 123 | if rect.minY <= 0 { 124 | visibleParallaxHeader = true 125 | } 126 | 127 | if parallaxHeaderAlwaysOnTop { 128 | visibleParallaxHeader = true 129 | } 130 | 131 | // Create the attributes for the Parallex header. 132 | if visibleParallaxHeader && parallaxHeaderReferenceSize != .zero { 133 | let currentAttribute = StickyHeaderFlowLayoutAttributes(forSupplementaryViewOfKind: type(of: self).parallaxHeaderIdentifier, with: IndexPath(index: 0)) 134 | updateParallaxHeaderAttribute(currentAttribute) 135 | allItems.append(currentAttribute) 136 | } 137 | 138 | if !disableStickyHeaders { 139 | lastCells.forEach { 140 | let indexPath = $0.value.indexPath 141 | let indexPathKey = indexPath.section 142 | 143 | if let header = headers[indexPathKey] { 144 | if header.frame.size != .zero { 145 | updateHeaderAttributes(header, lastCellAttributes: $0.value) 146 | } 147 | } else if let header = layoutAttributesForSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, at: IndexPath(item: 0, section: indexPath.section)) { 148 | if header.frame.size != .zero { 149 | allItems.append(header) 150 | } 151 | } 152 | } 153 | } 154 | 155 | return allItems 156 | } 157 | 158 | open override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { 159 | let attributes = super.layoutAttributesForItem(at: indexPath)?.copy() as? UICollectionViewLayoutAttributes 160 | if var frame = attributes?.frame { 161 | frame.origin.y += parallaxHeaderReferenceSize.height 162 | attributes?.frame = frame 163 | } 164 | return attributes 165 | } 166 | 167 | open override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { 168 | return true 169 | } 170 | 171 | open override class var layoutAttributesClass: AnyClass { 172 | return StickyHeaderFlowLayoutAttributes.self 173 | } 174 | 175 | private func updateHeaderAttributes(_ attributes: UICollectionViewLayoutAttributes, lastCellAttributes: UICollectionViewLayoutAttributes) { 176 | guard let collectionView = collectionView else { 177 | return 178 | } 179 | 180 | let currentBounds = collectionView.bounds 181 | attributes.zIndex = type(of: self).headerZIndex 182 | attributes.isHidden = false 183 | 184 | var origin = attributes.frame.origin 185 | let sectionMaxY = lastCellAttributes.frame.maxY - attributes.frame.size.height 186 | var y = currentBounds.maxY - currentBounds.size.height + collectionView.contentInset.top 187 | 188 | if parallaxHeaderAlwaysOnTop { 189 | y += parallaxHeaderMinimumReferenceSize.height 190 | } 191 | 192 | origin.y = min(max(y, attributes.frame.origin.y), sectionMaxY) 193 | attributes.frame = CGRect(origin: origin, size: attributes.frame.size) 194 | } 195 | 196 | private func updateParallaxHeaderAttribute(_ currentAttribute: StickyHeaderFlowLayoutAttributes) { 197 | guard let collectionView = collectionView else { 198 | return 199 | } 200 | 201 | var frame = currentAttribute.frame 202 | frame.size = parallaxHeaderReferenceSize 203 | 204 | let bounds = collectionView.bounds 205 | let maxY = frame.maxY 206 | 207 | // Make sure the frame won't be negative values. 208 | var y = min(maxY - parallaxHeaderMinimumReferenceSize.height, bounds.origin.y + collectionView.contentInset.top) 209 | let height = max(0, -y + maxY) 210 | 211 | let maxHeight = parallaxHeaderReferenceSize.height 212 | let minHeight = parallaxHeaderMinimumReferenceSize.height 213 | let progressiveness = (height - minHeight) / (maxHeight - minHeight) 214 | currentAttribute.progressiveness = progressiveness 215 | 216 | // If zIndex < 0 would prevents tap from recognized right under navigation bar. 217 | currentAttribute.zIndex = 0 218 | 219 | // When parallaxHeaderAlwaysOnTop is enabled, we will check when we should update the y position. 220 | if parallaxHeaderAlwaysOnTop && height <= parallaxHeaderMinimumReferenceSize.height { 221 | let insetTop = collectionView.contentInset.top 222 | // Always stick to top but under the nav bar. 223 | y = collectionView.contentOffset.y + insetTop 224 | currentAttribute.zIndex = 2000 225 | } 226 | 227 | let normalizedHeight = disableStretching && height > maxHeight ? maxHeight : height 228 | currentAttribute.frame = CGRect(x: frame.origin.x, y: y, width: frame.size.width, height: normalizedHeight) 229 | } 230 | 231 | } 232 | 233 | extension StickyHeaderFlowLayoutAttributes { 234 | 235 | override internal var debugDescription: String { 236 | let indexPathString = "\(indexPath.section) \(indexPath.item)" 237 | return " indexPath: \(indexPathString) zIndex: \(zIndex) valid: \(isValid) kind: \(representedElementKind ?? "cell")" 238 | } 239 | 240 | fileprivate var isValid: Bool { 241 | switch representedElementCategory { 242 | case .cell: 243 | if zIndex != 1 { 244 | return false 245 | } 246 | return true 247 | case .supplementaryView: 248 | if representedElementKind == StickyHeaderFlowLayout.parallaxHeaderIdentifier { 249 | return true 250 | } else if zIndex < 1024 { 251 | return false 252 | } 253 | return true 254 | default: 255 | return true 256 | } 257 | } 258 | 259 | } 260 | 261 | private extension StickyHeaderFlowLayout { 262 | 263 | func debugLayoutAttributes(_ layoutAttributes: [StickyHeaderFlowLayoutAttributes]) { 264 | var hasInvalid = false 265 | layoutAttributes.forEach { 266 | if !$0.isValid { 267 | hasInvalid = true 268 | } 269 | } 270 | 271 | if hasInvalid { 272 | print("StickyHeaderFlowLayout: \(layoutAttributes)") 273 | } 274 | } 275 | 276 | } 277 | -------------------------------------------------------------------------------- /StickyHeaderFlowLayout/Classes/StickyHeaderFlowLayoutAttributes.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tsimur Bernikovich on 12/6/18. 3 | // Copyright © 2018 Tsimur Bernikovich. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | 8 | class StickyHeaderFlowLayoutAttributes: UICollectionViewLayoutAttributes { 9 | 10 | var progressiveness: CGFloat = 0 11 | 12 | override func copy(with zone: NSZone? = nil) -> Any { 13 | let copy = super.copy(with: zone) 14 | if let copy = copy as? StickyHeaderFlowLayoutAttributes { 15 | copy.progressiveness = progressiveness 16 | } 17 | return copy 18 | } 19 | 20 | override var zIndex: Int { 21 | didSet { 22 | // Fixes: Section header go behind cell when insert via performBatchUpdates #68 23 | // https://github.com/jamztang/CSStickyHeaderFlowLayout/issues/68#issuecomment-108678022 24 | // Reference: UICollectionView setLayout:animated: not preserving zIndex 25 | // http://stackoverflow.com/questions/12659301/uicollectionview-setlayoutanimated-not-preserving-zindex 26 | 27 | // originally our solution is to translate the section header above the original z position, 28 | // however, scroll indicator will be covered by those cells and section header if z position is >= 1 29 | // so instead we translate the original cell to be -1, and make sure the cell are hit test proven. 30 | transform3D = CATransform3DMakeTranslation(0, 0, zIndex == 1 ? -1 : 0); 31 | } 32 | } 33 | 34 | } 35 | --------------------------------------------------------------------------------