Repository: bernikovich/StickyHeaderFlowLayout Branch: master Commit: 161e36bf77d7 Files: 43 Total size: 99.5 KB Directory structure: gitextract_0otwtvwj/ ├── .gitignore ├── Example/ │ ├── Base.lproj/ │ │ └── LaunchScreen.storyboard │ ├── Podfile │ ├── Pods/ │ │ ├── Local Podspecs/ │ │ │ └── StickyHeaderFlowLayout.podspec.json │ │ ├── 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/ │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets/ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ └── success-baby.imageset/ │ │ │ └── Contents.json │ │ ├── CollectionParallaxHeader.swift │ │ ├── CollectionViewCell.swift │ │ ├── CollectionViewController.swift │ │ ├── CollectionViewSectionHeader.swift │ │ ├── Info.plist │ │ └── LaunchScreen.storyboard │ ├── StickyHeaderFlowLayout.xcodeproj/ │ │ ├── project.pbxproj │ │ ├── project.xcworkspace/ │ │ │ └── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ └── xcschemes/ │ │ └── Example.xcscheme │ └── StickyHeaderFlowLayout.xcworkspace/ │ ├── contents.xcworkspacedata │ └── xcshareddata/ │ └── IDEWorkspaceChecks.plist ├── LICENSE ├── README.md ├── Resources/ │ └── design.sketch ├── StickyHeaderFlowLayout/ │ ├── Assets/ │ │ └── .gitkeep │ └── Classes/ │ ├── .gitkeep │ ├── StickyHeaderFlowLayout.swift │ └── StickyHeaderFlowLayoutAttributes.swift └── StickyHeaderFlowLayout.podspec ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ # Xcode # # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore ## Build generated build/ DerivedData/ ## Various settings *.pbxuser !default.pbxuser *.mode1v3 !default.mode1v3 *.mode2v3 !default.mode2v3 *.perspectivev3 !default.perspectivev3 xcuserdata/ ## Other *.moved-aside *.xccheckout *.xcscmblueprint ## Obj-C/Swift specific *.hmap *.ipa *.dSYM.zip *.dSYM ## Playgrounds timeline.xctimeline playground.xcworkspace # Swift Package Manager # # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. # Packages/ # Package.pins # Package.resolved .build/ # CocoaPods # # We recommend against adding the Pods directory to your .gitignore. However # you should judge for yourself, the pros and cons are mentioned at: # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control # # Pods/ # Carthage # # Add this line if you want to avoid checking in source code from Carthage dependencies. # Carthage/Checkouts Carthage/Build # fastlane # # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the # screenshots whenever they are needed. # For more information about the recommended setup visit: # https://docs.fastlane.tools/best-practices/source-control/#source-control fastlane/report.xml fastlane/Preview.html fastlane/screenshots/**/*.png fastlane/test_output ## macOS # General .DS_Store .AppleDouble .LSOverride # Icon must end with two \r Icon # Thumbnails ._* # Files that might appear in the root of a volume .DocumentRevisions-V100 .fseventsd .Spotlight-V100 .TemporaryItems .Trashes .VolumeIcon.icns .com.apple.timemachine.donotpresent # Directories potentially created on remote AFP share .AppleDB .AppleDesktop Network Trash Folder Temporary Items .apdisk ================================================ FILE: Example/Base.lproj/LaunchScreen.storyboard ================================================ ================================================ FILE: Example/Podfile ================================================ platform :ios, '9.0' use_frameworks! target 'Example' do pod 'StickyHeaderFlowLayout', :path => '../' end ================================================ FILE: Example/Pods/Local Podspecs/StickyHeaderFlowLayout.podspec.json ================================================ { "name": "StickyHeaderFlowLayout", "version": "0.9.4", "summary": "Sticky headers for UICollectionView written in pure Swift (based on CSStickyHeaderFlowLayout)", "homepage": "https://github.com/bernikovich/StickyHeaderFlowLayout", "license": { "type": "MIT", "file": "LICENSE" }, "authors": { "Timur Bernikovich": "bernikowich@icloud.com" }, "platforms": { "ios": "9.0" }, "swift_versions": "5.0", "frameworks": "UIKit", "source": { "git": "https://github.com/bernikovich/StickyHeaderFlowLayout.git", "tag": "0.9.4" }, "source_files": "StickyHeaderFlowLayout/Classes/**/*.swift", "module_name": "StickyHeaderFlowLayout" } ================================================ FILE: Example/Pods/Pods.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 35D94D0268DE4634F556D0CBE356B8D7 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ECF2A2B0720AE923C22BED3192888BE0 /* UIKit.framework */; }; 3A8648419C331474F84021A4E27CBD83 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40CB39E715FBCDAA142E6513E126200A /* Foundation.framework */; }; 3D7432320C2F3F7185362CA06E8EFABB /* StickyHeaderFlowLayout-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FB0ED361338A7A71E22E09690474E3F /* StickyHeaderFlowLayout-dummy.m */; }; 4CFEADD797100CA9D6DB1501FF9BE968 /* StickyHeaderFlowLayout-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C32DA58D5E552F7D09C95A2FABF5188D /* StickyHeaderFlowLayout-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 764B240ADC02EE30314FA73C9E7082EE /* Pods-Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D6D7C498FA339E02BD53ECB8916CEA8E /* Pods-Example-dummy.m */; }; 765870CB7746D953C8CFAE11471949B0 /* Pods-Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7825A90E082A1582EB16256B0E722B3F /* Pods-Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8968E2442AAFDDB89A5EC3F7BF58D731 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40CB39E715FBCDAA142E6513E126200A /* Foundation.framework */; }; 94289C8EDDA9C7E031F50AC578194760 /* StickyHeaderFlowLayoutAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 118019065266EA5F0BFA412E8F391AFA /* StickyHeaderFlowLayoutAttributes.swift */; }; F0B8EA7457D900BC48E412EB53859F94 /* StickyHeaderFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F5C33F5BE0F521E45DB02145225156 /* StickyHeaderFlowLayout.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ FF19EE9A03D7821E892AD4D9FBCE08BB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 40C945FB80B39872735EB9619BDC1A3C; remoteInfo = StickyHeaderFlowLayout; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ 118019065266EA5F0BFA412E8F391AFA /* StickyHeaderFlowLayoutAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StickyHeaderFlowLayoutAttributes.swift; path = StickyHeaderFlowLayout/Classes/StickyHeaderFlowLayoutAttributes.swift; sourceTree = ""; }; 243410B9535472556EA4BB6DBC133A0D /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.release.xcconfig"; sourceTree = ""; }; 31C1D37707DFAA5E6A164BCC07834264 /* Pods-Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-Info.plist"; sourceTree = ""; }; 35C305D3797C284E6F5BAA1D3E6F9BF8 /* Pods-Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-Example.modulemap"; sourceTree = ""; }; 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; }; 4047B086DF31E43AA06F1F60CC9EC6E5 /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_Example.framework; path = "Pods-Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 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; }; 441854E35F81731E63E53DC7E4EEAD9D /* Pods-Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Example-acknowledgements.markdown"; sourceTree = ""; }; 4EFC56309689F8EBE110DD3A622C93AD /* StickyHeaderFlowLayout-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "StickyHeaderFlowLayout-prefix.pch"; sourceTree = ""; }; 50F5C33F5BE0F521E45DB02145225156 /* StickyHeaderFlowLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StickyHeaderFlowLayout.swift; path = StickyHeaderFlowLayout/Classes/StickyHeaderFlowLayout.swift; sourceTree = ""; }; 6CE353BD73513B79D3E4F128A1AE0A20 /* StickyHeaderFlowLayout.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = StickyHeaderFlowLayout.modulemap; sourceTree = ""; }; 6FB0ED361338A7A71E22E09690474E3F /* StickyHeaderFlowLayout-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "StickyHeaderFlowLayout-dummy.m"; sourceTree = ""; }; 7825A90E082A1582EB16256B0E722B3F /* Pods-Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Example-umbrella.h"; sourceTree = ""; }; 7D9FA451C4851D8F443B3D2E046D9FD1 /* StickyHeaderFlowLayout-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "StickyHeaderFlowLayout-Info.plist"; sourceTree = ""; }; 7E9B3B42659383A023F0305F91B658AA /* StickyHeaderFlowLayout.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = StickyHeaderFlowLayout.xcconfig; sourceTree = ""; }; 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; }; AFECBC24E09D0D25F822C27BD944AFD4 /* Pods-Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Example-frameworks.sh"; sourceTree = ""; }; B45138496B85A072654D1D0F8EBBEDE5 /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.debug.xcconfig"; sourceTree = ""; }; C32DA58D5E552F7D09C95A2FABF5188D /* StickyHeaderFlowLayout-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "StickyHeaderFlowLayout-umbrella.h"; sourceTree = ""; }; D6D7C498FA339E02BD53ECB8916CEA8E /* Pods-Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Example-dummy.m"; sourceTree = ""; }; DFA2D66FDD3A69D8678878A660D22DF3 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; E54195536749EADE9D3704B9F5D44D65 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; EA21B344259B58996DB73382B1B1521F /* Pods-Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-acknowledgements.plist"; sourceTree = ""; }; EAF95A22DBB4BFFEA63EF28CFBA9A425 /* StickyHeaderFlowLayout.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = StickyHeaderFlowLayout.framework; path = StickyHeaderFlowLayout.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 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; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 442902C53954A478CE3924BCDD95C564 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 8968E2442AAFDDB89A5EC3F7BF58D731 /* Foundation.framework in Frameworks */, 35D94D0268DE4634F556D0CBE356B8D7 /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; CA3F0DDAE98C61BDE899719B6A2DF63C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 3A8648419C331474F84021A4E27CBD83 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = { isa = PBXGroup; children = ( E169A450ED27AC725DF52953F66D11E0 /* iOS */, ); name = Frameworks; sourceTree = ""; }; 1B1580ACE84F4547E4F23158A2A5DA24 /* Pod */ = { isa = PBXGroup; children = ( E54195536749EADE9D3704B9F5D44D65 /* LICENSE */, DFA2D66FDD3A69D8678878A660D22DF3 /* README.md */, 3692CDCE37798947D45B8637B4A32038 /* StickyHeaderFlowLayout.podspec */, ); name = Pod; sourceTree = ""; }; 565E83AFD614E3387B40F3BE9A33971B /* Development Pods */ = { isa = PBXGroup; children = ( A23E54343CDDBFFACC210E582FBD6379 /* StickyHeaderFlowLayout */, ); name = "Development Pods"; sourceTree = ""; }; 602AEF7352306B01699DA697382A0B20 /* Products */ = { isa = PBXGroup; children = ( 4047B086DF31E43AA06F1F60CC9EC6E5 /* Pods_Example.framework */, EAF95A22DBB4BFFEA63EF28CFBA9A425 /* StickyHeaderFlowLayout.framework */, ); name = Products; sourceTree = ""; }; 9BDBD95ED116334D1B2835202D8D3060 /* Pods-Example */ = { isa = PBXGroup; children = ( 35C305D3797C284E6F5BAA1D3E6F9BF8 /* Pods-Example.modulemap */, 441854E35F81731E63E53DC7E4EEAD9D /* Pods-Example-acknowledgements.markdown */, EA21B344259B58996DB73382B1B1521F /* Pods-Example-acknowledgements.plist */, D6D7C498FA339E02BD53ECB8916CEA8E /* Pods-Example-dummy.m */, AFECBC24E09D0D25F822C27BD944AFD4 /* Pods-Example-frameworks.sh */, 31C1D37707DFAA5E6A164BCC07834264 /* Pods-Example-Info.plist */, 7825A90E082A1582EB16256B0E722B3F /* Pods-Example-umbrella.h */, B45138496B85A072654D1D0F8EBBEDE5 /* Pods-Example.debug.xcconfig */, 243410B9535472556EA4BB6DBC133A0D /* Pods-Example.release.xcconfig */, ); name = "Pods-Example"; path = "Target Support Files/Pods-Example"; sourceTree = ""; }; A23E54343CDDBFFACC210E582FBD6379 /* StickyHeaderFlowLayout */ = { isa = PBXGroup; children = ( 50F5C33F5BE0F521E45DB02145225156 /* StickyHeaderFlowLayout.swift */, 118019065266EA5F0BFA412E8F391AFA /* StickyHeaderFlowLayoutAttributes.swift */, 1B1580ACE84F4547E4F23158A2A5DA24 /* Pod */, FA715227E1FE8BEAC05C1AC6A61EF39E /* Support Files */, ); name = StickyHeaderFlowLayout; path = ../..; sourceTree = ""; }; CE2E825F08D3AD0FD76E6D78D7512ED0 /* Targets Support Files */ = { isa = PBXGroup; children = ( 9BDBD95ED116334D1B2835202D8D3060 /* Pods-Example */, ); name = "Targets Support Files"; sourceTree = ""; }; CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 565E83AFD614E3387B40F3BE9A33971B /* Development Pods */, 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */, 602AEF7352306B01699DA697382A0B20 /* Products */, CE2E825F08D3AD0FD76E6D78D7512ED0 /* Targets Support Files */, ); sourceTree = ""; }; E169A450ED27AC725DF52953F66D11E0 /* iOS */ = { isa = PBXGroup; children = ( 40CB39E715FBCDAA142E6513E126200A /* Foundation.framework */, ECF2A2B0720AE923C22BED3192888BE0 /* UIKit.framework */, ); name = iOS; sourceTree = ""; }; FA715227E1FE8BEAC05C1AC6A61EF39E /* Support Files */ = { isa = PBXGroup; children = ( 6CE353BD73513B79D3E4F128A1AE0A20 /* StickyHeaderFlowLayout.modulemap */, 7E9B3B42659383A023F0305F91B658AA /* StickyHeaderFlowLayout.xcconfig */, 6FB0ED361338A7A71E22E09690474E3F /* StickyHeaderFlowLayout-dummy.m */, 7D9FA451C4851D8F443B3D2E046D9FD1 /* StickyHeaderFlowLayout-Info.plist */, 4EFC56309689F8EBE110DD3A622C93AD /* StickyHeaderFlowLayout-prefix.pch */, C32DA58D5E552F7D09C95A2FABF5188D /* StickyHeaderFlowLayout-umbrella.h */, ); name = "Support Files"; path = "Example/Pods/Target Support Files/StickyHeaderFlowLayout"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 03A142ED7D799F26E58BCEA441775788 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 4CFEADD797100CA9D6DB1501FF9BE968 /* StickyHeaderFlowLayout-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 37C0208891D6CBF287A0C99D3FDDA92F /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 765870CB7746D953C8CFAE11471949B0 /* Pods-Example-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 0AEE99A309977BD12A049FF48AF9BA4B /* Pods-Example */ = { isa = PBXNativeTarget; buildConfigurationList = DE3C3176A50A910BD91ACE691894E3CB /* Build configuration list for PBXNativeTarget "Pods-Example" */; buildPhases = ( 37C0208891D6CBF287A0C99D3FDDA92F /* Headers */, F5B455B3E6E6E38997A0411B3642B650 /* Sources */, CA3F0DDAE98C61BDE899719B6A2DF63C /* Frameworks */, 26BD2736A609DBD9918160CE9061D52C /* Resources */, ); buildRules = ( ); dependencies = ( 14F0A6918C39E169D6ADD18BDA061285 /* PBXTargetDependency */, ); name = "Pods-Example"; productName = "Pods-Example"; productReference = 4047B086DF31E43AA06F1F60CC9EC6E5 /* Pods_Example.framework */; productType = "com.apple.product-type.framework"; }; 40C945FB80B39872735EB9619BDC1A3C /* StickyHeaderFlowLayout */ = { isa = PBXNativeTarget; buildConfigurationList = 80D83C628FAF9A8B854DECD22874808F /* Build configuration list for PBXNativeTarget "StickyHeaderFlowLayout" */; buildPhases = ( 03A142ED7D799F26E58BCEA441775788 /* Headers */, 8BBB14DB6503D5D5F83B7C01C7DDA7CB /* Sources */, 442902C53954A478CE3924BCDD95C564 /* Frameworks */, 31FA0054C9683F0E892FD0475AE95F7A /* Resources */, ); buildRules = ( ); dependencies = ( ); name = StickyHeaderFlowLayout; productName = StickyHeaderFlowLayout; productReference = EAF95A22DBB4BFFEA63EF28CFBA9A425 /* StickyHeaderFlowLayout.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ BFDFE7DC352907FC980B868725387E98 /* Project object */ = { isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0930; LastUpgradeCheck = 0930; }; buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = CF1408CF629C7361332E53B88F7BD30C; productRefGroup = 602AEF7352306B01699DA697382A0B20 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 0AEE99A309977BD12A049FF48AF9BA4B /* Pods-Example */, 40C945FB80B39872735EB9619BDC1A3C /* StickyHeaderFlowLayout */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 26BD2736A609DBD9918160CE9061D52C /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 31FA0054C9683F0E892FD0475AE95F7A /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 8BBB14DB6503D5D5F83B7C01C7DDA7CB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 3D7432320C2F3F7185362CA06E8EFABB /* StickyHeaderFlowLayout-dummy.m in Sources */, F0B8EA7457D900BC48E412EB53859F94 /* StickyHeaderFlowLayout.swift in Sources */, 94289C8EDDA9C7E031F50AC578194760 /* StickyHeaderFlowLayoutAttributes.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; F5B455B3E6E6E38997A0411B3642B650 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 764B240ADC02EE30314FA73C9E7082EE /* Pods-Example-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 14F0A6918C39E169D6ADD18BDA061285 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = StickyHeaderFlowLayout; target = 40C945FB80B39872735EB9619BDC1A3C /* StickyHeaderFlowLayout */; targetProxy = FF19EE9A03D7821E892AD4D9FBCE08BB /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ 07488D4657FB0A78086563621D425F8A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "POD_CONFIGURATION_DEBUG=1", "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 4.2; SYMROOT = "${SRCROOT}/../build"; }; name = Debug; }; 39D8A9594A66C91A9FE0795BE5A56A2E /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7E9B3B42659383A023F0305F91B658AA /* StickyHeaderFlowLayout.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; GCC_PREFIX_HEADER = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-prefix.pch"; INFOPLIST_FILE = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout.modulemap"; PRODUCT_MODULE_NAME = StickyHeaderFlowLayout; PRODUCT_NAME = StickyHeaderFlowLayout; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; 489FB0F4199BDFD03C93BB88711A2D06 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7E9B3B42659383A023F0305F91B658AA /* StickyHeaderFlowLayout.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; GCC_PREFIX_HEADER = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-prefix.pch"; INFOPLIST_FILE = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout.modulemap"; PRODUCT_MODULE_NAME = StickyHeaderFlowLayout; PRODUCT_NAME = StickyHeaderFlowLayout; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; A1962E6FF39BBAC201A2E5DDF99557DF /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_PREPROCESSOR_DEFINITIONS = ( "POD_CONFIGURATION_RELEASE=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 4.2; SYMROOT = "${SRCROOT}/../build"; }; name = Release; }; AF8FCDD68146ABABC8EB48D487668CBD /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = B45138496B85A072654D1D0F8EBBEDE5 /* Pods-Example.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "Target Support Files/Pods-Example/Pods-Example-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; CCAE0C4C334BD450CDD3C30C5E1B4999 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 243410B9535472556EA4BB6DBC133A0D /* Pods-Example.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "Target Support Files/Pods-Example/Pods-Example-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( 07488D4657FB0A78086563621D425F8A /* Debug */, A1962E6FF39BBAC201A2E5DDF99557DF /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 80D83C628FAF9A8B854DECD22874808F /* Build configuration list for PBXNativeTarget "StickyHeaderFlowLayout" */ = { isa = XCConfigurationList; buildConfigurations = ( 39D8A9594A66C91A9FE0795BE5A56A2E /* Debug */, 489FB0F4199BDFD03C93BB88711A2D06 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; DE3C3176A50A910BD91ACE691894E3CB /* Build configuration list for PBXNativeTarget "Pods-Example" */ = { isa = XCConfigurationList; buildConfigurations = ( AF8FCDD68146ABABC8EB48D487668CBD /* Debug */, CCAE0C4C334BD450CDD3C30C5E1B4999 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; } ================================================ FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example-Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier ${PRODUCT_BUNDLE_IDENTIFIER} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType FMWK CFBundleShortVersionString 1.0.0 CFBundleSignature ???? CFBundleVersion ${CURRENT_PROJECT_VERSION} NSPrincipalClass ================================================ FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown ================================================ # Acknowledgements This application makes use of the following third party libraries: ## StickyHeaderFlowLayout MIT License Copyright (c) 2018 Timur Bernikowich Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Generated by CocoaPods - https://cocoapods.org ================================================ FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist ================================================ PreferenceSpecifiers FooterText This application makes use of the following third party libraries: Title Acknowledgements Type PSGroupSpecifier FooterText MIT License Copyright (c) 2018 Timur Bernikowich Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. License MIT Title StickyHeaderFlowLayout Type PSGroupSpecifier FooterText Generated by CocoaPods - https://cocoapods.org Title Type PSGroupSpecifier StringsTable Acknowledgements Title Acknowledgements ================================================ FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m ================================================ #import @interface PodsDummy_Pods_Example : NSObject @end @implementation PodsDummy_Pods_Example @end ================================================ FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks.sh ================================================ #!/bin/sh set -e set -u set -o pipefail function on_error { echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" } trap 'on_error $LINENO' ERR if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy # frameworks to, so exit 0 (signalling the script phase was successful). exit 0 fi echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" # Used as a return value for each invocation of `strip_invalid_archs` function. STRIP_BINARY_RETVAL=0 # This protects against multiple targets copying the same framework dependency at the same time. The solution # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") # Copies and strips a vendored framework install_framework() { if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then local source="${BUILT_PRODUCTS_DIR}/$1" elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" elif [ -r "$1" ]; then local source="$1" fi local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" if [ -L "${source}" ]; then echo "Symlinked..." source="$(readlink "${source}")" fi # Use filter instead of exclude so missing patterns don't throw errors. echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" local basename basename="$(basename -s .framework "$1")" binary="${destination}/${basename}.framework/${basename}" if ! [ -r "$binary" ]; then binary="${destination}/${basename}" elif [ -L "${binary}" ]; then echo "Destination binary is symlinked..." dirname="$(dirname "${binary}")" binary="${dirname}/$(readlink "${binary}")" fi # Strip invalid architectures so "fat" simulator / device frameworks work on device if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then strip_invalid_archs "$binary" fi # Resign the code if required by the build settings to avoid unstable apps code_sign_if_enabled "${destination}/$(basename "$1")" # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then local swift_runtime_libs swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) for lib in $swift_runtime_libs; do echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" code_sign_if_enabled "${destination}/${lib}" done fi } # Copies and strips a vendored dSYM install_dsym() { local source="$1" if [ -r "$source" ]; then # Copy the dSYM into a the targets temp dir. 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}\"" 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}" local basename basename="$(basename -s .framework.dSYM "$source")" binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" # Strip invalid architectures so "fat" simulator / device frameworks work on device if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then strip_invalid_archs "$binary" fi if [[ $STRIP_BINARY_RETVAL == 1 ]]; then # Move the stripped file into its final destination. 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}\"" 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}" else # 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. touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" fi fi } # Copies the bcsymbolmap files of a vendored framework install_bcsymbolmap() { local bcsymbolmap_path="$1" local destination="${BUILT_PRODUCTS_DIR}" 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}"" rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" } # Signs a framework with the provided identity code_sign_if_enabled() { if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then # Use the current code_sign_identity echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then code_sign_cmd="$code_sign_cmd &" fi echo "$code_sign_cmd" eval "$code_sign_cmd" fi } # Strip invalid architectures strip_invalid_archs() { binary="$1" # Get architectures for current target binary binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" # Intersect them with the architectures we are building for intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" # If there are no archs supported by this binary then warn the user if [[ -z "$intersected_archs" ]]; then echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." STRIP_BINARY_RETVAL=0 return fi stripped="" for arch in $binary_archs; do if ! [[ "${ARCHS}" == *"$arch"* ]]; then # Strip non-valid architectures in-place lipo -remove "$arch" -output "$binary" "$binary" stripped="$stripped $arch" fi done if [[ "$stripped" ]]; then echo "Stripped $binary of architectures:$stripped" fi STRIP_BINARY_RETVAL=1 } if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/StickyHeaderFlowLayout/StickyHeaderFlowLayout.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/StickyHeaderFlowLayout/StickyHeaderFlowLayout.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then wait fi ================================================ FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h ================================================ #ifdef __OBJC__ #import #else #ifndef FOUNDATION_EXPORT #if defined(__cplusplus) #define FOUNDATION_EXPORT extern "C" #else #define FOUNDATION_EXPORT extern #endif #endif #endif FOUNDATION_EXPORT double Pods_ExampleVersionNumber; FOUNDATION_EXPORT const unsigned char Pods_ExampleVersionString[]; ================================================ FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig ================================================ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StickyHeaderFlowLayout" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StickyHeaderFlowLayout/StickyHeaderFlowLayout.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' OTHER_LDFLAGS = $(inherited) -framework "StickyHeaderFlowLayout" -framework "UIKit" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods ================================================ FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap ================================================ framework module Pods_Example { umbrella header "Pods-Example-umbrella.h" export * module * { export * } } ================================================ FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig ================================================ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StickyHeaderFlowLayout" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StickyHeaderFlowLayout/StickyHeaderFlowLayout.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' OTHER_LDFLAGS = $(inherited) -framework "StickyHeaderFlowLayout" -framework "UIKit" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods ================================================ FILE: Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier ${PRODUCT_BUNDLE_IDENTIFIER} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType FMWK CFBundleShortVersionString 0.9.4 CFBundleSignature ???? CFBundleVersion ${CURRENT_PROJECT_VERSION} NSPrincipalClass ================================================ FILE: Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-dummy.m ================================================ #import @interface PodsDummy_StickyHeaderFlowLayout : NSObject @end @implementation PodsDummy_StickyHeaderFlowLayout @end ================================================ FILE: Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-prefix.pch ================================================ #ifdef __OBJC__ #import #else #ifndef FOUNDATION_EXPORT #if defined(__cplusplus) #define FOUNDATION_EXPORT extern "C" #else #define FOUNDATION_EXPORT extern #endif #endif #endif ================================================ FILE: Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-umbrella.h ================================================ #ifdef __OBJC__ #import #else #ifndef FOUNDATION_EXPORT #if defined(__cplusplus) #define FOUNDATION_EXPORT extern "C" #else #define FOUNDATION_EXPORT extern #endif #endif #endif FOUNDATION_EXPORT double StickyHeaderFlowLayoutVersionNumber; FOUNDATION_EXPORT const unsigned char StickyHeaderFlowLayoutVersionString[]; ================================================ FILE: Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout.modulemap ================================================ framework module StickyHeaderFlowLayout { umbrella header "StickyHeaderFlowLayout-umbrella.h" export * module * { export * } } ================================================ FILE: Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout.xcconfig ================================================ CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/StickyHeaderFlowLayout GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 OTHER_LDFLAGS = $(inherited) -framework "UIKit" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES ================================================ FILE: Example/StickyHeaderFlowLayout/AppDelegate.swift ================================================ // // Created by Tsimur Bernikovich on 12/6/18. // Copyright © 2018 Tsimur Bernikovich. All rights reserved. // import UIKit import StickyHeaderFlowLayout @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let stickyHeaderFlowLayout = StickyHeaderFlowLayout() let collectionViewController = CollectionViewController(collectionViewLayout: stickyHeaderFlowLayout) let window = UIWindow(frame: UIScreen.main.bounds) window.rootViewController = collectionViewController window.makeKeyAndVisible() self.window = window return true } } ================================================ FILE: Example/StickyHeaderFlowLayout/Assets.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "idiom" : "iphone", "size" : "20x20", "scale" : "2x" }, { "idiom" : "iphone", "size" : "20x20", "scale" : "3x" }, { "idiom" : "iphone", "size" : "29x29", "scale" : "2x" }, { "idiom" : "iphone", "size" : "29x29", "scale" : "3x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "3x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "2x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "3x" }, { "idiom" : "ipad", "size" : "20x20", "scale" : "1x" }, { "idiom" : "ipad", "size" : "20x20", "scale" : "2x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "1x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "2x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "1x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "2x" }, { "idiom" : "ipad", "size" : "76x76", "scale" : "1x" }, { "idiom" : "ipad", "size" : "76x76", "scale" : "2x" }, { "idiom" : "ipad", "size" : "83.5x83.5", "scale" : "2x" }, { "idiom" : "ios-marketing", "size" : "1024x1024", "scale" : "1x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Example/StickyHeaderFlowLayout/Assets.xcassets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Example/StickyHeaderFlowLayout/Assets.xcassets/success-baby.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "success-baby.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Example/StickyHeaderFlowLayout/CollectionParallaxHeader.swift ================================================ // // Created by Tsimur Bernikovich on 12/6/18. // Copyright © 2018 Tsimur Bernikovich. All rights reserved. // import UIKit class CollectionParallaxHeader: UICollectionReusableView { private var imageView : UIImageView? override init(frame: CGRect) { super.init(frame: frame) self.backgroundColor = .lightGray self.clipsToBounds = true let bounds = CGRect(x: 0, y: 0, width: frame.maxX, height: frame.maxY) let imageView = UIImageView(frame: bounds) imageView.contentMode = .scaleAspectFill imageView.image = UIImage(named: "success-baby") self.imageView = imageView self.addSubview(imageView) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func layoutSubviews() { super.layoutSubviews() self.imageView?.frame = self.bounds } } ================================================ FILE: Example/StickyHeaderFlowLayout/CollectionViewCell.swift ================================================ // // Created by Tsimur Bernikovich on 12/6/18. // Copyright © 2018 Tsimur Bernikovich. All rights reserved. // import UIKit class CollectionViewCell: UICollectionViewCell { var text : String? { didSet { self.reloadData() } } private var textLabel : UILabel? override init(frame: CGRect) { super.init(frame: frame) backgroundColor = .white let bounds = CGRect(x: 0, y: 0, width: frame.maxX, height: frame.maxY) let label = UILabel(frame: bounds) label.autoresizingMask = [.flexibleHeight, .flexibleWidth] self.textLabel = label self.addSubview(label) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } func reloadData() { self.textLabel?.text = self.text } override func layoutSubviews() { super.layoutSubviews() self.textLabel?.frame = self.bounds } } ================================================ FILE: Example/StickyHeaderFlowLayout/CollectionViewController.swift ================================================ // // Created by Tsimur Bernikovich on 12/6/18. // Copyright © 2018 Tsimur Bernikovich. All rights reserved. // import UIKit import StickyHeaderFlowLayout class CollectionViewController: UICollectionViewController { var items : [String] = ["StickyHeaderFlowLayout basic example", "Example to initialize in code", "Please Enjoy"] private var layout : StickyHeaderFlowLayout? { return collectionView?.collectionViewLayout as? StickyHeaderFlowLayout } override func viewDidLoad() { super.viewDidLoad() collectionView?.alwaysBounceVertical = true view.backgroundColor = .white // Setup Cell. collectionView?.register(CollectionViewCell.self, forCellWithReuseIdentifier: "cell") layout?.itemSize = CGSize(width: view.frame.size.width, height: 44) // Setup Header. collectionView?.register(CollectionParallaxHeader.self, forSupplementaryViewOfKind: StickyHeaderFlowLayout.parallaxHeaderIdentifier, withReuseIdentifier: "parallaxHeader") layout?.parallaxHeaderReferenceSize = CGSize(width: self.view.frame.size.width, height: 200) layout?.parallaxHeaderMinimumReferenceSize = CGSize(width: self.view.frame.size.width, height: 160) // Setup Section Header. collectionView?.register(CollectionViewSectionHeader.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "sectionHeader") layout?.headerReferenceSize = CGSize(width: view.frame.size.width, height: 40) } // Cells. override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return self.items.count } override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell cell.text = self.items[indexPath.row] return cell } // Parallax Header. override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { if kind == StickyHeaderFlowLayout.parallaxHeaderIdentifier { let view = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "parallaxHeader", for: indexPath) return view } else if kind == UICollectionView.elementKindSectionHeader { let view = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "sectionHeader", for: indexPath) view.backgroundColor = .lightGray return view } return UICollectionReusableView() } } ================================================ FILE: Example/StickyHeaderFlowLayout/CollectionViewSectionHeader.swift ================================================ // // Created by Tsimur Bernikovich on 12/6/18. // Copyright © 2018 Tsimur Bernikovich. All rights reserved. // import UIKit class CollectionViewSectionHeader: UICollectionReusableView { let label = UILabel() override init(frame: CGRect) { super.init(frame: frame) commonInit() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) commonInit() } func commonInit() { self.addSubview(label) label.frame = self.bounds label.text = UICollectionView.elementKindSectionHeader } } ================================================ FILE: Example/StickyHeaderFlowLayout/Info.plist ================================================ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleVersion 1 LSRequiresIPhoneOS UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight ================================================ FILE: Example/StickyHeaderFlowLayout/LaunchScreen.storyboard ================================================ ================================================ FILE: Example/StickyHeaderFlowLayout.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 1DF50A82E927EBA871BEE3A2 /* Pods_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 514C3341BE0F2FB319962E4C /* Pods_Example.framework */; }; 967CE8A22270B799005F851A /* CollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967CE8972270B798005F851A /* CollectionViewController.swift */; }; 967CE8A42270B799005F851A /* CollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967CE8992270B798005F851A /* CollectionViewCell.swift */; }; 967CE8A52270B799005F851A /* CollectionViewSectionHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967CE89A2270B798005F851A /* CollectionViewSectionHeader.swift */; }; 967CE8A62270B799005F851A /* CollectionParallaxHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967CE89B2270B798005F851A /* CollectionParallaxHeader.swift */; }; 967CE8A92270B799005F851A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967CE89F2270B799005F851A /* AppDelegate.swift */; }; 967CE8AA2270B799005F851A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 967CE8A02270B799005F851A /* Assets.xcassets */; }; 96DA112A2270BC26003B77DC /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 96DA11292270BC26003B77DC /* LaunchScreen.storyboard */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 056025ED3BFCB320B751B192 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 1B364769CDC0DD15980521CF /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 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 = ""; }; 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 = ""; }; 514C3341BE0F2FB319962E4C /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = ""; }; 607FACD01AFB9204008FA782 /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; 967CE8972270B798005F851A /* CollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewController.swift; sourceTree = ""; }; 967CE8982270B798005F851A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 967CE8992270B798005F851A /* CollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewCell.swift; sourceTree = ""; }; 967CE89A2270B798005F851A /* CollectionViewSectionHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewSectionHeader.swift; sourceTree = ""; }; 967CE89B2270B798005F851A /* CollectionParallaxHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionParallaxHeader.swift; sourceTree = ""; }; 967CE89F2270B799005F851A /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 967CE8A02270B799005F851A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 96DA11292270BC26003B77DC /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; A00CD01A851EBED0B9482915 /* StickyHeaderFlowLayout.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = StickyHeaderFlowLayout.podspec; path = ../StickyHeaderFlowLayout.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 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 = ""; }; 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 = ""; }; 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 = ""; }; 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 = ""; }; 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 607FACCD1AFB9204008FA782 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 1DF50A82E927EBA871BEE3A2 /* Pods_Example.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 1920E13B220F9436402627E5 /* Frameworks */ = { isa = PBXGroup; children = ( 514C3341BE0F2FB319962E4C /* Pods_Example.framework */, ); name = Frameworks; sourceTree = ""; }; 607FACC71AFB9204008FA782 = { isa = PBXGroup; children = ( 607FACF51AFB993E008FA782 /* Podspec Metadata */, 607FACD21AFB9204008FA782 /* Example */, 607FACE81AFB9204008FA782 /* Tests */, 607FACD11AFB9204008FA782 /* Products */, 66E40A9ED0C4CAE6427DA592 /* Pods */, 1920E13B220F9436402627E5 /* Frameworks */, ); sourceTree = ""; }; 607FACD11AFB9204008FA782 /* Products */ = { isa = PBXGroup; children = ( 607FACD01AFB9204008FA782 /* Example.app */, ); name = Products; sourceTree = ""; }; 607FACD21AFB9204008FA782 /* Example */ = { isa = PBXGroup; children = ( 967CE89F2270B799005F851A /* AppDelegate.swift */, 967CE8A02270B799005F851A /* Assets.xcassets */, 967CE89B2270B798005F851A /* CollectionParallaxHeader.swift */, 967CE8992270B798005F851A /* CollectionViewCell.swift */, 967CE8972270B798005F851A /* CollectionViewController.swift */, 967CE89A2270B798005F851A /* CollectionViewSectionHeader.swift */, 96DA11292270BC26003B77DC /* LaunchScreen.storyboard */, 967CE8982270B798005F851A /* Info.plist */, ); name = Example; path = StickyHeaderFlowLayout; sourceTree = ""; }; 607FACE81AFB9204008FA782 /* Tests */ = { isa = PBXGroup; children = ( 607FACEB1AFB9204008FA782 /* Tests.swift */, 607FACE91AFB9204008FA782 /* Supporting Files */, ); path = Tests; sourceTree = ""; }; 607FACE91AFB9204008FA782 /* Supporting Files */ = { isa = PBXGroup; children = ( 607FACEA1AFB9204008FA782 /* Info.plist */, ); name = "Supporting Files"; sourceTree = ""; }; 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { isa = PBXGroup; children = ( A00CD01A851EBED0B9482915 /* StickyHeaderFlowLayout.podspec */, 1B364769CDC0DD15980521CF /* README.md */, 056025ED3BFCB320B751B192 /* LICENSE */, ); name = "Podspec Metadata"; sourceTree = ""; }; 66E40A9ED0C4CAE6427DA592 /* Pods */ = { isa = PBXGroup; children = ( 27976B1CDD09415C9AB6AE4F /* Pods-StickyHeaderFlowLayout_Example.debug.xcconfig */, EACC21754180AA58C578D590 /* Pods-StickyHeaderFlowLayout_Example.release.xcconfig */, DB39E3C87DC2534CEE820EE1 /* Pods-StickyHeaderFlowLayout_Tests.debug.xcconfig */, EF9CF16FB3025C88380AFE48 /* Pods-StickyHeaderFlowLayout_Tests.release.xcconfig */, DDBA37BF865EF3B64D1AB8BE /* Pods-Example.debug.xcconfig */, 527832DE83E5F5843A269CB4 /* Pods-Example.release.xcconfig */, 24E13AA71E2BF397464604DC /* Pods-Tests.debug.xcconfig */, FB177CF1351843140B33325E /* Pods-Tests.release.xcconfig */, ); path = Pods; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 607FACCF1AFB9204008FA782 /* Example */ = { isa = PBXNativeTarget; buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Example" */; buildPhases = ( DD959C1DB21E05A87C22353D /* [CP] Check Pods Manifest.lock */, 607FACCC1AFB9204008FA782 /* Sources */, 607FACCD1AFB9204008FA782 /* Frameworks */, 607FACCE1AFB9204008FA782 /* Resources */, 33B0495725065F5ADB199F6C /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); dependencies = ( ); name = Example; productName = StickyHeaderFlowLayout; productReference = 607FACD01AFB9204008FA782 /* Example.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 607FACC81AFB9204008FA782 /* Project object */ = { isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; LastUpgradeCheck = 1020; ORGANIZATIONNAME = CocoaPods; TargetAttributes = { 607FACCF1AFB9204008FA782 = { CreatedOnToolsVersion = 6.3.1; DevelopmentTeam = PV29U2ZFSB; LastSwiftMigration = 1020; }; }; }; buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "StickyHeaderFlowLayout" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 607FACC71AFB9204008FA782; productRefGroup = 607FACD11AFB9204008FA782 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 607FACCF1AFB9204008FA782 /* Example */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 607FACCE1AFB9204008FA782 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 967CE8AA2270B799005F851A /* Assets.xcassets in Resources */, 96DA112A2270BC26003B77DC /* LaunchScreen.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ 33B0495725065F5ADB199F6C /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh", "${BUILT_PRODUCTS_DIR}/StickyHeaderFlowLayout/StickyHeaderFlowLayout.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/StickyHeaderFlowLayout.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; DD959C1DB21E05A87C22353D /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( "${PODS_PODFILE_DIR_PATH}/Podfile.lock", "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( "$(DERIVED_FILE_DIR)/Pods-Example-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; 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"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 607FACCC1AFB9204008FA782 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 967CE8A42270B799005F851A /* CollectionViewCell.swift in Sources */, 967CE8A22270B799005F851A /* CollectionViewController.swift in Sources */, 967CE8A52270B799005F851A /* CollectionViewSectionHeader.swift in Sources */, 967CE8A92270B799005F851A /* AppDelegate.swift in Sources */, 967CE8A62270B799005F851A /* CollectionParallaxHeader.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 607FACED1AFB9204008FA782 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; }; name = Debug; }; 607FACEE1AFB9204008FA782 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 5.0; VALIDATE_PRODUCT = YES; }; name = Release; }; 607FACF01AFB9204008FA782 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = DDBA37BF865EF3B64D1AB8BE /* Pods-Example.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; DEVELOPMENT_TEAM = PV29U2ZFSB; INFOPLIST_FILE = StickyHeaderFlowLayout/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MODULE_NAME = ExampleApp; PRODUCT_BUNDLE_IDENTIFIER = bernikovich.StickyHeaderFlowLayout; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_SWIFT3_OBJC_INFERENCE = Default; }; name = Debug; }; 607FACF11AFB9204008FA782 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 527832DE83E5F5843A269CB4 /* Pods-Example.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; DEVELOPMENT_TEAM = PV29U2ZFSB; INFOPLIST_FILE = StickyHeaderFlowLayout/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MODULE_NAME = ExampleApp; PRODUCT_BUNDLE_IDENTIFIER = bernikovich.StickyHeaderFlowLayout; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_SWIFT3_OBJC_INFERENCE = Default; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "StickyHeaderFlowLayout" */ = { isa = XCConfigurationList; buildConfigurations = ( 607FACED1AFB9204008FA782 /* Debug */, 607FACEE1AFB9204008FA782 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Example" */ = { isa = XCConfigurationList; buildConfigurations = ( 607FACF01AFB9204008FA782 /* Debug */, 607FACF11AFB9204008FA782 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 607FACC81AFB9204008FA782 /* Project object */; } ================================================ FILE: Example/StickyHeaderFlowLayout.xcodeproj/project.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: Example/StickyHeaderFlowLayout.xcodeproj/xcshareddata/xcschemes/Example.xcscheme ================================================ ================================================ FILE: Example/StickyHeaderFlowLayout.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: Example/StickyHeaderFlowLayout.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ================================================ IDEDidComputeMac32BitWarning ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2018 Timur Bernikowich Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================

StickyHeaderFlowLayout

StickyHeaderFlowLayout

Sticky headers for UICollectionView written in pure Swift


Based on [CSStickyHeaderFlowLayout](https://github.com/CSStickyHeaderFlowLayout/CSStickyHeaderFlowLayout). `StickyHeaderFlowLayout` makes it easy to create sticky headers in `UICollectionView`. ## Integration #### CocoaPods You can use [CocoaPods](http://cocoapods.org/) to install `StickyHeaderFlowLayout` by adding it to your `Podfile`: ```ruby platform :ios, '9.0' target 'MyApp' do pod 'StickyHeaderFlowLayout' end ``` #### Manually To use this library in your project manually you may: Just drag `StickyHeaderFlowLayout.swift` and `StickyHeaderFlowLayoutAttributes.swift` to the project tree ## Usage #### Sample project Repository contains small sample project which shows basic integration. #### Basic idea 1. Create layout and collection view ```swift let layout = StickyHeaderFlowLayout() let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) ``` 2. Setup sticky header ```swift collectionView.register(CollectionParallaxHeader.self, forSupplementaryViewOfKind: StickyHeaderFlowLayout.parallaxHeaderIdentifier, withReuseIdentifier: "parallaxHeader") layout.parallaxHeaderReferenceSize = CGSize(width: view.frame.size.width, height: 200) layout.parallaxHeaderMinimumReferenceSize = CGSize(width: view.frame.size.width, height: 160) ``` 3. Return correct view in `viewForSupplementaryElementOfKind` function ```swift override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { if kind == StickyHeaderFlowLayout.parallaxHeaderIdentifier { return collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "parallaxHeader", for: indexPath) } // Other views. ... } ``` ## License `StickyHeaderFlowLayout` is released under the MIT license. See `LICENSE` for details. ================================================ FILE: StickyHeaderFlowLayout/Assets/.gitkeep ================================================ ================================================ FILE: StickyHeaderFlowLayout/Classes/.gitkeep ================================================ ================================================ FILE: StickyHeaderFlowLayout/Classes/StickyHeaderFlowLayout.swift ================================================ // // Created by Tsimur Bernikovich on 12/6/18. // Copyright © 2018 Tsimur Bernikovich. All rights reserved. // import UIKit open class StickyHeaderFlowLayout: UICollectionViewFlowLayout { open class var parallaxHeaderIdentifier: String { return "StickyHeaderParallexHeader" } private static let headerZIndex = 1024 open var parallaxHeaderReferenceSize: CGSize = .zero open var parallaxHeaderMinimumReferenceSize: CGSize = .zero { didSet { invalidateLayout() } } open var parallaxHeaderAlwaysOnTop = false open var disableStickyHeaders = false open var disableStretching = false open override func prepare() { super.prepare() } open override func initialLayoutAttributesForAppearingSupplementaryElement(ofKind elementKind: String, at elementIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? { let attributes = super.initialLayoutAttributesForAppearingSupplementaryElement(ofKind: elementKind, at: elementIndexPath) if elementKind == type(of: self).parallaxHeaderIdentifier { // Sticky header do not need to offset. return nil } else { if var frame = attributes?.frame { frame.origin.y = parallaxHeaderReferenceSize.height attributes?.frame = frame } } return attributes } open override func finalLayoutAttributesForDisappearingSupplementaryElement(ofKind elementKind: String, at elementIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? { if elementKind == type(of: self).parallaxHeaderIdentifier { let attribute = layoutAttributesForSupplementaryView(ofKind: elementKind, at: elementIndexPath) if let attribute = attribute as? StickyHeaderFlowLayoutAttributes { updateParallaxHeaderAttribute(attribute) } return attribute } else { super.finalLayoutAttributesForDisappearingSupplementaryElement(ofKind: elementKind, at: elementIndexPath) } return nil } open override func layoutAttributesForSupplementaryView(ofKind elementKind: String, at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { var attrubutes = super.layoutAttributesForSupplementaryView(ofKind: elementKind, at: indexPath) if attrubutes == nil && elementKind == type(of: self).parallaxHeaderIdentifier { attrubutes = StickyHeaderFlowLayoutAttributes(forSupplementaryViewOfKind: elementKind, with: indexPath) } return attrubutes } open override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { guard collectionView?.dataSource != nil else { return nil } // The rect should compensate the header size var adjustedRect = rect adjustedRect.origin.y -= self.parallaxHeaderReferenceSize.height var allItems: [UICollectionViewLayoutAttributes] = [] // Perform a deep copy of the attributes returned from super. if let originalAttributes = super.layoutAttributesForElements(in: adjustedRect) { allItems = originalAttributes.compactMap { $0.copy() as? UICollectionViewLayoutAttributes } } var headers: [Int: UICollectionViewLayoutAttributes] = [:] var lastCells: [Int: UICollectionViewLayoutAttributes] = [:] var visibleParallaxHeader = false for item in allItems { let attributes = item var frame = attributes.frame frame.origin.y += parallaxHeaderReferenceSize.height attributes.frame = frame let indexPath = attributes.indexPath let isHeader = attributes.representedElementKind == UICollectionView.elementKindSectionHeader let isFooter = attributes.representedElementKind == UICollectionView.elementKindSectionFooter if isHeader { headers[indexPath.section] = attributes } else if isFooter { // Not implemeneted. } else { // Get the bottom most cell of that section. if let currentAttribute = lastCells[indexPath.section] { if indexPath.row > currentAttribute.indexPath.row { lastCells[indexPath.section] = attributes } } else { lastCells[indexPath.section] = attributes } if indexPath.item == 0 && indexPath.section == 0 { visibleParallaxHeader = true } } if isHeader { attributes.zIndex = type(of: self).headerZIndex } else { // For iOS 7.0, the cell zIndex should be above sticky section header. attributes.zIndex = 1 } } if rect.minY <= 0 { visibleParallaxHeader = true } if parallaxHeaderAlwaysOnTop { visibleParallaxHeader = true } // Create the attributes for the Parallex header. if visibleParallaxHeader && parallaxHeaderReferenceSize != .zero { let currentAttribute = StickyHeaderFlowLayoutAttributes(forSupplementaryViewOfKind: type(of: self).parallaxHeaderIdentifier, with: IndexPath(index: 0)) updateParallaxHeaderAttribute(currentAttribute) allItems.append(currentAttribute) } if !disableStickyHeaders { lastCells.forEach { let indexPath = $0.value.indexPath let indexPathKey = indexPath.section if let header = headers[indexPathKey] { if header.frame.size != .zero { updateHeaderAttributes(header, lastCellAttributes: $0.value) } } else if let header = layoutAttributesForSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, at: IndexPath(item: 0, section: indexPath.section)) { if header.frame.size != .zero { allItems.append(header) } } } } return allItems } open override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { let attributes = super.layoutAttributesForItem(at: indexPath)?.copy() as? UICollectionViewLayoutAttributes if var frame = attributes?.frame { frame.origin.y += parallaxHeaderReferenceSize.height attributes?.frame = frame } return attributes } open override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { return true } open override class var layoutAttributesClass: AnyClass { return StickyHeaderFlowLayoutAttributes.self } private func updateHeaderAttributes(_ attributes: UICollectionViewLayoutAttributes, lastCellAttributes: UICollectionViewLayoutAttributes) { guard let collectionView = collectionView else { return } let currentBounds = collectionView.bounds attributes.zIndex = type(of: self).headerZIndex attributes.isHidden = false var origin = attributes.frame.origin let sectionMaxY = lastCellAttributes.frame.maxY - attributes.frame.size.height var y = currentBounds.maxY - currentBounds.size.height + collectionView.contentInset.top if parallaxHeaderAlwaysOnTop { y += parallaxHeaderMinimumReferenceSize.height } origin.y = min(max(y, attributes.frame.origin.y), sectionMaxY) attributes.frame = CGRect(origin: origin, size: attributes.frame.size) } private func updateParallaxHeaderAttribute(_ currentAttribute: StickyHeaderFlowLayoutAttributes) { guard let collectionView = collectionView else { return } var frame = currentAttribute.frame frame.size = parallaxHeaderReferenceSize let bounds = collectionView.bounds let maxY = frame.maxY // Make sure the frame won't be negative values. var y = min(maxY - parallaxHeaderMinimumReferenceSize.height, bounds.origin.y + collectionView.contentInset.top) let height = max(0, -y + maxY) let maxHeight = parallaxHeaderReferenceSize.height let minHeight = parallaxHeaderMinimumReferenceSize.height let progressiveness = (height - minHeight) / (maxHeight - minHeight) currentAttribute.progressiveness = progressiveness // If zIndex < 0 would prevents tap from recognized right under navigation bar. currentAttribute.zIndex = 0 // When parallaxHeaderAlwaysOnTop is enabled, we will check when we should update the y position. if parallaxHeaderAlwaysOnTop && height <= parallaxHeaderMinimumReferenceSize.height { let insetTop = collectionView.contentInset.top // Always stick to top but under the nav bar. y = collectionView.contentOffset.y + insetTop currentAttribute.zIndex = 2000 } let normalizedHeight = disableStretching && height > maxHeight ? maxHeight : height currentAttribute.frame = CGRect(x: frame.origin.x, y: y, width: frame.size.width, height: normalizedHeight) } } extension StickyHeaderFlowLayoutAttributes { override internal var debugDescription: String { let indexPathString = "\(indexPath.section) \(indexPath.item)" return " indexPath: \(indexPathString) zIndex: \(zIndex) valid: \(isValid) kind: \(representedElementKind ?? "cell")" } fileprivate var isValid: Bool { switch representedElementCategory { case .cell: if zIndex != 1 { return false } return true case .supplementaryView: if representedElementKind == StickyHeaderFlowLayout.parallaxHeaderIdentifier { return true } else if zIndex < 1024 { return false } return true default: return true } } } private extension StickyHeaderFlowLayout { func debugLayoutAttributes(_ layoutAttributes: [StickyHeaderFlowLayoutAttributes]) { var hasInvalid = false layoutAttributes.forEach { if !$0.isValid { hasInvalid = true } } if hasInvalid { print("StickyHeaderFlowLayout: \(layoutAttributes)") } } } ================================================ FILE: StickyHeaderFlowLayout/Classes/StickyHeaderFlowLayoutAttributes.swift ================================================ // // Created by Tsimur Bernikovich on 12/6/18. // Copyright © 2018 Tsimur Bernikovich. All rights reserved. // import UIKit class StickyHeaderFlowLayoutAttributes: UICollectionViewLayoutAttributes { var progressiveness: CGFloat = 0 override func copy(with zone: NSZone? = nil) -> Any { let copy = super.copy(with: zone) if let copy = copy as? StickyHeaderFlowLayoutAttributes { copy.progressiveness = progressiveness } return copy } override var zIndex: Int { didSet { // Fixes: Section header go behind cell when insert via performBatchUpdates #68 // https://github.com/jamztang/CSStickyHeaderFlowLayout/issues/68#issuecomment-108678022 // Reference: UICollectionView setLayout:animated: not preserving zIndex // http://stackoverflow.com/questions/12659301/uicollectionview-setlayoutanimated-not-preserving-zindex // originally our solution is to translate the section header above the original z position, // however, scroll indicator will be covered by those cells and section header if z position is >= 1 // so instead we translate the original cell to be -1, and make sure the cell are hit test proven. transform3D = CATransform3DMakeTranslation(0, 0, zIndex == 1 ? -1 : 0); } } } ================================================ FILE: StickyHeaderFlowLayout.podspec ================================================ Pod::Spec.new do |spec| spec.name = "StickyHeaderFlowLayout" spec.version = "0.9.4" spec.summary = "Sticky headers for UICollectionView written in pure Swift (based on CSStickyHeaderFlowLayout)" spec.homepage = "https://github.com/bernikovich/StickyHeaderFlowLayout" spec.license = { :type => "MIT", :file => "LICENSE" } spec.author = { "Timur Bernikovich" => "bernikowich@icloud.com" } spec.platform = :ios, "9.0" spec.swift_version = "5.0" spec.framework = "UIKit" spec.source = { :git => "https://github.com/bernikovich/StickyHeaderFlowLayout.git", :tag => spec.version.to_s } spec.source_files = "StickyHeaderFlowLayout/Classes/**/*.swift" spec.module_name = "StickyHeaderFlowLayout" end