├── .gitignore ├── .swiftlint.yml ├── LICENSE ├── Podfile ├── Podfile.lock ├── Pods ├── Manifest.lock ├── Pods.xcodeproj │ └── project.pbxproj ├── SwiftLint │ ├── LICENSE │ └── swiftlint └── Target Support Files │ ├── Pods-ScrollableTabController │ ├── Info.plist │ ├── Pods-ScrollableTabController-acknowledgements.markdown │ ├── Pods-ScrollableTabController-acknowledgements.plist │ ├── Pods-ScrollableTabController-dummy.m │ ├── Pods-ScrollableTabController-resources.sh │ ├── Pods-ScrollableTabController-umbrella.h │ ├── Pods-ScrollableTabController.debug.xcconfig │ ├── Pods-ScrollableTabController.modulemap │ └── Pods-ScrollableTabController.release.xcconfig │ └── Pods-ScrollableTabControllerDemo │ ├── Info.plist │ ├── Pods-ScrollableTabControllerDemo-acknowledgements.markdown │ ├── Pods-ScrollableTabControllerDemo-acknowledgements.plist │ ├── Pods-ScrollableTabControllerDemo-dummy.m │ ├── Pods-ScrollableTabControllerDemo-frameworks.sh │ ├── Pods-ScrollableTabControllerDemo-resources.sh │ ├── Pods-ScrollableTabControllerDemo-umbrella.h │ ├── Pods-ScrollableTabControllerDemo.debug.xcconfig │ ├── Pods-ScrollableTabControllerDemo.modulemap │ └── Pods-ScrollableTabControllerDemo.release.xcconfig ├── README.md ├── ScrollableTabController.podspec ├── ScrollableTabController.xcodeproj └── project.pbxproj ├── ScrollableTabController.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── ScrollableTabControllerDemo ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon@2x.png │ │ └── Icon@3x.png │ ├── Button.imageset │ │ ├── Contents.json │ │ └── Rectangle 17 Copy@3x.png │ ├── Cell.imageset │ │ ├── Contents.json │ │ └── Dummy Cell@3x.png │ ├── Contents.json │ ├── CoverImage.imageset │ │ ├── Contents.json │ │ └── night@3x.png │ ├── ImageCell.imageset │ │ ├── Contents.json │ │ └── Dummy Image Cell@3x.png │ ├── LaunchBackground.imageset │ │ ├── Contents.json │ │ └── iPhone 7@3x.png │ └── PlaceholderText.imageset │ │ ├── Contents.json │ │ └── Group 12@3x.png ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Info.plist ├── ProfileViewController.swift └── TimelineViewController.swift └── Source ├── Extensions.swift ├── Info.plist ├── Log.swift ├── ScrollableTabController.h ├── ScrollableTabController.swift ├── ScrollableTabController.xib └── TouchTransparentView.swift /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/xcode,swift 3 | 4 | ### Swift ### 5 | # Xcode 6 | # 7 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 8 | 9 | ## Build generated 10 | build/ 11 | DerivedData/ 12 | 13 | ## Various settings 14 | *.pbxuser 15 | !default.pbxuser 16 | *.mode1v3 17 | !default.mode1v3 18 | *.mode2v3 19 | !default.mode2v3 20 | *.perspectivev3 21 | !default.perspectivev3 22 | xcuserdata/ 23 | 24 | ## Other 25 | *.moved-aside 26 | *.xccheckout 27 | *.xcscmblueprint 28 | 29 | ## Obj-C/Swift specific 30 | *.hmap 31 | *.ipa 32 | *.dSYM.zip 33 | *.dSYM 34 | 35 | ## Playgrounds 36 | timeline.xctimeline 37 | playground.xcworkspace 38 | 39 | # Swift Package Manager 40 | # 41 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 42 | # Packages/ 43 | # Package.pins 44 | .build/ 45 | 46 | # CocoaPods - Refactored to standalone file 47 | 48 | # Carthage - Refactored to standalone file 49 | 50 | # fastlane 51 | # 52 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 53 | # screenshots whenever they are needed. 54 | # For more information about the recommended setup visit: 55 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 56 | 57 | fastlane/report.xml 58 | fastlane/Preview.html 59 | fastlane/screenshots 60 | fastlane/test_output 61 | 62 | ### Swift.SwiftPackageManager Stack ### 63 | Packages 64 | .build 65 | xcuserdata 66 | #*.xcodeproj 67 | 68 | ### Xcode ### 69 | # Xcode 70 | # 71 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 72 | 73 | ## Build generated 74 | 75 | ## Various settings 76 | 77 | ## Other 78 | 79 | ### Xcode Patch ### 80 | *.xcodeproj/* 81 | !*.xcodeproj/project.pbxproj 82 | !*.xcodeproj/xcshareddata/ 83 | !*.xcworkspace/contents.xcworkspacedata 84 | /*.gcno 85 | 86 | # End of https://www.gitignore.io/api/xcode,swift 87 | -------------------------------------------------------------------------------- /.swiftlint.yml: -------------------------------------------------------------------------------- 1 | included: 2 | - Source 3 | excluded: 4 | - ScrollableTabControllerDemo 5 | opt_in_rules: 6 | - attributes 7 | - closure_end_indentation 8 | - conditional_returns_on_newline 9 | - contains_over_first_not_nil 10 | - empty_count 11 | - explicit_top_level_acl 12 | - fatal_error_message 13 | - force_unwrapping 14 | - implicitly_unwrapped_optional 15 | - let_var_whitespace 16 | - literal_expression_end_indentation 17 | - multiline_arguments 18 | - multiline_parameters 19 | - nimble_operator 20 | - no_extension_access_modifier 21 | - operator_usage_whitespace 22 | - override_in_extension 23 | - overridden_super_call 24 | - private_outlet 25 | - prohibited_super_call 26 | - single_test_class 27 | - sorted_imports 28 | - switch_case_on_newline 29 | - trailing_closure 30 | - unneeded_parentheses_in_closure_argument 31 | - vertical_parameter_alignment_on_call 32 | 33 | force_unwrapping: error 34 | line_length: 150 35 | trailing_newline: error 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Mitsuyoshi Yamazaki and Speee, Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | platform :ios, '10.0' 2 | 3 | target 'ScrollableTabController' do 4 | use_frameworks! 5 | 6 | pod 'SwiftLint', '~> 0.26.0' 7 | end 8 | 9 | target 'ScrollableTabControllerDemo' do 10 | use_frameworks! 11 | end 12 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SwiftLint (0.26.0) 3 | 4 | DEPENDENCIES: 5 | - SwiftLint (~> 0.26.0) 6 | 7 | SPEC REPOS: 8 | https://github.com/cocoapods/specs.git: 9 | - SwiftLint 10 | 11 | SPEC CHECKSUMS: 12 | SwiftLint: f6b83e8d95ee1e91e11932d843af4fdcbf3fc764 13 | 14 | PODFILE CHECKSUM: b1789ae988427392546c732bca75088886fa7c3c 15 | 16 | COCOAPODS: 1.5.2 17 | -------------------------------------------------------------------------------- /Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SwiftLint (0.26.0) 3 | 4 | DEPENDENCIES: 5 | - SwiftLint (~> 0.26.0) 6 | 7 | SPEC REPOS: 8 | https://github.com/cocoapods/specs.git: 9 | - SwiftLint 10 | 11 | SPEC CHECKSUMS: 12 | SwiftLint: f6b83e8d95ee1e91e11932d843af4fdcbf3fc764 13 | 14 | PODFILE CHECKSUM: b1789ae988427392546c732bca75088886fa7c3c 15 | 16 | COCOAPODS: 1.5.2 17 | -------------------------------------------------------------------------------- /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 | 007822574A5C8050E70A8E5C6B390843 /* Pods-ScrollableTabControllerDemo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D993165F7634D9E014AEB26FF6A26FF2 /* Pods-ScrollableTabControllerDemo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | 101D79417F16423E5C516EE158720057 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A16F4CFC63FAC439D7A04994F579A03 /* Foundation.framework */; }; 12 | 4AC07188888B86144DD9100D216F914C /* Pods-ScrollableTabController-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 376B453AD3FFFF7EF2A06063460D1140 /* Pods-ScrollableTabController-dummy.m */; }; 13 | 5964AAA227B0AD63DDA259F85B62551B /* Pods-ScrollableTabControllerDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 76FEFE22ED1DD697C1EAADEAB5897D50 /* Pods-ScrollableTabControllerDemo-dummy.m */; }; 14 | 5EF0BF49E237EE24AF4447999D8B42E4 /* Pods-ScrollableTabController-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F661E168B78260E1686364FB30D2B757 /* Pods-ScrollableTabController-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | C610C20FE1A191C54424C5A7618DAAB9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A16F4CFC63FAC439D7A04994F579A03 /* Foundation.framework */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXFileReference section */ 19 | 1156CEBDD4D03824E2351C5F5703BFA2 /* Pods-ScrollableTabController.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ScrollableTabController.modulemap"; sourceTree = ""; }; 20 | 14096B2C9C165A49EA7663D858D929AB /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 21 | 16EDEDAFD1DF7B6574A1AB6A842552CC /* Pods-ScrollableTabController.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ScrollableTabController.debug.xcconfig"; sourceTree = ""; }; 22 | 1718B8E270859BAF1C3CB8AB4E9A11CF /* Pods_ScrollableTabController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ScrollableTabController.framework; path = "Pods-ScrollableTabController.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 23 | 217F03442977457C857C1CD3564946DE /* Pods-ScrollableTabControllerDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ScrollableTabControllerDemo-acknowledgements.plist"; sourceTree = ""; }; 24 | 2278045B307A0C5FEDBFBD1F0D49BA71 /* Pods-ScrollableTabControllerDemo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ScrollableTabControllerDemo-acknowledgements.markdown"; sourceTree = ""; }; 25 | 24476894A7141DE227EA480C113E8B9D /* Pods-ScrollableTabControllerDemo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ScrollableTabControllerDemo-frameworks.sh"; sourceTree = ""; }; 26 | 34C3937B78D8CBE507FC33F1B4DADEB1 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 27 | 36309D24C233FE04F037090B2D144049 /* Pods_ScrollableTabControllerDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ScrollableTabControllerDemo.framework; path = "Pods-ScrollableTabControllerDemo.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 28 | 376B453AD3FFFF7EF2A06063460D1140 /* Pods-ScrollableTabController-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ScrollableTabController-dummy.m"; sourceTree = ""; }; 29 | 426AB464A22E3A512AEC11148945BE2D /* Pods-ScrollableTabControllerDemo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ScrollableTabControllerDemo.modulemap"; sourceTree = ""; }; 30 | 5746145C4828D223FB29BCECB79917AC /* Pods-ScrollableTabControllerDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ScrollableTabControllerDemo.release.xcconfig"; sourceTree = ""; }; 31 | 5A16F4CFC63FAC439D7A04994F579A03 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 32 | 76FEFE22ED1DD697C1EAADEAB5897D50 /* Pods-ScrollableTabControllerDemo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ScrollableTabControllerDemo-dummy.m"; sourceTree = ""; }; 33 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 34 | 998FF527C1E43A6FB8270DE8FD979B8E /* Pods-ScrollableTabController.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ScrollableTabController.release.xcconfig"; sourceTree = ""; }; 35 | AC0F5E0C68797F2D1A5E622768B4619C /* Pods-ScrollableTabController-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ScrollableTabController-resources.sh"; sourceTree = ""; }; 36 | AE7B70C062EFAA102D80D3E64A412CC5 /* Pods-ScrollableTabController-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ScrollableTabController-acknowledgements.plist"; sourceTree = ""; }; 37 | AFCE6921982075BB5D3DAFB663C4788D /* Pods-ScrollableTabControllerDemo-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ScrollableTabControllerDemo-resources.sh"; sourceTree = ""; }; 38 | D993165F7634D9E014AEB26FF6A26FF2 /* Pods-ScrollableTabControllerDemo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ScrollableTabControllerDemo-umbrella.h"; sourceTree = ""; }; 39 | E1A03F773446FC864CA78FB00337650A /* Pods-ScrollableTabController-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ScrollableTabController-acknowledgements.markdown"; sourceTree = ""; }; 40 | F661E168B78260E1686364FB30D2B757 /* Pods-ScrollableTabController-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ScrollableTabController-umbrella.h"; sourceTree = ""; }; 41 | FED6274D62888F9A805E9A554E0A0CDD /* Pods-ScrollableTabControllerDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ScrollableTabControllerDemo.debug.xcconfig"; sourceTree = ""; }; 42 | /* End PBXFileReference section */ 43 | 44 | /* Begin PBXFrameworksBuildPhase section */ 45 | 7BEE014C9C99DD19F35DE758F275F6C3 /* Frameworks */ = { 46 | isa = PBXFrameworksBuildPhase; 47 | buildActionMask = 2147483647; 48 | files = ( 49 | 101D79417F16423E5C516EE158720057 /* Foundation.framework in Frameworks */, 50 | ); 51 | runOnlyForDeploymentPostprocessing = 0; 52 | }; 53 | BE60EC557283268A8F92BFFF4168D799 /* Frameworks */ = { 54 | isa = PBXFrameworksBuildPhase; 55 | buildActionMask = 2147483647; 56 | files = ( 57 | C610C20FE1A191C54424C5A7618DAAB9 /* Foundation.framework in Frameworks */, 58 | ); 59 | runOnlyForDeploymentPostprocessing = 0; 60 | }; 61 | /* End PBXFrameworksBuildPhase section */ 62 | 63 | /* Begin PBXGroup section */ 64 | 32A23E08346748F1793F899C5FF672C1 /* SwiftLint */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | ); 68 | name = SwiftLint; 69 | path = SwiftLint; 70 | sourceTree = ""; 71 | }; 72 | 5E0D919E635D23B70123790B8308F8EF /* iOS */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | 5A16F4CFC63FAC439D7A04994F579A03 /* Foundation.framework */, 76 | ); 77 | name = iOS; 78 | sourceTree = ""; 79 | }; 80 | 65FA5D03CC86F7B4671AD73F194A5C2A /* Targets Support Files */ = { 81 | isa = PBXGroup; 82 | children = ( 83 | F230DA4594D8717545E6776149C035D8 /* Pods-ScrollableTabController */, 84 | 9741C34AFD75FEEE2C856354182522C7 /* Pods-ScrollableTabControllerDemo */, 85 | ); 86 | name = "Targets Support Files"; 87 | sourceTree = ""; 88 | }; 89 | 7DB346D0F39D3F0E887471402A8071AB = { 90 | isa = PBXGroup; 91 | children = ( 92 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, 93 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */, 94 | 9758CC519AE2C57A9659FFC01AAD26F9 /* Pods */, 95 | D9D86ED12679CB8E774247B7920BFC82 /* Products */, 96 | 65FA5D03CC86F7B4671AD73F194A5C2A /* Targets Support Files */, 97 | ); 98 | sourceTree = ""; 99 | }; 100 | 9741C34AFD75FEEE2C856354182522C7 /* Pods-ScrollableTabControllerDemo */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | 34C3937B78D8CBE507FC33F1B4DADEB1 /* Info.plist */, 104 | 426AB464A22E3A512AEC11148945BE2D /* Pods-ScrollableTabControllerDemo.modulemap */, 105 | 2278045B307A0C5FEDBFBD1F0D49BA71 /* Pods-ScrollableTabControllerDemo-acknowledgements.markdown */, 106 | 217F03442977457C857C1CD3564946DE /* Pods-ScrollableTabControllerDemo-acknowledgements.plist */, 107 | 76FEFE22ED1DD697C1EAADEAB5897D50 /* Pods-ScrollableTabControllerDemo-dummy.m */, 108 | 24476894A7141DE227EA480C113E8B9D /* Pods-ScrollableTabControllerDemo-frameworks.sh */, 109 | AFCE6921982075BB5D3DAFB663C4788D /* Pods-ScrollableTabControllerDemo-resources.sh */, 110 | D993165F7634D9E014AEB26FF6A26FF2 /* Pods-ScrollableTabControllerDemo-umbrella.h */, 111 | FED6274D62888F9A805E9A554E0A0CDD /* Pods-ScrollableTabControllerDemo.debug.xcconfig */, 112 | 5746145C4828D223FB29BCECB79917AC /* Pods-ScrollableTabControllerDemo.release.xcconfig */, 113 | ); 114 | name = "Pods-ScrollableTabControllerDemo"; 115 | path = "Target Support Files/Pods-ScrollableTabControllerDemo"; 116 | sourceTree = ""; 117 | }; 118 | 9758CC519AE2C57A9659FFC01AAD26F9 /* Pods */ = { 119 | isa = PBXGroup; 120 | children = ( 121 | 32A23E08346748F1793F899C5FF672C1 /* SwiftLint */, 122 | ); 123 | name = Pods; 124 | sourceTree = ""; 125 | }; 126 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | 5E0D919E635D23B70123790B8308F8EF /* iOS */, 130 | ); 131 | name = Frameworks; 132 | sourceTree = ""; 133 | }; 134 | D9D86ED12679CB8E774247B7920BFC82 /* Products */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | 1718B8E270859BAF1C3CB8AB4E9A11CF /* Pods_ScrollableTabController.framework */, 138 | 36309D24C233FE04F037090B2D144049 /* Pods_ScrollableTabControllerDemo.framework */, 139 | ); 140 | name = Products; 141 | sourceTree = ""; 142 | }; 143 | F230DA4594D8717545E6776149C035D8 /* Pods-ScrollableTabController */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | 14096B2C9C165A49EA7663D858D929AB /* Info.plist */, 147 | 1156CEBDD4D03824E2351C5F5703BFA2 /* Pods-ScrollableTabController.modulemap */, 148 | E1A03F773446FC864CA78FB00337650A /* Pods-ScrollableTabController-acknowledgements.markdown */, 149 | AE7B70C062EFAA102D80D3E64A412CC5 /* Pods-ScrollableTabController-acknowledgements.plist */, 150 | 376B453AD3FFFF7EF2A06063460D1140 /* Pods-ScrollableTabController-dummy.m */, 151 | AC0F5E0C68797F2D1A5E622768B4619C /* Pods-ScrollableTabController-resources.sh */, 152 | F661E168B78260E1686364FB30D2B757 /* Pods-ScrollableTabController-umbrella.h */, 153 | 16EDEDAFD1DF7B6574A1AB6A842552CC /* Pods-ScrollableTabController.debug.xcconfig */, 154 | 998FF527C1E43A6FB8270DE8FD979B8E /* Pods-ScrollableTabController.release.xcconfig */, 155 | ); 156 | name = "Pods-ScrollableTabController"; 157 | path = "Target Support Files/Pods-ScrollableTabController"; 158 | sourceTree = ""; 159 | }; 160 | /* End PBXGroup section */ 161 | 162 | /* Begin PBXHeadersBuildPhase section */ 163 | B45DD741E5D3C6C88DC3C7F906DB27F8 /* Headers */ = { 164 | isa = PBXHeadersBuildPhase; 165 | buildActionMask = 2147483647; 166 | files = ( 167 | 007822574A5C8050E70A8E5C6B390843 /* Pods-ScrollableTabControllerDemo-umbrella.h in Headers */, 168 | ); 169 | runOnlyForDeploymentPostprocessing = 0; 170 | }; 171 | BB6C3BF172E5437EC51C21FD3C3A6D4D /* Headers */ = { 172 | isa = PBXHeadersBuildPhase; 173 | buildActionMask = 2147483647; 174 | files = ( 175 | 5EF0BF49E237EE24AF4447999D8B42E4 /* Pods-ScrollableTabController-umbrella.h in Headers */, 176 | ); 177 | runOnlyForDeploymentPostprocessing = 0; 178 | }; 179 | /* End PBXHeadersBuildPhase section */ 180 | 181 | /* Begin PBXNativeTarget section */ 182 | 0B82AEB6B1441C5F0902A310FAA6992E /* Pods-ScrollableTabController */ = { 183 | isa = PBXNativeTarget; 184 | buildConfigurationList = 908D289415B7100BD3EC9F43A9680AEB /* Build configuration list for PBXNativeTarget "Pods-ScrollableTabController" */; 185 | buildPhases = ( 186 | D8BEA0F20A56D1B4016EE4DADF6DB711 /* Sources */, 187 | 7BEE014C9C99DD19F35DE758F275F6C3 /* Frameworks */, 188 | BB6C3BF172E5437EC51C21FD3C3A6D4D /* Headers */, 189 | ); 190 | buildRules = ( 191 | ); 192 | dependencies = ( 193 | ); 194 | name = "Pods-ScrollableTabController"; 195 | productName = "Pods-ScrollableTabController"; 196 | productReference = 1718B8E270859BAF1C3CB8AB4E9A11CF /* Pods_ScrollableTabController.framework */; 197 | productType = "com.apple.product-type.framework"; 198 | }; 199 | 7CEDEC672FE404A4CB4273EBCBEF262C /* Pods-ScrollableTabControllerDemo */ = { 200 | isa = PBXNativeTarget; 201 | buildConfigurationList = 19D6FB6C2F703B1AB370D29B80EBBF01 /* Build configuration list for PBXNativeTarget "Pods-ScrollableTabControllerDemo" */; 202 | buildPhases = ( 203 | 66BE186EBC73EA05A0D5F7E83E68EC5B /* Sources */, 204 | BE60EC557283268A8F92BFFF4168D799 /* Frameworks */, 205 | B45DD741E5D3C6C88DC3C7F906DB27F8 /* Headers */, 206 | ); 207 | buildRules = ( 208 | ); 209 | dependencies = ( 210 | ); 211 | name = "Pods-ScrollableTabControllerDemo"; 212 | productName = "Pods-ScrollableTabControllerDemo"; 213 | productReference = 36309D24C233FE04F037090B2D144049 /* Pods_ScrollableTabControllerDemo.framework */; 214 | productType = "com.apple.product-type.framework"; 215 | }; 216 | /* End PBXNativeTarget section */ 217 | 218 | /* Begin PBXProject section */ 219 | D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { 220 | isa = PBXProject; 221 | attributes = { 222 | LastSwiftUpdateCheck = 0930; 223 | LastUpgradeCheck = 0930; 224 | }; 225 | buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; 226 | compatibilityVersion = "Xcode 3.2"; 227 | developmentRegion = English; 228 | hasScannedForEncodings = 0; 229 | knownRegions = ( 230 | en, 231 | ); 232 | mainGroup = 7DB346D0F39D3F0E887471402A8071AB; 233 | productRefGroup = D9D86ED12679CB8E774247B7920BFC82 /* Products */; 234 | projectDirPath = ""; 235 | projectRoot = ""; 236 | targets = ( 237 | 0B82AEB6B1441C5F0902A310FAA6992E /* Pods-ScrollableTabController */, 238 | 7CEDEC672FE404A4CB4273EBCBEF262C /* Pods-ScrollableTabControllerDemo */, 239 | ); 240 | }; 241 | /* End PBXProject section */ 242 | 243 | /* Begin PBXSourcesBuildPhase section */ 244 | 66BE186EBC73EA05A0D5F7E83E68EC5B /* Sources */ = { 245 | isa = PBXSourcesBuildPhase; 246 | buildActionMask = 2147483647; 247 | files = ( 248 | 5964AAA227B0AD63DDA259F85B62551B /* Pods-ScrollableTabControllerDemo-dummy.m in Sources */, 249 | ); 250 | runOnlyForDeploymentPostprocessing = 0; 251 | }; 252 | D8BEA0F20A56D1B4016EE4DADF6DB711 /* Sources */ = { 253 | isa = PBXSourcesBuildPhase; 254 | buildActionMask = 2147483647; 255 | files = ( 256 | 4AC07188888B86144DD9100D216F914C /* Pods-ScrollableTabController-dummy.m in Sources */, 257 | ); 258 | runOnlyForDeploymentPostprocessing = 0; 259 | }; 260 | /* End PBXSourcesBuildPhase section */ 261 | 262 | /* Begin XCBuildConfiguration section */ 263 | 38DBBABF16391C3F4FC4791A8BC50693 /* Release */ = { 264 | isa = XCBuildConfiguration; 265 | baseConfigurationReference = 998FF527C1E43A6FB8270DE8FD979B8E /* Pods-ScrollableTabController.release.xcconfig */; 266 | buildSettings = { 267 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 268 | CLANG_ENABLE_OBJC_WEAK = NO; 269 | CODE_SIGN_IDENTITY = ""; 270 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 271 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 272 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 273 | CURRENT_PROJECT_VERSION = 1; 274 | DEFINES_MODULE = YES; 275 | DYLIB_COMPATIBILITY_VERSION = 1; 276 | DYLIB_CURRENT_VERSION = 1; 277 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 278 | INFOPLIST_FILE = "Target Support Files/Pods-ScrollableTabController/Info.plist"; 279 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 280 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 281 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 282 | MACH_O_TYPE = staticlib; 283 | MODULEMAP_FILE = "Target Support Files/Pods-ScrollableTabController/Pods-ScrollableTabController.modulemap"; 284 | OTHER_LDFLAGS = ""; 285 | OTHER_LIBTOOLFLAGS = ""; 286 | PODS_ROOT = "$(SRCROOT)"; 287 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 288 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 289 | SDKROOT = iphoneos; 290 | SKIP_INSTALL = YES; 291 | TARGETED_DEVICE_FAMILY = "1,2"; 292 | VALIDATE_PRODUCT = YES; 293 | VERSIONING_SYSTEM = "apple-generic"; 294 | VERSION_INFO_PREFIX = ""; 295 | }; 296 | name = Release; 297 | }; 298 | 553022A828EE1991F07D2D73F565AEF8 /* Debug */ = { 299 | isa = XCBuildConfiguration; 300 | buildSettings = { 301 | ALWAYS_SEARCH_USER_PATHS = NO; 302 | CLANG_ANALYZER_NONNULL = YES; 303 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 304 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 305 | CLANG_CXX_LIBRARY = "libc++"; 306 | CLANG_ENABLE_MODULES = YES; 307 | CLANG_ENABLE_OBJC_ARC = YES; 308 | CLANG_ENABLE_OBJC_WEAK = YES; 309 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 310 | CLANG_WARN_BOOL_CONVERSION = YES; 311 | CLANG_WARN_COMMA = YES; 312 | CLANG_WARN_CONSTANT_CONVERSION = YES; 313 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 314 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 315 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 316 | CLANG_WARN_EMPTY_BODY = YES; 317 | CLANG_WARN_ENUM_CONVERSION = YES; 318 | CLANG_WARN_INFINITE_RECURSION = YES; 319 | CLANG_WARN_INT_CONVERSION = YES; 320 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 321 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 322 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 323 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 324 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 325 | CLANG_WARN_STRICT_PROTOTYPES = YES; 326 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 327 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 328 | CLANG_WARN_UNREACHABLE_CODE = YES; 329 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 330 | CODE_SIGNING_ALLOWED = NO; 331 | CODE_SIGNING_REQUIRED = NO; 332 | COPY_PHASE_STRIP = NO; 333 | DEBUG_INFORMATION_FORMAT = dwarf; 334 | ENABLE_STRICT_OBJC_MSGSEND = YES; 335 | ENABLE_TESTABILITY = YES; 336 | GCC_C_LANGUAGE_STANDARD = gnu11; 337 | GCC_DYNAMIC_NO_PIC = NO; 338 | GCC_NO_COMMON_BLOCKS = YES; 339 | GCC_OPTIMIZATION_LEVEL = 0; 340 | GCC_PREPROCESSOR_DEFINITIONS = ( 341 | "POD_CONFIGURATION_DEBUG=1", 342 | "DEBUG=1", 343 | "$(inherited)", 344 | ); 345 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 346 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 347 | GCC_WARN_UNDECLARED_SELECTOR = YES; 348 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 349 | GCC_WARN_UNUSED_FUNCTION = YES; 350 | GCC_WARN_UNUSED_VARIABLE = YES; 351 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 352 | MTL_ENABLE_DEBUG_INFO = YES; 353 | ONLY_ACTIVE_ARCH = YES; 354 | PRODUCT_NAME = "$(TARGET_NAME)"; 355 | STRIP_INSTALLED_PRODUCT = NO; 356 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 357 | SYMROOT = "${SRCROOT}/../build"; 358 | }; 359 | name = Debug; 360 | }; 361 | 58CE816B060A41D32CEC095441D0E3E0 /* Release */ = { 362 | isa = XCBuildConfiguration; 363 | buildSettings = { 364 | ALWAYS_SEARCH_USER_PATHS = NO; 365 | CLANG_ANALYZER_NONNULL = YES; 366 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 367 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 368 | CLANG_CXX_LIBRARY = "libc++"; 369 | CLANG_ENABLE_MODULES = YES; 370 | CLANG_ENABLE_OBJC_ARC = YES; 371 | CLANG_ENABLE_OBJC_WEAK = YES; 372 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 373 | CLANG_WARN_BOOL_CONVERSION = YES; 374 | CLANG_WARN_COMMA = YES; 375 | CLANG_WARN_CONSTANT_CONVERSION = YES; 376 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 377 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 378 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 379 | CLANG_WARN_EMPTY_BODY = YES; 380 | CLANG_WARN_ENUM_CONVERSION = YES; 381 | CLANG_WARN_INFINITE_RECURSION = YES; 382 | CLANG_WARN_INT_CONVERSION = YES; 383 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 384 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 385 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 386 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 387 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 388 | CLANG_WARN_STRICT_PROTOTYPES = YES; 389 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 390 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 391 | CLANG_WARN_UNREACHABLE_CODE = YES; 392 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 393 | CODE_SIGNING_ALLOWED = NO; 394 | CODE_SIGNING_REQUIRED = NO; 395 | COPY_PHASE_STRIP = NO; 396 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 397 | ENABLE_NS_ASSERTIONS = NO; 398 | ENABLE_STRICT_OBJC_MSGSEND = YES; 399 | GCC_C_LANGUAGE_STANDARD = gnu11; 400 | GCC_NO_COMMON_BLOCKS = YES; 401 | GCC_PREPROCESSOR_DEFINITIONS = ( 402 | "POD_CONFIGURATION_RELEASE=1", 403 | "$(inherited)", 404 | ); 405 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 406 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 407 | GCC_WARN_UNDECLARED_SELECTOR = YES; 408 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 409 | GCC_WARN_UNUSED_FUNCTION = YES; 410 | GCC_WARN_UNUSED_VARIABLE = YES; 411 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 412 | MTL_ENABLE_DEBUG_INFO = NO; 413 | PRODUCT_NAME = "$(TARGET_NAME)"; 414 | STRIP_INSTALLED_PRODUCT = NO; 415 | SYMROOT = "${SRCROOT}/../build"; 416 | }; 417 | name = Release; 418 | }; 419 | 7F6202DF09EFB4A861EF3D641446F29D /* Debug */ = { 420 | isa = XCBuildConfiguration; 421 | baseConfigurationReference = FED6274D62888F9A805E9A554E0A0CDD /* Pods-ScrollableTabControllerDemo.debug.xcconfig */; 422 | buildSettings = { 423 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 424 | CLANG_ENABLE_OBJC_WEAK = NO; 425 | CODE_SIGN_IDENTITY = ""; 426 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 427 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 428 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 429 | CURRENT_PROJECT_VERSION = 1; 430 | DEFINES_MODULE = YES; 431 | DYLIB_COMPATIBILITY_VERSION = 1; 432 | DYLIB_CURRENT_VERSION = 1; 433 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 434 | INFOPLIST_FILE = "Target Support Files/Pods-ScrollableTabControllerDemo/Info.plist"; 435 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 436 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 437 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 438 | MACH_O_TYPE = staticlib; 439 | MODULEMAP_FILE = "Target Support Files/Pods-ScrollableTabControllerDemo/Pods-ScrollableTabControllerDemo.modulemap"; 440 | OTHER_LDFLAGS = ""; 441 | OTHER_LIBTOOLFLAGS = ""; 442 | PODS_ROOT = "$(SRCROOT)"; 443 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 444 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 445 | SDKROOT = iphoneos; 446 | SKIP_INSTALL = YES; 447 | TARGETED_DEVICE_FAMILY = "1,2"; 448 | VERSIONING_SYSTEM = "apple-generic"; 449 | VERSION_INFO_PREFIX = ""; 450 | }; 451 | name = Debug; 452 | }; 453 | A67170E55AA783167857BE1DF89EEEF6 /* Release */ = { 454 | isa = XCBuildConfiguration; 455 | baseConfigurationReference = 5746145C4828D223FB29BCECB79917AC /* Pods-ScrollableTabControllerDemo.release.xcconfig */; 456 | buildSettings = { 457 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 458 | CLANG_ENABLE_OBJC_WEAK = NO; 459 | CODE_SIGN_IDENTITY = ""; 460 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 461 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 462 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 463 | CURRENT_PROJECT_VERSION = 1; 464 | DEFINES_MODULE = YES; 465 | DYLIB_COMPATIBILITY_VERSION = 1; 466 | DYLIB_CURRENT_VERSION = 1; 467 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 468 | INFOPLIST_FILE = "Target Support Files/Pods-ScrollableTabControllerDemo/Info.plist"; 469 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 470 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 471 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 472 | MACH_O_TYPE = staticlib; 473 | MODULEMAP_FILE = "Target Support Files/Pods-ScrollableTabControllerDemo/Pods-ScrollableTabControllerDemo.modulemap"; 474 | OTHER_LDFLAGS = ""; 475 | OTHER_LIBTOOLFLAGS = ""; 476 | PODS_ROOT = "$(SRCROOT)"; 477 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 478 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 479 | SDKROOT = iphoneos; 480 | SKIP_INSTALL = YES; 481 | TARGETED_DEVICE_FAMILY = "1,2"; 482 | VALIDATE_PRODUCT = YES; 483 | VERSIONING_SYSTEM = "apple-generic"; 484 | VERSION_INFO_PREFIX = ""; 485 | }; 486 | name = Release; 487 | }; 488 | B4C7D018138061A5A0C424CBF7D58B3B /* Debug */ = { 489 | isa = XCBuildConfiguration; 490 | baseConfigurationReference = 16EDEDAFD1DF7B6574A1AB6A842552CC /* Pods-ScrollableTabController.debug.xcconfig */; 491 | buildSettings = { 492 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 493 | CLANG_ENABLE_OBJC_WEAK = NO; 494 | CODE_SIGN_IDENTITY = ""; 495 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 496 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 497 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 498 | CURRENT_PROJECT_VERSION = 1; 499 | DEFINES_MODULE = YES; 500 | DYLIB_COMPATIBILITY_VERSION = 1; 501 | DYLIB_CURRENT_VERSION = 1; 502 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 503 | INFOPLIST_FILE = "Target Support Files/Pods-ScrollableTabController/Info.plist"; 504 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 505 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 506 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 507 | MACH_O_TYPE = staticlib; 508 | MODULEMAP_FILE = "Target Support Files/Pods-ScrollableTabController/Pods-ScrollableTabController.modulemap"; 509 | OTHER_LDFLAGS = ""; 510 | OTHER_LIBTOOLFLAGS = ""; 511 | PODS_ROOT = "$(SRCROOT)"; 512 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 513 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 514 | SDKROOT = iphoneos; 515 | SKIP_INSTALL = YES; 516 | TARGETED_DEVICE_FAMILY = "1,2"; 517 | VERSIONING_SYSTEM = "apple-generic"; 518 | VERSION_INFO_PREFIX = ""; 519 | }; 520 | name = Debug; 521 | }; 522 | /* End XCBuildConfiguration section */ 523 | 524 | /* Begin XCConfigurationList section */ 525 | 19D6FB6C2F703B1AB370D29B80EBBF01 /* Build configuration list for PBXNativeTarget "Pods-ScrollableTabControllerDemo" */ = { 526 | isa = XCConfigurationList; 527 | buildConfigurations = ( 528 | 7F6202DF09EFB4A861EF3D641446F29D /* Debug */, 529 | A67170E55AA783167857BE1DF89EEEF6 /* Release */, 530 | ); 531 | defaultConfigurationIsVisible = 0; 532 | defaultConfigurationName = Release; 533 | }; 534 | 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { 535 | isa = XCConfigurationList; 536 | buildConfigurations = ( 537 | 553022A828EE1991F07D2D73F565AEF8 /* Debug */, 538 | 58CE816B060A41D32CEC095441D0E3E0 /* Release */, 539 | ); 540 | defaultConfigurationIsVisible = 0; 541 | defaultConfigurationName = Release; 542 | }; 543 | 908D289415B7100BD3EC9F43A9680AEB /* Build configuration list for PBXNativeTarget "Pods-ScrollableTabController" */ = { 544 | isa = XCConfigurationList; 545 | buildConfigurations = ( 546 | B4C7D018138061A5A0C424CBF7D58B3B /* Debug */, 547 | 38DBBABF16391C3F4FC4791A8BC50693 /* Release */, 548 | ); 549 | defaultConfigurationIsVisible = 0; 550 | defaultConfigurationName = Release; 551 | }; 552 | /* End XCConfigurationList section */ 553 | }; 554 | rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 555 | } 556 | -------------------------------------------------------------------------------- /Pods/SwiftLint/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Realm Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Pods/SwiftLint/swiftlint: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speee/ScrollableTabController/e76172212b556f7a863c33773cfdf10645330385/Pods/SwiftLint/swiftlint -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabController/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 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabController/Pods-ScrollableTabController-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## SwiftLint 5 | 6 | The MIT License (MIT) 7 | 8 | Copyright (c) 2015 Realm Inc. 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | 28 | Generated by CocoaPods - https://cocoapods.org 29 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabController/Pods-ScrollableTabController-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 | The MIT License (MIT) 18 | 19 | Copyright (c) 2015 Realm Inc. 20 | 21 | Permission is hereby granted, free of charge, to any person obtaining a copy 22 | of this software and associated documentation files (the "Software"), to deal 23 | in the Software without restriction, including without limitation the rights 24 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 25 | copies of the Software, and to permit persons to whom the Software is 26 | furnished to do so, subject to the following conditions: 27 | 28 | The above copyright notice and this permission notice shall be included in all 29 | copies or substantial portions of the Software. 30 | 31 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 32 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 33 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 34 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 35 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 36 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 37 | SOFTWARE. 38 | 39 | License 40 | MIT 41 | Title 42 | SwiftLint 43 | Type 44 | PSGroupSpecifier 45 | 46 | 47 | FooterText 48 | Generated by CocoaPods - https://cocoapods.org 49 | Title 50 | 51 | Type 52 | PSGroupSpecifier 53 | 54 | 55 | StringsTable 56 | Acknowledgements 57 | Title 58 | Acknowledgements 59 | 60 | 61 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabController/Pods-ScrollableTabController-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_ScrollableTabController : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_ScrollableTabController 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabController/Pods-ScrollableTabController-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then 7 | # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # resources to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 13 | 14 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 15 | > "$RESOURCES_TO_COPY" 16 | 17 | XCASSET_FILES=() 18 | 19 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 20 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 21 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 22 | 23 | case "${TARGETED_DEVICE_FAMILY:-}" in 24 | 1,2) 25 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 26 | ;; 27 | 1) 28 | TARGET_DEVICE_ARGS="--target-device iphone" 29 | ;; 30 | 2) 31 | TARGET_DEVICE_ARGS="--target-device ipad" 32 | ;; 33 | 3) 34 | TARGET_DEVICE_ARGS="--target-device tv" 35 | ;; 36 | 4) 37 | TARGET_DEVICE_ARGS="--target-device watch" 38 | ;; 39 | *) 40 | TARGET_DEVICE_ARGS="--target-device mac" 41 | ;; 42 | esac 43 | 44 | install_resource() 45 | { 46 | if [[ "$1" = /* ]] ; then 47 | RESOURCE_PATH="$1" 48 | else 49 | RESOURCE_PATH="${PODS_ROOT}/$1" 50 | fi 51 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 52 | cat << EOM 53 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 54 | EOM 55 | exit 1 56 | fi 57 | case $RESOURCE_PATH in 58 | *.storyboard) 59 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 60 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 61 | ;; 62 | *.xib) 63 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 64 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 65 | ;; 66 | *.framework) 67 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 68 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 69 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 70 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 71 | ;; 72 | *.xcdatamodel) 73 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true 74 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 75 | ;; 76 | *.xcdatamodeld) 77 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true 78 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 79 | ;; 80 | *.xcmappingmodel) 81 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true 82 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 83 | ;; 84 | *.xcassets) 85 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 86 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 87 | ;; 88 | *) 89 | echo "$RESOURCE_PATH" || true 90 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 91 | ;; 92 | esac 93 | } 94 | 95 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 96 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 97 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 98 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 99 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 100 | fi 101 | rm -f "$RESOURCES_TO_COPY" 102 | 103 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] 104 | then 105 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 106 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 107 | while read line; do 108 | if [[ $line != "${PODS_ROOT}*" ]]; then 109 | XCASSET_FILES+=("$line") 110 | fi 111 | done <<<"$OTHER_XCASSETS" 112 | 113 | if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then 114 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 115 | else 116 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" 117 | fi 118 | fi 119 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabController/Pods-ScrollableTabController-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_ScrollableTabControllerVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_ScrollableTabControllerVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabController/Pods-ScrollableTabController.debug.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' 3 | PODS_BUILD_DIR = ${BUILD_DIR} 4 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 5 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 6 | PODS_ROOT = ${SRCROOT}/Pods 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabController/Pods-ScrollableTabController.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_ScrollableTabController { 2 | umbrella header "Pods-ScrollableTabController-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabController/Pods-ScrollableTabController.release.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' 3 | PODS_BUILD_DIR = ${BUILD_DIR} 4 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 5 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 6 | PODS_ROOT = ${SRCROOT}/Pods 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabControllerDemo/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 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabControllerDemo/Pods-ScrollableTabControllerDemo-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## SwiftLint 5 | 6 | The MIT License (MIT) 7 | 8 | Copyright (c) 2015 Realm Inc. 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | 28 | Generated by CocoaPods - https://cocoapods.org 29 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabControllerDemo/Pods-ScrollableTabControllerDemo-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 | The MIT License (MIT) 18 | 19 | Copyright (c) 2015 Realm Inc. 20 | 21 | Permission is hereby granted, free of charge, to any person obtaining a copy 22 | of this software and associated documentation files (the "Software"), to deal 23 | in the Software without restriction, including without limitation the rights 24 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 25 | copies of the Software, and to permit persons to whom the Software is 26 | furnished to do so, subject to the following conditions: 27 | 28 | The above copyright notice and this permission notice shall be included in all 29 | copies or substantial portions of the Software. 30 | 31 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 32 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 33 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 34 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 35 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 36 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 37 | SOFTWARE. 38 | 39 | License 40 | MIT 41 | Title 42 | SwiftLint 43 | Type 44 | PSGroupSpecifier 45 | 46 | 47 | FooterText 48 | Generated by CocoaPods - https://cocoapods.org 49 | Title 50 | 51 | Type 52 | PSGroupSpecifier 53 | 54 | 55 | StringsTable 56 | Acknowledgements 57 | Title 58 | Acknowledgements 59 | 60 | 61 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabControllerDemo/Pods-ScrollableTabControllerDemo-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_ScrollableTabControllerDemo : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_ScrollableTabControllerDemo 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabControllerDemo/Pods-ScrollableTabControllerDemo-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 7 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # frameworks to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 13 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 14 | 15 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 16 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 17 | 18 | # Used as a return value for each invocation of `strip_invalid_archs` function. 19 | STRIP_BINARY_RETVAL=0 20 | 21 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 22 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 23 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 24 | 25 | # Copies and strips a vendored framework 26 | install_framework() 27 | { 28 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 29 | local source="${BUILT_PRODUCTS_DIR}/$1" 30 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 31 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 32 | elif [ -r "$1" ]; then 33 | local source="$1" 34 | fi 35 | 36 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 37 | 38 | if [ -L "${source}" ]; then 39 | echo "Symlinked..." 40 | source="$(readlink "${source}")" 41 | fi 42 | 43 | # Use filter instead of exclude so missing patterns don't throw errors. 44 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 45 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 46 | 47 | local basename 48 | basename="$(basename -s .framework "$1")" 49 | binary="${destination}/${basename}.framework/${basename}" 50 | if ! [ -r "$binary" ]; then 51 | binary="${destination}/${basename}" 52 | fi 53 | 54 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 55 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 56 | strip_invalid_archs "$binary" 57 | fi 58 | 59 | # Resign the code if required by the build settings to avoid unstable apps 60 | code_sign_if_enabled "${destination}/$(basename "$1")" 61 | 62 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 63 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 64 | local swift_runtime_libs 65 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 66 | for lib in $swift_runtime_libs; do 67 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 68 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 69 | code_sign_if_enabled "${destination}/${lib}" 70 | done 71 | fi 72 | } 73 | 74 | # Copies and strips a vendored dSYM 75 | install_dsym() { 76 | local source="$1" 77 | if [ -r "$source" ]; then 78 | # Copy the dSYM into a the targets temp dir. 79 | 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}\"" 80 | 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}" 81 | 82 | local basename 83 | basename="$(basename -s .framework.dSYM "$source")" 84 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 85 | 86 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 87 | if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then 88 | strip_invalid_archs "$binary" 89 | fi 90 | 91 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 92 | # Move the stripped file into its final destination. 93 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 94 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 95 | else 96 | # 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. 97 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 98 | fi 99 | fi 100 | } 101 | 102 | # Signs a framework with the provided identity 103 | code_sign_if_enabled() { 104 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 105 | # Use the current code_sign_identitiy 106 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 107 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 108 | 109 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 110 | code_sign_cmd="$code_sign_cmd &" 111 | fi 112 | echo "$code_sign_cmd" 113 | eval "$code_sign_cmd" 114 | fi 115 | } 116 | 117 | # Strip invalid architectures 118 | strip_invalid_archs() { 119 | binary="$1" 120 | # Get architectures for current target binary 121 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 122 | # Intersect them with the architectures we are building for 123 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 124 | # If there are no archs supported by this binary then warn the user 125 | if [[ -z "$intersected_archs" ]]; then 126 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 127 | STRIP_BINARY_RETVAL=0 128 | return 129 | fi 130 | stripped="" 131 | for arch in $binary_archs; do 132 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 133 | # Strip non-valid architectures in-place 134 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 135 | stripped="$stripped $arch" 136 | fi 137 | done 138 | if [[ "$stripped" ]]; then 139 | echo "Stripped $binary of architectures:$stripped" 140 | fi 141 | STRIP_BINARY_RETVAL=1 142 | } 143 | 144 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 145 | wait 146 | fi 147 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabControllerDemo/Pods-ScrollableTabControllerDemo-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then 7 | # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # resources to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 13 | 14 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 15 | > "$RESOURCES_TO_COPY" 16 | 17 | XCASSET_FILES=() 18 | 19 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 20 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 21 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 22 | 23 | case "${TARGETED_DEVICE_FAMILY:-}" in 24 | 1,2) 25 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 26 | ;; 27 | 1) 28 | TARGET_DEVICE_ARGS="--target-device iphone" 29 | ;; 30 | 2) 31 | TARGET_DEVICE_ARGS="--target-device ipad" 32 | ;; 33 | 3) 34 | TARGET_DEVICE_ARGS="--target-device tv" 35 | ;; 36 | 4) 37 | TARGET_DEVICE_ARGS="--target-device watch" 38 | ;; 39 | *) 40 | TARGET_DEVICE_ARGS="--target-device mac" 41 | ;; 42 | esac 43 | 44 | install_resource() 45 | { 46 | if [[ "$1" = /* ]] ; then 47 | RESOURCE_PATH="$1" 48 | else 49 | RESOURCE_PATH="${PODS_ROOT}/$1" 50 | fi 51 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 52 | cat << EOM 53 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 54 | EOM 55 | exit 1 56 | fi 57 | case $RESOURCE_PATH in 58 | *.storyboard) 59 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 60 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 61 | ;; 62 | *.xib) 63 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 64 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 65 | ;; 66 | *.framework) 67 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 68 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 69 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 70 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 71 | ;; 72 | *.xcdatamodel) 73 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true 74 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 75 | ;; 76 | *.xcdatamodeld) 77 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true 78 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 79 | ;; 80 | *.xcmappingmodel) 81 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true 82 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 83 | ;; 84 | *.xcassets) 85 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 86 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 87 | ;; 88 | *) 89 | echo "$RESOURCE_PATH" || true 90 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 91 | ;; 92 | esac 93 | } 94 | 95 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 96 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 97 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 98 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 99 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 100 | fi 101 | rm -f "$RESOURCES_TO_COPY" 102 | 103 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] 104 | then 105 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 106 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 107 | while read line; do 108 | if [[ $line != "${PODS_ROOT}*" ]]; then 109 | XCASSET_FILES+=("$line") 110 | fi 111 | done <<<"$OTHER_XCASSETS" 112 | 113 | if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then 114 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 115 | else 116 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" 117 | fi 118 | fi 119 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabControllerDemo/Pods-ScrollableTabControllerDemo-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_ScrollableTabControllerDemoVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_ScrollableTabControllerDemoVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabControllerDemo/Pods-ScrollableTabControllerDemo.debug.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 3 | PODS_BUILD_DIR = ${BUILD_DIR} 4 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 5 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 6 | PODS_ROOT = ${SRCROOT}/Pods 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabControllerDemo/Pods-ScrollableTabControllerDemo.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_ScrollableTabControllerDemo { 2 | umbrella header "Pods-ScrollableTabControllerDemo-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-ScrollableTabControllerDemo/Pods-ScrollableTabControllerDemo.release.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 3 | PODS_BUILD_DIR = ${BUILD_DIR} 4 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 5 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 6 | PODS_ROOT = ${SRCROOT}/Pods 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ScrollableTabController 2 | ==== 3 | 4 | [![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE) 5 | [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 6 | 7 | 8 | ScrollableTabController is tab based ContainerViewController with shrinkable and expandable upper content area. 9 | 10 | 11 | ## Demo 12 | 13 | 14 | 15 | ## Requirement 16 | 17 | iOS10+ 18 | 19 | ## Usage 20 | 21 | ### Instantiation by code 22 | 23 | ```swift 24 | let scrollableTabController = ScrollableTabController() 25 | 26 | scrollableTabController.viewControllers = [ 27 | someScrollableViewController1, 28 | someScrollableViewController2 29 | ] 30 | scrollableTabController.upperContentViewController = someContentViewController 31 | ``` 32 | 33 | ### Restrictions for ContentViewControllers 34 | 35 | There're some restrictions to use it properly. 36 | 37 | #### UpperContentViewController 38 | 39 | - UpperContentViewController.view has to define its height with **900 to 950 constraints priority**. 40 | - First, ScrollableTabController observes the height and set it as default height(the upper content height when the scrollable area is not scrolled). 41 | - Then when the user scrolls, the upper content area shrinks / expands, 42 | - The default view height(the height when the scrollable area is not scrolled) should be fixed when viewDidLoad is called. Changing the height is not supported. 43 | - If you want to allow users to scroll over upper content area, consider using TouchTransparentView that passes touch events to views below it. 44 | 45 | #### ScrollableViewController 46 | 47 | - It has to conform to Scrollable protocol to make ScrollableTabController can observe scrolling. 48 | - **Its scrollView.contentSize.height must not be smaller than scrollView.frame.height.** If the contentSize.height is too small, the upper content area can't shrink. See the screenshot below. 49 | 50 | 51 | 52 | - priority 900 - 950 53 | - conflicting xx to achieve 54 | - example 55 | 56 | ## Installation 57 | 58 | ### Carthage 59 | 60 | ``` 61 | github "speee/ScrollableTabController" 62 | ``` 63 | 64 | ## Contribution 65 | 66 | Welcome!! 67 | 68 | ## Licence 69 | 70 | [MIT](https://github.com/tcnksm/tool/blob/master/LICENCE) 71 | 72 | ## Author 73 | 74 | [Mitsuyoshi Yamazaki](https://github.com/mitsuyoshi-yamazaki) 75 | 76 | -------------------------------------------------------------------------------- /ScrollableTabController.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "ScrollableTabController" 3 | s.version = "0.0.3" 4 | s.summary = "ScrollableTabController" 5 | s.description = "ScrollableTabController" 6 | s.homepage = "https://github.com/speee/ScrollableTabController" 7 | s.license = 'MIT' 8 | s.author = { "Mitsuyoshi Yamazaki" => "yamazaki.mitsuyoshi@gmail.com" } 9 | s.source = { :git => "https://github.com/speee/ScrollableTabController.git", :tag => "v#{s.version.to_s}" } 10 | 11 | s.requires_arc = true 12 | s.ios.deployment_target = '10.0' 13 | 14 | s.source_files = 'Source/*' 15 | end 16 | -------------------------------------------------------------------------------- /ScrollableTabController.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXAggregateTarget section */ 10 | ED0B456B20FDEBB100DE1967 /* Swiftlint */ = { 11 | isa = PBXAggregateTarget; 12 | buildConfigurationList = ED0B456C20FDEBB100DE1967 /* Build configuration list for PBXAggregateTarget "Swiftlint" */; 13 | buildPhases = ( 14 | ED0B456F20FDEBB600DE1967 /* Swiftlint */, 15 | ); 16 | dependencies = ( 17 | ); 18 | name = Swiftlint; 19 | productName = Swiftlint; 20 | }; 21 | /* End PBXAggregateTarget section */ 22 | 23 | /* Begin PBXBuildFile section */ 24 | 164B84D87D4179334C7780B4 /* Pods_ScrollableTabControllerDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 421C7ACD1CB13145DDC9311C /* Pods_ScrollableTabControllerDemo.framework */; }; 25 | A9B34FA67DF242C83F8BE963 /* Pods_ScrollableTabController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54F2C46BF5C854C40FFBAA6F /* Pods_ScrollableTabController.framework */; }; 26 | ED747D091F2B35B000E228D2 /* ScrollableTabController.h in Headers */ = {isa = PBXBuildFile; fileRef = ED747D071F2B35B000E228D2 /* ScrollableTabController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 27 | ED747D0B1F2B361700E228D2 /* ScrollableTabController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED747D0A1F2B361700E228D2 /* ScrollableTabController.swift */; }; 28 | ED7846D71F302A0E00511AB2 /* ScrollableTabController.xib in Resources */ = {isa = PBXBuildFile; fileRef = ED7846D61F302A0E00511AB2 /* ScrollableTabController.xib */; }; 29 | ED7846D91F302BB800511AB2 /* TouchTransparentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED7846D81F302BB800511AB2 /* TouchTransparentView.swift */; }; 30 | ED7846DD1F3163A300511AB2 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED7846DC1F3163A300511AB2 /* Extensions.swift */; }; 31 | ED7C21231F3AB00600018F97 /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED7C21221F3AB00600018F97 /* Log.swift */; }; 32 | EDABFDFE1F44299000E1D56C /* ProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDABFDFD1F44299000E1D56C /* ProfileViewController.swift */; }; 33 | EDEA2CBD1F2F18BB00B35F4A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDEA2CBC1F2F18BB00B35F4A /* AppDelegate.swift */; }; 34 | EDEA2CC21F2F18BB00B35F4A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EDEA2CC01F2F18BB00B35F4A /* Main.storyboard */; }; 35 | EDEA2CC41F2F18BB00B35F4A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EDEA2CC31F2F18BB00B35F4A /* Assets.xcassets */; }; 36 | EDEA2CC71F2F18BB00B35F4A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EDEA2CC51F2F18BB00B35F4A /* LaunchScreen.storyboard */; }; 37 | EDEA2CCD1F2F309900B35F4A /* ScrollableTabController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED747CFA1F2B356800E228D2 /* ScrollableTabController.framework */; }; 38 | EDEA2CCE1F2F309900B35F4A /* ScrollableTabController.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = ED747CFA1F2B356800E228D2 /* ScrollableTabController.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 39 | EDFE04241F4553BA00EDA902 /* TimelineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDFE04231F4553BA00EDA902 /* TimelineViewController.swift */; }; 40 | /* End PBXBuildFile section */ 41 | 42 | /* Begin PBXContainerItemProxy section */ 43 | EDEA2CCF1F2F309900B35F4A /* PBXContainerItemProxy */ = { 44 | isa = PBXContainerItemProxy; 45 | containerPortal = ED747CF11F2B356700E228D2 /* Project object */; 46 | proxyType = 1; 47 | remoteGlobalIDString = ED747CF91F2B356800E228D2; 48 | remoteInfo = ScrollableTabController; 49 | }; 50 | /* End PBXContainerItemProxy section */ 51 | 52 | /* Begin PBXCopyFilesBuildPhase section */ 53 | EDEA2CD11F2F309900B35F4A /* Embed Frameworks */ = { 54 | isa = PBXCopyFilesBuildPhase; 55 | buildActionMask = 2147483647; 56 | dstPath = ""; 57 | dstSubfolderSpec = 10; 58 | files = ( 59 | EDEA2CCE1F2F309900B35F4A /* ScrollableTabController.framework in Embed Frameworks */, 60 | ); 61 | name = "Embed Frameworks"; 62 | runOnlyForDeploymentPostprocessing = 0; 63 | }; 64 | /* End PBXCopyFilesBuildPhase section */ 65 | 66 | /* Begin PBXFileReference section */ 67 | 15080E8785A58508BD625180 /* Pods-ScrollableTabController.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ScrollableTabController.release.xcconfig"; path = "Pods/Target Support Files/Pods-ScrollableTabController/Pods-ScrollableTabController.release.xcconfig"; sourceTree = ""; }; 68 | 421C7ACD1CB13145DDC9311C /* Pods_ScrollableTabControllerDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ScrollableTabControllerDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 69 | 51BB203299175CD9DA5B80CC /* Pods-ScrollableTabControllerDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ScrollableTabControllerDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-ScrollableTabControllerDemo/Pods-ScrollableTabControllerDemo.release.xcconfig"; sourceTree = ""; }; 70 | 54F2C46BF5C854C40FFBAA6F /* Pods_ScrollableTabController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ScrollableTabController.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 71 | 6C072FA980F14931CEBB7679 /* Pods-ScrollableTabController.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ScrollableTabController.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ScrollableTabController/Pods-ScrollableTabController.debug.xcconfig"; sourceTree = ""; }; 72 | 8829A7A02659876C63090515 /* Pods-ScrollableTabControllerDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ScrollableTabControllerDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ScrollableTabControllerDemo/Pods-ScrollableTabControllerDemo.debug.xcconfig"; sourceTree = ""; }; 73 | ED747CFA1F2B356800E228D2 /* ScrollableTabController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ScrollableTabController.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74 | ED747D061F2B35B000E228D2 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 75 | ED747D071F2B35B000E228D2 /* ScrollableTabController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollableTabController.h; sourceTree = ""; }; 76 | ED747D0A1F2B361700E228D2 /* ScrollableTabController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScrollableTabController.swift; sourceTree = ""; }; 77 | ED7846D61F302A0E00511AB2 /* ScrollableTabController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ScrollableTabController.xib; sourceTree = ""; }; 78 | ED7846D81F302BB800511AB2 /* TouchTransparentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TouchTransparentView.swift; sourceTree = ""; }; 79 | ED7846DC1F3163A300511AB2 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; 80 | ED7C21221F3AB00600018F97 /* Log.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Log.swift; sourceTree = ""; }; 81 | EDABFDFB1F44296F00E1D56C /* Twitter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Twitter.framework; path = System/Library/Frameworks/Twitter.framework; sourceTree = SDKROOT; }; 82 | EDABFDFD1F44299000E1D56C /* ProfileViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProfileViewController.swift; sourceTree = ""; }; 83 | EDABFDFF1F4429C900E1D56C /* Social.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Social.framework; path = System/Library/Frameworks/Social.framework; sourceTree = SDKROOT; }; 84 | EDEA2CBA1F2F18BB00B35F4A /* ScrollableTabControllerDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ScrollableTabControllerDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 85 | EDEA2CBC1F2F18BB00B35F4A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 86 | EDEA2CC11F2F18BB00B35F4A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 87 | EDEA2CC31F2F18BB00B35F4A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 88 | EDEA2CC61F2F18BB00B35F4A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 89 | EDEA2CC81F2F18BB00B35F4A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 90 | EDFE04231F4553BA00EDA902 /* TimelineViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimelineViewController.swift; sourceTree = ""; }; 91 | /* End PBXFileReference section */ 92 | 93 | /* Begin PBXFrameworksBuildPhase section */ 94 | ED747CF61F2B356800E228D2 /* Frameworks */ = { 95 | isa = PBXFrameworksBuildPhase; 96 | buildActionMask = 2147483647; 97 | files = ( 98 | A9B34FA67DF242C83F8BE963 /* Pods_ScrollableTabController.framework in Frameworks */, 99 | ); 100 | runOnlyForDeploymentPostprocessing = 0; 101 | }; 102 | EDEA2CB71F2F18BB00B35F4A /* Frameworks */ = { 103 | isa = PBXFrameworksBuildPhase; 104 | buildActionMask = 2147483647; 105 | files = ( 106 | EDEA2CCD1F2F309900B35F4A /* ScrollableTabController.framework in Frameworks */, 107 | 164B84D87D4179334C7780B4 /* Pods_ScrollableTabControllerDemo.framework in Frameworks */, 108 | ); 109 | runOnlyForDeploymentPostprocessing = 0; 110 | }; 111 | /* End PBXFrameworksBuildPhase section */ 112 | 113 | /* Begin PBXGroup section */ 114 | 8C737C8F26F56B2FB763152E /* Pods */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | 6C072FA980F14931CEBB7679 /* Pods-ScrollableTabController.debug.xcconfig */, 118 | 15080E8785A58508BD625180 /* Pods-ScrollableTabController.release.xcconfig */, 119 | 8829A7A02659876C63090515 /* Pods-ScrollableTabControllerDemo.debug.xcconfig */, 120 | 51BB203299175CD9DA5B80CC /* Pods-ScrollableTabControllerDemo.release.xcconfig */, 121 | ); 122 | name = Pods; 123 | sourceTree = ""; 124 | }; 125 | ED747CF01F2B356700E228D2 = { 126 | isa = PBXGroup; 127 | children = ( 128 | ED747D051F2B35B000E228D2 /* Source */, 129 | EDEA2CBB1F2F18BB00B35F4A /* ScrollableTabControllerDemo */, 130 | ED747CFB1F2B356800E228D2 /* Products */, 131 | EDABFDFA1F44296F00E1D56C /* Frameworks */, 132 | 8C737C8F26F56B2FB763152E /* Pods */, 133 | ); 134 | sourceTree = ""; 135 | }; 136 | ED747CFB1F2B356800E228D2 /* Products */ = { 137 | isa = PBXGroup; 138 | children = ( 139 | ED747CFA1F2B356800E228D2 /* ScrollableTabController.framework */, 140 | EDEA2CBA1F2F18BB00B35F4A /* ScrollableTabControllerDemo.app */, 141 | ); 142 | name = Products; 143 | sourceTree = ""; 144 | }; 145 | ED747D051F2B35B000E228D2 /* Source */ = { 146 | isa = PBXGroup; 147 | children = ( 148 | ED747D071F2B35B000E228D2 /* ScrollableTabController.h */, 149 | ED747D0A1F2B361700E228D2 /* ScrollableTabController.swift */, 150 | ED7846D61F302A0E00511AB2 /* ScrollableTabController.xib */, 151 | ED7846D81F302BB800511AB2 /* TouchTransparentView.swift */, 152 | ED7846DC1F3163A300511AB2 /* Extensions.swift */, 153 | ED7C21221F3AB00600018F97 /* Log.swift */, 154 | ED747D061F2B35B000E228D2 /* Info.plist */, 155 | ); 156 | path = Source; 157 | sourceTree = ""; 158 | }; 159 | EDABFDFA1F44296F00E1D56C /* Frameworks */ = { 160 | isa = PBXGroup; 161 | children = ( 162 | EDABFDFF1F4429C900E1D56C /* Social.framework */, 163 | EDABFDFB1F44296F00E1D56C /* Twitter.framework */, 164 | 54F2C46BF5C854C40FFBAA6F /* Pods_ScrollableTabController.framework */, 165 | 421C7ACD1CB13145DDC9311C /* Pods_ScrollableTabControllerDemo.framework */, 166 | ); 167 | name = Frameworks; 168 | sourceTree = ""; 169 | }; 170 | EDEA2CBB1F2F18BB00B35F4A /* ScrollableTabControllerDemo */ = { 171 | isa = PBXGroup; 172 | children = ( 173 | EDEA2CBC1F2F18BB00B35F4A /* AppDelegate.swift */, 174 | EDABFDFD1F44299000E1D56C /* ProfileViewController.swift */, 175 | EDFE04231F4553BA00EDA902 /* TimelineViewController.swift */, 176 | EDEA2CC01F2F18BB00B35F4A /* Main.storyboard */, 177 | EDEA2CC31F2F18BB00B35F4A /* Assets.xcassets */, 178 | EDEA2CC51F2F18BB00B35F4A /* LaunchScreen.storyboard */, 179 | EDEA2CC81F2F18BB00B35F4A /* Info.plist */, 180 | ); 181 | path = ScrollableTabControllerDemo; 182 | sourceTree = ""; 183 | }; 184 | /* End PBXGroup section */ 185 | 186 | /* Begin PBXHeadersBuildPhase section */ 187 | ED747CF71F2B356800E228D2 /* Headers */ = { 188 | isa = PBXHeadersBuildPhase; 189 | buildActionMask = 2147483647; 190 | files = ( 191 | ED747D091F2B35B000E228D2 /* ScrollableTabController.h in Headers */, 192 | ); 193 | runOnlyForDeploymentPostprocessing = 0; 194 | }; 195 | /* End PBXHeadersBuildPhase section */ 196 | 197 | /* Begin PBXNativeTarget section */ 198 | ED747CF91F2B356800E228D2 /* ScrollableTabController */ = { 199 | isa = PBXNativeTarget; 200 | buildConfigurationList = ED747D021F2B356800E228D2 /* Build configuration list for PBXNativeTarget "ScrollableTabController" */; 201 | buildPhases = ( 202 | 80967E728B2C7939E85EB1CE /* [CP] Check Pods Manifest.lock */, 203 | ED747CF51F2B356800E228D2 /* Sources */, 204 | ED747CF61F2B356800E228D2 /* Frameworks */, 205 | ED747CF71F2B356800E228D2 /* Headers */, 206 | ED747CF81F2B356800E228D2 /* Resources */, 207 | ); 208 | buildRules = ( 209 | ); 210 | dependencies = ( 211 | ); 212 | name = ScrollableTabController; 213 | productName = ScrollableTabController; 214 | productReference = ED747CFA1F2B356800E228D2 /* ScrollableTabController.framework */; 215 | productType = "com.apple.product-type.framework"; 216 | }; 217 | EDEA2CB91F2F18BB00B35F4A /* ScrollableTabControllerDemo */ = { 218 | isa = PBXNativeTarget; 219 | buildConfigurationList = EDEA2CCB1F2F18BB00B35F4A /* Build configuration list for PBXNativeTarget "ScrollableTabControllerDemo" */; 220 | buildPhases = ( 221 | 566B2A3C49B044D73A817A4D /* [CP] Check Pods Manifest.lock */, 222 | EDEA2CB61F2F18BB00B35F4A /* Sources */, 223 | EDEA2CB71F2F18BB00B35F4A /* Frameworks */, 224 | EDEA2CB81F2F18BB00B35F4A /* Resources */, 225 | EDEA2CD11F2F309900B35F4A /* Embed Frameworks */, 226 | ); 227 | buildRules = ( 228 | ); 229 | dependencies = ( 230 | EDEA2CD01F2F309900B35F4A /* PBXTargetDependency */, 231 | ); 232 | name = ScrollableTabControllerDemo; 233 | productName = ScrollableTabControllerDemo; 234 | productReference = EDEA2CBA1F2F18BB00B35F4A /* ScrollableTabControllerDemo.app */; 235 | productType = "com.apple.product-type.application"; 236 | }; 237 | /* End PBXNativeTarget section */ 238 | 239 | /* Begin PBXProject section */ 240 | ED747CF11F2B356700E228D2 /* Project object */ = { 241 | isa = PBXProject; 242 | attributes = { 243 | LastSwiftUpdateCheck = 0830; 244 | LastUpgradeCheck = 0830; 245 | ORGANIZATIONNAME = "Mitsuyoshi Yamazaki and Speee, Inc."; 246 | TargetAttributes = { 247 | ED0B456B20FDEBB100DE1967 = { 248 | CreatedOnToolsVersion = 9.4.1; 249 | ProvisioningStyle = Automatic; 250 | }; 251 | ED747CF91F2B356800E228D2 = { 252 | CreatedOnToolsVersion = 8.3.3; 253 | LastSwiftMigration = 0940; 254 | ProvisioningStyle = Automatic; 255 | }; 256 | EDEA2CB91F2F18BB00B35F4A = { 257 | CreatedOnToolsVersion = 8.3.3; 258 | LastSwiftMigration = 0940; 259 | ProvisioningStyle = Automatic; 260 | }; 261 | }; 262 | }; 263 | buildConfigurationList = ED747CF41F2B356700E228D2 /* Build configuration list for PBXProject "ScrollableTabController" */; 264 | compatibilityVersion = "Xcode 3.2"; 265 | developmentRegion = English; 266 | hasScannedForEncodings = 0; 267 | knownRegions = ( 268 | en, 269 | Base, 270 | ); 271 | mainGroup = ED747CF01F2B356700E228D2; 272 | productRefGroup = ED747CFB1F2B356800E228D2 /* Products */; 273 | projectDirPath = ""; 274 | projectRoot = ""; 275 | targets = ( 276 | ED747CF91F2B356800E228D2 /* ScrollableTabController */, 277 | EDEA2CB91F2F18BB00B35F4A /* ScrollableTabControllerDemo */, 278 | ED0B456B20FDEBB100DE1967 /* Swiftlint */, 279 | ); 280 | }; 281 | /* End PBXProject section */ 282 | 283 | /* Begin PBXResourcesBuildPhase section */ 284 | ED747CF81F2B356800E228D2 /* Resources */ = { 285 | isa = PBXResourcesBuildPhase; 286 | buildActionMask = 2147483647; 287 | files = ( 288 | ED7846D71F302A0E00511AB2 /* ScrollableTabController.xib in Resources */, 289 | ); 290 | runOnlyForDeploymentPostprocessing = 0; 291 | }; 292 | EDEA2CB81F2F18BB00B35F4A /* Resources */ = { 293 | isa = PBXResourcesBuildPhase; 294 | buildActionMask = 2147483647; 295 | files = ( 296 | EDEA2CC71F2F18BB00B35F4A /* LaunchScreen.storyboard in Resources */, 297 | EDEA2CC41F2F18BB00B35F4A /* Assets.xcassets in Resources */, 298 | EDEA2CC21F2F18BB00B35F4A /* Main.storyboard in Resources */, 299 | ); 300 | runOnlyForDeploymentPostprocessing = 0; 301 | }; 302 | /* End PBXResourcesBuildPhase section */ 303 | 304 | /* Begin PBXShellScriptBuildPhase section */ 305 | 566B2A3C49B044D73A817A4D /* [CP] Check Pods Manifest.lock */ = { 306 | isa = PBXShellScriptBuildPhase; 307 | buildActionMask = 2147483647; 308 | files = ( 309 | ); 310 | inputPaths = ( 311 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 312 | "${PODS_ROOT}/Manifest.lock", 313 | ); 314 | name = "[CP] Check Pods Manifest.lock"; 315 | outputPaths = ( 316 | "$(DERIVED_FILE_DIR)/Pods-ScrollableTabControllerDemo-checkManifestLockResult.txt", 317 | ); 318 | runOnlyForDeploymentPostprocessing = 0; 319 | shellPath = /bin/sh; 320 | 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"; 321 | showEnvVarsInLog = 0; 322 | }; 323 | 80967E728B2C7939E85EB1CE /* [CP] Check Pods Manifest.lock */ = { 324 | isa = PBXShellScriptBuildPhase; 325 | buildActionMask = 2147483647; 326 | files = ( 327 | ); 328 | inputPaths = ( 329 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 330 | "${PODS_ROOT}/Manifest.lock", 331 | ); 332 | name = "[CP] Check Pods Manifest.lock"; 333 | outputPaths = ( 334 | "$(DERIVED_FILE_DIR)/Pods-ScrollableTabController-checkManifestLockResult.txt", 335 | ); 336 | runOnlyForDeploymentPostprocessing = 0; 337 | shellPath = /bin/sh; 338 | 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"; 339 | showEnvVarsInLog = 0; 340 | }; 341 | ED0B456F20FDEBB600DE1967 /* Swiftlint */ = { 342 | isa = PBXShellScriptBuildPhase; 343 | buildActionMask = 2147483647; 344 | files = ( 345 | ); 346 | inputPaths = ( 347 | ); 348 | name = Swiftlint; 349 | outputPaths = ( 350 | ); 351 | runOnlyForDeploymentPostprocessing = 0; 352 | shellPath = /bin/sh; 353 | shellScript = "${SRCROOT}/Pods/SwiftLint/swiftlint autocorrect\n${SRCROOT}/Pods/SwiftLint/swiftlint"; 354 | }; 355 | /* End PBXShellScriptBuildPhase section */ 356 | 357 | /* Begin PBXSourcesBuildPhase section */ 358 | ED747CF51F2B356800E228D2 /* Sources */ = { 359 | isa = PBXSourcesBuildPhase; 360 | buildActionMask = 2147483647; 361 | files = ( 362 | ED747D0B1F2B361700E228D2 /* ScrollableTabController.swift in Sources */, 363 | ED7846DD1F3163A300511AB2 /* Extensions.swift in Sources */, 364 | ED7C21231F3AB00600018F97 /* Log.swift in Sources */, 365 | ED7846D91F302BB800511AB2 /* TouchTransparentView.swift in Sources */, 366 | ); 367 | runOnlyForDeploymentPostprocessing = 0; 368 | }; 369 | EDEA2CB61F2F18BB00B35F4A /* Sources */ = { 370 | isa = PBXSourcesBuildPhase; 371 | buildActionMask = 2147483647; 372 | files = ( 373 | EDABFDFE1F44299000E1D56C /* ProfileViewController.swift in Sources */, 374 | EDEA2CBD1F2F18BB00B35F4A /* AppDelegate.swift in Sources */, 375 | EDFE04241F4553BA00EDA902 /* TimelineViewController.swift in Sources */, 376 | ); 377 | runOnlyForDeploymentPostprocessing = 0; 378 | }; 379 | /* End PBXSourcesBuildPhase section */ 380 | 381 | /* Begin PBXTargetDependency section */ 382 | EDEA2CD01F2F309900B35F4A /* PBXTargetDependency */ = { 383 | isa = PBXTargetDependency; 384 | target = ED747CF91F2B356800E228D2 /* ScrollableTabController */; 385 | targetProxy = EDEA2CCF1F2F309900B35F4A /* PBXContainerItemProxy */; 386 | }; 387 | /* End PBXTargetDependency section */ 388 | 389 | /* Begin PBXVariantGroup section */ 390 | EDEA2CC01F2F18BB00B35F4A /* Main.storyboard */ = { 391 | isa = PBXVariantGroup; 392 | children = ( 393 | EDEA2CC11F2F18BB00B35F4A /* Base */, 394 | ); 395 | name = Main.storyboard; 396 | sourceTree = ""; 397 | }; 398 | EDEA2CC51F2F18BB00B35F4A /* LaunchScreen.storyboard */ = { 399 | isa = PBXVariantGroup; 400 | children = ( 401 | EDEA2CC61F2F18BB00B35F4A /* Base */, 402 | ); 403 | name = LaunchScreen.storyboard; 404 | sourceTree = ""; 405 | }; 406 | /* End PBXVariantGroup section */ 407 | 408 | /* Begin XCBuildConfiguration section */ 409 | ED0B456D20FDEBB100DE1967 /* Debug */ = { 410 | isa = XCBuildConfiguration; 411 | buildSettings = { 412 | CODE_SIGN_STYLE = Automatic; 413 | PRODUCT_NAME = "$(TARGET_NAME)"; 414 | }; 415 | name = Debug; 416 | }; 417 | ED0B456E20FDEBB100DE1967 /* Release */ = { 418 | isa = XCBuildConfiguration; 419 | buildSettings = { 420 | CODE_SIGN_STYLE = Automatic; 421 | PRODUCT_NAME = "$(TARGET_NAME)"; 422 | }; 423 | name = Release; 424 | }; 425 | ED747D001F2B356800E228D2 /* Debug */ = { 426 | isa = XCBuildConfiguration; 427 | buildSettings = { 428 | ALWAYS_SEARCH_USER_PATHS = NO; 429 | CLANG_ANALYZER_NONNULL = YES; 430 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 431 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 432 | CLANG_CXX_LIBRARY = "libc++"; 433 | CLANG_ENABLE_MODULES = YES; 434 | CLANG_ENABLE_OBJC_ARC = YES; 435 | CLANG_WARN_BOOL_CONVERSION = YES; 436 | CLANG_WARN_CONSTANT_CONVERSION = YES; 437 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 438 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 439 | CLANG_WARN_EMPTY_BODY = YES; 440 | CLANG_WARN_ENUM_CONVERSION = YES; 441 | CLANG_WARN_INFINITE_RECURSION = YES; 442 | CLANG_WARN_INT_CONVERSION = YES; 443 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 444 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 445 | CLANG_WARN_UNREACHABLE_CODE = YES; 446 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 447 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 448 | COPY_PHASE_STRIP = NO; 449 | CURRENT_PROJECT_VERSION = 1; 450 | DEBUG_INFORMATION_FORMAT = dwarf; 451 | ENABLE_STRICT_OBJC_MSGSEND = YES; 452 | ENABLE_TESTABILITY = YES; 453 | GCC_C_LANGUAGE_STANDARD = gnu99; 454 | GCC_DYNAMIC_NO_PIC = NO; 455 | GCC_NO_COMMON_BLOCKS = YES; 456 | GCC_OPTIMIZATION_LEVEL = 0; 457 | GCC_PREPROCESSOR_DEFINITIONS = ( 458 | "DEBUG=1", 459 | "$(inherited)", 460 | ); 461 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 462 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 463 | GCC_WARN_UNDECLARED_SELECTOR = YES; 464 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 465 | GCC_WARN_UNUSED_FUNCTION = YES; 466 | GCC_WARN_UNUSED_VARIABLE = YES; 467 | IPHONEOS_DEPLOYMENT_TARGET = 10.3; 468 | MTL_ENABLE_DEBUG_INFO = YES; 469 | ONLY_ACTIVE_ARCH = YES; 470 | SDKROOT = iphoneos; 471 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 472 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 473 | TARGETED_DEVICE_FAMILY = "1,2"; 474 | VERSIONING_SYSTEM = "apple-generic"; 475 | VERSION_INFO_PREFIX = ""; 476 | }; 477 | name = Debug; 478 | }; 479 | ED747D011F2B356800E228D2 /* Release */ = { 480 | isa = XCBuildConfiguration; 481 | buildSettings = { 482 | ALWAYS_SEARCH_USER_PATHS = NO; 483 | CLANG_ANALYZER_NONNULL = YES; 484 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 485 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 486 | CLANG_CXX_LIBRARY = "libc++"; 487 | CLANG_ENABLE_MODULES = YES; 488 | CLANG_ENABLE_OBJC_ARC = YES; 489 | CLANG_WARN_BOOL_CONVERSION = YES; 490 | CLANG_WARN_CONSTANT_CONVERSION = YES; 491 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 492 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 493 | CLANG_WARN_EMPTY_BODY = YES; 494 | CLANG_WARN_ENUM_CONVERSION = YES; 495 | CLANG_WARN_INFINITE_RECURSION = YES; 496 | CLANG_WARN_INT_CONVERSION = YES; 497 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 498 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 499 | CLANG_WARN_UNREACHABLE_CODE = YES; 500 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 501 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 502 | COPY_PHASE_STRIP = NO; 503 | CURRENT_PROJECT_VERSION = 1; 504 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 505 | ENABLE_NS_ASSERTIONS = NO; 506 | ENABLE_STRICT_OBJC_MSGSEND = YES; 507 | GCC_C_LANGUAGE_STANDARD = gnu99; 508 | GCC_NO_COMMON_BLOCKS = YES; 509 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 510 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 511 | GCC_WARN_UNDECLARED_SELECTOR = YES; 512 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 513 | GCC_WARN_UNUSED_FUNCTION = YES; 514 | GCC_WARN_UNUSED_VARIABLE = YES; 515 | IPHONEOS_DEPLOYMENT_TARGET = 10.3; 516 | MTL_ENABLE_DEBUG_INFO = NO; 517 | SDKROOT = iphoneos; 518 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 519 | TARGETED_DEVICE_FAMILY = "1,2"; 520 | VALIDATE_PRODUCT = YES; 521 | VERSIONING_SYSTEM = "apple-generic"; 522 | VERSION_INFO_PREFIX = ""; 523 | }; 524 | name = Release; 525 | }; 526 | ED747D031F2B356800E228D2 /* Debug */ = { 527 | isa = XCBuildConfiguration; 528 | baseConfigurationReference = 6C072FA980F14931CEBB7679 /* Pods-ScrollableTabController.debug.xcconfig */; 529 | buildSettings = { 530 | CLANG_ENABLE_MODULES = YES; 531 | CODE_SIGN_IDENTITY = ""; 532 | DEFINES_MODULE = YES; 533 | DYLIB_COMPATIBILITY_VERSION = 1; 534 | DYLIB_CURRENT_VERSION = 1; 535 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 536 | INFOPLIST_FILE = Source/Info.plist; 537 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 538 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 539 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 540 | OTHER_SWIFT_FLAGS = "-D DEBUG"; 541 | PRODUCT_BUNDLE_IDENTIFIER = jp.speee.ScrollableTabController; 542 | PRODUCT_NAME = "$(TARGET_NAME)"; 543 | SKIP_INSTALL = YES; 544 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 545 | SWIFT_SWIFT3_OBJC_INFERENCE = On; 546 | SWIFT_VERSION = 4.0; 547 | }; 548 | name = Debug; 549 | }; 550 | ED747D041F2B356800E228D2 /* Release */ = { 551 | isa = XCBuildConfiguration; 552 | baseConfigurationReference = 15080E8785A58508BD625180 /* Pods-ScrollableTabController.release.xcconfig */; 553 | buildSettings = { 554 | CLANG_ENABLE_MODULES = YES; 555 | CODE_SIGN_IDENTITY = ""; 556 | DEFINES_MODULE = YES; 557 | DYLIB_COMPATIBILITY_VERSION = 1; 558 | DYLIB_CURRENT_VERSION = 1; 559 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 560 | INFOPLIST_FILE = Source/Info.plist; 561 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 562 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 563 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 564 | PRODUCT_BUNDLE_IDENTIFIER = jp.speee.ScrollableTabController; 565 | PRODUCT_NAME = "$(TARGET_NAME)"; 566 | SKIP_INSTALL = YES; 567 | SWIFT_SWIFT3_OBJC_INFERENCE = On; 568 | SWIFT_VERSION = 4.0; 569 | }; 570 | name = Release; 571 | }; 572 | EDEA2CC91F2F18BB00B35F4A /* Debug */ = { 573 | isa = XCBuildConfiguration; 574 | baseConfigurationReference = 8829A7A02659876C63090515 /* Pods-ScrollableTabControllerDemo.debug.xcconfig */; 575 | buildSettings = { 576 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 577 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 578 | DEVELOPMENT_TEAM = ""; 579 | INFOPLIST_FILE = ScrollableTabControllerDemo/Info.plist; 580 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 581 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 582 | PRODUCT_BUNDLE_IDENTIFIER = jp.speee.ScrollableTabControllerDemo; 583 | PRODUCT_NAME = "$(TARGET_NAME)"; 584 | SWIFT_SWIFT3_OBJC_INFERENCE = On; 585 | SWIFT_VERSION = 4.0; 586 | }; 587 | name = Debug; 588 | }; 589 | EDEA2CCA1F2F18BB00B35F4A /* Release */ = { 590 | isa = XCBuildConfiguration; 591 | baseConfigurationReference = 51BB203299175CD9DA5B80CC /* Pods-ScrollableTabControllerDemo.release.xcconfig */; 592 | buildSettings = { 593 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 594 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 595 | DEVELOPMENT_TEAM = ""; 596 | INFOPLIST_FILE = ScrollableTabControllerDemo/Info.plist; 597 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 598 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 599 | PRODUCT_BUNDLE_IDENTIFIER = jp.speee.ScrollableTabControllerDemo; 600 | PRODUCT_NAME = "$(TARGET_NAME)"; 601 | SWIFT_SWIFT3_OBJC_INFERENCE = On; 602 | SWIFT_VERSION = 4.0; 603 | }; 604 | name = Release; 605 | }; 606 | /* End XCBuildConfiguration section */ 607 | 608 | /* Begin XCConfigurationList section */ 609 | ED0B456C20FDEBB100DE1967 /* Build configuration list for PBXAggregateTarget "Swiftlint" */ = { 610 | isa = XCConfigurationList; 611 | buildConfigurations = ( 612 | ED0B456D20FDEBB100DE1967 /* Debug */, 613 | ED0B456E20FDEBB100DE1967 /* Release */, 614 | ); 615 | defaultConfigurationIsVisible = 0; 616 | defaultConfigurationName = Release; 617 | }; 618 | ED747CF41F2B356700E228D2 /* Build configuration list for PBXProject "ScrollableTabController" */ = { 619 | isa = XCConfigurationList; 620 | buildConfigurations = ( 621 | ED747D001F2B356800E228D2 /* Debug */, 622 | ED747D011F2B356800E228D2 /* Release */, 623 | ); 624 | defaultConfigurationIsVisible = 0; 625 | defaultConfigurationName = Release; 626 | }; 627 | ED747D021F2B356800E228D2 /* Build configuration list for PBXNativeTarget "ScrollableTabController" */ = { 628 | isa = XCConfigurationList; 629 | buildConfigurations = ( 630 | ED747D031F2B356800E228D2 /* Debug */, 631 | ED747D041F2B356800E228D2 /* Release */, 632 | ); 633 | defaultConfigurationIsVisible = 0; 634 | defaultConfigurationName = Release; 635 | }; 636 | EDEA2CCB1F2F18BB00B35F4A /* Build configuration list for PBXNativeTarget "ScrollableTabControllerDemo" */ = { 637 | isa = XCConfigurationList; 638 | buildConfigurations = ( 639 | EDEA2CC91F2F18BB00B35F4A /* Debug */, 640 | EDEA2CCA1F2F18BB00B35F4A /* Release */, 641 | ); 642 | defaultConfigurationIsVisible = 0; 643 | defaultConfigurationName = Release; 644 | }; 645 | /* End XCConfigurationList section */ 646 | }; 647 | rootObject = ED747CF11F2B356700E228D2 /* Project object */; 648 | } 649 | -------------------------------------------------------------------------------- /ScrollableTabController.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ScrollableTabController.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // ScrollableTabControllerDemo 4 | // 5 | // Created by mitsuyoshi.yamazaki on 2017/07/31. 6 | // Copyright © 2017年 Mitsuyoshi Yamazaki and Speee, Inc. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import ScrollableTabController 11 | 12 | @UIApplicationMain 13 | class AppDelegate: UIResponder, UIApplicationDelegate { 14 | 15 | var window: UIWindow? 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 18 | 19 | window = UIWindow(frame: UIScreen.main.bounds) 20 | let storyboard = UIStoryboard.init(name: "Main", bundle: nil) 21 | 22 | // Setup content ViewControllers 23 | let timelineViewController = storyboard.instantiateViewController(withIdentifier: "TimelineViewController") as! TimelineViewController 24 | timelineViewController.title = "Timeline" 25 | timelineViewController.cellIdentifier = .normal 26 | 27 | let imageTimelineViewController = storyboard.instantiateViewController(withIdentifier: "TimelineViewController") as! TimelineViewController 28 | imageTimelineViewController.title = "Media" 29 | imageTimelineViewController.cellIdentifier = .image 30 | 31 | let upperContentViewController = storyboard.instantiateViewController(withIdentifier: "ProfileViewController") 32 | 33 | // Setup ScrollableTabController 34 | let scrollableTabController = ScrollableTabController() 35 | scrollableTabController.viewControllers = [ timelineViewController, imageTimelineViewController ] 36 | scrollableTabController.upperContentViewController = upperContentViewController 37 | 38 | let navigationController = UINavigationController.init(rootViewController: scrollableTabController) 39 | navigationController.navigationBar.isTranslucent = false 40 | 41 | window!.rootViewController = navigationController 42 | window!.makeKeyAndVisible() 43 | 44 | return true 45 | } 46 | 47 | func applicationWillResignActive(_ application: UIApplication) { 48 | } 49 | 50 | func applicationDidEnterBackground(_ application: UIApplication) { 51 | } 52 | 53 | func applicationWillEnterForeground(_ application: UIApplication) { 54 | } 55 | 56 | func applicationDidBecomeActive(_ application: UIApplication) { 57 | } 58 | 59 | func applicationWillTerminate(_ application: UIApplication) { 60 | } 61 | } 62 | 63 | extension UITableViewController: Scrollable { 64 | public var scrollView: UIScrollView! { 65 | return tableView 66 | } 67 | } 68 | 69 | class ExpandedTableView: UITableView { 70 | override var contentSize: CGSize { 71 | set { 72 | let size = CGSize.init(width: newValue.width, height: max(newValue.height, minimumContentHeight)) 73 | super.contentSize = size 74 | } 75 | get { 76 | return super.contentSize 77 | } 78 | } 79 | 80 | var minimumContentHeight: CGFloat { 81 | return frame.height 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "60x60", 35 | "idiom" : "iphone", 36 | "filename" : "Icon@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "60x60", 41 | "idiom" : "iphone", 42 | "filename" : "Icon@3x.png", 43 | "scale" : "3x" 44 | } 45 | ], 46 | "info" : { 47 | "version" : 1, 48 | "author" : "xcode" 49 | } 50 | } -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/Assets.xcassets/AppIcon.appiconset/Icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speee/ScrollableTabController/e76172212b556f7a863c33773cfdf10645330385/ScrollableTabControllerDemo/Assets.xcassets/AppIcon.appiconset/Icon@2x.png -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/Assets.xcassets/AppIcon.appiconset/Icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speee/ScrollableTabController/e76172212b556f7a863c33773cfdf10645330385/ScrollableTabControllerDemo/Assets.xcassets/AppIcon.appiconset/Icon@3x.png -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/Assets.xcassets/Button.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "Rectangle 17 Copy@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/Assets.xcassets/Button.imageset/Rectangle 17 Copy@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speee/ScrollableTabController/e76172212b556f7a863c33773cfdf10645330385/ScrollableTabControllerDemo/Assets.xcassets/Button.imageset/Rectangle 17 Copy@3x.png -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/Assets.xcassets/Cell.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "Dummy Cell@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/Assets.xcassets/Cell.imageset/Dummy Cell@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speee/ScrollableTabController/e76172212b556f7a863c33773cfdf10645330385/ScrollableTabControllerDemo/Assets.xcassets/Cell.imageset/Dummy Cell@3x.png -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/Assets.xcassets/CoverImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "night@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/Assets.xcassets/CoverImage.imageset/night@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speee/ScrollableTabController/e76172212b556f7a863c33773cfdf10645330385/ScrollableTabControllerDemo/Assets.xcassets/CoverImage.imageset/night@3x.png -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/Assets.xcassets/ImageCell.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "Dummy Image Cell@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/Assets.xcassets/ImageCell.imageset/Dummy Image Cell@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speee/ScrollableTabController/e76172212b556f7a863c33773cfdf10645330385/ScrollableTabControllerDemo/Assets.xcassets/ImageCell.imageset/Dummy Image Cell@3x.png -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/Assets.xcassets/LaunchBackground.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "iPhone 7@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/Assets.xcassets/LaunchBackground.imageset/iPhone 7@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speee/ScrollableTabController/e76172212b556f7a863c33773cfdf10645330385/ScrollableTabControllerDemo/Assets.xcassets/LaunchBackground.imageset/iPhone 7@3x.png -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/Assets.xcassets/PlaceholderText.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "Group 12@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/Assets.xcassets/PlaceholderText.imageset/Group 12@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speee/ScrollableTabController/e76172212b556f7a863c33773cfdf10645330385/ScrollableTabControllerDemo/Assets.xcassets/PlaceholderText.imageset/Group 12@3x.png -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/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 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/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 | ScrollableTab 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 0.0.1 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIRequiredDeviceCapabilities 26 | 27 | armv7 28 | 29 | UIStatusBarStyle 30 | UIStatusBarStyleLightContent 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UIViewControllerBasedStatusBarAppearance 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/ProfileViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProfileViewController.swift 3 | // ScrollableTabController 4 | // 5 | // Created by mitsuyoshi.yamazaki on 2017/08/16. 6 | // Copyright © 2017年 Mitsuyoshi Yamazaki and Speee, Inc. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Social 11 | import ScrollableTabController 12 | 13 | class ProfileViewController: UIViewController { 14 | 15 | @IBOutlet private weak var blurEffectView: UIVisualEffectView! 16 | 17 | // MARK: - Lifecycle 18 | override var preferredStatusBarStyle: UIStatusBarStyle { 19 | return .lightContent 20 | } 21 | 22 | override func viewDidLoad() { 23 | super.viewDidLoad() 24 | } 25 | 26 | override func viewWillAppear(_ animated: Bool) { 27 | super.viewWillAppear(animated) 28 | navigationController?.setNavigationBarHidden(true, animated: true) 29 | } 30 | 31 | override func viewDidLayoutSubviews() { 32 | super.viewDidLayoutSubviews() 33 | 34 | let defaultHeight: CGFloat = 266.0 35 | let minimumHeight: CGFloat = 64.0 36 | let transparency = min((view.frame.height - minimumHeight) / (defaultHeight - minimumHeight), 1.0) 37 | 38 | blurEffectView?.alpha = CGFloat(1.0) - transparency 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /ScrollableTabControllerDemo/TimelineViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TimelineViewController.swift 3 | // ScrollableTabController 4 | // 5 | // Created by mitsuyoshi.yamazaki on 2017/08/17. 6 | // Copyright © 2017年 Mitsuyoshi Yamazaki and Speee, Inc. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class TimelineViewController: UITableViewController { 12 | enum CellIdentifier: String { 13 | case normal = "Cell" 14 | case image = "ImageCell" 15 | } 16 | 17 | var cellIdentifier = CellIdentifier.normal 18 | 19 | override func viewDidLoad() { 20 | super.viewDidLoad() 21 | 22 | switch cellIdentifier { 23 | case .normal: 24 | tableView.rowHeight = 108.0 / 375.0 * view.frame.width 25 | case .image: 26 | tableView.rowHeight = 286.0 / 375.0 * view.frame.width 27 | } 28 | } 29 | 30 | // MARK: - Table view data source 31 | override func numberOfSections(in tableView: UITableView) -> Int { 32 | return 1 33 | } 34 | 35 | override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 36 | return 20 37 | } 38 | 39 | override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 40 | let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier.rawValue, for: indexPath) 41 | return cell 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Source/Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Extensions.swift 3 | // ScrollableTabController 4 | // 5 | // Created by mitsuyoshi.yamazaki on 2017/08/02. 6 | // Copyright © 2017年 Mitsuyoshi Yamazaki and Speee, Inc. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension UIViewController { 12 | func ancestor() -> Ancestor? { 13 | var controller: UIViewController? = self 14 | 15 | while controller?.parent != nil { 16 | if let ancestorViewController = controller?.parent as? Ancestor { 17 | return ancestorViewController 18 | } 19 | controller = controller?.parent 20 | } 21 | return nil 22 | } 23 | } 24 | 25 | extension Array { 26 | var isNotEmpty: Bool { 27 | return !isEmpty 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Source/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.0.1 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Source/Log.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Log.swift 3 | // ScrollableTabController 4 | // 5 | // Created by mitsuyoshi.yamazaki on 2017/08/09. 6 | // Copyright © 2017年 Mitsuyoshi Yamazaki and Speee, Inc. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | internal struct Log { 12 | static func error(_ message: String) { 13 | #if DEBUG 14 | fatalError(message) 15 | #else 16 | print(message) 17 | #endif 18 | } 19 | 20 | static func fatal(_ message: String) -> Never { 21 | fatalError(message) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Source/ScrollableTabController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ScrollableTabController.h 3 | // ScrollableTabController 4 | // 5 | // Created by Mitsuyoshi Yamazaki on 2017/07/28. 6 | // Copyright © 2017年 Mitsuyoshi Yamazaki and Speee, Inc. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for ScrollableTabController. 12 | FOUNDATION_EXPORT double ScrollableTabControllerVersionNumber; 13 | 14 | //! Project version string for ScrollableTabController. 15 | FOUNDATION_EXPORT const unsigned char ScrollableTabControllerVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /Source/ScrollableTabController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ScrollableTabController.swift 3 | // ScrollableTabController 4 | // 5 | // Created by Mitsuyoshi Yamazaki on 2017/07/28. 6 | // Copyright © 2017年 Mitsuyoshi Yamazaki and Speee, Inc. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public protocol Scrollable { 12 | var scrollView: UIScrollView! { get } 13 | } 14 | 15 | public final class ScrollableTabController: UIViewController { 16 | 17 | // MARK: - Public API 18 | public init() { 19 | let klass = type(of: self) 20 | let bundle = Bundle.init(for: klass) 21 | super.init(nibName: nil, bundle: bundle) 22 | } 23 | 24 | required public init?(coder aDecoder: NSCoder) { 25 | Log.fatal("init(coder:) has not been implemented") 26 | } 27 | 28 | public override var title: String? { 29 | set { 30 | super.title = newValue 31 | } 32 | get { 33 | if let title = super.title { 34 | return title 35 | } 36 | return upperContentViewController?.title 37 | } 38 | } 39 | 40 | public var viewControllers: [UIViewController] = [] { 41 | willSet { 42 | for controller in viewControllers { 43 | if controller.isViewLoaded { 44 | controller.view.removeFromSuperview() 45 | } 46 | controller.willMove(toParentViewController: nil) 47 | controller.removeFromParentViewController() 48 | } 49 | } 50 | didSet { 51 | if isViewLoaded { 52 | isTabViewHidden = viewControllers.count <= 1 53 | } 54 | 55 | segmentedControl?.removeAllSegments() 56 | 57 | for (index, controller) in viewControllers.enumerated() { 58 | addChildViewController(controller) 59 | controller.automaticallyAdjustsScrollViewInsets = false 60 | controller.didMove(toParentViewController: self) 61 | 62 | segmentedControl?.insertSegment(withTitle: controller.title, at: index, animated: false) 63 | } 64 | selectedIndex = 0 65 | } 66 | } 67 | 68 | public var selectedViewController: UIViewController? { 69 | guard viewControllers.isNotEmpty else { 70 | return nil 71 | } 72 | return viewControllers[selectedIndex] 73 | } 74 | 75 | public var selectedIndex = 0 { 76 | willSet { 77 | guard selectedViewController != nil else { 78 | return 79 | } 80 | stopContentObservable() 81 | } 82 | didSet { 83 | guard selectedIndex < viewControllers.count else { 84 | Log.fatal("index out of bounds. index: \(selectedIndex), viewControllers.count: \(viewControllers.count)") 85 | } 86 | guard selectedIndex != oldValue else { 87 | return 88 | } 89 | let previousViewController = viewControllers[oldValue] 90 | if previousViewController.isViewLoaded { 91 | previousViewController.view.removeFromSuperview() 92 | } 93 | 94 | if isViewLoaded { 95 | setupChildViewController() 96 | } 97 | 98 | if selectedIndex != segmentedControl?.selectedSegmentIndex { 99 | segmentedControl?.selectedSegmentIndex = selectedIndex 100 | } 101 | } 102 | } 103 | 104 | public var upperContentViewController: UIViewController? { 105 | willSet { 106 | stopUpperContentObservable() 107 | guard newValue != upperContentViewController else { 108 | return 109 | } 110 | upperContentViewController?.willMove(toParentViewController: nil) 111 | upperContentViewController?.view.removeObserver(self, forKeyPath: "frame") 112 | 113 | if upperContentViewController?.isViewLoaded ?? false { 114 | upperContentViewController?.view.removeFromSuperview() 115 | } 116 | 117 | upperContentViewController?.removeFromParentViewController() 118 | } 119 | didSet { 120 | guard upperContentViewController != oldValue, 121 | let controller = upperContentViewController 122 | else { 123 | return 124 | } 125 | didLayoutUpperContent = false 126 | 127 | addChildViewController(controller) 128 | controller.automaticallyAdjustsScrollViewInsets = false 129 | controller.didMove(toParentViewController: self) 130 | 131 | upperContentViewController = controller 132 | if isViewLoaded { 133 | setupUpperContentViewController() 134 | startUpperContentObservable() 135 | } 136 | } 137 | } 138 | 139 | public func set (scrollableControllers: [T]) where T: Scrollable { 140 | viewControllers = scrollableControllers 141 | } 142 | 143 | public var tabViewHeight: CGFloat { 144 | return isTabViewHidden ? 0.0 : tabView.frame.size.height 145 | } 146 | 147 | public var tabViewTintColor: UIColor? { 148 | get { 149 | return segmentedControl.tintColor 150 | } 151 | set { 152 | segmentedControl.tintColor = newValue 153 | } 154 | } 155 | 156 | // MARK: - Private Accessor 157 | @IBOutlet private weak var upperContentView: UIView! 158 | @IBOutlet private weak var segmentedControl: UISegmentedControl! { 159 | didSet { 160 | segmentedControl.removeAllSegments() 161 | 162 | for (index, controller) in viewControllers.enumerated() { 163 | segmentedControl.insertSegment(withTitle: controller.title, at: index, animated: false) 164 | } 165 | 166 | segmentedControl.selectedSegmentIndex = selectedIndex 167 | 168 | let action = #selector(self.segmentedControlDidChangeValue(sender:)) 169 | segmentedControl.addTarget(self, action: action, for: .valueChanged) 170 | } 171 | } 172 | @IBAction func segmentedControlDidChangeValue(sender: AnyObject!) { 173 | selectedIndex = segmentedControl.selectedSegmentIndex 174 | } 175 | 176 | @IBOutlet private weak var tabView: UIView! 177 | @IBOutlet private weak var tabContentView: UIView! 178 | @IBOutlet private weak var tabViewTopConstraint: NSLayoutConstraint! { 179 | didSet { 180 | let temp = didLayoutUpperContent 181 | didLayoutUpperContent = temp 182 | } 183 | } 184 | 185 | private var topScrollableContentViewController: Scrollable? { 186 | guard let scrollable = selectedViewController as? Scrollable else { 187 | return nil 188 | } 189 | return scrollable 190 | } 191 | 192 | private var isTabViewHidden: Bool { 193 | set { 194 | tabView.isHidden = newValue 195 | } 196 | get { 197 | return tabView.isHidden 198 | } 199 | } 200 | 201 | private var upperContentViewHeight: CGFloat = 0.0 202 | private var scrollInsetTop: CGFloat { 203 | return upperContentViewHeight + tabViewHeight 204 | } 205 | private var isUpperViewSizeFixed = false 206 | private var shouldIgnoreOffsetChange = false 207 | private var didLayoutUpperContent = false { 208 | didSet { 209 | if didLayoutUpperContent { 210 | tabViewTopConstraint?.priority = UILayoutPriority(rawValue: 950) 211 | } else { 212 | tabViewTopConstraint?.priority = UILayoutPriority(rawValue: 900) 213 | } 214 | } 215 | } 216 | 217 | // MARK: - Lifecycle 218 | public override var preferredStatusBarStyle: UIStatusBarStyle { 219 | return upperContentViewController?.preferredStatusBarStyle ?? .default 220 | } 221 | 222 | override public func viewDidLoad() { 223 | super.viewDidLoad() 224 | 225 | automaticallyAdjustsScrollViewInsets = false 226 | 227 | isTabViewHidden = viewControllers.count <= 1 228 | setupUpperContentViewController() 229 | setupChildViewController() 230 | startUpperContentObservable() 231 | } 232 | 233 | public override func viewDidLayoutSubviews() { 234 | super.viewDidLayoutSubviews() 235 | didLayoutUpperContent = true 236 | } 237 | 238 | private func setupUpperContentViewController() { 239 | guard isViewLoaded, 240 | let upperContentViewController = upperContentViewController 241 | else { 242 | return 243 | } 244 | 245 | upperContentView.addSubview(upperContentViewController.view) 246 | upperContentView.translatesAutoresizingMaskIntoConstraints = false 247 | upperContentViewController.view.translatesAutoresizingMaskIntoConstraints = false 248 | 249 | let constraints = [NSLayoutAttribute.top, .right, .left, .bottom].map { attribute -> NSLayoutConstraint in 250 | return NSLayoutConstraint.init( 251 | item: self.upperContentView, 252 | attribute: attribute, 253 | relatedBy: .equal, 254 | toItem: upperContentViewController.view, 255 | attribute: attribute, 256 | multiplier: 1, 257 | constant: 0 258 | ) 259 | } 260 | upperContentView.addConstraints(constraints) 261 | upperContentView.layoutIfNeeded() 262 | } 263 | 264 | private func setupChildViewController() { 265 | guard isViewLoaded, 266 | selectedIndex < viewControllers.count 267 | else { 268 | return 269 | } 270 | 271 | let currentViewController = viewControllers[selectedIndex] 272 | currentViewController.view.autoresizingMask = [ .flexibleWidth, .flexibleHeight ] 273 | currentViewController.view.frame = tabContentView.bounds 274 | currentViewController.view.setNeedsLayout() 275 | 276 | if let scrollable = currentViewController as? Scrollable { 277 | let scrollInsetTop = isUpperViewSizeFixed ? self.scrollInsetTop : 0.0 278 | let scrollInset = UIEdgeInsets.init(top: scrollInsetTop, left: 0.0, bottom: 0.0, right: 0.0) 279 | scrollable.scrollView.contentInset = scrollInset 280 | scrollable.scrollView.scrollIndicatorInsets = scrollInset 281 | 282 | let tabViewTop = tabViewTopConstraint.constant 283 | 284 | if tabViewTop == 0.0 { 285 | if scrollable.scrollView.contentOffset.y < 0.0 { 286 | let offset = -tabViewHeight 287 | 288 | scrollable.scrollView.contentOffset = CGPoint.init(x: 0.0, y: offset) 289 | observeScrollViewOffset(offset) 290 | shouldIgnoreOffsetChange = true 291 | } 292 | } else { 293 | let offset = -(tabViewHeight + tabViewTop) 294 | 295 | scrollable.scrollView.contentOffset = CGPoint.init(x: 0.0, y: offset) 296 | observeScrollViewOffset(offset) 297 | shouldIgnoreOffsetChange = true 298 | } 299 | } 300 | 301 | tabContentView.addSubview(currentViewController.view) 302 | 303 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) { 304 | self.shouldIgnoreOffsetChange = false 305 | } 306 | 307 | startContentObservable() 308 | } 309 | 310 | private func startUpperContentObservable() { 311 | guard isViewLoaded else { 312 | return 313 | } 314 | observeUpperViewHeight(upperContentView.frame.height) 315 | 316 | guard upperContentViewController != nil else { 317 | return 318 | } 319 | upperContentView.addObserver(self, forKeyPath: "bounds", options: .new, context: nil) 320 | upperContentView.layer.addObserver(self, forKeyPath: "frame", options: .new, context: nil) 321 | upperContentView.layer.addObserver(self, forKeyPath: "bounds", options: .new, context: nil) 322 | } 323 | 324 | private func startContentObservable() { 325 | guard let selectedViewController = selectedViewController as? Scrollable, isViewLoaded else { 326 | return 327 | } 328 | selectedViewController.scrollView.addObserver(self, forKeyPath: "contentOffset", options: .new, context: nil) 329 | } 330 | 331 | private func stopUpperContentObservable() { 332 | guard upperContentViewController != nil, isViewLoaded else { 333 | return 334 | } 335 | upperContentView.removeObserver(self, forKeyPath: "bounds") 336 | upperContentView.layer.removeObserver(self, forKeyPath: "frame") 337 | upperContentView.layer.removeObserver(self, forKeyPath: "bounds") 338 | } 339 | 340 | private func stopContentObservable() { 341 | guard let selectedViewController = selectedViewController as? Scrollable, isViewLoaded else { 342 | return 343 | } 344 | selectedViewController.scrollView.removeObserver(self, forKeyPath: "contentOffset") 345 | } 346 | 347 | override public func observeValue(forKeyPath keyPath: String?, 348 | of object: Any?, 349 | change: [NSKeyValueChangeKey: Any]?, 350 | context: UnsafeMutableRawPointer?) { 351 | switch keyPath { 352 | case .some("bounds"), .some("frame"): 353 | guard let frame = change?[.newKey] as? CGRect else { 354 | Log.error("Unexpected change[.newKey], expected: CGRect, actual: \(String(describing: change?[.newKey]))") 355 | return 356 | } 357 | observeUpperViewHeight(frame.height) 358 | 359 | case .some("contentOffset"): 360 | guard let offset = change?[.newKey] as? CGPoint else { 361 | Log.error("Unexpected change[.newKey], expected: CGPoint, actual: \(String(describing: change?[.newKey]))") 362 | return 363 | } 364 | observeScrollViewOffset(offset.y) 365 | 366 | default: 367 | break 368 | } 369 | } 370 | 371 | private func observeUpperViewHeight(_ height: CGFloat) { 372 | guard didLayoutUpperContent == false else { 373 | return 374 | } 375 | guard let scrollable = topScrollableContentViewController else { 376 | return 377 | } 378 | 379 | upperContentViewHeight = height 380 | isUpperViewSizeFixed = true 381 | 382 | guard scrollInsetTop != scrollable.scrollView.contentInset.top else { 383 | return 384 | } 385 | 386 | let scrollInset = UIEdgeInsets.init(top: scrollInsetTop, left: 0.0, bottom: 0.0, right: 0.0) 387 | scrollable.scrollView.contentInset = scrollInset 388 | scrollable.scrollView.scrollIndicatorInsets = scrollInset 389 | scrollable.scrollView.contentOffset = CGPoint.init(x: 0.0, y: -scrollInsetTop) 390 | } 391 | 392 | private func observeScrollViewOffset(_ offsetY: CGFloat) { 393 | guard didLayoutUpperContent == true else { 394 | return 395 | } 396 | 397 | guard offsetY > -(upperContentViewHeight + tabViewHeight) else { 398 | if tabViewTopConstraint.constant != upperContentViewHeight { 399 | tabViewTopConstraint.constant = upperContentViewHeight 400 | view.setNeedsLayout() // layoutIfNeeded() may not redraw the view 401 | } 402 | return 403 | } 404 | 405 | let offset = -(tabViewHeight + offsetY) 406 | let maxValue = CGFloat(0.0) 407 | let constant = max(offset, maxValue) 408 | 409 | guard constant != tabViewTopConstraint.constant else { 410 | return 411 | } 412 | 413 | guard shouldIgnoreOffsetChange == false else { 414 | let currentViewController = viewControllers[selectedIndex] 415 | if let scrollable = currentViewController as? Scrollable { 416 | let offset = -(self.tabViewTopConstraint.constant + self.tabViewHeight) 417 | DispatchQueue.main.async { 418 | scrollable.scrollView.contentOffset = CGPoint.init(x: 0.0, y: offset) 419 | } 420 | } 421 | return 422 | } 423 | 424 | if let scrollable = viewControllers[selectedIndex] as? Scrollable { 425 | let scrollInset = UIEdgeInsets.init(top: constant + tabViewHeight, left: 0.0, bottom: 0.0, right: 0.0) 426 | scrollable.scrollView.scrollIndicatorInsets = scrollInset 427 | } 428 | 429 | tabViewTopConstraint.constant = constant 430 | view.setNeedsLayout() // layoutIfNeeded() may not redraw the view 431 | } 432 | 433 | deinit { 434 | stopUpperContentObservable() 435 | stopContentObservable() 436 | } 437 | } 438 | 439 | extension UIViewController { 440 | public var scrollableTabController: ScrollableTabController? { 441 | return ancestor() 442 | } 443 | } 444 | -------------------------------------------------------------------------------- /Source/ScrollableTabController.xib: -------------------------------------------------------------------------------- 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 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /Source/TouchTransparentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TouchTransparentView.swift 3 | // ScrollableTabController 4 | // 5 | // Created by mitsuyoshi.yamazaki on 2017/08/01. 6 | // Copyright © 2017年 Mitsuyoshi Yamazaki and Speee, Inc. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public class TouchTransparentView: UIView { 12 | 13 | override public func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { 14 | let hitView = super.hitTest(point, with: event) 15 | 16 | guard hitView !== self else { 17 | return nil 18 | } 19 | return hitView 20 | } 21 | } 22 | --------------------------------------------------------------------------------