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