├── .gitignore ├── .travis.yml ├── Example ├── Podfile ├── Podfile.lock ├── Pods │ ├── Local Podspecs │ │ └── SimpleExpandableView.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ └── project.pbxproj │ └── Target Support Files │ │ ├── Pods-SimpleExpandableView_Example │ │ ├── Pods-SimpleExpandableView_Example-Info.plist │ │ ├── Pods-SimpleExpandableView_Example-acknowledgements.markdown │ │ ├── Pods-SimpleExpandableView_Example-acknowledgements.plist │ │ ├── Pods-SimpleExpandableView_Example-dummy.m │ │ ├── Pods-SimpleExpandableView_Example-frameworks.sh │ │ ├── Pods-SimpleExpandableView_Example-umbrella.h │ │ ├── Pods-SimpleExpandableView_Example.debug.xcconfig │ │ ├── Pods-SimpleExpandableView_Example.modulemap │ │ └── Pods-SimpleExpandableView_Example.release.xcconfig │ │ └── SimpleExpandableView │ │ ├── SimpleExpandableView-Info.plist │ │ ├── SimpleExpandableView-dummy.m │ │ ├── SimpleExpandableView-prefix.pch │ │ ├── SimpleExpandableView-umbrella.h │ │ ├── SimpleExpandableView.debug.xcconfig │ │ ├── SimpleExpandableView.modulemap │ │ └── SimpleExpandableView.release.xcconfig ├── SimpleExpandableView.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── SimpleExpandableView-Example.xcscheme ├── SimpleExpandableView.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── SimpleExpandableView │ ├── Base.lproj │ └── Main.storyboard │ ├── ComponentExample.swift │ ├── ContentView.swift │ ├── ExampleApp.swift │ ├── GroupExample.swift │ ├── Info.plist │ └── SimpleExpandableView_Example-Bridging-Header.h ├── LICENSE ├── README-zh.md ├── README.md ├── SimpleExpandableView.podspec ├── SimpleExpandableView ├── Assets │ └── .gitkeep └── Classes │ ├── .gitkeep │ ├── ExpandableView.swift │ ├── ExpandableViewGroup.swift │ ├── HeaderView.swift │ └── Utilities.swift ├── _Pods.xcodeproj ├── demo.gif ├── pic-structure.png └── screenshot.png /.gitignore: -------------------------------------------------------------------------------- 1 | # macOS 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata/ 15 | *.xccheckout 16 | profile 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | 22 | # Bundler 23 | .bundle 24 | 25 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 26 | # Carthage/Checkouts 27 | 28 | Carthage/Build 29 | 30 | # We recommend against adding the Pods directory to your .gitignore. However 31 | # you should judge for yourself, the pros and cons are mentioned at: 32 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 33 | # 34 | # Note: if you ignore the Pods directory, make sure to uncomment 35 | # `pod install` in .travis.yml 36 | # 37 | # Pods/ 38 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # references: 2 | # * https://www.objc.io/issues/6-build-tools/travis-ci/ 3 | # * https://github.com/supermarin/xcpretty#usage 4 | 5 | osx_image: xcode7.3 6 | language: objective-c 7 | # cache: cocoapods 8 | # podfile: Example/Podfile 9 | # before_install: 10 | # - gem install cocoapods # Since Travis is not always on latest version 11 | # - pod install --project-directory=Example 12 | script: 13 | - set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/SimpleExpandableView.xcworkspace -scheme SimpleExpandableView-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty 14 | - pod lib lint 15 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | platform :ios, '15.0' 4 | 5 | target 'SimpleExpandableView_Example' do 6 | pod 'SimpleExpandableView', :path => '../' 7 | end 8 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SimpleExpandableView (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - SimpleExpandableView (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | SimpleExpandableView: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | SimpleExpandableView: 63a236435c9fda60baa961e76489ac8558a54468 13 | 14 | PODFILE CHECKSUM: 6eacbbd4e043ef00f9fa7c75795a681817a113bc 15 | 16 | COCOAPODS: 1.11.0 17 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/SimpleExpandableView.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "SimpleExpandableView", 3 | "version": "0.1.0", 4 | "summary": "`SimpleExpandableView` is a SwiftUI view which can collapse and expand the content", 5 | "description": "`SimpleExpandableView` is a SwiftUI view which can collapse the detail content and expand it when you want .\n You can easily change the appearance of the view as you want.\nThis view is concise and easy to modify", 6 | "homepage": "https://github.com/Tomortec/SimpleExpandableView", 7 | "screenshots": "./screenshot.png", 8 | "license": { 9 | "type": "MIT", 10 | "file": "LICENSE" 11 | }, 12 | "authors": { 13 | "Tomortec": "everything@tomortec.com" 14 | }, 15 | "source": { 16 | "git": "https://github.com/Tomortec/SimpleExpandableView.git", 17 | "tag": "0.1.0" 18 | }, 19 | "swift_versions": "5.6", 20 | "platforms": { 21 | "ios": "15.0" 22 | }, 23 | "source_files": "SimpleExpandableView/Classes/**/*", 24 | "swift_version": "5.6" 25 | } 26 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SimpleExpandableView (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - SimpleExpandableView (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | SimpleExpandableView: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | SimpleExpandableView: 63a236435c9fda60baa961e76489ac8558a54468 13 | 14 | PODFILE CHECKSUM: 6eacbbd4e043ef00f9fa7c75795a681817a113bc 15 | 16 | COCOAPODS: 1.11.0 17 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 085A023955B2C54BCE67E02E1130CB1B /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 185EB255CFB608F07A0DAF5C36B37832 /* Utilities.swift */; }; 11 | 10200BA1770665CA641E533261635CD0 /* SimpleExpandableView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 54D04548E9BD6F6D36A3CE9F2F27A523 /* SimpleExpandableView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12 | 1C723677AA49CD6ECD73C35B077A2A56 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; 13 | 49E6F88F788E128FC6A2689FBE53F43F /* ExpandableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF929BF05BC55B8E25C84A73334088B5 /* ExpandableView.swift */; }; 14 | 60846CFAD8BD744567FAC2A28E0EF2B4 /* Pods-SimpleExpandableView_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EFDF1C19BFCB4CE2BDE1DCF7CE859C22 /* Pods-SimpleExpandableView_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | ABE1B85C2AF524828A57F1B50A644BFF /* HeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8312A6912CD2C0D787FF418ACB831F8A /* HeaderView.swift */; }; 16 | B84B3FDECE62DE34F8C9ABCA9B9FFFD0 /* SimpleExpandableView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BDCB19A34F9C1BD3D0323EE74BD1693 /* SimpleExpandableView-dummy.m */; }; 17 | BAFE5F837098D3C5C23BE5E9F564C93C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; 18 | E3D0B6F5D72A6FBF269904426D6992A5 /* Pods-SimpleExpandableView_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 69EFC94D44BD793E96096BDD7DE9F3C7 /* Pods-SimpleExpandableView_Example-dummy.m */; }; 19 | EE88F7A0F5464E7A9CCF7E9A5144F3F2 /* ExpandableViewGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11F83BFCAFFDCCB9591EF3703DAA318A /* ExpandableViewGroup.swift */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXContainerItemProxy section */ 23 | 3007F8C8E12E02FC1F42EFC1638145FE /* PBXContainerItemProxy */ = { 24 | isa = PBXContainerItemProxy; 25 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 26 | proxyType = 1; 27 | remoteGlobalIDString = BBE03EBF860F4DF8DD7CA354E272434A; 28 | remoteInfo = SimpleExpandableView; 29 | }; 30 | /* End PBXContainerItemProxy section */ 31 | 32 | /* Begin PBXFileReference section */ 33 | 0CDBA3358214541DC41AAA5C37F7333E /* Pods-SimpleExpandableView_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-SimpleExpandableView_Example.debug.xcconfig"; sourceTree = ""; }; 34 | 11F83BFCAFFDCCB9591EF3703DAA318A /* ExpandableViewGroup.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpandableViewGroup.swift; path = SimpleExpandableView/Classes/ExpandableViewGroup.swift; sourceTree = ""; }; 35 | 14B6330CB9D8B86C92C3C1BEC60EFFBD /* Pods-SimpleExpandableView_Example */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-SimpleExpandableView_Example"; path = Pods_SimpleExpandableView_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 36 | 185EB255CFB608F07A0DAF5C36B37832 /* Utilities.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Utilities.swift; path = SimpleExpandableView/Classes/Utilities.swift; sourceTree = ""; }; 37 | 32DE52B0D6F8627DFE7440BBA4757F9C /* SimpleExpandableView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SimpleExpandableView-prefix.pch"; sourceTree = ""; }; 38 | 39479E0E0D7596D85023F63B8E3A30CD /* Pods-SimpleExpandableView_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-SimpleExpandableView_Example-frameworks.sh"; sourceTree = ""; }; 39 | 48D11671686EE67E8FEC90FE275A8D25 /* README-zh.md */ = {isa = PBXFileReference; includeInIndex = 1; path = "README-zh.md"; sourceTree = ""; }; 40 | 540604C86D9AC34DED81BA7582EDC988 /* SimpleExpandableView */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SimpleExpandableView; path = SimpleExpandableView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 54D04548E9BD6F6D36A3CE9F2F27A523 /* SimpleExpandableView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SimpleExpandableView-umbrella.h"; sourceTree = ""; }; 42 | 5BDCB19A34F9C1BD3D0323EE74BD1693 /* SimpleExpandableView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SimpleExpandableView-dummy.m"; sourceTree = ""; }; 43 | 69EFC94D44BD793E96096BDD7DE9F3C7 /* Pods-SimpleExpandableView_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-SimpleExpandableView_Example-dummy.m"; sourceTree = ""; }; 44 | 6E0AC5F81BB04566BBCE83A84DADD30E /* Pods-SimpleExpandableView_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-SimpleExpandableView_Example-acknowledgements.plist"; sourceTree = ""; }; 45 | 72121719A1A3BBFD54CA7F53E39AEBA6 /* SimpleExpandableView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = SimpleExpandableView.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 46 | 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 47 | 8312A6912CD2C0D787FF418ACB831F8A /* HeaderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HeaderView.swift; path = SimpleExpandableView/Classes/HeaderView.swift; sourceTree = ""; }; 48 | 87FB421BCFEE42B16F3924D4B38E380B /* SimpleExpandableView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SimpleExpandableView-Info.plist"; sourceTree = ""; }; 49 | 8CF357C48D078A8CAE90C8F158DEA6B2 /* Pods-SimpleExpandableView_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-SimpleExpandableView_Example-acknowledgements.markdown"; sourceTree = ""; }; 50 | 9C8381F4AA4793861E938A4D5E370E4A /* SimpleExpandableView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SimpleExpandableView.modulemap; sourceTree = ""; }; 51 | 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; }; 52 | A2C58EF36F2FF39C8E4404418E63196E /* Pods-SimpleExpandableView_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-SimpleExpandableView_Example.release.xcconfig"; sourceTree = ""; }; 53 | A7545BCFE1B2D6308A20B741B7602E60 /* SimpleExpandableView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SimpleExpandableView.release.xcconfig; sourceTree = ""; }; 54 | AF929BF05BC55B8E25C84A73334088B5 /* ExpandableView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpandableView.swift; path = SimpleExpandableView/Classes/ExpandableView.swift; sourceTree = ""; }; 55 | B66553719DA6B017233FA4BA0BFFA8B5 /* Pods-SimpleExpandableView_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-SimpleExpandableView_Example-Info.plist"; sourceTree = ""; }; 56 | C02C7F7053DFEBBCF01F2E8EB334C09E /* Pods-SimpleExpandableView_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-SimpleExpandableView_Example.modulemap"; sourceTree = ""; }; 57 | D9E681489438687A7F8E6AD371714D21 /* SimpleExpandableView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SimpleExpandableView.debug.xcconfig; sourceTree = ""; }; 58 | DA1F0A7A2BD07AA784C08F47E0951ABD /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; 59 | EFDF1C19BFCB4CE2BDE1DCF7CE859C22 /* Pods-SimpleExpandableView_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-SimpleExpandableView_Example-umbrella.h"; sourceTree = ""; }; 60 | /* End PBXFileReference section */ 61 | 62 | /* Begin PBXFrameworksBuildPhase section */ 63 | 646C7F0B87B176DA619026235B9A8F0C /* Frameworks */ = { 64 | isa = PBXFrameworksBuildPhase; 65 | buildActionMask = 2147483647; 66 | files = ( 67 | 1C723677AA49CD6ECD73C35B077A2A56 /* Foundation.framework in Frameworks */, 68 | ); 69 | runOnlyForDeploymentPostprocessing = 0; 70 | }; 71 | B7E294273FC888A2E38C735345A70D96 /* Frameworks */ = { 72 | isa = PBXFrameworksBuildPhase; 73 | buildActionMask = 2147483647; 74 | files = ( 75 | BAFE5F837098D3C5C23BE5E9F564C93C /* Foundation.framework in Frameworks */, 76 | ); 77 | runOnlyForDeploymentPostprocessing = 0; 78 | }; 79 | /* End PBXFrameworksBuildPhase section */ 80 | 81 | /* Begin PBXGroup section */ 82 | 0437DD160AFD22905AE9D03239E43614 /* Pod */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | DA1F0A7A2BD07AA784C08F47E0951ABD /* LICENSE */, 86 | 48D11671686EE67E8FEC90FE275A8D25 /* README-zh.md */, 87 | 72121719A1A3BBFD54CA7F53E39AEBA6 /* SimpleExpandableView.podspec */, 88 | ); 89 | name = Pod; 90 | sourceTree = ""; 91 | }; 92 | 2F7821B891888909EB5047D4F025B249 /* Development Pods */ = { 93 | isa = PBXGroup; 94 | children = ( 95 | 8D6A1C25492BCA509089F87C2875C389 /* SimpleExpandableView */, 96 | ); 97 | name = "Development Pods"; 98 | sourceTree = ""; 99 | }; 100 | 55AB88EF2C602149AE69E8C3D0E2DB30 /* Targets Support Files */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | BC5710D2A06BE39F4608BBE4719AF932 /* Pods-SimpleExpandableView_Example */, 104 | ); 105 | name = "Targets Support Files"; 106 | sourceTree = ""; 107 | }; 108 | 578452D2E740E91742655AC8F1636D1F /* iOS */ = { 109 | isa = PBXGroup; 110 | children = ( 111 | 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */, 112 | ); 113 | name = iOS; 114 | sourceTree = ""; 115 | }; 116 | 8D6A1C25492BCA509089F87C2875C389 /* SimpleExpandableView */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | AF929BF05BC55B8E25C84A73334088B5 /* ExpandableView.swift */, 120 | 11F83BFCAFFDCCB9591EF3703DAA318A /* ExpandableViewGroup.swift */, 121 | 8312A6912CD2C0D787FF418ACB831F8A /* HeaderView.swift */, 122 | 185EB255CFB608F07A0DAF5C36B37832 /* Utilities.swift */, 123 | 0437DD160AFD22905AE9D03239E43614 /* Pod */, 124 | D489A355C1891F524AE02B353E1DD4F4 /* Support Files */, 125 | ); 126 | name = SimpleExpandableView; 127 | path = ../..; 128 | sourceTree = ""; 129 | }; 130 | BC5710D2A06BE39F4608BBE4719AF932 /* Pods-SimpleExpandableView_Example */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | C02C7F7053DFEBBCF01F2E8EB334C09E /* Pods-SimpleExpandableView_Example.modulemap */, 134 | 8CF357C48D078A8CAE90C8F158DEA6B2 /* Pods-SimpleExpandableView_Example-acknowledgements.markdown */, 135 | 6E0AC5F81BB04566BBCE83A84DADD30E /* Pods-SimpleExpandableView_Example-acknowledgements.plist */, 136 | 69EFC94D44BD793E96096BDD7DE9F3C7 /* Pods-SimpleExpandableView_Example-dummy.m */, 137 | 39479E0E0D7596D85023F63B8E3A30CD /* Pods-SimpleExpandableView_Example-frameworks.sh */, 138 | B66553719DA6B017233FA4BA0BFFA8B5 /* Pods-SimpleExpandableView_Example-Info.plist */, 139 | EFDF1C19BFCB4CE2BDE1DCF7CE859C22 /* Pods-SimpleExpandableView_Example-umbrella.h */, 140 | 0CDBA3358214541DC41AAA5C37F7333E /* Pods-SimpleExpandableView_Example.debug.xcconfig */, 141 | A2C58EF36F2FF39C8E4404418E63196E /* Pods-SimpleExpandableView_Example.release.xcconfig */, 142 | ); 143 | name = "Pods-SimpleExpandableView_Example"; 144 | path = "Target Support Files/Pods-SimpleExpandableView_Example"; 145 | sourceTree = ""; 146 | }; 147 | CF1408CF629C7361332E53B88F7BD30C = { 148 | isa = PBXGroup; 149 | children = ( 150 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 151 | 2F7821B891888909EB5047D4F025B249 /* Development Pods */, 152 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, 153 | D45F81E10892D48CEF96A77468A6E0E6 /* Products */, 154 | 55AB88EF2C602149AE69E8C3D0E2DB30 /* Targets Support Files */, 155 | ); 156 | sourceTree = ""; 157 | }; 158 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { 159 | isa = PBXGroup; 160 | children = ( 161 | 578452D2E740E91742655AC8F1636D1F /* iOS */, 162 | ); 163 | name = Frameworks; 164 | sourceTree = ""; 165 | }; 166 | D45F81E10892D48CEF96A77468A6E0E6 /* Products */ = { 167 | isa = PBXGroup; 168 | children = ( 169 | 14B6330CB9D8B86C92C3C1BEC60EFFBD /* Pods-SimpleExpandableView_Example */, 170 | 540604C86D9AC34DED81BA7582EDC988 /* SimpleExpandableView */, 171 | ); 172 | name = Products; 173 | sourceTree = ""; 174 | }; 175 | D489A355C1891F524AE02B353E1DD4F4 /* Support Files */ = { 176 | isa = PBXGroup; 177 | children = ( 178 | 9C8381F4AA4793861E938A4D5E370E4A /* SimpleExpandableView.modulemap */, 179 | 5BDCB19A34F9C1BD3D0323EE74BD1693 /* SimpleExpandableView-dummy.m */, 180 | 87FB421BCFEE42B16F3924D4B38E380B /* SimpleExpandableView-Info.plist */, 181 | 32DE52B0D6F8627DFE7440BBA4757F9C /* SimpleExpandableView-prefix.pch */, 182 | 54D04548E9BD6F6D36A3CE9F2F27A523 /* SimpleExpandableView-umbrella.h */, 183 | D9E681489438687A7F8E6AD371714D21 /* SimpleExpandableView.debug.xcconfig */, 184 | A7545BCFE1B2D6308A20B741B7602E60 /* SimpleExpandableView.release.xcconfig */, 185 | ); 186 | name = "Support Files"; 187 | path = "Example/Pods/Target Support Files/SimpleExpandableView"; 188 | sourceTree = ""; 189 | }; 190 | /* End PBXGroup section */ 191 | 192 | /* Begin PBXHeadersBuildPhase section */ 193 | 536B3FDC8C1AB99ADD037B67BC4738F9 /* Headers */ = { 194 | isa = PBXHeadersBuildPhase; 195 | buildActionMask = 2147483647; 196 | files = ( 197 | 60846CFAD8BD744567FAC2A28E0EF2B4 /* Pods-SimpleExpandableView_Example-umbrella.h in Headers */, 198 | ); 199 | runOnlyForDeploymentPostprocessing = 0; 200 | }; 201 | 5AEB335F2AE3B871D95B7877764A7C91 /* Headers */ = { 202 | isa = PBXHeadersBuildPhase; 203 | buildActionMask = 2147483647; 204 | files = ( 205 | 10200BA1770665CA641E533261635CD0 /* SimpleExpandableView-umbrella.h in Headers */, 206 | ); 207 | runOnlyForDeploymentPostprocessing = 0; 208 | }; 209 | /* End PBXHeadersBuildPhase section */ 210 | 211 | /* Begin PBXNativeTarget section */ 212 | 6B86EA7D19BDAE51A757BC7CC9DFFB57 /* Pods-SimpleExpandableView_Example */ = { 213 | isa = PBXNativeTarget; 214 | buildConfigurationList = 401C8C27A83F0A6B1B4538209DE79DAE /* Build configuration list for PBXNativeTarget "Pods-SimpleExpandableView_Example" */; 215 | buildPhases = ( 216 | 536B3FDC8C1AB99ADD037B67BC4738F9 /* Headers */, 217 | 663E0BF3D1A38875F9718E485202592C /* Sources */, 218 | 646C7F0B87B176DA619026235B9A8F0C /* Frameworks */, 219 | F643599BBDB749855E2AA4E58E38E140 /* Resources */, 220 | ); 221 | buildRules = ( 222 | ); 223 | dependencies = ( 224 | 06611F98BD091F82A3A6CE165AB2B0B6 /* PBXTargetDependency */, 225 | ); 226 | name = "Pods-SimpleExpandableView_Example"; 227 | productName = Pods_SimpleExpandableView_Example; 228 | productReference = 14B6330CB9D8B86C92C3C1BEC60EFFBD /* Pods-SimpleExpandableView_Example */; 229 | productType = "com.apple.product-type.framework"; 230 | }; 231 | BBE03EBF860F4DF8DD7CA354E272434A /* SimpleExpandableView */ = { 232 | isa = PBXNativeTarget; 233 | buildConfigurationList = C7CB1F5B3814E8CA468197F8A78D3F88 /* Build configuration list for PBXNativeTarget "SimpleExpandableView" */; 234 | buildPhases = ( 235 | 5AEB335F2AE3B871D95B7877764A7C91 /* Headers */, 236 | EEF85C697D110A93FE3EE2D16470AEEF /* Sources */, 237 | B7E294273FC888A2E38C735345A70D96 /* Frameworks */, 238 | C735235EE6D18EA175214A8617B1D5BD /* Resources */, 239 | ); 240 | buildRules = ( 241 | ); 242 | dependencies = ( 243 | ); 244 | name = SimpleExpandableView; 245 | productName = SimpleExpandableView; 246 | productReference = 540604C86D9AC34DED81BA7582EDC988 /* SimpleExpandableView */; 247 | productType = "com.apple.product-type.framework"; 248 | }; 249 | /* End PBXNativeTarget section */ 250 | 251 | /* Begin PBXProject section */ 252 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = { 253 | isa = PBXProject; 254 | attributes = { 255 | LastSwiftUpdateCheck = 1240; 256 | LastUpgradeCheck = 1240; 257 | }; 258 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; 259 | compatibilityVersion = "Xcode 3.2"; 260 | developmentRegion = en; 261 | hasScannedForEncodings = 0; 262 | knownRegions = ( 263 | Base, 264 | en, 265 | ); 266 | mainGroup = CF1408CF629C7361332E53B88F7BD30C; 267 | productRefGroup = D45F81E10892D48CEF96A77468A6E0E6 /* Products */; 268 | projectDirPath = ""; 269 | projectRoot = ""; 270 | targets = ( 271 | 6B86EA7D19BDAE51A757BC7CC9DFFB57 /* Pods-SimpleExpandableView_Example */, 272 | BBE03EBF860F4DF8DD7CA354E272434A /* SimpleExpandableView */, 273 | ); 274 | }; 275 | /* End PBXProject section */ 276 | 277 | /* Begin PBXResourcesBuildPhase section */ 278 | C735235EE6D18EA175214A8617B1D5BD /* Resources */ = { 279 | isa = PBXResourcesBuildPhase; 280 | buildActionMask = 2147483647; 281 | files = ( 282 | ); 283 | runOnlyForDeploymentPostprocessing = 0; 284 | }; 285 | F643599BBDB749855E2AA4E58E38E140 /* Resources */ = { 286 | isa = PBXResourcesBuildPhase; 287 | buildActionMask = 2147483647; 288 | files = ( 289 | ); 290 | runOnlyForDeploymentPostprocessing = 0; 291 | }; 292 | /* End PBXResourcesBuildPhase section */ 293 | 294 | /* Begin PBXSourcesBuildPhase section */ 295 | 663E0BF3D1A38875F9718E485202592C /* Sources */ = { 296 | isa = PBXSourcesBuildPhase; 297 | buildActionMask = 2147483647; 298 | files = ( 299 | E3D0B6F5D72A6FBF269904426D6992A5 /* Pods-SimpleExpandableView_Example-dummy.m in Sources */, 300 | ); 301 | runOnlyForDeploymentPostprocessing = 0; 302 | }; 303 | EEF85C697D110A93FE3EE2D16470AEEF /* Sources */ = { 304 | isa = PBXSourcesBuildPhase; 305 | buildActionMask = 2147483647; 306 | files = ( 307 | 49E6F88F788E128FC6A2689FBE53F43F /* ExpandableView.swift in Sources */, 308 | EE88F7A0F5464E7A9CCF7E9A5144F3F2 /* ExpandableViewGroup.swift in Sources */, 309 | ABE1B85C2AF524828A57F1B50A644BFF /* HeaderView.swift in Sources */, 310 | B84B3FDECE62DE34F8C9ABCA9B9FFFD0 /* SimpleExpandableView-dummy.m in Sources */, 311 | 085A023955B2C54BCE67E02E1130CB1B /* Utilities.swift in Sources */, 312 | ); 313 | runOnlyForDeploymentPostprocessing = 0; 314 | }; 315 | /* End PBXSourcesBuildPhase section */ 316 | 317 | /* Begin PBXTargetDependency section */ 318 | 06611F98BD091F82A3A6CE165AB2B0B6 /* PBXTargetDependency */ = { 319 | isa = PBXTargetDependency; 320 | name = SimpleExpandableView; 321 | target = BBE03EBF860F4DF8DD7CA354E272434A /* SimpleExpandableView */; 322 | targetProxy = 3007F8C8E12E02FC1F42EFC1638145FE /* PBXContainerItemProxy */; 323 | }; 324 | /* End PBXTargetDependency section */ 325 | 326 | /* Begin XCBuildConfiguration section */ 327 | 40DF900D1EA34E33B8E89B6EB4A9A4D4 /* Debug */ = { 328 | isa = XCBuildConfiguration; 329 | baseConfigurationReference = 0CDBA3358214541DC41AAA5C37F7333E /* Pods-SimpleExpandableView_Example.debug.xcconfig */; 330 | buildSettings = { 331 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 332 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 333 | CLANG_ENABLE_OBJC_WEAK = NO; 334 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 335 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 336 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 337 | CURRENT_PROJECT_VERSION = 1; 338 | DEFINES_MODULE = YES; 339 | DYLIB_COMPATIBILITY_VERSION = 1; 340 | DYLIB_CURRENT_VERSION = 1; 341 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 342 | INFOPLIST_FILE = "Target Support Files/Pods-SimpleExpandableView_Example/Pods-SimpleExpandableView_Example-Info.plist"; 343 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 344 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 345 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 346 | MACH_O_TYPE = staticlib; 347 | MODULEMAP_FILE = "Target Support Files/Pods-SimpleExpandableView_Example/Pods-SimpleExpandableView_Example.modulemap"; 348 | OTHER_LDFLAGS = ""; 349 | OTHER_LIBTOOLFLAGS = ""; 350 | PODS_ROOT = "$(SRCROOT)"; 351 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 352 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 353 | SDKROOT = iphoneos; 354 | SKIP_INSTALL = YES; 355 | TARGETED_DEVICE_FAMILY = "1,2"; 356 | VERSIONING_SYSTEM = "apple-generic"; 357 | VERSION_INFO_PREFIX = ""; 358 | }; 359 | name = Debug; 360 | }; 361 | 60E1630CB1165CF4F1F8E2D571A9AB70 /* Debug */ = { 362 | isa = XCBuildConfiguration; 363 | baseConfigurationReference = D9E681489438687A7F8E6AD371714D21 /* SimpleExpandableView.debug.xcconfig */; 364 | buildSettings = { 365 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 366 | CLANG_ENABLE_OBJC_WEAK = NO; 367 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 368 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 369 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 370 | CURRENT_PROJECT_VERSION = 1; 371 | DEFINES_MODULE = YES; 372 | DYLIB_COMPATIBILITY_VERSION = 1; 373 | DYLIB_CURRENT_VERSION = 1; 374 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 375 | GCC_PREFIX_HEADER = "Target Support Files/SimpleExpandableView/SimpleExpandableView-prefix.pch"; 376 | INFOPLIST_FILE = "Target Support Files/SimpleExpandableView/SimpleExpandableView-Info.plist"; 377 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 378 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 379 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 380 | MODULEMAP_FILE = "Target Support Files/SimpleExpandableView/SimpleExpandableView.modulemap"; 381 | PRODUCT_MODULE_NAME = SimpleExpandableView; 382 | PRODUCT_NAME = SimpleExpandableView; 383 | SDKROOT = iphoneos; 384 | SKIP_INSTALL = YES; 385 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 386 | SWIFT_VERSION = 5.6; 387 | TARGETED_DEVICE_FAMILY = "1,2"; 388 | VERSIONING_SYSTEM = "apple-generic"; 389 | VERSION_INFO_PREFIX = ""; 390 | }; 391 | name = Debug; 392 | }; 393 | 861BDF8D4D8E7C9EAF2D14E68B6130C4 /* Release */ = { 394 | isa = XCBuildConfiguration; 395 | baseConfigurationReference = A2C58EF36F2FF39C8E4404418E63196E /* Pods-SimpleExpandableView_Example.release.xcconfig */; 396 | buildSettings = { 397 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 398 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 399 | CLANG_ENABLE_OBJC_WEAK = NO; 400 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 401 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 402 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 403 | CURRENT_PROJECT_VERSION = 1; 404 | DEFINES_MODULE = YES; 405 | DYLIB_COMPATIBILITY_VERSION = 1; 406 | DYLIB_CURRENT_VERSION = 1; 407 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 408 | INFOPLIST_FILE = "Target Support Files/Pods-SimpleExpandableView_Example/Pods-SimpleExpandableView_Example-Info.plist"; 409 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 410 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 411 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 412 | MACH_O_TYPE = staticlib; 413 | MODULEMAP_FILE = "Target Support Files/Pods-SimpleExpandableView_Example/Pods-SimpleExpandableView_Example.modulemap"; 414 | OTHER_LDFLAGS = ""; 415 | OTHER_LIBTOOLFLAGS = ""; 416 | PODS_ROOT = "$(SRCROOT)"; 417 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 418 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 419 | SDKROOT = iphoneos; 420 | SKIP_INSTALL = YES; 421 | TARGETED_DEVICE_FAMILY = "1,2"; 422 | VALIDATE_PRODUCT = YES; 423 | VERSIONING_SYSTEM = "apple-generic"; 424 | VERSION_INFO_PREFIX = ""; 425 | }; 426 | name = Release; 427 | }; 428 | 90D4D09BCB6A4660E43ACBE9ECB6FE9A /* Debug */ = { 429 | isa = XCBuildConfiguration; 430 | buildSettings = { 431 | ALWAYS_SEARCH_USER_PATHS = NO; 432 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 433 | CLANG_ANALYZER_NONNULL = YES; 434 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 435 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 436 | CLANG_CXX_LIBRARY = "libc++"; 437 | CLANG_ENABLE_MODULES = YES; 438 | CLANG_ENABLE_OBJC_ARC = YES; 439 | CLANG_ENABLE_OBJC_WEAK = YES; 440 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 441 | CLANG_WARN_BOOL_CONVERSION = YES; 442 | CLANG_WARN_COMMA = YES; 443 | CLANG_WARN_CONSTANT_CONVERSION = YES; 444 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 445 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 446 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 447 | CLANG_WARN_EMPTY_BODY = YES; 448 | CLANG_WARN_ENUM_CONVERSION = YES; 449 | CLANG_WARN_INFINITE_RECURSION = YES; 450 | CLANG_WARN_INT_CONVERSION = YES; 451 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 452 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 453 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 454 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 455 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 456 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 457 | CLANG_WARN_STRICT_PROTOTYPES = YES; 458 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 459 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 460 | CLANG_WARN_UNREACHABLE_CODE = YES; 461 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 462 | COPY_PHASE_STRIP = NO; 463 | DEBUG_INFORMATION_FORMAT = dwarf; 464 | ENABLE_STRICT_OBJC_MSGSEND = YES; 465 | ENABLE_TESTABILITY = YES; 466 | GCC_C_LANGUAGE_STANDARD = gnu11; 467 | GCC_DYNAMIC_NO_PIC = NO; 468 | GCC_NO_COMMON_BLOCKS = YES; 469 | GCC_OPTIMIZATION_LEVEL = 0; 470 | GCC_PREPROCESSOR_DEFINITIONS = ( 471 | "POD_CONFIGURATION_DEBUG=1", 472 | "DEBUG=1", 473 | "$(inherited)", 474 | ); 475 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 476 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 477 | GCC_WARN_UNDECLARED_SELECTOR = YES; 478 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 479 | GCC_WARN_UNUSED_FUNCTION = YES; 480 | GCC_WARN_UNUSED_VARIABLE = YES; 481 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 482 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 483 | MTL_FAST_MATH = YES; 484 | ONLY_ACTIVE_ARCH = YES; 485 | PRODUCT_NAME = "$(TARGET_NAME)"; 486 | STRIP_INSTALLED_PRODUCT = NO; 487 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 488 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 489 | SWIFT_VERSION = 5.0; 490 | SYMROOT = "${SRCROOT}/../build"; 491 | }; 492 | name = Debug; 493 | }; 494 | 9553C89E183877A5CB2F3C6801BEC129 /* Release */ = { 495 | isa = XCBuildConfiguration; 496 | buildSettings = { 497 | ALWAYS_SEARCH_USER_PATHS = NO; 498 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 499 | CLANG_ANALYZER_NONNULL = YES; 500 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 501 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 502 | CLANG_CXX_LIBRARY = "libc++"; 503 | CLANG_ENABLE_MODULES = YES; 504 | CLANG_ENABLE_OBJC_ARC = YES; 505 | CLANG_ENABLE_OBJC_WEAK = YES; 506 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 507 | CLANG_WARN_BOOL_CONVERSION = YES; 508 | CLANG_WARN_COMMA = YES; 509 | CLANG_WARN_CONSTANT_CONVERSION = YES; 510 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 511 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 512 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 513 | CLANG_WARN_EMPTY_BODY = YES; 514 | CLANG_WARN_ENUM_CONVERSION = YES; 515 | CLANG_WARN_INFINITE_RECURSION = YES; 516 | CLANG_WARN_INT_CONVERSION = YES; 517 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 518 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 519 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 520 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 521 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 522 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 523 | CLANG_WARN_STRICT_PROTOTYPES = YES; 524 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 525 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 526 | CLANG_WARN_UNREACHABLE_CODE = YES; 527 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 528 | COPY_PHASE_STRIP = NO; 529 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 530 | ENABLE_NS_ASSERTIONS = NO; 531 | ENABLE_STRICT_OBJC_MSGSEND = YES; 532 | GCC_C_LANGUAGE_STANDARD = gnu11; 533 | GCC_NO_COMMON_BLOCKS = YES; 534 | GCC_PREPROCESSOR_DEFINITIONS = ( 535 | "POD_CONFIGURATION_RELEASE=1", 536 | "$(inherited)", 537 | ); 538 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 539 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 540 | GCC_WARN_UNDECLARED_SELECTOR = YES; 541 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 542 | GCC_WARN_UNUSED_FUNCTION = YES; 543 | GCC_WARN_UNUSED_VARIABLE = YES; 544 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 545 | MTL_ENABLE_DEBUG_INFO = NO; 546 | MTL_FAST_MATH = YES; 547 | PRODUCT_NAME = "$(TARGET_NAME)"; 548 | STRIP_INSTALLED_PRODUCT = NO; 549 | SWIFT_COMPILATION_MODE = wholemodule; 550 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 551 | SWIFT_VERSION = 5.0; 552 | SYMROOT = "${SRCROOT}/../build"; 553 | }; 554 | name = Release; 555 | }; 556 | F0ACD97143A77E492D679F7DA883F7DD /* Release */ = { 557 | isa = XCBuildConfiguration; 558 | baseConfigurationReference = A7545BCFE1B2D6308A20B741B7602E60 /* SimpleExpandableView.release.xcconfig */; 559 | buildSettings = { 560 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 561 | CLANG_ENABLE_OBJC_WEAK = NO; 562 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 563 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 564 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 565 | CURRENT_PROJECT_VERSION = 1; 566 | DEFINES_MODULE = YES; 567 | DYLIB_COMPATIBILITY_VERSION = 1; 568 | DYLIB_CURRENT_VERSION = 1; 569 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 570 | GCC_PREFIX_HEADER = "Target Support Files/SimpleExpandableView/SimpleExpandableView-prefix.pch"; 571 | INFOPLIST_FILE = "Target Support Files/SimpleExpandableView/SimpleExpandableView-Info.plist"; 572 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 573 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 574 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 575 | MODULEMAP_FILE = "Target Support Files/SimpleExpandableView/SimpleExpandableView.modulemap"; 576 | PRODUCT_MODULE_NAME = SimpleExpandableView; 577 | PRODUCT_NAME = SimpleExpandableView; 578 | SDKROOT = iphoneos; 579 | SKIP_INSTALL = YES; 580 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 581 | SWIFT_VERSION = 5.6; 582 | TARGETED_DEVICE_FAMILY = "1,2"; 583 | VALIDATE_PRODUCT = YES; 584 | VERSIONING_SYSTEM = "apple-generic"; 585 | VERSION_INFO_PREFIX = ""; 586 | }; 587 | name = Release; 588 | }; 589 | /* End XCBuildConfiguration section */ 590 | 591 | /* Begin XCConfigurationList section */ 592 | 401C8C27A83F0A6B1B4538209DE79DAE /* Build configuration list for PBXNativeTarget "Pods-SimpleExpandableView_Example" */ = { 593 | isa = XCConfigurationList; 594 | buildConfigurations = ( 595 | 40DF900D1EA34E33B8E89B6EB4A9A4D4 /* Debug */, 596 | 861BDF8D4D8E7C9EAF2D14E68B6130C4 /* Release */, 597 | ); 598 | defaultConfigurationIsVisible = 0; 599 | defaultConfigurationName = Release; 600 | }; 601 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { 602 | isa = XCConfigurationList; 603 | buildConfigurations = ( 604 | 90D4D09BCB6A4660E43ACBE9ECB6FE9A /* Debug */, 605 | 9553C89E183877A5CB2F3C6801BEC129 /* Release */, 606 | ); 607 | defaultConfigurationIsVisible = 0; 608 | defaultConfigurationName = Release; 609 | }; 610 | C7CB1F5B3814E8CA468197F8A78D3F88 /* Build configuration list for PBXNativeTarget "SimpleExpandableView" */ = { 611 | isa = XCConfigurationList; 612 | buildConfigurations = ( 613 | 60E1630CB1165CF4F1F8E2D571A9AB70 /* Debug */, 614 | F0ACD97143A77E492D679F7DA883F7DD /* Release */, 615 | ); 616 | defaultConfigurationIsVisible = 0; 617 | defaultConfigurationName = Release; 618 | }; 619 | /* End XCConfigurationList section */ 620 | }; 621 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; 622 | } 623 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SimpleExpandableView_Example/Pods-SimpleExpandableView_Example-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SimpleExpandableView_Example/Pods-SimpleExpandableView_Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## SimpleExpandableView 5 | 6 | Copyright (c) 2022 36720212 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - https://cocoapods.org 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SimpleExpandableView_Example/Pods-SimpleExpandableView_Example-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2022 36720212 <everything@tomortec.com> 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | License 38 | MIT 39 | Title 40 | SimpleExpandableView 41 | Type 42 | PSGroupSpecifier 43 | 44 | 45 | FooterText 46 | Generated by CocoaPods - https://cocoapods.org 47 | Title 48 | 49 | Type 50 | PSGroupSpecifier 51 | 52 | 53 | StringsTable 54 | Acknowledgements 55 | Title 56 | Acknowledgements 57 | 58 | 59 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SimpleExpandableView_Example/Pods-SimpleExpandableView_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_SimpleExpandableView_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_SimpleExpandableView_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SimpleExpandableView_Example/Pods-SimpleExpandableView_Example-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | BCSYMBOLMAP_DIR="BCSymbolMaps" 23 | 24 | 25 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 26 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 27 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 28 | 29 | # Copies and strips a vendored framework 30 | install_framework() 31 | { 32 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 33 | local source="${BUILT_PRODUCTS_DIR}/$1" 34 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 35 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 36 | elif [ -r "$1" ]; then 37 | local source="$1" 38 | fi 39 | 40 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 41 | 42 | if [ -L "${source}" ]; then 43 | echo "Symlinked..." 44 | source="$(readlink "${source}")" 45 | fi 46 | 47 | if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then 48 | # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied 49 | find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do 50 | echo "Installing $f" 51 | install_bcsymbolmap "$f" "$destination" 52 | rm "$f" 53 | done 54 | rmdir "${source}/${BCSYMBOLMAP_DIR}" 55 | fi 56 | 57 | # Use filter instead of exclude so missing patterns don't throw errors. 58 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 59 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 60 | 61 | local basename 62 | basename="$(basename -s .framework "$1")" 63 | binary="${destination}/${basename}.framework/${basename}" 64 | 65 | if ! [ -r "$binary" ]; then 66 | binary="${destination}/${basename}" 67 | elif [ -L "${binary}" ]; then 68 | echo "Destination binary is symlinked..." 69 | dirname="$(dirname "${binary}")" 70 | binary="${dirname}/$(readlink "${binary}")" 71 | fi 72 | 73 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 74 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 75 | strip_invalid_archs "$binary" 76 | fi 77 | 78 | # Resign the code if required by the build settings to avoid unstable apps 79 | code_sign_if_enabled "${destination}/$(basename "$1")" 80 | 81 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 82 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 83 | local swift_runtime_libs 84 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 85 | for lib in $swift_runtime_libs; do 86 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 87 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 88 | code_sign_if_enabled "${destination}/${lib}" 89 | done 90 | fi 91 | } 92 | # Copies and strips a vendored dSYM 93 | install_dsym() { 94 | local source="$1" 95 | warn_missing_arch=${2:-true} 96 | if [ -r "$source" ]; then 97 | # Copy the dSYM into the targets temp dir. 98 | 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}\"" 99 | 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}" 100 | 101 | local basename 102 | basename="$(basename -s .dSYM "$source")" 103 | binary_name="$(ls "$source/Contents/Resources/DWARF")" 104 | binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" 105 | 106 | # Strip invalid architectures from the dSYM. 107 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then 108 | strip_invalid_archs "$binary" "$warn_missing_arch" 109 | fi 110 | if [[ $STRIP_BINARY_RETVAL == 0 ]]; then 111 | # Move the stripped file into its final destination. 112 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 113 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 114 | else 115 | # 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. 116 | mkdir -p "${DWARF_DSYM_FOLDER_PATH}" 117 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" 118 | fi 119 | fi 120 | } 121 | 122 | # Used as a return value for each invocation of `strip_invalid_archs` function. 123 | STRIP_BINARY_RETVAL=0 124 | 125 | # Strip invalid architectures 126 | strip_invalid_archs() { 127 | binary="$1" 128 | warn_missing_arch=${2:-true} 129 | # Get architectures for current target binary 130 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 131 | # Intersect them with the architectures we are building for 132 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 133 | # If there are no archs supported by this binary then warn the user 134 | if [[ -z "$intersected_archs" ]]; then 135 | if [[ "$warn_missing_arch" == "true" ]]; then 136 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 137 | fi 138 | STRIP_BINARY_RETVAL=1 139 | return 140 | fi 141 | stripped="" 142 | for arch in $binary_archs; do 143 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 144 | # Strip non-valid architectures in-place 145 | lipo -remove "$arch" -output "$binary" "$binary" 146 | stripped="$stripped $arch" 147 | fi 148 | done 149 | if [[ "$stripped" ]]; then 150 | echo "Stripped $binary of architectures:$stripped" 151 | fi 152 | STRIP_BINARY_RETVAL=0 153 | } 154 | 155 | # Copies the bcsymbolmap files of a vendored framework 156 | install_bcsymbolmap() { 157 | local bcsymbolmap_path="$1" 158 | local destination="${BUILT_PRODUCTS_DIR}" 159 | 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}"" 160 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" 161 | } 162 | 163 | # Signs a framework with the provided identity 164 | code_sign_if_enabled() { 165 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 166 | # Use the current code_sign_identity 167 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 168 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 169 | 170 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 171 | code_sign_cmd="$code_sign_cmd &" 172 | fi 173 | echo "$code_sign_cmd" 174 | eval "$code_sign_cmd" 175 | fi 176 | } 177 | 178 | if [[ "$CONFIGURATION" == "Debug" ]]; then 179 | install_framework "${BUILT_PRODUCTS_DIR}/SimpleExpandableView/SimpleExpandableView.framework" 180 | fi 181 | if [[ "$CONFIGURATION" == "Release" ]]; then 182 | install_framework "${BUILT_PRODUCTS_DIR}/SimpleExpandableView/SimpleExpandableView.framework" 183 | fi 184 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 185 | wait 186 | fi 187 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SimpleExpandableView_Example/Pods-SimpleExpandableView_Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_SimpleExpandableView_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_SimpleExpandableView_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SimpleExpandableView_Example/Pods-SimpleExpandableView_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SimpleExpandableView" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SimpleExpandableView/SimpleExpandableView.framework/Headers" 6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' 7 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 8 | OTHER_LDFLAGS = $(inherited) -framework "SimpleExpandableView" 9 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 10 | PODS_BUILD_DIR = ${BUILD_DIR} 11 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 12 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 13 | PODS_ROOT = ${SRCROOT}/Pods 14 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SimpleExpandableView_Example/Pods-SimpleExpandableView_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_SimpleExpandableView_Example { 2 | umbrella header "Pods-SimpleExpandableView_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SimpleExpandableView_Example/Pods-SimpleExpandableView_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SimpleExpandableView" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SimpleExpandableView/SimpleExpandableView.framework/Headers" 6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' 7 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 8 | OTHER_LDFLAGS = $(inherited) -framework "SimpleExpandableView" 9 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 10 | PODS_BUILD_DIR = ${BUILD_DIR} 11 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 12 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 13 | PODS_ROOT = ${SRCROOT}/Pods 14 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SimpleExpandableView/SimpleExpandableView-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SimpleExpandableView/SimpleExpandableView-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_SimpleExpandableView : NSObject 3 | @end 4 | @implementation PodsDummy_SimpleExpandableView 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SimpleExpandableView/SimpleExpandableView-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SimpleExpandableView/SimpleExpandableView-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double SimpleExpandableViewVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char SimpleExpandableViewVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SimpleExpandableView/SimpleExpandableView.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SimpleExpandableView 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT} 9 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 11 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 12 | SKIP_INSTALL = YES 13 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 14 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SimpleExpandableView/SimpleExpandableView.modulemap: -------------------------------------------------------------------------------- 1 | framework module SimpleExpandableView { 2 | umbrella header "SimpleExpandableView-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SimpleExpandableView/SimpleExpandableView.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SimpleExpandableView 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT} 9 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 11 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 12 | SKIP_INSTALL = YES 13 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 14 | -------------------------------------------------------------------------------- /Example/SimpleExpandableView.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0DAAE6F02834DE3A00AE4687 /* ExampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DAAE6EF2834DE3A00AE4687 /* ExampleApp.swift */; }; 11 | 0DAAE6F22834DE6500AE4687 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DAAE6F12834DE6500AE4687 /* ContentView.swift */; }; 12 | 0DF993622835EE6B00DBB7EA /* ComponentExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DF993612835EE6B00DBB7EA /* ComponentExample.swift */; }; 13 | 0DF993642835F60E00DBB7EA /* GroupExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DF993632835F60E00DBB7EA /* GroupExample.swift */; }; 14 | 0EA6188F553010C31FE56744 /* Pods_SimpleExpandableView_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F0A03F581763EF605509932D /* Pods_SimpleExpandableView_Example.framework */; }; 15 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXFileReference section */ 19 | 0DAAE6EE2834DE3A00AE4687 /* SimpleExpandableView_Example-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SimpleExpandableView_Example-Bridging-Header.h"; sourceTree = ""; }; 20 | 0DAAE6EF2834DE3A00AE4687 /* ExampleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleApp.swift; sourceTree = ""; }; 21 | 0DAAE6F12834DE6500AE4687 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 22 | 0DF993612835EE6B00DBB7EA /* ComponentExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComponentExample.swift; sourceTree = ""; }; 23 | 0DF993632835F60E00DBB7EA /* GroupExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupExample.swift; sourceTree = ""; }; 24 | 12CF7E8F99E61974B8F58A67 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 25 | 15FD4FC2BF61EC1B45E0864F /* SimpleExpandableView.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = SimpleExpandableView.podspec; path = ../SimpleExpandableView.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 26 | 607FACD01AFB9204008FA782 /* SimpleExpandableView_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleExpandableView_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 27 | 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 28 | 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 29 | 70C50D01EE65BBBC62B3BAC5 /* Pods_SimpleExpandableView_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SimpleExpandableView_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 30 | 7189861CD361A189190D71F2 /* Pods-SimpleExpandableView_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SimpleExpandableView_Example.debug.xcconfig"; path = "Target Support Files/Pods-SimpleExpandableView_Example/Pods-SimpleExpandableView_Example.debug.xcconfig"; sourceTree = ""; }; 31 | B96940CE70D9EB7409D5AB14 /* Pods-SimpleExpandableView_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SimpleExpandableView_Example.release.xcconfig"; path = "Target Support Files/Pods-SimpleExpandableView_Example/Pods-SimpleExpandableView_Example.release.xcconfig"; sourceTree = ""; }; 32 | C3E44DD147DE875A5CFEE0C1 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 33 | F0A03F581763EF605509932D /* Pods_SimpleExpandableView_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SimpleExpandableView_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 34 | /* End PBXFileReference section */ 35 | 36 | /* Begin PBXFrameworksBuildPhase section */ 37 | 607FACCD1AFB9204008FA782 /* Frameworks */ = { 38 | isa = PBXFrameworksBuildPhase; 39 | buildActionMask = 2147483647; 40 | files = ( 41 | 0EA6188F553010C31FE56744 /* Pods_SimpleExpandableView_Example.framework in Frameworks */, 42 | ); 43 | runOnlyForDeploymentPostprocessing = 0; 44 | }; 45 | /* End PBXFrameworksBuildPhase section */ 46 | 47 | /* Begin PBXGroup section */ 48 | 607FACC71AFB9204008FA782 = { 49 | isa = PBXGroup; 50 | children = ( 51 | 607FACF51AFB993E008FA782 /* Podspec Metadata */, 52 | 607FACD21AFB9204008FA782 /* Example for SimpleExpandableView */, 53 | 607FACD11AFB9204008FA782 /* Products */, 54 | D1A3F77A2BA464B14CEA6100 /* Pods */, 55 | F5FB4E6BAFEF15458FDD82D8 /* Frameworks */, 56 | ); 57 | sourceTree = ""; 58 | }; 59 | 607FACD11AFB9204008FA782 /* Products */ = { 60 | isa = PBXGroup; 61 | children = ( 62 | 607FACD01AFB9204008FA782 /* SimpleExpandableView_Example.app */, 63 | ); 64 | name = Products; 65 | sourceTree = ""; 66 | }; 67 | 607FACD21AFB9204008FA782 /* Example for SimpleExpandableView */ = { 68 | isa = PBXGroup; 69 | children = ( 70 | 607FACD91AFB9204008FA782 /* Main.storyboard */, 71 | 607FACD31AFB9204008FA782 /* Supporting Files */, 72 | 0DAAE6EF2834DE3A00AE4687 /* ExampleApp.swift */, 73 | 0DAAE6EE2834DE3A00AE4687 /* SimpleExpandableView_Example-Bridging-Header.h */, 74 | 0DAAE6F12834DE6500AE4687 /* ContentView.swift */, 75 | 0DF993612835EE6B00DBB7EA /* ComponentExample.swift */, 76 | 0DF993632835F60E00DBB7EA /* GroupExample.swift */, 77 | ); 78 | name = "Example for SimpleExpandableView"; 79 | path = SimpleExpandableView; 80 | sourceTree = ""; 81 | }; 82 | 607FACD31AFB9204008FA782 /* Supporting Files */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | 607FACD41AFB9204008FA782 /* Info.plist */, 86 | ); 87 | name = "Supporting Files"; 88 | sourceTree = ""; 89 | }; 90 | 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 15FD4FC2BF61EC1B45E0864F /* SimpleExpandableView.podspec */, 94 | C3E44DD147DE875A5CFEE0C1 /* README.md */, 95 | 12CF7E8F99E61974B8F58A67 /* LICENSE */, 96 | ); 97 | name = "Podspec Metadata"; 98 | sourceTree = ""; 99 | }; 100 | D1A3F77A2BA464B14CEA6100 /* Pods */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | 7189861CD361A189190D71F2 /* Pods-SimpleExpandableView_Example.debug.xcconfig */, 104 | B96940CE70D9EB7409D5AB14 /* Pods-SimpleExpandableView_Example.release.xcconfig */, 105 | ); 106 | path = Pods; 107 | sourceTree = ""; 108 | }; 109 | F5FB4E6BAFEF15458FDD82D8 /* Frameworks */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | F0A03F581763EF605509932D /* Pods_SimpleExpandableView_Example.framework */, 113 | 70C50D01EE65BBBC62B3BAC5 /* Pods_SimpleExpandableView_Tests.framework */, 114 | ); 115 | name = Frameworks; 116 | sourceTree = ""; 117 | }; 118 | /* End PBXGroup section */ 119 | 120 | /* Begin PBXNativeTarget section */ 121 | 607FACCF1AFB9204008FA782 /* SimpleExpandableView_Example */ = { 122 | isa = PBXNativeTarget; 123 | buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "SimpleExpandableView_Example" */; 124 | buildPhases = ( 125 | C12CA895CB8E332AD661296B /* [CP] Check Pods Manifest.lock */, 126 | 607FACCC1AFB9204008FA782 /* Sources */, 127 | 607FACCD1AFB9204008FA782 /* Frameworks */, 128 | 607FACCE1AFB9204008FA782 /* Resources */, 129 | 241DC51CADB5DCEAC950CA2D /* [CP] Embed Pods Frameworks */, 130 | ); 131 | buildRules = ( 132 | ); 133 | dependencies = ( 134 | ); 135 | name = SimpleExpandableView_Example; 136 | productName = SimpleExpandableView; 137 | productReference = 607FACD01AFB9204008FA782 /* SimpleExpandableView_Example.app */; 138 | productType = "com.apple.product-type.application"; 139 | }; 140 | /* End PBXNativeTarget section */ 141 | 142 | /* Begin PBXProject section */ 143 | 607FACC81AFB9204008FA782 /* Project object */ = { 144 | isa = PBXProject; 145 | attributes = { 146 | LastSwiftUpdateCheck = 0830; 147 | LastUpgradeCheck = 1330; 148 | ORGANIZATIONNAME = CocoaPods; 149 | TargetAttributes = { 150 | 607FACCF1AFB9204008FA782 = { 151 | CreatedOnToolsVersion = 6.3.1; 152 | DevelopmentTeam = SJ84SX66Q7; 153 | LastSwiftMigration = 1330; 154 | }; 155 | }; 156 | }; 157 | buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "SimpleExpandableView" */; 158 | compatibilityVersion = "Xcode 3.2"; 159 | developmentRegion = English; 160 | hasScannedForEncodings = 0; 161 | knownRegions = ( 162 | English, 163 | en, 164 | Base, 165 | ); 166 | mainGroup = 607FACC71AFB9204008FA782; 167 | productRefGroup = 607FACD11AFB9204008FA782 /* Products */; 168 | projectDirPath = ""; 169 | projectRoot = ""; 170 | targets = ( 171 | 607FACCF1AFB9204008FA782 /* SimpleExpandableView_Example */, 172 | ); 173 | }; 174 | /* End PBXProject section */ 175 | 176 | /* Begin PBXResourcesBuildPhase section */ 177 | 607FACCE1AFB9204008FA782 /* Resources */ = { 178 | isa = PBXResourcesBuildPhase; 179 | buildActionMask = 2147483647; 180 | files = ( 181 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, 182 | ); 183 | runOnlyForDeploymentPostprocessing = 0; 184 | }; 185 | /* End PBXResourcesBuildPhase section */ 186 | 187 | /* Begin PBXShellScriptBuildPhase section */ 188 | 241DC51CADB5DCEAC950CA2D /* [CP] Embed Pods Frameworks */ = { 189 | isa = PBXShellScriptBuildPhase; 190 | buildActionMask = 2147483647; 191 | files = ( 192 | ); 193 | inputPaths = ( 194 | "${PODS_ROOT}/Target Support Files/Pods-SimpleExpandableView_Example/Pods-SimpleExpandableView_Example-frameworks.sh", 195 | "${BUILT_PRODUCTS_DIR}/SimpleExpandableView/SimpleExpandableView.framework", 196 | ); 197 | name = "[CP] Embed Pods Frameworks"; 198 | outputPaths = ( 199 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SimpleExpandableView.framework", 200 | ); 201 | runOnlyForDeploymentPostprocessing = 0; 202 | shellPath = /bin/sh; 203 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SimpleExpandableView_Example/Pods-SimpleExpandableView_Example-frameworks.sh\"\n"; 204 | showEnvVarsInLog = 0; 205 | }; 206 | C12CA895CB8E332AD661296B /* [CP] Check Pods Manifest.lock */ = { 207 | isa = PBXShellScriptBuildPhase; 208 | buildActionMask = 2147483647; 209 | files = ( 210 | ); 211 | inputFileListPaths = ( 212 | ); 213 | inputPaths = ( 214 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 215 | "${PODS_ROOT}/Manifest.lock", 216 | ); 217 | name = "[CP] Check Pods Manifest.lock"; 218 | outputFileListPaths = ( 219 | ); 220 | outputPaths = ( 221 | "$(DERIVED_FILE_DIR)/Pods-SimpleExpandableView_Example-checkManifestLockResult.txt", 222 | ); 223 | runOnlyForDeploymentPostprocessing = 0; 224 | shellPath = /bin/sh; 225 | 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"; 226 | showEnvVarsInLog = 0; 227 | }; 228 | /* End PBXShellScriptBuildPhase section */ 229 | 230 | /* Begin PBXSourcesBuildPhase section */ 231 | 607FACCC1AFB9204008FA782 /* Sources */ = { 232 | isa = PBXSourcesBuildPhase; 233 | buildActionMask = 2147483647; 234 | files = ( 235 | 0DF993622835EE6B00DBB7EA /* ComponentExample.swift in Sources */, 236 | 0DAAE6F22834DE6500AE4687 /* ContentView.swift in Sources */, 237 | 0DF993642835F60E00DBB7EA /* GroupExample.swift in Sources */, 238 | 0DAAE6F02834DE3A00AE4687 /* ExampleApp.swift in Sources */, 239 | ); 240 | runOnlyForDeploymentPostprocessing = 0; 241 | }; 242 | /* End PBXSourcesBuildPhase section */ 243 | 244 | /* Begin PBXVariantGroup section */ 245 | 607FACD91AFB9204008FA782 /* Main.storyboard */ = { 246 | isa = PBXVariantGroup; 247 | children = ( 248 | 607FACDA1AFB9204008FA782 /* Base */, 249 | ); 250 | name = Main.storyboard; 251 | sourceTree = ""; 252 | }; 253 | /* End PBXVariantGroup section */ 254 | 255 | /* Begin XCBuildConfiguration section */ 256 | 607FACED1AFB9204008FA782 /* Debug */ = { 257 | isa = XCBuildConfiguration; 258 | buildSettings = { 259 | ALWAYS_SEARCH_USER_PATHS = NO; 260 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 261 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 262 | CLANG_CXX_LIBRARY = "libc++"; 263 | CLANG_ENABLE_MODULES = YES; 264 | CLANG_ENABLE_OBJC_ARC = YES; 265 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 266 | CLANG_WARN_BOOL_CONVERSION = YES; 267 | CLANG_WARN_COMMA = YES; 268 | CLANG_WARN_CONSTANT_CONVERSION = YES; 269 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 270 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 271 | CLANG_WARN_EMPTY_BODY = YES; 272 | CLANG_WARN_ENUM_CONVERSION = YES; 273 | CLANG_WARN_INFINITE_RECURSION = YES; 274 | CLANG_WARN_INT_CONVERSION = YES; 275 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 276 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 277 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 278 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 279 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 280 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 281 | CLANG_WARN_STRICT_PROTOTYPES = YES; 282 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 283 | CLANG_WARN_UNREACHABLE_CODE = YES; 284 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 285 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 286 | COPY_PHASE_STRIP = NO; 287 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 288 | ENABLE_STRICT_OBJC_MSGSEND = YES; 289 | ENABLE_TESTABILITY = YES; 290 | GCC_C_LANGUAGE_STANDARD = gnu99; 291 | GCC_DYNAMIC_NO_PIC = NO; 292 | GCC_NO_COMMON_BLOCKS = YES; 293 | GCC_OPTIMIZATION_LEVEL = 0; 294 | GCC_PREPROCESSOR_DEFINITIONS = ( 295 | "DEBUG=1", 296 | "$(inherited)", 297 | ); 298 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 299 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 300 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 301 | GCC_WARN_UNDECLARED_SELECTOR = YES; 302 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 303 | GCC_WARN_UNUSED_FUNCTION = YES; 304 | GCC_WARN_UNUSED_VARIABLE = YES; 305 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 306 | MTL_ENABLE_DEBUG_INFO = YES; 307 | ONLY_ACTIVE_ARCH = YES; 308 | SDKROOT = iphoneos; 309 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 310 | }; 311 | name = Debug; 312 | }; 313 | 607FACEE1AFB9204008FA782 /* Release */ = { 314 | isa = XCBuildConfiguration; 315 | buildSettings = { 316 | ALWAYS_SEARCH_USER_PATHS = NO; 317 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 318 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 319 | CLANG_CXX_LIBRARY = "libc++"; 320 | CLANG_ENABLE_MODULES = YES; 321 | CLANG_ENABLE_OBJC_ARC = YES; 322 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 323 | CLANG_WARN_BOOL_CONVERSION = YES; 324 | CLANG_WARN_COMMA = YES; 325 | CLANG_WARN_CONSTANT_CONVERSION = YES; 326 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 327 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 328 | CLANG_WARN_EMPTY_BODY = YES; 329 | CLANG_WARN_ENUM_CONVERSION = YES; 330 | CLANG_WARN_INFINITE_RECURSION = YES; 331 | CLANG_WARN_INT_CONVERSION = YES; 332 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 333 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 334 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 335 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 336 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 337 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 338 | CLANG_WARN_STRICT_PROTOTYPES = YES; 339 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 340 | CLANG_WARN_UNREACHABLE_CODE = YES; 341 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 342 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 343 | COPY_PHASE_STRIP = NO; 344 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 345 | ENABLE_NS_ASSERTIONS = NO; 346 | ENABLE_STRICT_OBJC_MSGSEND = YES; 347 | GCC_C_LANGUAGE_STANDARD = gnu99; 348 | GCC_NO_COMMON_BLOCKS = YES; 349 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 350 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 351 | GCC_WARN_UNDECLARED_SELECTOR = YES; 352 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 353 | GCC_WARN_UNUSED_FUNCTION = YES; 354 | GCC_WARN_UNUSED_VARIABLE = YES; 355 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 356 | MTL_ENABLE_DEBUG_INFO = NO; 357 | SDKROOT = iphoneos; 358 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 359 | VALIDATE_PRODUCT = YES; 360 | }; 361 | name = Release; 362 | }; 363 | 607FACF01AFB9204008FA782 /* Debug */ = { 364 | isa = XCBuildConfiguration; 365 | baseConfigurationReference = 7189861CD361A189190D71F2 /* Pods-SimpleExpandableView_Example.debug.xcconfig */; 366 | buildSettings = { 367 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 368 | CLANG_ENABLE_MODULES = YES; 369 | DEVELOPMENT_TEAM = SJ84SX66Q7; 370 | INFOPLIST_FILE = SimpleExpandableView/Info.plist; 371 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 372 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 373 | MODULE_NAME = ExampleApp; 374 | PRODUCT_BUNDLE_IDENTIFIER = "com.Tomortec.SimpleExpandableView-Example"; 375 | PRODUCT_NAME = "$(TARGET_NAME)"; 376 | SWIFT_OBJC_BRIDGING_HEADER = "SimpleExpandableView/SimpleExpandableView_Example-Bridging-Header.h"; 377 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 378 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 379 | SWIFT_VERSION = 4.0; 380 | }; 381 | name = Debug; 382 | }; 383 | 607FACF11AFB9204008FA782 /* Release */ = { 384 | isa = XCBuildConfiguration; 385 | baseConfigurationReference = B96940CE70D9EB7409D5AB14 /* Pods-SimpleExpandableView_Example.release.xcconfig */; 386 | buildSettings = { 387 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 388 | CLANG_ENABLE_MODULES = YES; 389 | DEVELOPMENT_TEAM = SJ84SX66Q7; 390 | INFOPLIST_FILE = SimpleExpandableView/Info.plist; 391 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 392 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 393 | MODULE_NAME = ExampleApp; 394 | PRODUCT_BUNDLE_IDENTIFIER = "com.Tomortec.SimpleExpandableView-Example"; 395 | PRODUCT_NAME = "$(TARGET_NAME)"; 396 | SWIFT_OBJC_BRIDGING_HEADER = "SimpleExpandableView/SimpleExpandableView_Example-Bridging-Header.h"; 397 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 398 | SWIFT_VERSION = 4.0; 399 | }; 400 | name = Release; 401 | }; 402 | /* End XCBuildConfiguration section */ 403 | 404 | /* Begin XCConfigurationList section */ 405 | 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "SimpleExpandableView" */ = { 406 | isa = XCConfigurationList; 407 | buildConfigurations = ( 408 | 607FACED1AFB9204008FA782 /* Debug */, 409 | 607FACEE1AFB9204008FA782 /* Release */, 410 | ); 411 | defaultConfigurationIsVisible = 0; 412 | defaultConfigurationName = Release; 413 | }; 414 | 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "SimpleExpandableView_Example" */ = { 415 | isa = XCConfigurationList; 416 | buildConfigurations = ( 417 | 607FACF01AFB9204008FA782 /* Debug */, 418 | 607FACF11AFB9204008FA782 /* Release */, 419 | ); 420 | defaultConfigurationIsVisible = 0; 421 | defaultConfigurationName = Release; 422 | }; 423 | /* End XCConfigurationList section */ 424 | }; 425 | rootObject = 607FACC81AFB9204008FA782 /* Project object */; 426 | } 427 | -------------------------------------------------------------------------------- /Example/SimpleExpandableView.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/SimpleExpandableView.xcodeproj/xcshareddata/xcschemes/SimpleExpandableView-Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 51 | 52 | 53 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 76 | 78 | 84 | 85 | 86 | 87 | 93 | 95 | 101 | 102 | 103 | 104 | 106 | 107 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /Example/SimpleExpandableView.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/SimpleExpandableView.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/SimpleExpandableView/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Example/SimpleExpandableView/ComponentExample.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ComponentExample.swift 3 | // SimpleExpandableView_Example 4 | // 5 | // Created by Tomortec on 2022/5/18. 6 | // Copyright © 2022 Tomortec. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import SimpleExpandableView 11 | 12 | struct ComponentExample: View { 13 | 14 | var body: some View { 15 | List { 16 | /* MARK: - Fixed Height */ 17 | ExpandableView( 18 | headerSize: CGSize(width: 300.0, height: 50.0), 19 | cardSize: CGSize(width: 300.0, height: 200.0), header: { 20 | Text("Fixed Height") 21 | .font(.title) 22 | .frame(maxWidth: .infinity, maxHeight: .infinity) 23 | .background(LinearGradient(colors: [.blue, .cyan], startPoint: .topTrailing, endPoint: .bottomLeading)) 24 | }, content: { 25 | Image(systemName: "heart.fill") 26 | .resizable() 27 | .aspectRatio(1.0, contentMode: .fit) 28 | // as you can see, compared with `No Shadow` view, the policy of resizing affects the animation 29 | .scaleEffect(0.6) 30 | }) 31 | .cardBackgroundColor(.cyan) 32 | .frame(maxWidth: .infinity) 33 | .listRowSeparator(.hidden) 34 | .listRowBackground(Color.clear) 35 | .padding(.vertical) 36 | 37 | /* MARK: - Dynamic Height */ 38 | ExpandableView( 39 | headerSize: CGSize(width: 300.0, height: 50.0), 40 | cardSize: CGSize(width: 300.0, height: 200.0), header: { 41 | Text("Dynamic Height") 42 | .font(.title) 43 | .frame(maxWidth: .infinity, maxHeight: .infinity) 44 | .background(LinearGradient(colors: [.red, .pink], startPoint: .topTrailing, endPoint: .bottomLeading)) 45 | }, content: { 46 | Image(systemName: "heart.fill") 47 | .resizable() 48 | // as you can see, compared with `Fixed Height` view, the policy of resizing affects the animation 49 | .frame(width: 120.0, height: 120.0) 50 | }) 51 | .cardBackgroundColor(.pink) 52 | .dynamicCardHeight() 53 | .frame(maxWidth: .infinity) 54 | .listRowSeparator(.hidden) 55 | .listRowBackground(Color.clear) 56 | .padding(.vertical) 57 | 58 | /* MARK: - No Shadow */ 59 | ExpandableView( 60 | headerSize: CGSize(width: 300.0, height: 50.0), 61 | cardSize: CGSize(width: 300.0, height: 200.0), header: { 62 | Text("No Shadow") 63 | .font(.title) 64 | .frame(maxWidth: .infinity, maxHeight: .infinity) 65 | .background(LinearGradient(colors: [.orange, .yellow], startPoint: .topTrailing, endPoint: .bottomLeading)) 66 | }, content: { 67 | Image(systemName: "heart.fill") 68 | .resizable() 69 | // as you can see, compared with `Fixed Height` view, the policy of resizing affects the animation 70 | .frame(width: 120.0, height: 120.0) 71 | }) 72 | .cardBackgroundColor(.yellow) 73 | .shadow(shadowRadius: 0) 74 | .frame(maxWidth: .infinity) 75 | .listRowSeparator(.hidden) 76 | .listRowBackground(Color.clear) 77 | .padding(.vertical) 78 | 79 | /* MARK: - Harmony */ 80 | ExpandableView( 81 | headerSize: CGSize(width: 300.0, height: 50.0), 82 | cardSize: CGSize(width: 300.0, height: 200.0), header: { 83 | Text("Harmony") 84 | .font(.title) 85 | }, content: { 86 | Image(systemName: "heart.fill") 87 | .resizable() 88 | .frame(width: 120.0, height: 120.0) 89 | }) 90 | .headerBackgroundColor(.mint) 91 | .cardBackgroundColor(.mint) 92 | .shadow(shadowRadius: 0) 93 | .frame(maxWidth: .infinity) 94 | .listRowSeparator(.hidden) 95 | .listRowBackground(Color.clear) 96 | .padding(.vertical) 97 | 98 | /* MARK: - More Complex One */ 99 | ExpandableView( 100 | headerSize: CGSize(width: 300.0, height: 80.0), 101 | cardSize: CGSize(width: 300.0, height: 200.0), header: { 102 | HStack { 103 | Image(systemName: "person.circle") 104 | .font(.largeTitle) 105 | VStack(alignment: .leading) { 106 | Text("Complex") 107 | .font(.title2) 108 | 109 | Text("SimpleExpandableView") 110 | } 111 | } 112 | }, content: { 113 | VStack { 114 | Image(systemName: "heart.fill") 115 | .resizable() 116 | .frame(width: 120.0, height: 120.0) 117 | 118 | Text("Designed with heart") 119 | .font(.title2) 120 | } 121 | }) 122 | .headerBackgroundColor(.purple) 123 | .cardBackgroundColor(.purple) 124 | .shadow(shadowRadius: 0) 125 | .frame(maxWidth: .infinity) 126 | .listRowSeparator(.hidden) 127 | .listRowBackground(Color.clear) 128 | .padding(.vertical) 129 | } 130 | .foregroundColor(.white) 131 | } 132 | } 133 | 134 | struct ComponentExamplePreviews: PreviewProvider { 135 | static var previews: some View { 136 | ComponentExample() 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /Example/SimpleExpandableView/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // SimpleExpandableView_Example 4 | // 5 | // Created by Tomortec on 2022/5/18. 6 | // Copyright © 2022 Tomortec. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import SimpleExpandableView 11 | 12 | struct ContentView: View { 13 | var body: some View { 14 | NavigationView { 15 | List { 16 | NavigationLink("ExpandableView Example", destination: { 17 | ComponentExample() 18 | }) 19 | NavigationLink("ExpandableViewsGroup Example", destination: { 20 | GroupExample() 21 | }) 22 | } 23 | .navigationTitle("Examples") 24 | } 25 | .navigationViewStyle(.columns) 26 | } 27 | } 28 | 29 | struct ContentViewPreviews: PreviewProvider { 30 | static var previews: some View { 31 | ContentView() 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Example/SimpleExpandableView/ExampleApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ExampleApp.swift 3 | // SimpleExpandableView_Example 4 | // 5 | // Created by Tomortec on 2022/5/18. 6 | // Copyright © 2022 Tomortec. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | @main 12 | struct ExampleApp: App { 13 | var body: some Scene { 14 | WindowGroup { 15 | ContentView() 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Example/SimpleExpandableView/GroupExample.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GroupExample.swift 3 | // SimpleExpandableView_Example 4 | // 5 | // Created by 李奥 on 2022/5/19. 6 | // Copyright © 2022 CocoaPods. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import SimpleExpandableView 11 | 12 | struct GroupExample: View { 13 | var body: some View { 14 | ExpandableViewsGroup(headerSize: CGSize(width: 300.0, height: 80.0), cardSize: CGSize(width: 300.0, height: 300.0), headerView: { 15 | HStack { 16 | Image(systemName: "person.circle") 17 | .font(.largeTitle) 18 | 19 | VStack { 20 | Text("Header") 21 | .font(.title) 22 | Text("SimpleExpandableView") 23 | } 24 | } 25 | .frame(maxWidth: .infinity, maxHeight: .infinity) 26 | .background(LinearGradient(colors: [.blue, .cyan], startPoint: .topTrailing, endPoint: .bottomLeading)) 27 | }, contentViews: {[ 28 | AnyView(Image(systemName: "heart.fill") 29 | .resizable() 30 | .aspectRatio(1.0, contentMode: .fit) 31 | .frame(width: 120, height: 120) 32 | .padding()), 33 | AnyView(Image(systemName: "sun.max.fill") 34 | .resizable() 35 | .aspectRatio(1.0, contentMode: .fit) 36 | .frame(width: 120, height: 120) 37 | .padding()), 38 | AnyView(Image(systemName: "moon.fill") 39 | .resizable() 40 | .aspectRatio(1.0, contentMode: .fit) 41 | .frame(width: 120, height: 120) 42 | .padding()) 43 | ]}) 44 | .cardBackgroundColor(.cyan) 45 | .shadow(shadowRadius: 0.0) 46 | .dynamicCardHeight() 47 | .verticalSpacing(10.0) 48 | .foregroundColor(.white) 49 | } 50 | } 51 | 52 | struct GroupExamplePreviews: PreviewProvider { 53 | static var previews: some View { 54 | GroupExample() 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Example/SimpleExpandableView/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /Example/SimpleExpandableView/SimpleExpandableView_Example-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2022 36720212 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /README-zh.md: -------------------------------------------------------------------------------- 1 | # SimpleExpandableView 2 | 3 | Banner 4 | 5 | Demo 6 | 7 | ## ExpandableView 结构 8 | Structure 9 | 10 | ## 小示例 11 | 12 | ``` Swift 13 | ExpandableView( 14 | headerSize: CGSize(width: 250.0, height: 50.0), 15 | cardSize: CGSize(width: 250.0, height: 250.0), header: { 16 | Text("Hello world") 17 | .foregroundColor(.white) 18 | .frame(maxWidth: .infinity, maxHeight: .infinity) 19 | .background(LinearGradient(colors: [.blue, .cyan], startPoint: .top, endPoint: .bottom)) 20 | }, content: { 21 | VStack { 22 | Image(systemName: "heart.fill") 23 | .resizable() 24 | .frame(width: 180, height: 180) 25 | Text("Hi") 26 | .font(.title2) 27 | } 28 | .foregroundColor(.white) 29 | }) 30 | .cardBackgroundColor(.cyan) 31 | .shadow(shadowRadius: 0.0) 32 | .listRowSeparator(.hidden) 33 | .frame(maxWidth: .infinity) // 居中 34 | .padding(.vertical, 5.0) 35 | ``` 36 | 37 | 克隆本仓库,在 `Example` 文件夹执行 `pod install` 后在 `Xcode` 运行示例项目来查看 demo 38 | 39 | ## ExpandableView 接口 40 | ### 初始化 41 | ``` swift 42 | init( 43 | headerSize: CGSize, 44 | cardSize: CGSize, 45 | @ViewBuilder header: () -> Header, 46 | @ViewBuilder content: () -> Content, 47 | onTapped action: (() -> ())? = nil // 当 headerView 被点击时执行的操作 48 | ) 49 | ``` 50 | 51 | ### 方法 52 | ``` swift 53 | // 改变 header view 的背景颜色 54 | func headerBackgroundColor(_ color: Color) 55 | 56 | // 改变 card view 的背景颜色 57 | func cardBackgroundColor(_ color: Color) 58 | 59 | // 改变 header view 的圆角大小 60 | func headerCornerRadius(_ radius: CGFloat) 61 | 62 | // 改变 card view 的圆角大小 63 | func cardCornerRadius(_ radius: CGFloat) 64 | 65 | // 设置 header view 和 card view 的阴影 66 | func shadow(shadowRadius: CGFloat = 6.0, color: Color = .gray, x: CGFloat = 0.0, y: CGFloat = 0.0) 67 | 68 | // 使用 content view 的高度来确定 card view 的高度 69 | func dynamicCardHeight() 70 | ``` 71 | 72 | ## ExpandableViewsGroup 接口 73 | ### 初始化 74 | ``` swift 75 | // 所有 ExpandableView 使用相同的 `headerView` 76 | init
( 77 | headerSize: CGSize, 78 | cardSize: CGSize, 79 | headerView: () -> Header, 80 | contentViews: () -> [AnyView] 81 | ) where Header : View 82 | 83 | // 使用泛型 84 | init( 85 | headerSize: CGSize, 86 | cardSize: CGSize, 87 | headerViews: () -> [Header], 88 | contentViews: () -> [Content] 89 | ) where Header : View, Content : View 90 | 91 | // 使用 AnyView 数组 92 | init( 93 | headerSize: CGSize, 94 | cardSize: CGSize, 95 | headerViews: () -> [AnyView], 96 | contentViews: () -> [AnyView] 97 | ) 98 | 99 | // 使用可变参数 100 | init( 101 | headerSize: CGSize, 102 | cardSize: CGSize, 103 | headerViews: AnyView..., 104 | contentViews: AnyView... 105 | ) 106 | ``` 107 | 108 | ### 方法 109 | ``` swift 110 | // 设置两个 `ExpandableView` 之间的空间 111 | func verticalSpacing(_ spacing: CGFloat) 112 | 113 | // 设置整个组的背景颜色 114 | func backgroundColor(_ color: Color) 115 | 116 | // 设置所有 header view 的背景颜色 117 | func headersBackgroundColor(_ color: Color) 118 | 119 | // 设置所有 card view 的背景颜色 120 | func cardBackgroundColor(_ color: Color) 121 | 122 | // 设置所有 header view 的圆角 123 | func headerCornerRadius(_ radius: CGFloat) 124 | 125 | // 设置所有 card view 的圆角 126 | func cardCornerRadius(_ radius: CGFloat) 127 | 128 | // 设置所有 header view 和 card view 的阴影 129 | func shadow(shadowRadius: CGFloat = 6.0, color: Color = .gray, x: CGFloat = 0.0, y: CGFloat = 0.0) 130 | 131 | // 将所有 `ExpandableView` 设置为 `.dynamicCardHeight()` 132 | func dynamicCardHeight() 133 | ``` 134 | 135 | 执行 Xcode 的 `Product > Build Documentation` 并前往文档中心来查看 `SimpleExpandableView` 的更多接口细节 136 | 137 | ## Swift 版本 138 | 139 | Swift >= 5.0 140 | 141 | ## 安装方法 142 | 143 | `SimpleExpandableView` 已在 [CocoaPods](https://cocoapods.org)发布。添加下列命令到你的 `Podfile` 来安装 `SimpleExpandableView`: 144 | 145 | ```ruby 146 | pod 'SimpleExpandableView' 147 | 148 | # 注意:如果您的 pod 没找到 `SimpleExpandableView`, 请使用下面的命令重试 149 | # pod `SimpleExpandableView`, :git => 'https://github.com/Tomortec/SimpleExpandableView.git' 150 | ``` 151 | 152 | ## 作者 153 | 154 | Tomortec, everything@tomortec.com 155 | 156 | ## License 157 | 158 | SimpleExpandableView is available under the MIT license. See the LICENSE file for more info. 159 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SimpleExpandableView 2 | 3 | Banner 4 | 5 | [中文说明](./README-zh.md) 6 | 7 | Demo 8 | 9 | ## ExpandableView structure 10 | Structure 11 | 12 | ## Example 13 | 14 | ``` Swift 15 | ExpandableView( 16 | headerSize: CGSize(width: 250.0, height: 50.0), 17 | cardSize: CGSize(width: 250.0, height: 250.0), header: { 18 | Text("Hello world") 19 | .foregroundColor(.white) 20 | .frame(maxWidth: .infinity, maxHeight: .infinity) 21 | .background(LinearGradient(colors: [.blue, .cyan], startPoint: .top, endPoint: .bottom)) 22 | }, content: { 23 | VStack { 24 | Image(systemName: "heart.fill") 25 | .resizable() 26 | .frame(width: 180, height: 180) 27 | Text("Hi") 28 | .font(.title2) 29 | } 30 | .foregroundColor(.white) 31 | }) 32 | .cardBackgroundColor(.cyan) 33 | .shadow(shadowRadius: 0.0) 34 | .listRowSeparator(.hidden) 35 | .frame(maxWidth: .infinity) // align center 36 | .padding(.vertical, 5.0) 37 | ``` 38 | 39 | To run the example project, clone the repo, and run `pod install` from the Example directory first. 40 | 41 | ## ExpandableView Interfaces 42 | ### Initialization 43 | ``` swift 44 | init( 45 | headerSize: CGSize, 46 | cardSize: CGSize, 47 | @ViewBuilder header: () -> Header, 48 | @ViewBuilder content: () -> Content, 49 | onTapped action: (() -> ())? = nil // action to do when the header view is tapped 50 | ) 51 | ``` 52 | 53 | ### Methods 54 | ``` swift 55 | // Change the background color of header view 56 | func headerBackgroundColor(_ color: Color) 57 | 58 | // Change the background color of the card view 59 | func cardBackgroundColor(_ color: Color) 60 | 61 | // Change the corner radius of the header view 62 | func headerCornerRadius(_ radius: CGFloat) 63 | 64 | // Change the corner radius of the card view 65 | func cardCornerRadius(_ radius: CGFloat) 66 | 67 | // Change the shadow of the whole view (both header view and card view will render shadow) 68 | func shadow(shadowRadius: CGFloat = 6.0, color: Color = .gray, x: CGFloat = 0.0, y: CGFloat = 0.0) 69 | 70 | // Determine the height of the card view by the `contentView` you passed instead of a fixed height 71 | func dynamicCardHeight() 72 | ``` 73 | 74 | ## ExpandableViewsGroup Interfaces 75 | ### Initialization 76 | ``` swift 77 | // Share the same `headerView` 78 | init
( 79 | headerSize: CGSize, 80 | cardSize: CGSize, 81 | headerView: () -> Header, 82 | contentViews: () -> [AnyView] 83 | ) where Header : View 84 | 85 | // Using generics 86 | init( 87 | headerSize: CGSize, 88 | cardSize: CGSize, 89 | headerViews: () -> [Header], 90 | contentViews: () -> [Content] 91 | ) where Header : View, Content : View 92 | 93 | // Using AnyView array 94 | init( 95 | headerSize: CGSize, 96 | cardSize: CGSize, 97 | headerViews: () -> [AnyView], 98 | contentViews: () -> [AnyView] 99 | ) 100 | 101 | // Using variadic parameters 102 | init( 103 | headerSize: CGSize, 104 | cardSize: CGSize, 105 | headerViews: AnyView..., 106 | contentViews: AnyView... 107 | ) 108 | ``` 109 | 110 | ### Methods 111 | ``` swift 112 | // Set the vertical spacing between two `ExpandableView` 113 | func verticalSpacing(_ spacing: CGFloat) 114 | 115 | // Change the background color of the group 116 | func backgroundColor(_ color: Color) 117 | 118 | // Change the background color of all header views 119 | func headersBackgroundColor(_ color: Color) 120 | 121 | // Change the background color of all card views 122 | func cardBackgroundColor(_ color: Color) 123 | 124 | // Change the corner radius of all header views 125 | func headerCornerRadius(_ radius: CGFloat) 126 | 127 | // Change the corner radius of all card views 128 | func cardCornerRadius(_ radius: CGFloat) 129 | 130 | // Change the shadow of all views in the group (header views and card views included) 131 | func shadow(shadowRadius: CGFloat = 6.0, color: Color = .gray, x: CGFloat = 0.0, y: CGFloat = 0.0) 132 | 133 | // Set all `ExpandableView` in the group with `.dynamicCardHeight()` 134 | func dynamicCardHeight() 135 | ``` 136 | 137 | Execute Xcode's `Product > Build Documentation` and go to `SimpleExpandableView`'s documentation for more details. 138 | 139 | ## Requirements 140 | 141 | Swift >= 5.0 142 | 143 | ## Installation 144 | 145 | SimpleExpandableView is available through [CocoaPods](https://cocoapods.org). To install 146 | it, simply add the following line to your Podfile: 147 | 148 | ```ruby 149 | pod 'SimpleExpandableView' 150 | 151 | # Note that if cocoapods cannot find `SimpleExpandableView`, please try the command below 152 | # pod `SimpleExpandableView`, :git => 'https://github.com/Tomortec/SimpleExpandableView.git' 153 | ``` 154 | 155 | ## Author 156 | 157 | Tomortec, everything@tomortec.com 158 | 159 | ## License 160 | 161 | SimpleExpandableView is available under the MIT license. See the LICENSE file for more info. 162 | -------------------------------------------------------------------------------- /SimpleExpandableView.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint SimpleExpandableView.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'SimpleExpandableView' 11 | s.version = '0.1.0' 12 | s.summary = '`SimpleExpandableView` is a SwiftUI view which can collapse and expand the content' 13 | 14 | s.description = <<-DESC 15 | `SimpleExpandableView` is a SwiftUI view which can collapse the detail content and expand it when you want . 16 | You can easily change the appearance of the view as you want. 17 | This view is concise and easy to modify 18 | DESC 19 | 20 | s.homepage = 'https://github.com/Tomortec/SimpleExpandableView' 21 | s.screenshots = './screenshot.png' 22 | s.license = { :type => 'MIT', :file => 'LICENSE' } 23 | s.author = { 'Tomortec' => 'everything@tomortec.com' } 24 | s.source = { :git => 'https://github.com/Tomortec/SimpleExpandableView.git', :tag => s.version.to_s } 25 | 26 | s.swift_version = '5.6' 27 | s.ios.deployment_target = '15.0' 28 | 29 | s.source_files = 'SimpleExpandableView/Classes/**/*' 30 | end 31 | -------------------------------------------------------------------------------- /SimpleExpandableView/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tomortec/SimpleExpandableView/fe082e501905b0829822af7666b1f8e104cea5be/SimpleExpandableView/Assets/.gitkeep -------------------------------------------------------------------------------- /SimpleExpandableView/Classes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tomortec/SimpleExpandableView/fe082e501905b0829822af7666b1f8e104cea5be/SimpleExpandableView/Classes/.gitkeep -------------------------------------------------------------------------------- /SimpleExpandableView/Classes/ExpandableView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ExpandableView.swift 3 | // SimpleExpandableView 4 | // 5 | // Created by Tomortec on 2022/5/18. 6 | // Copyright © 2022 Tomortec. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /** 12 | ExpandableView with `headerView` and `contentView` 13 | 14 | Simple Example: 15 | ``` swift 16 | List { 17 | ForEach(0 ..< 5) { 18 | _ in 19 | ExpandableView( 20 | headerSize: CGSize(width: 250.0, height: 50.0), 21 | cardSize: CGSize(width: 250.0, height: 250.0), header: { 22 | Text("Hello world") 23 | .foregroundColor(.white) 24 | .frame(maxWidth: .infinity, maxHeight: .infinity) 25 | .background(LinearGradient(colors: [.blue, .cyan], startPoint: .top, endPoint: .bottom)) 26 | }, content: { 27 | VStack { 28 | Image(systemName: "heart.fill") 29 | .resizable() 30 | .frame(width: 180, height: 180) 31 | Text("Hi") 32 | .font(.title2) 33 | } 34 | .foregroundColor(.white) 35 | }) 36 | .cardBackgroundColor(.cyan) 37 | .shadow(shadowRadius: 0.0) 38 | .listRowSeparator(.hidden) 39 | .frame(maxWidth: .infinity) // align center 40 | .padding(.vertical, 5.0) 41 | } 42 | } 43 | ``` 44 | */ 45 | public struct ExpandableView: View { 46 | 47 | let headerView: Header 48 | let contentView: Content 49 | 50 | /// The size of the header view 51 | let headerSize: CGSize 52 | 53 | /// The passed size of the card 54 | private(set) var cardSize: CGSize 55 | 56 | /// The height of the `contentView` 57 | @State private(set) var contentHeight: CGFloat = 100.0 58 | 59 | /// The height of the card 60 | /// 61 | /// - note: if the height of `cardSize` is negative, this value will be the height of `contentView`, that is 'dynamic height'. 62 | var desiredCardHeight: CGFloat { 63 | cardSize.height < 0.0 ? contentHeight : cardSize.height 64 | } 65 | 66 | var headerBackgroundColor: Color = .white 67 | var cardBackgroundColor: Color = .white 68 | 69 | var headerCornerRadius: CGFloat = 12.0 70 | var cardCornerRadius: CGFloat = 12.0 71 | 72 | var shadowRadius: CGFloat = 6.0 73 | var shadowColor: Color = .gray 74 | var shadowXOffset: CGFloat = 0.0 75 | var shadowYOffset: CGFloat = 0.0 76 | 77 | /// Used to remove the space between header and card 78 | private var cardYOffset: CGFloat { 79 | -1 * (headerCornerRadius + cardCornerRadius) 80 | } 81 | 82 | @State var isExpanding: Bool = false 83 | let action: (() -> ())? 84 | 85 | /// Construct an `ExpandableView` with must-have paras: `headerSize`, `cardSize`, `header`, `content` 86 | /// 87 | /// - parameters: 88 | /// - headerSize: defines the size of the `header`. Required 89 | /// - cardSize: defines the size of the `cardView`. Note that you can fix the size of the `cardView` by providing a valid height. Or if you'd like the height of the `cardView` to adapt to that of the `contentView`, you can provide a negative height or just call `dynamicCardHeight()` method. Required 90 | /// - header: the content of `headerView`. Required 91 | /// - content: the `contentView`, that is, the content of `cardView`. Required 92 | /// - onTapped: the closure to execute when the `headerView` is tapped. Default is `nil` 93 | /// 94 | /// - note: if you are trying to wrap `ExpandableView` with `VStack`, affected by the coordinate, the `ExpandableView` will expand in two directions. A recommended container is `List` (you can remove the separator by calling `ExpandableView(...).listRowSeparator(.hidden)`) 95 | /// - note: if you'd like to use `View` as your background (like `LinearGradient`, `Shape`), modify your passed `headerView` instead of calling `.headerBackgroundColor(_:)` which only accepts `Color` 96 | /// - note: if you are only changing the background color of the `contentView` you passed, you will find that there is white space (brought by `cornerRadius`) between the `headerView` and the `contentView`. To avoid the unwanted result, use `.cardBackgroundColor(_:)` method instead. 97 | /// - note: you can fix the size of the `cardView` by providing a valid height. Or if you'd like the height of the `cardView` to adapt to that of the `contentView`, you can provide a negative height or just call `dynamicCardHeight()` method. 98 | public init( 99 | headerSize: CGSize, 100 | cardSize: CGSize, 101 | @ViewBuilder header: () -> Header, 102 | @ViewBuilder content: () -> Content, 103 | onTapped action: (() -> ())? = nil 104 | ) { 105 | self.headerView = header() 106 | self.contentView = content() 107 | self.headerSize = headerSize 108 | self.cardSize = cardSize 109 | self.action = action 110 | } 111 | 112 | public var body: some View { 113 | // used to modify the whole view's coordinate 114 | GeometryReader { 115 | _ in 116 | VStack(spacing: cardYOffset) { 117 | HeaderView(size: headerSize, header: { 118 | headerView 119 | }) 120 | .background(headerBackgroundColor) 121 | .cornerRadius(headerCornerRadius) 122 | .zIndex(5) 123 | .onTapGesture { 124 | withAnimation { 125 | isExpanding.toggle() 126 | } 127 | action?() 128 | } 129 | 130 | VStack(spacing: 0.0) { 131 | // as a spacer to prevent the `contentView` from moving upwards, being masked by the `headerView` 132 | cardBackgroundColor.frame(width: cardSize.width, height: abs(cardYOffset)) 133 | 134 | ChildHeightReader(height: $contentHeight) { 135 | contentView 136 | } 137 | } 138 | .frame(width: cardSize.width) 139 | .animatingCellHeight(isExpanding ? desiredCardHeight + abs(cardYOffset) : 0.0) 140 | .background(cardBackgroundColor) 141 | .cornerRadius(cardCornerRadius) 142 | } 143 | .shadow(color: shadowColor, radius: shadowRadius, x: shadowXOffset, y: shadowYOffset) 144 | } 145 | .frame(width: max(headerSize.width, cardSize.width)) 146 | .animatingCellHeight(isExpanding ? headerSize.height + desiredCardHeight : headerSize.height) 147 | } 148 | } 149 | 150 | /* MARK: - Config for Appearance */ 151 | extension ExpandableView { 152 | /// Change the background color of header view 153 | /// 154 | /// - note: if you'd like to use `View` as your background (like `LinearGradient`, `Shape`), modify your passed `headerView` instead of calling this method 155 | /// For example: 156 | /// ``` Swift 157 | /// ExpandableView( 158 | /// headerSize: CGSize(width: 200.0, height: 50.0), 159 | /// cardSize: CGSize(width: 200.0, height: 200.0), header: { 160 | /// Text("Hello world") 161 | /// .foregroundColor(.white) 162 | /// .frame(maxWidth: .infinity, maxHeight: .infinity) 163 | /// .background(LinearGradient(colors: [.blue, .cyan], startPoint: .top, endPoint: .bottom)) 164 | /// }, content: { 165 | /// Text("Hi") 166 | /// }) 167 | /// 168 | /// ``` 169 | public func headerBackgroundColor(_ color: Color) -> Self { 170 | var copied = self 171 | copied.headerBackgroundColor = color 172 | return copied 173 | } 174 | 175 | /// Change the background color of the card view 176 | /// 177 | /// - note: if you are only changing the background color of the `contentView` you passed (Just like the codes below shows), you will find that there is white space (brought by `cornerRadius`) between the `headerView` and the `contentView`. To avoid the unwanted result, use this method instead. 178 | /// ``` Swift 179 | /// ExpandableView( 180 | /// headerSize: CGSize(width: 200.0, height: 50.0), 181 | /// cardSize: CGSize(width: 200.0, height: 200.0), header: { 182 | /// Text("Hello world") 183 | /// .foregroundColor(.white) 184 | /// .frame(maxWidth: .infinity, maxHeight: .infinity) 185 | /// .background(LinearGradient(colors: [.blue, .cyan], startPoint: .top, endPoint: .bottom)) 186 | /// }, content: { 187 | /// Text("Hi") 188 | /// .foregroundColor(.white) 189 | /// .frame(maxWidth: .infinity, maxHeight: .infinity) 190 | /// .background(.cyan) // just changing the background color of the `contentView` may cause unwanted result 191 | /// }) 192 | /// ``` 193 | public func cardBackgroundColor(_ color: Color) -> Self { 194 | var copied = self 195 | copied.cardBackgroundColor = color 196 | return copied 197 | } 198 | 199 | /// Change the corner radius of the header view 200 | public func headerCornerRadius(_ radius: CGFloat) -> Self { 201 | var copied = self 202 | copied.headerCornerRadius = radius 203 | return copied 204 | } 205 | 206 | /// Change the corner radius of the card view 207 | public func cardCornerRadius(_ radius: CGFloat) -> Self { 208 | var copied = self 209 | copied.cardCornerRadius = radius 210 | return copied 211 | } 212 | 213 | /// Change the shadow of the whole view (both header view and card view will render shadow) 214 | public func shadow( 215 | shadowRadius: CGFloat = 6.0, 216 | color: Color = .gray, 217 | x: CGFloat = 0.0, 218 | y: CGFloat = 0.0 219 | ) -> Self { 220 | var copied = self 221 | copied.shadowRadius = shadowRadius 222 | copied.shadowColor = color 223 | copied.shadowXOffset = x 224 | copied.shadowYOffset = y 225 | return copied 226 | } 227 | 228 | /// Determine the height of the card view by the `contentView` you passed instead of a fixed height 229 | /// 230 | /// - note: Once this method is called, the height of `cardSize` you passed in constructor will make no sense and be set to `-1.0`. In the logic of `ExpandableView`, a card view with negative height means dynamic height is needed. 231 | public func dynamicCardHeight() -> Self { 232 | var copied = self 233 | copied.cardSize.height = -1.0 234 | return copied 235 | } 236 | } 237 | -------------------------------------------------------------------------------- /SimpleExpandableView/Classes/ExpandableViewGroup.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ExpandableViewGroup.swift 3 | // SimpleExpandableView 4 | // 5 | // Created by Tomortec on 2022/5/18. 6 | // Copyright © 2022 Tomortec. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /** 12 | A list of `ExpandableView` contained by `List` 13 | 14 | There are four constructors to create an `ExpandableViewGroup`. 15 | 16 | Simple example: 17 | ``` swift 18 | /* MARK: - Sharing the Same Header */ 19 | ExpandableViewsGroup( 20 | headerSize: CGSize(width: 200.0, height: 50.0), 21 | cardSize: CGSize(width: 200.0, height: 200.0), headerView: { 22 | Text("Hello") 23 | }, contentViews: {[ 24 | AnyView(Text("Hi")), 25 | AnyView(Text("123")) 26 | ]}) 27 | 28 | /* MARK: - Using Generics */ 29 | ExpandableViewsGroup( 30 | headerSize: CGSize(width: 200, height: 50), 31 | cardSize: CGSize(width: 200, height: 200), headerViews: { 32 | [Text("Hi")] 33 | }, contentViews: { 34 | [Text("Hello"), Text("123"), Text(";")] 35 | }) 36 | 37 | /* MARK: - Using [AnyView] */ 38 | ExpandableViewsGroup( 39 | headerSize: CGSize(width: 200, height: 50), 40 | cardSize: CGSize(width: 200, height: 200), headerViews: { 41 | [AnyView(Text("Hi"))] 42 | }, contentViews: { 43 | Array(repeating: AnyView(Image(systemName: "heart.fill")), count: 5) 44 | }) 45 | 46 | /* MARK: - Using Variadic Parameters */ 47 | ExpandableViewsGroup( 48 | headerSize: CGSize(width: 200, height: 50), 49 | cardSize: CGSize(width: 200, height: 200), 50 | headerViews: AnyView(Text("Hello")), AnyView(Text("Hi")), 51 | contentViews: AnyView(Text("With")), AnyView(Text("123"))) 52 | ``` 53 | 54 | - note: the `ExpandableViewsGroup` will hide list row separator, align expandable views center, have the group's background color `.clear` by default. 55 | - todo: expose methods to configure specific `ExpandableView` 56 | */ 57 | public struct ExpandableViewsGroup: View { 58 | 59 | let headerViews: [AnyView] 60 | let contentViews: [AnyView] 61 | 62 | let headerSize: CGSize 63 | private(set) var cardSize: CGSize 64 | 65 | var verticalSpacing: CGFloat = 10.0 66 | 67 | /// The background color of the group 68 | var backgroundColor: Color = .clear 69 | 70 | var headerBackgroundColor: Color = .white 71 | var cardBackgroundColor: Color = .white 72 | 73 | var headerCornerRadius: CGFloat = 12.0 74 | var cardCornerRadius: CGFloat = 12.0 75 | 76 | var shadowRadius: CGFloat = 6.0 77 | var shadowColor: Color = .gray 78 | var shadowXOffset: CGFloat = 0.0 79 | var shadowYOffset: CGFloat = 0.0 80 | 81 | /// Construct a `ExpandableViewsGroup` with must-have paras: `headerSize`, `cardSize`, `headerViews`, `contentViews` 82 | /// 83 | /// - parameters: 84 | /// - headerSize: the size of the `headerView`. Required 85 | /// - cardSize: defines the size of the `cardView`. Note that you can fix the size of the `cardView` by providing a valid height. Or if you'd like the height of the `cardView` to adapt to that of the `contentViews`, you can provide a negative height or just call `dynamicCardHeight()` method. Required 86 | /// - headerView: the content of header views. Required 87 | /// - contentViews: the content of card views. Required 88 | /// 89 | /// - note: Using this constructor will make all `ExpandableView` in the group share the same header view 90 | public init
( 91 | headerSize: CGSize, 92 | cardSize: CGSize, 93 | headerView: () -> Header, 94 | contentViews: () -> [AnyView] 95 | ) where Header : View { 96 | self.headerSize = headerSize 97 | self.cardSize = cardSize 98 | self.headerViews = Array(arrayLiteral: AnyView(headerView())) 99 | self.contentViews = contentViews() 100 | } 101 | 102 | /// Construct a `ExpandableViewsGroup` with must-have paras: `headerSize`, `cardSize`, `headerViews`, `contentViews` 103 | /// 104 | /// - parameters: 105 | /// - headerSize: the size of the `headerViews`. Required 106 | /// - cardSize: defines the size of the `cardView`. Note that you can fix the size of the `cardView` by providing a valid height. Or if you'd like the height of the `cardView` to adapt to that of the `contentViews`, you can provide a negative height or just call `dynamicCardHeight()` method. Required 107 | /// - headerViews: the content of header views. Required 108 | /// - contentViews: the content of card views. Required 109 | /// 110 | /// - note: if the count of `headerViews` is `1`, all of the `ExpandableView`s will share the same header view. Or if the count of `headerViews` equals to that of `contentViews`, one header view will match one content view. 111 | /// - important: if the count of `headerViews` is neither `1` nor matches the `contentViews`'s, a `fatalError` will be thrown 112 | /// - important: the types of elements in `headerViews` must be the same, or the compiler will throw an error. So does `contentViews`. If you prefer different types, wrap each element with `AnyView(_:)` as the example in ``ExpandableViewsGroup`` does (buidling documentation is needed). 113 | public init( 114 | headerSize: CGSize, 115 | cardSize: CGSize, 116 | headerViews: () -> [Header], 117 | contentViews: () -> [Content] 118 | ) where Header : View, Content : View { 119 | self.headerSize = headerSize 120 | self.cardSize = cardSize 121 | self.headerViews = headerViews().map { AnyView($0) } 122 | self.contentViews = contentViews().map { AnyView($0) } 123 | } 124 | 125 | /// Construct a `ExpandableViewsGroup` with must-have paras: `headerSize`, `cardSize`, `headerViews`, `contentViews` 126 | /// 127 | /// - parameters: 128 | /// - headerSize: the size of the `headerViews`. Required 129 | /// - cardSize: defines the size of the `cardView`. Note that you can fix the size of the `cardView` by providing a valid height. Or if you'd like the height of the `cardView` to adapt to that of the `contentViews`, you can provide a negative height or just call `dynamicCardHeight()` method. Required 130 | /// - headerViews: the content of header views. Required 131 | /// - contentViews: the content of card views. Required 132 | /// 133 | /// - note: if the count of `headerViews` is `1`, all of the `ExpandableView`s will share the same header view. Or if the count of `headerViews` equals to that of `contentViews`, one header view will match one content view. 134 | /// - important: if the count of `headerViews` is neither `1` nor matches the `contentViews`'s, a `fatalError` will be thrown 135 | public init( 136 | headerSize: CGSize, 137 | cardSize: CGSize, 138 | headerViews: () -> [AnyView], 139 | contentViews: () -> [AnyView] 140 | ) { 141 | self.headerViews = headerViews() 142 | self.contentViews = contentViews() 143 | self.headerSize = headerSize 144 | self.cardSize = cardSize 145 | } 146 | 147 | /// Construct a `ExpandableViewsGroup` with must-have paras: `headerSize`, `cardSize`, `headerViews`, `contentViews` 148 | /// 149 | /// - parameters: 150 | /// - headerSize: the size of the `headerViews`. Required 151 | /// - cardSize: defines the size of the `cardView`. Note that you can fix the size of the `cardView` by providing a valid height. Or if you'd like the height of the `cardView` to adapt to that of the `contentViews`, you can provide a negative height or just call `dynamicCardHeight()` method. Required 152 | /// - headerViews: the content of header views. Required 153 | /// - contentViews: the content of card views. Required 154 | /// 155 | /// - note: if the count of `headerViews` is `1`, all of the `ExpandableView`s will share the same header view. Or if the count of `headerViews` equals to that of `contentViews`, one header view will match one content view. 156 | /// - important: if the count of `headerViews` is neither `1` nor matches the `contentViews`'s, a `fatalError` will be thrown 157 | public init( 158 | headerSize: CGSize, 159 | cardSize: CGSize, 160 | headerViews: AnyView..., 161 | contentViews: AnyView... 162 | ) { 163 | self.headerViews = headerViews 164 | self.contentViews = contentViews 165 | self.headerSize = headerSize 166 | self.cardSize = cardSize 167 | } 168 | 169 | public var body: some View { 170 | List { 171 | if headerViews.count == 1 || 172 | headerViews.count == contentViews.count { 173 | 174 | ForEach(contentViews.startIndex ..< contentViews.endIndex, id: \.self) { 175 | index in 176 | ExpandableView(headerSize: headerSize, cardSize: cardSize, header: { 177 | headerViews.count == 1 ? headerViews.first! : headerViews[index] 178 | }, content: { 179 | contentViews[index] 180 | }) 181 | .headerBackgroundColor(headerBackgroundColor) 182 | .cardBackgroundColor(cardBackgroundColor) 183 | .headerCornerRadius(headerCornerRadius) 184 | .cardCornerRadius(cardCornerRadius) 185 | .shadow(shadowRadius: shadowRadius, color: shadowColor, x: shadowXOffset, y: shadowYOffset) 186 | .listRowSeparator(.hidden) 187 | .listRowBackground(backgroundColor) 188 | .listRowInsets(EdgeInsets(top: 0.0, leading: 0.0, bottom: 0.0, trailing: 0.0)) 189 | .frame(maxWidth: .infinity) // align center 190 | .padding(.vertical, verticalSpacing / 2.0) 191 | } 192 | 193 | } else { 194 | fatalError("ExpandableViewsGroup requires your headerViews.count equals 1 or equals to contentViews.count") 195 | } 196 | } 197 | } 198 | } 199 | 200 | extension ExpandableViewsGroup { 201 | /// Set the vertical spacing between two `ExpandableView` 202 | public func verticalSpacing(_ spacing: CGFloat) -> Self { 203 | var copied = self 204 | copied.verticalSpacing = spacing 205 | return copied 206 | } 207 | 208 | /// Change the background color of the group 209 | public func backgroundColor(_ color: Color) -> Self { 210 | var copied = self 211 | copied.backgroundColor = color 212 | return copied 213 | } 214 | 215 | /// Change the background color of all header views 216 | /// 217 | /// See also ``ExpandableView/headerBackgroundColor(_:)`` 218 | public func headersBackgroundColor(_ color: Color) -> Self { 219 | var copied = self 220 | copied.headerBackgroundColor = color 221 | return copied 222 | } 223 | 224 | /// Change the background color of all card views 225 | /// 226 | /// See also ``ExpandableView/cardBackgroundColor(_:)`` 227 | public func cardBackgroundColor(_ color: Color) -> Self { 228 | var copied = self 229 | copied.cardBackgroundColor = color 230 | return copied 231 | } 232 | 233 | /// Change the corner radius of all header views 234 | /// 235 | /// See also ``ExpandableView/headerCornerRadius(_:)`` 236 | public func headerCornerRadius(_ radius: CGFloat) -> Self { 237 | var copied = self 238 | copied.headerCornerRadius = radius 239 | return copied 240 | } 241 | 242 | /// Change the corner radius of all card views 243 | /// 244 | /// See also ``ExpandableView/cardCornerRadius(_:)`` 245 | public func cardCornerRadius(_ radius: CGFloat) -> Self { 246 | var copied = self 247 | copied.cardCornerRadius = radius 248 | return copied 249 | } 250 | 251 | /// Change the shadow of all views in the group (header views and card views included) 252 | /// 253 | /// See also ``ExpandableView/shadow(shadowRadius:color:x:y:)`` 254 | public func shadow( 255 | shadowRadius: CGFloat = 6.0, 256 | color: Color = .gray, 257 | x: CGFloat = 0.0, 258 | y: CGFloat = 0.0 259 | ) -> Self { 260 | var copied = self 261 | copied.shadowRadius = shadowRadius 262 | copied.shadowColor = color 263 | copied.shadowXOffset = x 264 | copied.shadowYOffset = y 265 | return copied 266 | } 267 | 268 | /// Set all `ExpandableView` in the group with `.dynamicCardHeight()` 269 | /// 270 | /// See Also: ``ExpandableView/dynamicCardHeight()`` 271 | public func dynamicCardHeight() -> Self { 272 | var copied = self 273 | copied.cardSize.height = -1.0 274 | return copied 275 | } 276 | } 277 | -------------------------------------------------------------------------------- /SimpleExpandableView/Classes/HeaderView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HeaderView.swift 3 | // SimpleExpandableView 4 | // 5 | // Created by Tomortec on 2022/5/18. 6 | // Copyright © 2022 Tomortec. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct HeaderView: View { 12 | 13 | let headerView: V 14 | 15 | let size: CGSize 16 | var cornerRadius: CGFloat = 12.0 17 | 18 | init(size: CGSize, @ViewBuilder header: () -> V) { 19 | self.headerView = header() 20 | self.size = size 21 | } 22 | 23 | var body: some View { 24 | ZStack { 25 | headerView 26 | } 27 | .frame(width: size.width, height: size.height) 28 | .cornerRadius(cornerRadius) 29 | } 30 | } 31 | 32 | extension HeaderView { 33 | func cornerRadius(_ radius: CGFloat) -> Self { 34 | var copied = self 35 | copied.cornerRadius = radius 36 | return self 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /SimpleExpandableView/Classes/Utilities.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Utilities.swift 3 | // SimpleExpandableView 4 | // 5 | // Created by Tomortec on 2022/5/18. 6 | // Copyright © 2022 Tomortec. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /* MARK: - Animation Modifier */ 12 | struct AnimatingCellHeight: AnimatableModifier { 13 | var height: CGFloat = 0 14 | 15 | var animatableData: CGFloat { 16 | get { height } 17 | set { height = newValue } 18 | } 19 | 20 | func body(content: Content) -> some View { 21 | content.frame(height: height) 22 | } 23 | } 24 | 25 | extension View { 26 | func animatingCellHeight(_ height: CGFloat) -> some View { 27 | modifier(AnimatingCellHeight(height: height)) 28 | } 29 | } 30 | 31 | /* MARK: - Child Height Reader */ 32 | struct ChildHeightReader: View { 33 | @Binding var height: CGFloat 34 | let content: () -> Content 35 | 36 | var body: some View { 37 | ZStack { 38 | content() 39 | .background( 40 | GeometryReader { 41 | proxy in 42 | Color.clear 43 | .preference(key: HeightPreferenceKey.self, 44 | value: proxy.size.height) 45 | } 46 | ) 47 | } 48 | .onPreferenceChange(HeightPreferenceKey.self) { 49 | value in 50 | height = value 51 | } 52 | } 53 | } 54 | 55 | struct HeightPreferenceKey: PreferenceKey { 56 | typealias Value = CGFloat 57 | static var defaultValue: CGFloat = .zero 58 | 59 | static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) { 60 | value = nextValue() 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj -------------------------------------------------------------------------------- /demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tomortec/SimpleExpandableView/fe082e501905b0829822af7666b1f8e104cea5be/demo.gif -------------------------------------------------------------------------------- /pic-structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tomortec/SimpleExpandableView/fe082e501905b0829822af7666b1f8e104cea5be/pic-structure.png -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tomortec/SimpleExpandableView/fe082e501905b0829822af7666b1f8e104cea5be/screenshot.png --------------------------------------------------------------------------------