Repository: bernikovich/StickyHeaderFlowLayout
Branch: master
Commit: 161e36bf77d7
Files: 43
Total size: 99.5 KB
Directory structure:
gitextract_0otwtvwj/
├── .gitignore
├── Example/
│ ├── Base.lproj/
│ │ └── LaunchScreen.storyboard
│ ├── Podfile
│ ├── Pods/
│ │ ├── Local Podspecs/
│ │ │ └── StickyHeaderFlowLayout.podspec.json
│ │ ├── Pods.xcodeproj/
│ │ │ └── project.pbxproj
│ │ └── Target Support Files/
│ │ ├── Pods-Example/
│ │ │ ├── Pods-Example-Info.plist
│ │ │ ├── Pods-Example-acknowledgements.markdown
│ │ │ ├── Pods-Example-acknowledgements.plist
│ │ │ ├── Pods-Example-dummy.m
│ │ │ ├── Pods-Example-frameworks.sh
│ │ │ ├── Pods-Example-umbrella.h
│ │ │ ├── Pods-Example.debug.xcconfig
│ │ │ ├── Pods-Example.modulemap
│ │ │ └── Pods-Example.release.xcconfig
│ │ └── StickyHeaderFlowLayout/
│ │ ├── StickyHeaderFlowLayout-Info.plist
│ │ ├── StickyHeaderFlowLayout-dummy.m
│ │ ├── StickyHeaderFlowLayout-prefix.pch
│ │ ├── StickyHeaderFlowLayout-umbrella.h
│ │ ├── StickyHeaderFlowLayout.modulemap
│ │ └── StickyHeaderFlowLayout.xcconfig
│ ├── StickyHeaderFlowLayout/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── Contents.json
│ │ │ └── success-baby.imageset/
│ │ │ └── Contents.json
│ │ ├── CollectionParallaxHeader.swift
│ │ ├── CollectionViewCell.swift
│ │ ├── CollectionViewController.swift
│ │ ├── CollectionViewSectionHeader.swift
│ │ ├── Info.plist
│ │ └── LaunchScreen.storyboard
│ ├── StickyHeaderFlowLayout.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ └── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Example.xcscheme
│ └── StickyHeaderFlowLayout.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ └── IDEWorkspaceChecks.plist
├── LICENSE
├── README.md
├── Resources/
│ └── design.sketch
├── StickyHeaderFlowLayout/
│ ├── Assets/
│ │ └── .gitkeep
│ └── Classes/
│ ├── .gitkeep
│ ├── StickyHeaderFlowLayout.swift
│ └── StickyHeaderFlowLayoutAttributes.swift
└── StickyHeaderFlowLayout.podspec
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## Build generated
build/
DerivedData/
## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata/
## Other
*.moved-aside
*.xccheckout
*.xcscmblueprint
## Obj-C/Swift specific
*.hmap
*.ipa
*.dSYM.zip
*.dSYM
## Playgrounds
timeline.xctimeline
playground.xcworkspace
# Swift Package Manager
#
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
# Package.pins
# Package.resolved
.build/
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build
# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output
## macOS
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
================================================
FILE: Example/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>
================================================
FILE: Example/Podfile
================================================
platform :ios, '9.0'
use_frameworks!
target 'Example' do
pod 'StickyHeaderFlowLayout', :path => '../'
end
================================================
FILE: Example/Pods/Local Podspecs/StickyHeaderFlowLayout.podspec.json
================================================
{
"name": "StickyHeaderFlowLayout",
"version": "0.9.4",
"summary": "Sticky headers for UICollectionView written in pure Swift (based on CSStickyHeaderFlowLayout)",
"homepage": "https://github.com/bernikovich/StickyHeaderFlowLayout",
"license": {
"type": "MIT",
"file": "LICENSE"
},
"authors": {
"Timur Bernikovich": "bernikowich@icloud.com"
},
"platforms": {
"ios": "9.0"
},
"swift_versions": "5.0",
"frameworks": "UIKit",
"source": {
"git": "https://github.com/bernikovich/StickyHeaderFlowLayout.git",
"tag": "0.9.4"
},
"source_files": "StickyHeaderFlowLayout/Classes/**/*.swift",
"module_name": "StickyHeaderFlowLayout"
}
================================================
FILE: Example/Pods/Pods.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
35D94D0268DE4634F556D0CBE356B8D7 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ECF2A2B0720AE923C22BED3192888BE0 /* UIKit.framework */; };
3A8648419C331474F84021A4E27CBD83 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40CB39E715FBCDAA142E6513E126200A /* Foundation.framework */; };
3D7432320C2F3F7185362CA06E8EFABB /* StickyHeaderFlowLayout-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FB0ED361338A7A71E22E09690474E3F /* StickyHeaderFlowLayout-dummy.m */; };
4CFEADD797100CA9D6DB1501FF9BE968 /* StickyHeaderFlowLayout-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C32DA58D5E552F7D09C95A2FABF5188D /* StickyHeaderFlowLayout-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
764B240ADC02EE30314FA73C9E7082EE /* Pods-Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D6D7C498FA339E02BD53ECB8916CEA8E /* Pods-Example-dummy.m */; };
765870CB7746D953C8CFAE11471949B0 /* Pods-Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7825A90E082A1582EB16256B0E722B3F /* Pods-Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
8968E2442AAFDDB89A5EC3F7BF58D731 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40CB39E715FBCDAA142E6513E126200A /* Foundation.framework */; };
94289C8EDDA9C7E031F50AC578194760 /* StickyHeaderFlowLayoutAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 118019065266EA5F0BFA412E8F391AFA /* StickyHeaderFlowLayoutAttributes.swift */; };
F0B8EA7457D900BC48E412EB53859F94 /* StickyHeaderFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F5C33F5BE0F521E45DB02145225156 /* StickyHeaderFlowLayout.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
FF19EE9A03D7821E892AD4D9FBCE08BB /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 40C945FB80B39872735EB9619BDC1A3C;
remoteInfo = StickyHeaderFlowLayout;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
118019065266EA5F0BFA412E8F391AFA /* StickyHeaderFlowLayoutAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StickyHeaderFlowLayoutAttributes.swift; path = StickyHeaderFlowLayout/Classes/StickyHeaderFlowLayoutAttributes.swift; sourceTree = "<group>"; };
243410B9535472556EA4BB6DBC133A0D /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.release.xcconfig"; sourceTree = "<group>"; };
31C1D37707DFAA5E6A164BCC07834264 /* Pods-Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-Info.plist"; sourceTree = "<group>"; };
35C305D3797C284E6F5BAA1D3E6F9BF8 /* Pods-Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-Example.modulemap"; sourceTree = "<group>"; };
3692CDCE37798947D45B8637B4A32038 /* StickyHeaderFlowLayout.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = StickyHeaderFlowLayout.podspec; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
4047B086DF31E43AA06F1F60CC9EC6E5 /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_Example.framework; path = "Pods-Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
40CB39E715FBCDAA142E6513E126200A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
441854E35F81731E63E53DC7E4EEAD9D /* Pods-Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Example-acknowledgements.markdown"; sourceTree = "<group>"; };
4EFC56309689F8EBE110DD3A622C93AD /* StickyHeaderFlowLayout-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "StickyHeaderFlowLayout-prefix.pch"; sourceTree = "<group>"; };
50F5C33F5BE0F521E45DB02145225156 /* StickyHeaderFlowLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StickyHeaderFlowLayout.swift; path = StickyHeaderFlowLayout/Classes/StickyHeaderFlowLayout.swift; sourceTree = "<group>"; };
6CE353BD73513B79D3E4F128A1AE0A20 /* StickyHeaderFlowLayout.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = StickyHeaderFlowLayout.modulemap; sourceTree = "<group>"; };
6FB0ED361338A7A71E22E09690474E3F /* StickyHeaderFlowLayout-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "StickyHeaderFlowLayout-dummy.m"; sourceTree = "<group>"; };
7825A90E082A1582EB16256B0E722B3F /* Pods-Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Example-umbrella.h"; sourceTree = "<group>"; };
7D9FA451C4851D8F443B3D2E046D9FD1 /* StickyHeaderFlowLayout-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "StickyHeaderFlowLayout-Info.plist"; sourceTree = "<group>"; };
7E9B3B42659383A023F0305F91B658AA /* StickyHeaderFlowLayout.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = StickyHeaderFlowLayout.xcconfig; sourceTree = "<group>"; };
9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
AFECBC24E09D0D25F822C27BD944AFD4 /* Pods-Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Example-frameworks.sh"; sourceTree = "<group>"; };
B45138496B85A072654D1D0F8EBBEDE5 /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.debug.xcconfig"; sourceTree = "<group>"; };
C32DA58D5E552F7D09C95A2FABF5188D /* StickyHeaderFlowLayout-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "StickyHeaderFlowLayout-umbrella.h"; sourceTree = "<group>"; };
D6D7C498FA339E02BD53ECB8916CEA8E /* Pods-Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Example-dummy.m"; sourceTree = "<group>"; };
DFA2D66FDD3A69D8678878A660D22DF3 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = "<group>"; };
E54195536749EADE9D3704B9F5D44D65 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = "<group>"; };
EA21B344259B58996DB73382B1B1521F /* Pods-Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-acknowledgements.plist"; sourceTree = "<group>"; };
EAF95A22DBB4BFFEA63EF28CFBA9A425 /* StickyHeaderFlowLayout.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = StickyHeaderFlowLayout.framework; path = StickyHeaderFlowLayout.framework; sourceTree = BUILT_PRODUCTS_DIR; };
ECF2A2B0720AE923C22BED3192888BE0 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
442902C53954A478CE3924BCDD95C564 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
8968E2442AAFDDB89A5EC3F7BF58D731 /* Foundation.framework in Frameworks */,
35D94D0268DE4634F556D0CBE356B8D7 /* UIKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
CA3F0DDAE98C61BDE899719B6A2DF63C /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
3A8648419C331474F84021A4E27CBD83 /* Foundation.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = {
isa = PBXGroup;
children = (
E169A450ED27AC725DF52953F66D11E0 /* iOS */,
);
name = Frameworks;
sourceTree = "<group>";
};
1B1580ACE84F4547E4F23158A2A5DA24 /* Pod */ = {
isa = PBXGroup;
children = (
E54195536749EADE9D3704B9F5D44D65 /* LICENSE */,
DFA2D66FDD3A69D8678878A660D22DF3 /* README.md */,
3692CDCE37798947D45B8637B4A32038 /* StickyHeaderFlowLayout.podspec */,
);
name = Pod;
sourceTree = "<group>";
};
565E83AFD614E3387B40F3BE9A33971B /* Development Pods */ = {
isa = PBXGroup;
children = (
A23E54343CDDBFFACC210E582FBD6379 /* StickyHeaderFlowLayout */,
);
name = "Development Pods";
sourceTree = "<group>";
};
602AEF7352306B01699DA697382A0B20 /* Products */ = {
isa = PBXGroup;
children = (
4047B086DF31E43AA06F1F60CC9EC6E5 /* Pods_Example.framework */,
EAF95A22DBB4BFFEA63EF28CFBA9A425 /* StickyHeaderFlowLayout.framework */,
);
name = Products;
sourceTree = "<group>";
};
9BDBD95ED116334D1B2835202D8D3060 /* Pods-Example */ = {
isa = PBXGroup;
children = (
35C305D3797C284E6F5BAA1D3E6F9BF8 /* Pods-Example.modulemap */,
441854E35F81731E63E53DC7E4EEAD9D /* Pods-Example-acknowledgements.markdown */,
EA21B344259B58996DB73382B1B1521F /* Pods-Example-acknowledgements.plist */,
D6D7C498FA339E02BD53ECB8916CEA8E /* Pods-Example-dummy.m */,
AFECBC24E09D0D25F822C27BD944AFD4 /* Pods-Example-frameworks.sh */,
31C1D37707DFAA5E6A164BCC07834264 /* Pods-Example-Info.plist */,
7825A90E082A1582EB16256B0E722B3F /* Pods-Example-umbrella.h */,
B45138496B85A072654D1D0F8EBBEDE5 /* Pods-Example.debug.xcconfig */,
243410B9535472556EA4BB6DBC133A0D /* Pods-Example.release.xcconfig */,
);
name = "Pods-Example";
path = "Target Support Files/Pods-Example";
sourceTree = "<group>";
};
A23E54343CDDBFFACC210E582FBD6379 /* StickyHeaderFlowLayout */ = {
isa = PBXGroup;
children = (
50F5C33F5BE0F521E45DB02145225156 /* StickyHeaderFlowLayout.swift */,
118019065266EA5F0BFA412E8F391AFA /* StickyHeaderFlowLayoutAttributes.swift */,
1B1580ACE84F4547E4F23158A2A5DA24 /* Pod */,
FA715227E1FE8BEAC05C1AC6A61EF39E /* Support Files */,
);
name = StickyHeaderFlowLayout;
path = ../..;
sourceTree = "<group>";
};
CE2E825F08D3AD0FD76E6D78D7512ED0 /* Targets Support Files */ = {
isa = PBXGroup;
children = (
9BDBD95ED116334D1B2835202D8D3060 /* Pods-Example */,
);
name = "Targets Support Files";
sourceTree = "<group>";
};
CF1408CF629C7361332E53B88F7BD30C = {
isa = PBXGroup;
children = (
9D940727FF8FB9C785EB98E56350EF41 /* Podfile */,
565E83AFD614E3387B40F3BE9A33971B /* Development Pods */,
1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */,
602AEF7352306B01699DA697382A0B20 /* Products */,
CE2E825F08D3AD0FD76E6D78D7512ED0 /* Targets Support Files */,
);
sourceTree = "<group>";
};
E169A450ED27AC725DF52953F66D11E0 /* iOS */ = {
isa = PBXGroup;
children = (
40CB39E715FBCDAA142E6513E126200A /* Foundation.framework */,
ECF2A2B0720AE923C22BED3192888BE0 /* UIKit.framework */,
);
name = iOS;
sourceTree = "<group>";
};
FA715227E1FE8BEAC05C1AC6A61EF39E /* Support Files */ = {
isa = PBXGroup;
children = (
6CE353BD73513B79D3E4F128A1AE0A20 /* StickyHeaderFlowLayout.modulemap */,
7E9B3B42659383A023F0305F91B658AA /* StickyHeaderFlowLayout.xcconfig */,
6FB0ED361338A7A71E22E09690474E3F /* StickyHeaderFlowLayout-dummy.m */,
7D9FA451C4851D8F443B3D2E046D9FD1 /* StickyHeaderFlowLayout-Info.plist */,
4EFC56309689F8EBE110DD3A622C93AD /* StickyHeaderFlowLayout-prefix.pch */,
C32DA58D5E552F7D09C95A2FABF5188D /* StickyHeaderFlowLayout-umbrella.h */,
);
name = "Support Files";
path = "Example/Pods/Target Support Files/StickyHeaderFlowLayout";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
03A142ED7D799F26E58BCEA441775788 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
4CFEADD797100CA9D6DB1501FF9BE968 /* StickyHeaderFlowLayout-umbrella.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
37C0208891D6CBF287A0C99D3FDDA92F /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
765870CB7746D953C8CFAE11471949B0 /* Pods-Example-umbrella.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
0AEE99A309977BD12A049FF48AF9BA4B /* Pods-Example */ = {
isa = PBXNativeTarget;
buildConfigurationList = DE3C3176A50A910BD91ACE691894E3CB /* Build configuration list for PBXNativeTarget "Pods-Example" */;
buildPhases = (
37C0208891D6CBF287A0C99D3FDDA92F /* Headers */,
F5B455B3E6E6E38997A0411B3642B650 /* Sources */,
CA3F0DDAE98C61BDE899719B6A2DF63C /* Frameworks */,
26BD2736A609DBD9918160CE9061D52C /* Resources */,
);
buildRules = (
);
dependencies = (
14F0A6918C39E169D6ADD18BDA061285 /* PBXTargetDependency */,
);
name = "Pods-Example";
productName = "Pods-Example";
productReference = 4047B086DF31E43AA06F1F60CC9EC6E5 /* Pods_Example.framework */;
productType = "com.apple.product-type.framework";
};
40C945FB80B39872735EB9619BDC1A3C /* StickyHeaderFlowLayout */ = {
isa = PBXNativeTarget;
buildConfigurationList = 80D83C628FAF9A8B854DECD22874808F /* Build configuration list for PBXNativeTarget "StickyHeaderFlowLayout" */;
buildPhases = (
03A142ED7D799F26E58BCEA441775788 /* Headers */,
8BBB14DB6503D5D5F83B7C01C7DDA7CB /* Sources */,
442902C53954A478CE3924BCDD95C564 /* Frameworks */,
31FA0054C9683F0E892FD0475AE95F7A /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = StickyHeaderFlowLayout;
productName = StickyHeaderFlowLayout;
productReference = EAF95A22DBB4BFFEA63EF28CFBA9A425 /* StickyHeaderFlowLayout.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
BFDFE7DC352907FC980B868725387E98 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0930;
LastUpgradeCheck = 0930;
};
buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = CF1408CF629C7361332E53B88F7BD30C;
productRefGroup = 602AEF7352306B01699DA697382A0B20 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
0AEE99A309977BD12A049FF48AF9BA4B /* Pods-Example */,
40C945FB80B39872735EB9619BDC1A3C /* StickyHeaderFlowLayout */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
26BD2736A609DBD9918160CE9061D52C /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
31FA0054C9683F0E892FD0475AE95F7A /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
8BBB14DB6503D5D5F83B7C01C7DDA7CB /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
3D7432320C2F3F7185362CA06E8EFABB /* StickyHeaderFlowLayout-dummy.m in Sources */,
F0B8EA7457D900BC48E412EB53859F94 /* StickyHeaderFlowLayout.swift in Sources */,
94289C8EDDA9C7E031F50AC578194760 /* StickyHeaderFlowLayoutAttributes.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
F5B455B3E6E6E38997A0411B3642B650 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
764B240ADC02EE30314FA73C9E7082EE /* Pods-Example-dummy.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
14F0A6918C39E169D6ADD18BDA061285 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = StickyHeaderFlowLayout;
target = 40C945FB80B39872735EB9619BDC1A3C /* StickyHeaderFlowLayout */;
targetProxy = FF19EE9A03D7821E892AD4D9FBCE08BB /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
07488D4657FB0A78086563621D425F8A /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"POD_CONFIGURATION_DEBUG=1",
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
STRIP_INSTALLED_PRODUCT = NO;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 4.2;
SYMROOT = "${SRCROOT}/../build";
};
name = Debug;
};
39D8A9594A66C91A9FE0795BE5A56A2E /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7E9B3B42659383A023F0305F91B658AA /* StickyHeaderFlowLayout.xcconfig */;
buildSettings = {
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
GCC_PREFIX_HEADER = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-prefix.pch";
INFOPLIST_FILE = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MODULEMAP_FILE = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout.modulemap";
PRODUCT_MODULE_NAME = StickyHeaderFlowLayout;
PRODUCT_NAME = StickyHeaderFlowLayout;
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
489FB0F4199BDFD03C93BB88711A2D06 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7E9B3B42659383A023F0305F91B658AA /* StickyHeaderFlowLayout.xcconfig */;
buildSettings = {
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
GCC_PREFIX_HEADER = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-prefix.pch";
INFOPLIST_FILE = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MODULEMAP_FILE = "Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout.modulemap";
PRODUCT_MODULE_NAME = StickyHeaderFlowLayout;
PRODUCT_NAME = StickyHeaderFlowLayout;
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
A1962E6FF39BBAC201A2E5DDF99557DF /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_PREPROCESSOR_DEFINITIONS = (
"POD_CONFIGURATION_RELEASE=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
STRIP_INSTALLED_PRODUCT = NO;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 4.2;
SYMROOT = "${SRCROOT}/../build";
};
name = Release;
};
AF8FCDD68146ABABC8EB48D487668CBD /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = B45138496B85A072654D1D0F8EBBEDE5 /* Pods-Example.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = "Target Support Files/Pods-Example/Pods-Example-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MACH_O_TYPE = staticlib;
MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.modulemap";
OTHER_LDFLAGS = "";
OTHER_LIBTOOLFLAGS = "";
PODS_ROOT = "$(SRCROOT)";
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
CCAE0C4C334BD450CDD3C30C5E1B4999 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 243410B9535472556EA4BB6DBC133A0D /* Pods-Example.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = "Target Support Files/Pods-Example/Pods-Example-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MACH_O_TYPE = staticlib;
MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.modulemap";
OTHER_LDFLAGS = "";
OTHER_LIBTOOLFLAGS = "";
PODS_ROOT = "$(SRCROOT)";
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = {
isa = XCConfigurationList;
buildConfigurations = (
07488D4657FB0A78086563621D425F8A /* Debug */,
A1962E6FF39BBAC201A2E5DDF99557DF /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
80D83C628FAF9A8B854DECD22874808F /* Build configuration list for PBXNativeTarget "StickyHeaderFlowLayout" */ = {
isa = XCConfigurationList;
buildConfigurations = (
39D8A9594A66C91A9FE0795BE5A56A2E /* Debug */,
489FB0F4199BDFD03C93BB88711A2D06 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
DE3C3176A50A910BD91ACE691894E3CB /* Build configuration list for PBXNativeTarget "Pods-Example" */ = {
isa = XCConfigurationList;
buildConfigurations = (
AF8FCDD68146ABABC8EB48D487668CBD /* Debug */,
CCAE0C4C334BD450CDD3C30C5E1B4999 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */;
}
================================================
FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example-Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${CURRENT_PROJECT_VERSION}</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>
================================================
FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown
================================================
# Acknowledgements
This application makes use of the following third party libraries:
## StickyHeaderFlowLayout
MIT License
Copyright (c) 2018 Timur Bernikowich
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Generated by CocoaPods - https://cocoapods.org
================================================
FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>FooterText</key>
<string>This application makes use of the following third party libraries:</string>
<key>Title</key>
<string>Acknowledgements</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>MIT License
Copyright (c) 2018 Timur Bernikowich
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
</string>
<key>License</key>
<string>MIT</string>
<key>Title</key>
<string>StickyHeaderFlowLayout</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>Generated by CocoaPods - https://cocoapods.org</string>
<key>Title</key>
<string></string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
</array>
<key>StringsTable</key>
<string>Acknowledgements</string>
<key>Title</key>
<string>Acknowledgements</string>
</dict>
</plist>
================================================
FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m
================================================
#import <Foundation/Foundation.h>
@interface PodsDummy_Pods_Example : NSObject
@end
@implementation PodsDummy_Pods_Example
@end
================================================
FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks.sh
================================================
#!/bin/sh
set -e
set -u
set -o pipefail
function on_error {
echo "$(realpath -mq "${0}"):$1: error: Unexpected failure"
}
trap 'on_error $LINENO' ERR
if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then
# If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy
# frameworks to, so exit 0 (signalling the script phase was successful).
exit 0
fi
echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}"
SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
# Used as a return value for each invocation of `strip_invalid_archs` function.
STRIP_BINARY_RETVAL=0
# This protects against multiple targets copying the same framework dependency at the same time. The solution
# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
# Copies and strips a vendored framework
install_framework()
{
if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then
local source="${BUILT_PRODUCTS_DIR}/$1"
elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then
local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")"
elif [ -r "$1" ]; then
local source="$1"
fi
local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
if [ -L "${source}" ]; then
echo "Symlinked..."
source="$(readlink "${source}")"
fi
# Use filter instead of exclude so missing patterns don't throw errors.
echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\""
rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
local basename
basename="$(basename -s .framework "$1")"
binary="${destination}/${basename}.framework/${basename}"
if ! [ -r "$binary" ]; then
binary="${destination}/${basename}"
elif [ -L "${binary}" ]; then
echo "Destination binary is symlinked..."
dirname="$(dirname "${binary}")"
binary="${dirname}/$(readlink "${binary}")"
fi
# Strip invalid architectures so "fat" simulator / device frameworks work on device
if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then
strip_invalid_archs "$binary"
fi
# Resign the code if required by the build settings to avoid unstable apps
code_sign_if_enabled "${destination}/$(basename "$1")"
# Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.
if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then
local swift_runtime_libs
swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u)
for lib in $swift_runtime_libs; do
echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\""
rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
code_sign_if_enabled "${destination}/${lib}"
done
fi
}
# Copies and strips a vendored dSYM
install_dsym() {
local source="$1"
if [ -r "$source" ]; then
# Copy the dSYM into a the targets temp dir.
echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\""
rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}"
local basename
basename="$(basename -s .framework.dSYM "$source")"
binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}"
# Strip invalid architectures so "fat" simulator / device frameworks work on device
if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then
strip_invalid_archs "$binary"
fi
if [[ $STRIP_BINARY_RETVAL == 1 ]]; then
# Move the stripped file into its final destination.
echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\""
rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}"
else
# The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.
touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM"
fi
fi
}
# Copies the bcsymbolmap files of a vendored framework
install_bcsymbolmap() {
local bcsymbolmap_path="$1"
local destination="${BUILT_PRODUCTS_DIR}"
echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}""
rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"
}
# Signs a framework with the provided identity
code_sign_if_enabled() {
if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
# Use the current code_sign_identity
echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'"
if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
code_sign_cmd="$code_sign_cmd &"
fi
echo "$code_sign_cmd"
eval "$code_sign_cmd"
fi
}
# Strip invalid architectures
strip_invalid_archs() {
binary="$1"
# Get architectures for current target binary
binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)"
# Intersect them with the architectures we are building for
intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)"
# If there are no archs supported by this binary then warn the user
if [[ -z "$intersected_archs" ]]; then
echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)."
STRIP_BINARY_RETVAL=0
return
fi
stripped=""
for arch in $binary_archs; do
if ! [[ "${ARCHS}" == *"$arch"* ]]; then
# Strip non-valid architectures in-place
lipo -remove "$arch" -output "$binary" "$binary"
stripped="$stripped $arch"
fi
done
if [[ "$stripped" ]]; then
echo "Stripped $binary of architectures:$stripped"
fi
STRIP_BINARY_RETVAL=1
}
if [[ "$CONFIGURATION" == "Debug" ]]; then
install_framework "${BUILT_PRODUCTS_DIR}/StickyHeaderFlowLayout/StickyHeaderFlowLayout.framework"
fi
if [[ "$CONFIGURATION" == "Release" ]]; then
install_framework "${BUILT_PRODUCTS_DIR}/StickyHeaderFlowLayout/StickyHeaderFlowLayout.framework"
fi
if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
wait
fi
================================================
FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h
================================================
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif
FOUNDATION_EXPORT double Pods_ExampleVersionNumber;
FOUNDATION_EXPORT const unsigned char Pods_ExampleVersionString[];
================================================
FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig
================================================
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StickyHeaderFlowLayout"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StickyHeaderFlowLayout/StickyHeaderFlowLayout.framework/Headers"
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_LDFLAGS = $(inherited) -framework "StickyHeaderFlowLayout" -framework "UIKit"
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods
================================================
FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap
================================================
framework module Pods_Example {
umbrella header "Pods-Example-umbrella.h"
export *
module * { export * }
}
================================================
FILE: Example/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig
================================================
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StickyHeaderFlowLayout"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StickyHeaderFlowLayout/StickyHeaderFlowLayout.framework/Headers"
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_LDFLAGS = $(inherited) -framework "StickyHeaderFlowLayout" -framework "UIKit"
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods
================================================
FILE: Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>0.9.4</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${CURRENT_PROJECT_VERSION}</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>
================================================
FILE: Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-dummy.m
================================================
#import <Foundation/Foundation.h>
@interface PodsDummy_StickyHeaderFlowLayout : NSObject
@end
@implementation PodsDummy_StickyHeaderFlowLayout
@end
================================================
FILE: Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-prefix.pch
================================================
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif
================================================
FILE: Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-umbrella.h
================================================
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif
FOUNDATION_EXPORT double StickyHeaderFlowLayoutVersionNumber;
FOUNDATION_EXPORT const unsigned char StickyHeaderFlowLayoutVersionString[];
================================================
FILE: Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout.modulemap
================================================
framework module StickyHeaderFlowLayout {
umbrella header "StickyHeaderFlowLayout-umbrella.h"
export *
module * { export * }
}
================================================
FILE: Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout.xcconfig
================================================
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/StickyHeaderFlowLayout
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
OTHER_LDFLAGS = $(inherited) -framework "UIKit"
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PODS_TARGET_SRCROOT = ${PODS_ROOT}/../..
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES
================================================
FILE: Example/StickyHeaderFlowLayout/AppDelegate.swift
================================================
//
// Created by Tsimur Bernikovich on 12/6/18.
// Copyright © 2018 Tsimur Bernikovich. All rights reserved.
//
import UIKit
import StickyHeaderFlowLayout
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let stickyHeaderFlowLayout = StickyHeaderFlowLayout()
let collectionViewController = CollectionViewController(collectionViewLayout: stickyHeaderFlowLayout)
let window = UIWindow(frame: UIScreen.main.bounds)
window.rootViewController = collectionViewController
window.makeKeyAndVisible()
self.window = window
return true
}
}
================================================
FILE: Example/StickyHeaderFlowLayout/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "83.5x83.5",
"scale" : "2x"
},
{
"idiom" : "ios-marketing",
"size" : "1024x1024",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Example/StickyHeaderFlowLayout/Assets.xcassets/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Example/StickyHeaderFlowLayout/Assets.xcassets/success-baby.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "success-baby.png"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Example/StickyHeaderFlowLayout/CollectionParallaxHeader.swift
================================================
//
// Created by Tsimur Bernikovich on 12/6/18.
// Copyright © 2018 Tsimur Bernikovich. All rights reserved.
//
import UIKit
class CollectionParallaxHeader: UICollectionReusableView {
private var imageView : UIImageView?
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = .lightGray
self.clipsToBounds = true
let bounds = CGRect(x: 0, y: 0, width: frame.maxX, height: frame.maxY)
let imageView = UIImageView(frame: bounds)
imageView.contentMode = .scaleAspectFill
imageView.image = UIImage(named: "success-baby")
self.imageView = imageView
self.addSubview(imageView)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func layoutSubviews() {
super.layoutSubviews()
self.imageView?.frame = self.bounds
}
}
================================================
FILE: Example/StickyHeaderFlowLayout/CollectionViewCell.swift
================================================
//
// Created by Tsimur Bernikovich on 12/6/18.
// Copyright © 2018 Tsimur Bernikovich. All rights reserved.
//
import UIKit
class CollectionViewCell: UICollectionViewCell {
var text : String? {
didSet {
self.reloadData()
}
}
private var textLabel : UILabel?
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = .white
let bounds = CGRect(x: 0, y: 0, width: frame.maxX, height: frame.maxY)
let label = UILabel(frame: bounds)
label.autoresizingMask = [.flexibleHeight, .flexibleWidth]
self.textLabel = label
self.addSubview(label)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func reloadData() {
self.textLabel?.text = self.text
}
override func layoutSubviews() {
super.layoutSubviews()
self.textLabel?.frame = self.bounds
}
}
================================================
FILE: Example/StickyHeaderFlowLayout/CollectionViewController.swift
================================================
//
// Created by Tsimur Bernikovich on 12/6/18.
// Copyright © 2018 Tsimur Bernikovich. All rights reserved.
//
import UIKit
import StickyHeaderFlowLayout
class CollectionViewController: UICollectionViewController {
var items : [String] = ["StickyHeaderFlowLayout basic example", "Example to initialize in code", "Please Enjoy"]
private var layout : StickyHeaderFlowLayout? {
return collectionView?.collectionViewLayout as? StickyHeaderFlowLayout
}
override func viewDidLoad() {
super.viewDidLoad()
collectionView?.alwaysBounceVertical = true
view.backgroundColor = .white
// Setup Cell.
collectionView?.register(CollectionViewCell.self, forCellWithReuseIdentifier: "cell")
layout?.itemSize = CGSize(width: view.frame.size.width, height: 44)
// Setup Header.
collectionView?.register(CollectionParallaxHeader.self, forSupplementaryViewOfKind: StickyHeaderFlowLayout.parallaxHeaderIdentifier, withReuseIdentifier: "parallaxHeader")
layout?.parallaxHeaderReferenceSize = CGSize(width: self.view.frame.size.width, height: 200)
layout?.parallaxHeaderMinimumReferenceSize = CGSize(width: self.view.frame.size.width, height: 160)
// Setup Section Header.
collectionView?.register(CollectionViewSectionHeader.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "sectionHeader")
layout?.headerReferenceSize = CGSize(width: view.frame.size.width, height: 40)
}
// Cells.
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.items.count
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell
cell.text = self.items[indexPath.row]
return cell
}
// Parallax Header.
override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
if kind == StickyHeaderFlowLayout.parallaxHeaderIdentifier {
let view = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "parallaxHeader", for: indexPath)
return view
} else if kind == UICollectionView.elementKindSectionHeader {
let view = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "sectionHeader", for: indexPath)
view.backgroundColor = .lightGray
return view
}
return UICollectionReusableView()
}
}
================================================
FILE: Example/StickyHeaderFlowLayout/CollectionViewSectionHeader.swift
================================================
//
// Created by Tsimur Bernikovich on 12/6/18.
// Copyright © 2018 Tsimur Bernikovich. All rights reserved.
//
import UIKit
class CollectionViewSectionHeader: UICollectionReusableView {
let label = UILabel()
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
func commonInit() {
self.addSubview(label)
label.frame = self.bounds
label.text = UICollectionView.elementKindSectionHeader
}
}
================================================
FILE: Example/StickyHeaderFlowLayout/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
================================================
FILE: Example/StickyHeaderFlowLayout/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>
================================================
FILE: Example/StickyHeaderFlowLayout.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
1DF50A82E927EBA871BEE3A2 /* Pods_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 514C3341BE0F2FB319962E4C /* Pods_Example.framework */; };
967CE8A22270B799005F851A /* CollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967CE8972270B798005F851A /* CollectionViewController.swift */; };
967CE8A42270B799005F851A /* CollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967CE8992270B798005F851A /* CollectionViewCell.swift */; };
967CE8A52270B799005F851A /* CollectionViewSectionHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967CE89A2270B798005F851A /* CollectionViewSectionHeader.swift */; };
967CE8A62270B799005F851A /* CollectionParallaxHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967CE89B2270B798005F851A /* CollectionParallaxHeader.swift */; };
967CE8A92270B799005F851A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967CE89F2270B799005F851A /* AppDelegate.swift */; };
967CE8AA2270B799005F851A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 967CE8A02270B799005F851A /* Assets.xcassets */; };
96DA112A2270BC26003B77DC /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 96DA11292270BC26003B77DC /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
056025ED3BFCB320B751B192 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = "<group>"; };
1B364769CDC0DD15980521CF /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
514C3341BE0F2FB319962E4C /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; };
527832DE83E5F5843A269CB4 /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.release.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.release.xcconfig"; sourceTree = "<group>"; };
607FACD01AFB9204008FA782 /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; };
607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = "<group>"; };
967CE8972270B798005F851A /* CollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewController.swift; sourceTree = "<group>"; };
967CE8982270B798005F851A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
967CE8992270B798005F851A /* CollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewCell.swift; sourceTree = "<group>"; };
967CE89A2270B798005F851A /* CollectionViewSectionHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewSectionHeader.swift; sourceTree = "<group>"; };
967CE89B2270B798005F851A /* CollectionParallaxHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionParallaxHeader.swift; sourceTree = "<group>"; };
967CE89F2270B799005F851A /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
967CE8A02270B799005F851A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
96DA11292270BC26003B77DC /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
A00CD01A851EBED0B9482915 /* StickyHeaderFlowLayout.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = StickyHeaderFlowLayout.podspec; path = ../StickyHeaderFlowLayout.podspec; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
DB39E3C87DC2534CEE820EE1 /* Pods-StickyHeaderFlowLayout_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StickyHeaderFlowLayout_Tests.debug.xcconfig"; path = "Target Support Files/Pods-StickyHeaderFlowLayout_Tests/Pods-StickyHeaderFlowLayout_Tests.debug.xcconfig"; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
607FACCD1AFB9204008FA782 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
1DF50A82E927EBA871BEE3A2 /* Pods_Example.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
1920E13B220F9436402627E5 /* Frameworks */ = {
isa = PBXGroup;
children = (
514C3341BE0F2FB319962E4C /* Pods_Example.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
607FACC71AFB9204008FA782 = {
isa = PBXGroup;
children = (
607FACF51AFB993E008FA782 /* Podspec Metadata */,
607FACD21AFB9204008FA782 /* Example */,
607FACE81AFB9204008FA782 /* Tests */,
607FACD11AFB9204008FA782 /* Products */,
66E40A9ED0C4CAE6427DA592 /* Pods */,
1920E13B220F9436402627E5 /* Frameworks */,
);
sourceTree = "<group>";
};
607FACD11AFB9204008FA782 /* Products */ = {
isa = PBXGroup;
children = (
607FACD01AFB9204008FA782 /* Example.app */,
);
name = Products;
sourceTree = "<group>";
};
607FACD21AFB9204008FA782 /* Example */ = {
isa = PBXGroup;
children = (
967CE89F2270B799005F851A /* AppDelegate.swift */,
967CE8A02270B799005F851A /* Assets.xcassets */,
967CE89B2270B798005F851A /* CollectionParallaxHeader.swift */,
967CE8992270B798005F851A /* CollectionViewCell.swift */,
967CE8972270B798005F851A /* CollectionViewController.swift */,
967CE89A2270B798005F851A /* CollectionViewSectionHeader.swift */,
96DA11292270BC26003B77DC /* LaunchScreen.storyboard */,
967CE8982270B798005F851A /* Info.plist */,
);
name = Example;
path = StickyHeaderFlowLayout;
sourceTree = "<group>";
};
607FACE81AFB9204008FA782 /* Tests */ = {
isa = PBXGroup;
children = (
607FACEB1AFB9204008FA782 /* Tests.swift */,
607FACE91AFB9204008FA782 /* Supporting Files */,
);
path = Tests;
sourceTree = "<group>";
};
607FACE91AFB9204008FA782 /* Supporting Files */ = {
isa = PBXGroup;
children = (
607FACEA1AFB9204008FA782 /* Info.plist */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
607FACF51AFB993E008FA782 /* Podspec Metadata */ = {
isa = PBXGroup;
children = (
A00CD01A851EBED0B9482915 /* StickyHeaderFlowLayout.podspec */,
1B364769CDC0DD15980521CF /* README.md */,
056025ED3BFCB320B751B192 /* LICENSE */,
);
name = "Podspec Metadata";
sourceTree = "<group>";
};
66E40A9ED0C4CAE6427DA592 /* Pods */ = {
isa = PBXGroup;
children = (
27976B1CDD09415C9AB6AE4F /* Pods-StickyHeaderFlowLayout_Example.debug.xcconfig */,
EACC21754180AA58C578D590 /* Pods-StickyHeaderFlowLayout_Example.release.xcconfig */,
DB39E3C87DC2534CEE820EE1 /* Pods-StickyHeaderFlowLayout_Tests.debug.xcconfig */,
EF9CF16FB3025C88380AFE48 /* Pods-StickyHeaderFlowLayout_Tests.release.xcconfig */,
DDBA37BF865EF3B64D1AB8BE /* Pods-Example.debug.xcconfig */,
527832DE83E5F5843A269CB4 /* Pods-Example.release.xcconfig */,
24E13AA71E2BF397464604DC /* Pods-Tests.debug.xcconfig */,
FB177CF1351843140B33325E /* Pods-Tests.release.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
607FACCF1AFB9204008FA782 /* Example */ = {
isa = PBXNativeTarget;
buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Example" */;
buildPhases = (
DD959C1DB21E05A87C22353D /* [CP] Check Pods Manifest.lock */,
607FACCC1AFB9204008FA782 /* Sources */,
607FACCD1AFB9204008FA782 /* Frameworks */,
607FACCE1AFB9204008FA782 /* Resources */,
33B0495725065F5ADB199F6C /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = Example;
productName = StickyHeaderFlowLayout;
productReference = 607FACD01AFB9204008FA782 /* Example.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
607FACC81AFB9204008FA782 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0830;
LastUpgradeCheck = 1020;
ORGANIZATIONNAME = CocoaPods;
TargetAttributes = {
607FACCF1AFB9204008FA782 = {
CreatedOnToolsVersion = 6.3.1;
DevelopmentTeam = PV29U2ZFSB;
LastSwiftMigration = 1020;
};
};
};
buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "StickyHeaderFlowLayout" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 607FACC71AFB9204008FA782;
productRefGroup = 607FACD11AFB9204008FA782 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
607FACCF1AFB9204008FA782 /* Example */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
607FACCE1AFB9204008FA782 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
967CE8AA2270B799005F851A /* Assets.xcassets in Resources */,
96DA112A2270BC26003B77DC /* LaunchScreen.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
33B0495725065F5ADB199F6C /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh",
"${BUILT_PRODUCTS_DIR}/StickyHeaderFlowLayout/StickyHeaderFlowLayout.framework",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/StickyHeaderFlowLayout.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
DD959C1DB21E05A87C22353D /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Example-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
607FACCC1AFB9204008FA782 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
967CE8A42270B799005F851A /* CollectionViewCell.swift in Sources */,
967CE8A22270B799005F851A /* CollectionViewController.swift in Sources */,
967CE8A52270B799005F851A /* CollectionViewSectionHeader.swift in Sources */,
967CE8A92270B799005F851A /* AppDelegate.swift in Sources */,
967CE8A62270B799005F851A /* CollectionParallaxHeader.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
607FACED1AFB9204008FA782 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
};
name = Debug;
};
607FACEE1AFB9204008FA782 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 5.0;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
607FACF01AFB9204008FA782 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = DDBA37BF865EF3B64D1AB8BE /* Pods-Example.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
DEVELOPMENT_TEAM = PV29U2ZFSB;
INFOPLIST_FILE = StickyHeaderFlowLayout/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MODULE_NAME = ExampleApp;
PRODUCT_BUNDLE_IDENTIFIER = bernikovich.StickyHeaderFlowLayout;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
};
name = Debug;
};
607FACF11AFB9204008FA782 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 527832DE83E5F5843A269CB4 /* Pods-Example.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
DEVELOPMENT_TEAM = PV29U2ZFSB;
INFOPLIST_FILE = StickyHeaderFlowLayout/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MODULE_NAME = ExampleApp;
PRODUCT_BUNDLE_IDENTIFIER = bernikovich.StickyHeaderFlowLayout;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "StickyHeaderFlowLayout" */ = {
isa = XCConfigurationList;
buildConfigurations = (
607FACED1AFB9204008FA782 /* Debug */,
607FACEE1AFB9204008FA782 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Example" */ = {
isa = XCConfigurationList;
buildConfigurations = (
607FACF01AFB9204008FA782 /* Debug */,
607FACF11AFB9204008FA782 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 607FACC81AFB9204008FA782 /* Project object */;
}
================================================
FILE: Example/StickyHeaderFlowLayout.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:StickyHeaderFlowLayout.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: Example/StickyHeaderFlowLayout.xcodeproj/xcshareddata/xcschemes/Example.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1020"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "607FACCF1AFB9204008FA782"
BuildableName = "Example.app"
BlueprintName = "Example"
ReferencedContainer = "container:StickyHeaderFlowLayout.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "NO"
buildForArchiving = "NO"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "607FACE41AFB9204008FA782"
BuildableName = "Tests.xctest"
BlueprintName = "Tests"
ReferencedContainer = "container:StickyHeaderFlowLayout.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "607FACE41AFB9204008FA782"
BuildableName = "Tests.xctest"
BlueprintName = "Tests"
ReferencedContainer = "container:StickyHeaderFlowLayout.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "607FACCF1AFB9204008FA782"
BuildableName = "Example.app"
BlueprintName = "Example"
ReferencedContainer = "container:StickyHeaderFlowLayout.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "607FACCF1AFB9204008FA782"
BuildableName = "Example.app"
BlueprintName = "Example"
ReferencedContainer = "container:StickyHeaderFlowLayout.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "607FACCF1AFB9204008FA782"
BuildableName = "Example.app"
BlueprintName = "Example"
ReferencedContainer = "container:StickyHeaderFlowLayout.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: Example/StickyHeaderFlowLayout.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:StickyHeaderFlowLayout.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: Example/StickyHeaderFlowLayout.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2018 Timur Bernikowich
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
<p align="center">
<img src="/Resources/logo.svg" alt="StickyHeaderFlowLayout" width="105">
<br/>
<h3 align="center">StickyHeaderFlowLayout</h2>
<p align="center">Sticky headers for UICollectionView written in pure Swift</p>
<h1></h1>
<br/>
</p>
Based on [CSStickyHeaderFlowLayout](https://github.com/CSStickyHeaderFlowLayout/CSStickyHeaderFlowLayout). `StickyHeaderFlowLayout` makes it easy to create sticky headers in `UICollectionView`.
## Integration
#### CocoaPods
You can use [CocoaPods](http://cocoapods.org/) to install `StickyHeaderFlowLayout` by adding it to your `Podfile`:
```ruby
platform :ios, '9.0'
target 'MyApp' do
pod 'StickyHeaderFlowLayout'
end
```
#### Manually
To use this library in your project manually you may:
Just drag `StickyHeaderFlowLayout.swift` and `StickyHeaderFlowLayoutAttributes.swift` to the project tree
## Usage
#### Sample project
Repository contains small sample project which shows basic integration.
#### Basic idea
1. Create layout and collection view
```swift
let layout = StickyHeaderFlowLayout()
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
```
2. Setup sticky header
```swift
collectionView.register(CollectionParallaxHeader.self, forSupplementaryViewOfKind: StickyHeaderFlowLayout.parallaxHeaderIdentifier, withReuseIdentifier: "parallaxHeader")
layout.parallaxHeaderReferenceSize = CGSize(width: view.frame.size.width, height: 200)
layout.parallaxHeaderMinimumReferenceSize = CGSize(width: view.frame.size.width, height: 160)
```
3. Return correct view in `viewForSupplementaryElementOfKind` function
```swift
override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
if kind == StickyHeaderFlowLayout.parallaxHeaderIdentifier {
return collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "parallaxHeader", for: indexPath)
}
// Other views.
...
}
```
## License
`StickyHeaderFlowLayout` is released under the MIT license. See `LICENSE` for details.
================================================
FILE: StickyHeaderFlowLayout/Assets/.gitkeep
================================================
================================================
FILE: StickyHeaderFlowLayout/Classes/.gitkeep
================================================
================================================
FILE: StickyHeaderFlowLayout/Classes/StickyHeaderFlowLayout.swift
================================================
//
// Created by Tsimur Bernikovich on 12/6/18.
// Copyright © 2018 Tsimur Bernikovich. All rights reserved.
//
import UIKit
open class StickyHeaderFlowLayout: UICollectionViewFlowLayout {
open class var parallaxHeaderIdentifier: String {
return "StickyHeaderParallexHeader"
}
private static let headerZIndex = 1024
open var parallaxHeaderReferenceSize: CGSize = .zero
open var parallaxHeaderMinimumReferenceSize: CGSize = .zero {
didSet {
invalidateLayout()
}
}
open var parallaxHeaderAlwaysOnTop = false
open var disableStickyHeaders = false
open var disableStretching = false
open override func prepare() {
super.prepare()
}
open override func initialLayoutAttributesForAppearingSupplementaryElement(ofKind elementKind: String, at elementIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
let attributes = super.initialLayoutAttributesForAppearingSupplementaryElement(ofKind: elementKind, at: elementIndexPath)
if elementKind == type(of: self).parallaxHeaderIdentifier {
// Sticky header do not need to offset.
return nil
} else {
if var frame = attributes?.frame {
frame.origin.y = parallaxHeaderReferenceSize.height
attributes?.frame = frame
}
}
return attributes
}
open override func finalLayoutAttributesForDisappearingSupplementaryElement(ofKind elementKind: String, at elementIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
if elementKind == type(of: self).parallaxHeaderIdentifier {
let attribute = layoutAttributesForSupplementaryView(ofKind: elementKind, at: elementIndexPath)
if let attribute = attribute as? StickyHeaderFlowLayoutAttributes {
updateParallaxHeaderAttribute(attribute)
}
return attribute
} else {
super.finalLayoutAttributesForDisappearingSupplementaryElement(ofKind: elementKind, at: elementIndexPath)
}
return nil
}
open override func layoutAttributesForSupplementaryView(ofKind elementKind: String, at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
var attrubutes = super.layoutAttributesForSupplementaryView(ofKind: elementKind, at: indexPath)
if attrubutes == nil && elementKind == type(of: self).parallaxHeaderIdentifier {
attrubutes = StickyHeaderFlowLayoutAttributes(forSupplementaryViewOfKind: elementKind, with: indexPath)
}
return attrubutes
}
open override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
guard collectionView?.dataSource != nil else {
return nil
}
// The rect should compensate the header size
var adjustedRect = rect
adjustedRect.origin.y -= self.parallaxHeaderReferenceSize.height
var allItems: [UICollectionViewLayoutAttributes] = []
// Perform a deep copy of the attributes returned from super.
if let originalAttributes = super.layoutAttributesForElements(in: adjustedRect) {
allItems = originalAttributes.compactMap {
$0.copy() as? UICollectionViewLayoutAttributes
}
}
var headers: [Int: UICollectionViewLayoutAttributes] = [:]
var lastCells: [Int: UICollectionViewLayoutAttributes] = [:]
var visibleParallaxHeader = false
for item in allItems {
let attributes = item
var frame = attributes.frame
frame.origin.y += parallaxHeaderReferenceSize.height
attributes.frame = frame
let indexPath = attributes.indexPath
let isHeader = attributes.representedElementKind == UICollectionView.elementKindSectionHeader
let isFooter = attributes.representedElementKind == UICollectionView.elementKindSectionFooter
if isHeader {
headers[indexPath.section] = attributes
} else if isFooter {
// Not implemeneted.
} else {
// Get the bottom most cell of that section.
if let currentAttribute = lastCells[indexPath.section] {
if indexPath.row > currentAttribute.indexPath.row {
lastCells[indexPath.section] = attributes
}
} else {
lastCells[indexPath.section] = attributes
}
if indexPath.item == 0 && indexPath.section == 0 {
visibleParallaxHeader = true
}
}
if isHeader {
attributes.zIndex = type(of: self).headerZIndex
} else {
// For iOS 7.0, the cell zIndex should be above sticky section header.
attributes.zIndex = 1
}
}
if rect.minY <= 0 {
visibleParallaxHeader = true
}
if parallaxHeaderAlwaysOnTop {
visibleParallaxHeader = true
}
// Create the attributes for the Parallex header.
if visibleParallaxHeader && parallaxHeaderReferenceSize != .zero {
let currentAttribute = StickyHeaderFlowLayoutAttributes(forSupplementaryViewOfKind: type(of: self).parallaxHeaderIdentifier, with: IndexPath(index: 0))
updateParallaxHeaderAttribute(currentAttribute)
allItems.append(currentAttribute)
}
if !disableStickyHeaders {
lastCells.forEach {
let indexPath = $0.value.indexPath
let indexPathKey = indexPath.section
if let header = headers[indexPathKey] {
if header.frame.size != .zero {
updateHeaderAttributes(header, lastCellAttributes: $0.value)
}
} else if let header = layoutAttributesForSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, at: IndexPath(item: 0, section: indexPath.section)) {
if header.frame.size != .zero {
allItems.append(header)
}
}
}
}
return allItems
}
open override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
let attributes = super.layoutAttributesForItem(at: indexPath)?.copy() as? UICollectionViewLayoutAttributes
if var frame = attributes?.frame {
frame.origin.y += parallaxHeaderReferenceSize.height
attributes?.frame = frame
}
return attributes
}
open override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
return true
}
open override class var layoutAttributesClass: AnyClass {
return StickyHeaderFlowLayoutAttributes.self
}
private func updateHeaderAttributes(_ attributes: UICollectionViewLayoutAttributes, lastCellAttributes: UICollectionViewLayoutAttributes) {
guard let collectionView = collectionView else {
return
}
let currentBounds = collectionView.bounds
attributes.zIndex = type(of: self).headerZIndex
attributes.isHidden = false
var origin = attributes.frame.origin
let sectionMaxY = lastCellAttributes.frame.maxY - attributes.frame.size.height
var y = currentBounds.maxY - currentBounds.size.height + collectionView.contentInset.top
if parallaxHeaderAlwaysOnTop {
y += parallaxHeaderMinimumReferenceSize.height
}
origin.y = min(max(y, attributes.frame.origin.y), sectionMaxY)
attributes.frame = CGRect(origin: origin, size: attributes.frame.size)
}
private func updateParallaxHeaderAttribute(_ currentAttribute: StickyHeaderFlowLayoutAttributes) {
guard let collectionView = collectionView else {
return
}
var frame = currentAttribute.frame
frame.size = parallaxHeaderReferenceSize
let bounds = collectionView.bounds
let maxY = frame.maxY
// Make sure the frame won't be negative values.
var y = min(maxY - parallaxHeaderMinimumReferenceSize.height, bounds.origin.y + collectionView.contentInset.top)
let height = max(0, -y + maxY)
let maxHeight = parallaxHeaderReferenceSize.height
let minHeight = parallaxHeaderMinimumReferenceSize.height
let progressiveness = (height - minHeight) / (maxHeight - minHeight)
currentAttribute.progressiveness = progressiveness
// If zIndex < 0 would prevents tap from recognized right under navigation bar.
currentAttribute.zIndex = 0
// When parallaxHeaderAlwaysOnTop is enabled, we will check when we should update the y position.
if parallaxHeaderAlwaysOnTop && height <= parallaxHeaderMinimumReferenceSize.height {
let insetTop = collectionView.contentInset.top
// Always stick to top but under the nav bar.
y = collectionView.contentOffset.y + insetTop
currentAttribute.zIndex = 2000
}
let normalizedHeight = disableStretching && height > maxHeight ? maxHeight : height
currentAttribute.frame = CGRect(x: frame.origin.x, y: y, width: frame.size.width, height: normalizedHeight)
}
}
extension StickyHeaderFlowLayoutAttributes {
override internal var debugDescription: String {
let indexPathString = "\(indexPath.section) \(indexPath.item)"
return "<StickyHeaderFlowLayoutAttributes: \(self)> indexPath: \(indexPathString) zIndex: \(zIndex) valid: \(isValid) kind: \(representedElementKind ?? "cell")"
}
fileprivate var isValid: Bool {
switch representedElementCategory {
case .cell:
if zIndex != 1 {
return false
}
return true
case .supplementaryView:
if representedElementKind == StickyHeaderFlowLayout.parallaxHeaderIdentifier {
return true
} else if zIndex < 1024 {
return false
}
return true
default:
return true
}
}
}
private extension StickyHeaderFlowLayout {
func debugLayoutAttributes(_ layoutAttributes: [StickyHeaderFlowLayoutAttributes]) {
var hasInvalid = false
layoutAttributes.forEach {
if !$0.isValid {
hasInvalid = true
}
}
if hasInvalid {
print("StickyHeaderFlowLayout: \(layoutAttributes)")
}
}
}
================================================
FILE: StickyHeaderFlowLayout/Classes/StickyHeaderFlowLayoutAttributes.swift
================================================
//
// Created by Tsimur Bernikovich on 12/6/18.
// Copyright © 2018 Tsimur Bernikovich. All rights reserved.
//
import UIKit
class StickyHeaderFlowLayoutAttributes: UICollectionViewLayoutAttributes {
var progressiveness: CGFloat = 0
override func copy(with zone: NSZone? = nil) -> Any {
let copy = super.copy(with: zone)
if let copy = copy as? StickyHeaderFlowLayoutAttributes {
copy.progressiveness = progressiveness
}
return copy
}
override var zIndex: Int {
didSet {
// Fixes: Section header go behind cell when insert via performBatchUpdates #68
// https://github.com/jamztang/CSStickyHeaderFlowLayout/issues/68#issuecomment-108678022
// Reference: UICollectionView setLayout:animated: not preserving zIndex
// http://stackoverflow.com/questions/12659301/uicollectionview-setlayoutanimated-not-preserving-zindex
// originally our solution is to translate the section header above the original z position,
// however, scroll indicator will be covered by those cells and section header if z position is >= 1
// so instead we translate the original cell to be -1, and make sure the cell are hit test proven.
transform3D = CATransform3DMakeTranslation(0, 0, zIndex == 1 ? -1 : 0);
}
}
}
================================================
FILE: StickyHeaderFlowLayout.podspec
================================================
Pod::Spec.new do |spec|
spec.name = "StickyHeaderFlowLayout"
spec.version = "0.9.4"
spec.summary = "Sticky headers for UICollectionView written in pure Swift (based on CSStickyHeaderFlowLayout)"
spec.homepage = "https://github.com/bernikovich/StickyHeaderFlowLayout"
spec.license = { :type => "MIT", :file => "LICENSE" }
spec.author = { "Timur Bernikovich" => "bernikowich@icloud.com" }
spec.platform = :ios, "9.0"
spec.swift_version = "5.0"
spec.framework = "UIKit"
spec.source = { :git => "https://github.com/bernikovich/StickyHeaderFlowLayout.git", :tag => spec.version.to_s }
spec.source_files = "StickyHeaderFlowLayout/Classes/**/*.swift"
spec.module_name = "StickyHeaderFlowLayout"
end
gitextract_0otwtvwj/ ├── .gitignore ├── Example/ │ ├── Base.lproj/ │ │ └── LaunchScreen.storyboard │ ├── Podfile │ ├── Pods/ │ │ ├── Local Podspecs/ │ │ │ └── StickyHeaderFlowLayout.podspec.json │ │ ├── Pods.xcodeproj/ │ │ │ └── project.pbxproj │ │ └── Target Support Files/ │ │ ├── Pods-Example/ │ │ │ ├── Pods-Example-Info.plist │ │ │ ├── Pods-Example-acknowledgements.markdown │ │ │ ├── Pods-Example-acknowledgements.plist │ │ │ ├── Pods-Example-dummy.m │ │ │ ├── Pods-Example-frameworks.sh │ │ │ ├── Pods-Example-umbrella.h │ │ │ ├── Pods-Example.debug.xcconfig │ │ │ ├── Pods-Example.modulemap │ │ │ └── Pods-Example.release.xcconfig │ │ └── StickyHeaderFlowLayout/ │ │ ├── StickyHeaderFlowLayout-Info.plist │ │ ├── StickyHeaderFlowLayout-dummy.m │ │ ├── StickyHeaderFlowLayout-prefix.pch │ │ ├── StickyHeaderFlowLayout-umbrella.h │ │ ├── StickyHeaderFlowLayout.modulemap │ │ └── StickyHeaderFlowLayout.xcconfig │ ├── StickyHeaderFlowLayout/ │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets/ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ └── success-baby.imageset/ │ │ │ └── Contents.json │ │ ├── CollectionParallaxHeader.swift │ │ ├── CollectionViewCell.swift │ │ ├── CollectionViewController.swift │ │ ├── CollectionViewSectionHeader.swift │ │ ├── Info.plist │ │ └── LaunchScreen.storyboard │ ├── StickyHeaderFlowLayout.xcodeproj/ │ │ ├── project.pbxproj │ │ ├── project.xcworkspace/ │ │ │ └── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ └── xcschemes/ │ │ └── Example.xcscheme │ └── StickyHeaderFlowLayout.xcworkspace/ │ ├── contents.xcworkspacedata │ └── xcshareddata/ │ └── IDEWorkspaceChecks.plist ├── LICENSE ├── README.md ├── Resources/ │ └── design.sketch ├── StickyHeaderFlowLayout/ │ ├── Assets/ │ │ └── .gitkeep │ └── Classes/ │ ├── .gitkeep │ ├── StickyHeaderFlowLayout.swift │ └── StickyHeaderFlowLayoutAttributes.swift └── StickyHeaderFlowLayout.podspec
Condensed preview — 43 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (113K chars).
[
{
"path": ".gitignore",
"chars": 1888,
"preview": "# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n"
},
{
"path": "Example/Base.lproj/LaunchScreen.storyboard",
"chars": 1658,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "Example/Podfile",
"chars": 109,
"preview": "platform :ios, '9.0'\nuse_frameworks!\n\ntarget 'Example' do\n pod 'StickyHeaderFlowLayout', :path => '../'\nend\n"
},
{
"path": "Example/Pods/Local Podspecs/StickyHeaderFlowLayout.podspec.json",
"chars": 680,
"preview": "{\n \"name\": \"StickyHeaderFlowLayout\",\n \"version\": \"0.9.4\",\n \"summary\": \"Sticky headers for UICollectionView written in"
},
{
"path": "Example/Pods/Pods.xcodeproj/project.pbxproj",
"chars": 29017,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Example/Pods/Target Support Files/Pods-Example/Pods-Example-Info.plist",
"chars": 828,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown",
"chars": 1236,
"preview": "# Acknowledgements\nThis application makes use of the following third party libraries:\n\n## StickyHeaderFlowLayout\n\nMIT Li"
},
{
"path": "Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist",
"chars": 2109,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Example/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m",
"chars": 128,
"preview": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_Example : NSObject\n@end\n@implementation PodsDummy_Pods_Examp"
},
{
"path": "Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks.sh",
"chars": 7926,
"preview": "#!/bin/sh\nset -e\nset -u\nset -o pipefail\n\nfunction on_error {\n echo \"$(realpath -mq \"${0}\"):$1: error: Unexpected failur"
},
{
"path": "Example/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h",
"chars": 316,
"preview": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPO"
},
{
"path": "Example/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig",
"chars": 740,
"preview": "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/Stick"
},
{
"path": "Example/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap",
"chars": 114,
"preview": "framework module Pods_Example {\n umbrella header \"Pods-Example-umbrella.h\"\n\n export *\n module * { export * }\n}\n"
},
{
"path": "Example/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig",
"chars": 740,
"preview": "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/Stick"
},
{
"path": "Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-Info.plist",
"chars": 828,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-dummy.m",
"chars": 148,
"preview": "#import <Foundation/Foundation.h>\n@interface PodsDummy_StickyHeaderFlowLayout : NSObject\n@end\n@implementation PodsDummy_"
},
{
"path": "Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-prefix.pch",
"chars": 195,
"preview": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPO"
},
{
"path": "Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout-umbrella.h",
"chars": 336,
"preview": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPO"
},
{
"path": "Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout.modulemap",
"chars": 134,
"preview": "framework module StickyHeaderFlowLayout {\n umbrella header \"StickyHeaderFlowLayout-umbrella.h\"\n\n export *\n module * {"
},
{
"path": "Example/Pods/Target Support Files/StickyHeaderFlowLayout/StickyHeaderFlowLayout.xcconfig",
"chars": 512,
"preview": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/StickyHeaderFlowLayout\nGCC_PREPROCESSOR_DEFINITIONS = $(inheri"
},
{
"path": "Example/StickyHeaderFlowLayout/AppDelegate.swift",
"chars": 823,
"preview": "//\n// Created by Tsimur Bernikovich on 12/6/18.\n// Copyright © 2018 Tsimur Bernikovich. All rights reserved.\n//\n\nimpor"
},
{
"path": "Example/StickyHeaderFlowLayout/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1590,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"iphone\",\n \"size\" : \"20x20\",\n \"scale\" : \"2x\"\n },\n {\n \"idiom\""
},
{
"path": "Example/StickyHeaderFlowLayout/Assets.xcassets/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "Example/StickyHeaderFlowLayout/Assets.xcassets/success-baby.imageset/Contents.json",
"chars": 161,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"success-baby.png\"\n }\n ],\n \"info\" : {\n \"v"
},
{
"path": "Example/StickyHeaderFlowLayout/CollectionParallaxHeader.swift",
"chars": 928,
"preview": "//\n// Created by Tsimur Bernikovich on 12/6/18.\n// Copyright © 2018 Tsimur Bernikovich. All rights reserved.\n//\n\nimpor"
},
{
"path": "Example/StickyHeaderFlowLayout/CollectionViewCell.swift",
"chars": 994,
"preview": "//\n// Created by Tsimur Bernikovich on 12/6/18.\n// Copyright © 2018 Tsimur Bernikovich. All rights reserved.\n//\n\nimpor"
},
{
"path": "Example/StickyHeaderFlowLayout/CollectionViewController.swift",
"chars": 2869,
"preview": "//\n// Created by Tsimur Bernikovich on 12/6/18.\n// Copyright © 2018 Tsimur Bernikovich. All rights reserved.\n//\n\nimpor"
},
{
"path": "Example/StickyHeaderFlowLayout/CollectionViewSectionHeader.swift",
"chars": 601,
"preview": "//\n// Created by Tsimur Bernikovich on 12/6/18.\n// Copyright © 2018 Tsimur Bernikovich. All rights reserved.\n//\n\nimpor"
},
{
"path": "Example/StickyHeaderFlowLayout/Info.plist",
"chars": 1407,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Example/StickyHeaderFlowLayout/LaunchScreen.storyboard",
"chars": 1658,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "Example/StickyHeaderFlowLayout.xcodeproj/project.pbxproj",
"chars": 21050,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Example/StickyHeaderFlowLayout.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 167,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:StickyHeaderFlo"
},
{
"path": "Example/StickyHeaderFlowLayout.xcodeproj/xcshareddata/xcschemes/Example.xcscheme",
"chars": 4380,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1020\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "Example/StickyHeaderFlowLayout.xcworkspace/contents.xcworkspacedata",
"chars": 240,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:StickyHeaderFl"
},
{
"path": "Example/StickyHeaderFlowLayout.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "LICENSE",
"chars": 1074,
"preview": "MIT License\n\nCopyright (c) 2018 Timur Bernikowich\n\nPermission is hereby granted, free of charge, to any person obtaining"
},
{
"path": "README.md",
"chars": 2145,
"preview": "<p align=\"center\">\n\t<img src=\"/Resources/logo.svg\" alt=\"StickyHeaderFlowLayout\" width=\"105\">\n <br/>\n <h3 align=\"center"
},
{
"path": "StickyHeaderFlowLayout/Assets/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "StickyHeaderFlowLayout/Classes/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "StickyHeaderFlowLayout/Classes/StickyHeaderFlowLayout.swift",
"chars": 9795,
"preview": "//\n// Created by Tsimur Bernikovich on 12/6/18.\n// Copyright © 2018 Tsimur Bernikovich. All rights reserved.\n//\n\nimpor"
},
{
"path": "StickyHeaderFlowLayout/Classes/StickyHeaderFlowLayoutAttributes.swift",
"chars": 1298,
"preview": "//\n// Created by Tsimur Bernikovich on 12/6/18.\n// Copyright © 2018 Tsimur Bernikovich. All rights reserved.\n//\n\nimpor"
},
{
"path": "StickyHeaderFlowLayout.podspec",
"chars": 798,
"preview": "Pod::Spec.new do |spec|\n spec.name = \"StickyHeaderFlowLayout\"\n spec.version = \"0.9.4\"\n spec.summ"
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the bernikovich/StickyHeaderFlowLayout GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 43 files (99.5 KB), approximately 31.0k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.