├── .gitignore ├── Assets ├── context.png ├── demo.gif └── storyboard.png ├── CatalystOutlineView.podspec ├── CatalystOutlineView.xcodeproj ├── project.pbxproj └── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── CatalystOutlineView ├── 0.1.0 │ └── CatalystOutlineView.podspec ├── CatalystOutlineView.h ├── Info.plist ├── LICENSE.swift └── Source │ ├── CatalystOutlineView.swift │ ├── Cell │ └── NodeCell.swift │ ├── Model │ └── Node.swift │ └── Protocols │ └── CatalystOutlineViewProtocols.swift ├── Example ├── Example.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── Example.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── Example │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ └── Contents.json │ ├── Base.lproj │ │ └── LaunchScreen.storyboard │ ├── Demo Classes │ │ ├── Base.lproj │ │ │ └── Main.storyboard │ │ ├── BasicViewCell.swift │ │ └── ViewController.swift │ ├── Example.entitlements │ ├── Info.plist │ └── SceneDelegate.swift ├── Podfile ├── Podfile.lock └── Pods │ ├── Local Podspecs │ └── CatalystOutlineView.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ └── project.pbxproj │ └── Target Support Files │ ├── CatalystOutlineView │ ├── CatalystOutlineView-Info.plist │ ├── CatalystOutlineView-dummy.m │ ├── CatalystOutlineView-prefix.pch │ ├── CatalystOutlineView-umbrella.h │ ├── CatalystOutlineView.debug.xcconfig │ ├── CatalystOutlineView.modulemap │ └── CatalystOutlineView.release.xcconfig │ └── Pods-Example │ ├── Pods-Example-Info.plist │ ├── Pods-Example-acknowledgements.markdown │ ├── Pods-Example-acknowledgements.plist │ ├── Pods-Example-dummy.m │ ├── Pods-Example-frameworks-Debug-input-files.xcfilelist │ ├── Pods-Example-frameworks-Debug-output-files.xcfilelist │ ├── Pods-Example-frameworks-Release-input-files.xcfilelist │ ├── Pods-Example-frameworks-Release-output-files.xcfilelist │ ├── Pods-Example-frameworks.sh │ ├── Pods-Example-umbrella.h │ ├── Pods-Example.debug.xcconfig │ ├── Pods-Example.modulemap │ └── Pods-Example.release.xcconfig ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## User settings 6 | xcuserdata/ 7 | 8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 9 | *.xcscmblueprint 10 | *.xccheckout 11 | 12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 13 | build/ 14 | DerivedData/ 15 | *.moved-aside 16 | *.pbxuser 17 | !default.pbxuser 18 | *.mode1v3 19 | !default.mode1v3 20 | *.mode2v3 21 | !default.mode2v3 22 | *.perspectivev3 23 | !default.perspectivev3 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | 28 | ## App packaging 29 | *.ipa 30 | *.dSYM.zip 31 | *.dSYM 32 | 33 | ## Playgrounds 34 | timeline.xctimeline 35 | playground.xcworkspace 36 | 37 | # Swift Package Manager 38 | # 39 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 40 | # Packages/ 41 | # Package.pins 42 | # Package.resolved 43 | # *.xcodeproj 44 | # 45 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata 46 | # hence it is not needed unless you have added a package configuration file to your project 47 | # .swiftpm 48 | 49 | .build/ 50 | 51 | # CocoaPods 52 | # 53 | # We recommend against adding the Pods directory to your .gitignore. However 54 | # you should judge for yourself, the pros and cons are mentioned at: 55 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 56 | # 57 | # Pods/ 58 | # 59 | # Add this line if you want to avoid checking in source code from the Xcode workspace 60 | # *.xcworkspace 61 | 62 | # Carthage 63 | # 64 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 65 | # Carthage/Checkouts 66 | 67 | Carthage/Build/ 68 | 69 | # Accio dependency management 70 | Dependencies/ 71 | .accio/ 72 | 73 | # fastlane 74 | # 75 | # It is recommended to not store the screenshots in the git repo. 76 | # Instead, use fastlane to re-generate the screenshots whenever they are needed. 77 | # For more information about the recommended setup visit: 78 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 79 | 80 | fastlane/report.xml 81 | fastlane/Preview.html 82 | fastlane/screenshots/**/*.png 83 | fastlane/test_output 84 | 85 | # Code Injection 86 | # 87 | # After new code Injection tools there's a generated folder /iOSInjectionProject 88 | # https://github.com/johnno1962/injectionforxcode 89 | 90 | iOSInjectionProject/ 91 | .DS_Store 92 | -------------------------------------------------------------------------------- /Assets/context.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InstaRobot/CatalystOutlineView/a4a7282e63837916495d17367cbcb63b5c4b497c/Assets/context.png -------------------------------------------------------------------------------- /Assets/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InstaRobot/CatalystOutlineView/a4a7282e63837916495d17367cbcb63b5c4b497c/Assets/demo.gif -------------------------------------------------------------------------------- /Assets/storyboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InstaRobot/CatalystOutlineView/a4a7282e63837916495d17367cbcb63b5c4b497c/Assets/storyboard.png -------------------------------------------------------------------------------- /CatalystOutlineView.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |spec| 2 | spec.name = 'CatalystOutlineView' 3 | spec.version = '0.1.2' 4 | spec.summary = 'NSOutlineView for UIKit (recreation of popular control from AppKit)' 5 | 6 | spec.ios.deployment_target = '13.0' 7 | spec.platform = :ios, "13.0" 8 | 9 | 10 | spec.homepage = 'https://github.com/InstaRobot/CatalystOutlineView' 11 | spec.license = { :type => 'MIT', :file => 'LICENSE' } 12 | spec.author = { 'DEVLAB' => 'v.podolskiy@devlab.studio' } 13 | spec.source = { :git => 'https://github.com/InstaRobot/CatalystOutlineView.git', :tag => spec.version.to_s } 14 | spec.social_media_url = 'https://twitter.com/StudioDevlab' 15 | spec.swift_version = '5.0' 16 | spec.requires_arc = true 17 | 18 | spec.source_files = 'CatalystOutlineView/**/*.swift' 19 | end -------------------------------------------------------------------------------- /CatalystOutlineView.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 50139894247DCB9F001B5830 /* LICENSE.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50139893247DCB9F001B5830 /* LICENSE.swift */; }; 11 | 50FC7DCA247C9BB20079AD4D /* CatalystOutlineView.h in Headers */ = {isa = PBXBuildFile; fileRef = 50FC7DC8247C9BB20079AD4D /* CatalystOutlineView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12 | 50FC7DD8247C9CA60079AD4D /* NodeCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50FC7DD2247C9CA60079AD4D /* NodeCell.swift */; }; 13 | 50FC7DD9247C9CA60079AD4D /* CatalystOutlineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50FC7DD3247C9CA60079AD4D /* CatalystOutlineView.swift */; }; 14 | 50FC7DDA247C9CA60079AD4D /* Node.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50FC7DD5247C9CA60079AD4D /* Node.swift */; }; 15 | 50FC7DDB247C9CA60079AD4D /* CatalystOutlineViewProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50FC7DD7247C9CA60079AD4D /* CatalystOutlineViewProtocols.swift */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXFileReference section */ 19 | 50139893247DCB9F001B5830 /* LICENSE.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LICENSE.swift; sourceTree = ""; }; 20 | 50FC7DC5247C9BB20079AD4D /* CatalystOutlineView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CatalystOutlineView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 21 | 50FC7DC8247C9BB20079AD4D /* CatalystOutlineView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CatalystOutlineView.h; sourceTree = ""; }; 22 | 50FC7DC9247C9BB20079AD4D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 23 | 50FC7DD2247C9CA60079AD4D /* NodeCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NodeCell.swift; sourceTree = ""; }; 24 | 50FC7DD3247C9CA60079AD4D /* CatalystOutlineView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CatalystOutlineView.swift; sourceTree = ""; }; 25 | 50FC7DD5247C9CA60079AD4D /* Node.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Node.swift; sourceTree = ""; }; 26 | 50FC7DD7247C9CA60079AD4D /* CatalystOutlineViewProtocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CatalystOutlineViewProtocols.swift; sourceTree = ""; }; 27 | /* End PBXFileReference section */ 28 | 29 | /* Begin PBXFrameworksBuildPhase section */ 30 | 50FC7DC2247C9BB20079AD4D /* Frameworks */ = { 31 | isa = PBXFrameworksBuildPhase; 32 | buildActionMask = 2147483647; 33 | files = ( 34 | ); 35 | runOnlyForDeploymentPostprocessing = 0; 36 | }; 37 | /* End PBXFrameworksBuildPhase section */ 38 | 39 | /* Begin PBXGroup section */ 40 | 50FC7DBB247C9BB20079AD4D = { 41 | isa = PBXGroup; 42 | children = ( 43 | 50FC7DC7247C9BB20079AD4D /* CatalystOutlineView */, 44 | 50FC7DC6247C9BB20079AD4D /* Products */, 45 | ); 46 | sourceTree = ""; 47 | }; 48 | 50FC7DC6247C9BB20079AD4D /* Products */ = { 49 | isa = PBXGroup; 50 | children = ( 51 | 50FC7DC5247C9BB20079AD4D /* CatalystOutlineView.framework */, 52 | ); 53 | name = Products; 54 | sourceTree = ""; 55 | }; 56 | 50FC7DC7247C9BB20079AD4D /* CatalystOutlineView */ = { 57 | isa = PBXGroup; 58 | children = ( 59 | 50FC7DD0247C9CA60079AD4D /* Source */, 60 | 50FC7DC8247C9BB20079AD4D /* CatalystOutlineView.h */, 61 | 50FC7DC9247C9BB20079AD4D /* Info.plist */, 62 | 50139893247DCB9F001B5830 /* LICENSE.swift */, 63 | ); 64 | path = CatalystOutlineView; 65 | sourceTree = ""; 66 | }; 67 | 50FC7DD0247C9CA60079AD4D /* Source */ = { 68 | isa = PBXGroup; 69 | children = ( 70 | 50FC7DD3247C9CA60079AD4D /* CatalystOutlineView.swift */, 71 | 50FC7DD1247C9CA60079AD4D /* Cell */, 72 | 50FC7DD4247C9CA60079AD4D /* Model */, 73 | 50FC7DD6247C9CA60079AD4D /* Protocols */, 74 | ); 75 | path = Source; 76 | sourceTree = ""; 77 | }; 78 | 50FC7DD1247C9CA60079AD4D /* Cell */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 50FC7DD2247C9CA60079AD4D /* NodeCell.swift */, 82 | ); 83 | path = Cell; 84 | sourceTree = ""; 85 | }; 86 | 50FC7DD4247C9CA60079AD4D /* Model */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 50FC7DD5247C9CA60079AD4D /* Node.swift */, 90 | ); 91 | path = Model; 92 | sourceTree = ""; 93 | }; 94 | 50FC7DD6247C9CA60079AD4D /* Protocols */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | 50FC7DD7247C9CA60079AD4D /* CatalystOutlineViewProtocols.swift */, 98 | ); 99 | path = Protocols; 100 | sourceTree = ""; 101 | }; 102 | /* End PBXGroup section */ 103 | 104 | /* Begin PBXHeadersBuildPhase section */ 105 | 50FC7DC0247C9BB20079AD4D /* Headers */ = { 106 | isa = PBXHeadersBuildPhase; 107 | buildActionMask = 2147483647; 108 | files = ( 109 | 50FC7DCA247C9BB20079AD4D /* CatalystOutlineView.h in Headers */, 110 | ); 111 | runOnlyForDeploymentPostprocessing = 0; 112 | }; 113 | /* End PBXHeadersBuildPhase section */ 114 | 115 | /* Begin PBXNativeTarget section */ 116 | 50FC7DC4247C9BB20079AD4D /* CatalystOutlineView */ = { 117 | isa = PBXNativeTarget; 118 | buildConfigurationList = 50FC7DCD247C9BB20079AD4D /* Build configuration list for PBXNativeTarget "CatalystOutlineView" */; 119 | buildPhases = ( 120 | 50FC7DC0247C9BB20079AD4D /* Headers */, 121 | 50FC7DC1247C9BB20079AD4D /* Sources */, 122 | 50FC7DC2247C9BB20079AD4D /* Frameworks */, 123 | 50FC7DC3247C9BB20079AD4D /* Resources */, 124 | ); 125 | buildRules = ( 126 | ); 127 | dependencies = ( 128 | ); 129 | name = CatalystOutlineView; 130 | productName = CatalystOutlineView; 131 | productReference = 50FC7DC5247C9BB20079AD4D /* CatalystOutlineView.framework */; 132 | productType = "com.apple.product-type.framework"; 133 | }; 134 | /* End PBXNativeTarget section */ 135 | 136 | /* Begin PBXProject section */ 137 | 50FC7DBC247C9BB20079AD4D /* Project object */ = { 138 | isa = PBXProject; 139 | attributes = { 140 | LastUpgradeCheck = 1150; 141 | ORGANIZATIONNAME = "DEVLAB Studio LLC"; 142 | TargetAttributes = { 143 | 50FC7DC4247C9BB20079AD4D = { 144 | CreatedOnToolsVersion = 11.5; 145 | }; 146 | }; 147 | }; 148 | buildConfigurationList = 50FC7DBF247C9BB20079AD4D /* Build configuration list for PBXProject "CatalystOutlineView" */; 149 | compatibilityVersion = "Xcode 9.3"; 150 | developmentRegion = en; 151 | hasScannedForEncodings = 0; 152 | knownRegions = ( 153 | en, 154 | Base, 155 | ); 156 | mainGroup = 50FC7DBB247C9BB20079AD4D; 157 | productRefGroup = 50FC7DC6247C9BB20079AD4D /* Products */; 158 | projectDirPath = ""; 159 | projectRoot = ""; 160 | targets = ( 161 | 50FC7DC4247C9BB20079AD4D /* CatalystOutlineView */, 162 | ); 163 | }; 164 | /* End PBXProject section */ 165 | 166 | /* Begin PBXResourcesBuildPhase section */ 167 | 50FC7DC3247C9BB20079AD4D /* Resources */ = { 168 | isa = PBXResourcesBuildPhase; 169 | buildActionMask = 2147483647; 170 | files = ( 171 | ); 172 | runOnlyForDeploymentPostprocessing = 0; 173 | }; 174 | /* End PBXResourcesBuildPhase section */ 175 | 176 | /* Begin PBXSourcesBuildPhase section */ 177 | 50FC7DC1247C9BB20079AD4D /* Sources */ = { 178 | isa = PBXSourcesBuildPhase; 179 | buildActionMask = 2147483647; 180 | files = ( 181 | 50FC7DDA247C9CA60079AD4D /* Node.swift in Sources */, 182 | 50FC7DD9247C9CA60079AD4D /* CatalystOutlineView.swift in Sources */, 183 | 50FC7DDB247C9CA60079AD4D /* CatalystOutlineViewProtocols.swift in Sources */, 184 | 50FC7DD8247C9CA60079AD4D /* NodeCell.swift in Sources */, 185 | 50139894247DCB9F001B5830 /* LICENSE.swift in Sources */, 186 | ); 187 | runOnlyForDeploymentPostprocessing = 0; 188 | }; 189 | /* End PBXSourcesBuildPhase section */ 190 | 191 | /* Begin XCBuildConfiguration section */ 192 | 50FC7DCB247C9BB20079AD4D /* Debug */ = { 193 | isa = XCBuildConfiguration; 194 | buildSettings = { 195 | ALWAYS_SEARCH_USER_PATHS = NO; 196 | CLANG_ANALYZER_NONNULL = YES; 197 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 198 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 199 | CLANG_CXX_LIBRARY = "libc++"; 200 | CLANG_ENABLE_MODULES = YES; 201 | CLANG_ENABLE_OBJC_ARC = YES; 202 | CLANG_ENABLE_OBJC_WEAK = YES; 203 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 204 | CLANG_WARN_BOOL_CONVERSION = YES; 205 | CLANG_WARN_COMMA = YES; 206 | CLANG_WARN_CONSTANT_CONVERSION = YES; 207 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 208 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 209 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 210 | CLANG_WARN_EMPTY_BODY = YES; 211 | CLANG_WARN_ENUM_CONVERSION = YES; 212 | CLANG_WARN_INFINITE_RECURSION = YES; 213 | CLANG_WARN_INT_CONVERSION = YES; 214 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 215 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 216 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 217 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 218 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 219 | CLANG_WARN_STRICT_PROTOTYPES = YES; 220 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 221 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 222 | CLANG_WARN_UNREACHABLE_CODE = YES; 223 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 224 | COPY_PHASE_STRIP = NO; 225 | CURRENT_PROJECT_VERSION = 1; 226 | DEBUG_INFORMATION_FORMAT = dwarf; 227 | ENABLE_STRICT_OBJC_MSGSEND = YES; 228 | ENABLE_TESTABILITY = YES; 229 | GCC_C_LANGUAGE_STANDARD = gnu11; 230 | GCC_DYNAMIC_NO_PIC = NO; 231 | GCC_NO_COMMON_BLOCKS = YES; 232 | GCC_OPTIMIZATION_LEVEL = 0; 233 | GCC_PREPROCESSOR_DEFINITIONS = ( 234 | "DEBUG=1", 235 | "$(inherited)", 236 | ); 237 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 238 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 239 | GCC_WARN_UNDECLARED_SELECTOR = YES; 240 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 241 | GCC_WARN_UNUSED_FUNCTION = YES; 242 | GCC_WARN_UNUSED_VARIABLE = YES; 243 | IPHONEOS_DEPLOYMENT_TARGET = 13.5; 244 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 245 | MTL_FAST_MATH = YES; 246 | ONLY_ACTIVE_ARCH = YES; 247 | SDKROOT = iphoneos; 248 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 249 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 250 | VERSIONING_SYSTEM = "apple-generic"; 251 | VERSION_INFO_PREFIX = ""; 252 | }; 253 | name = Debug; 254 | }; 255 | 50FC7DCC247C9BB20079AD4D /* Release */ = { 256 | isa = XCBuildConfiguration; 257 | buildSettings = { 258 | ALWAYS_SEARCH_USER_PATHS = NO; 259 | CLANG_ANALYZER_NONNULL = YES; 260 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 261 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 262 | CLANG_CXX_LIBRARY = "libc++"; 263 | CLANG_ENABLE_MODULES = YES; 264 | CLANG_ENABLE_OBJC_ARC = YES; 265 | CLANG_ENABLE_OBJC_WEAK = YES; 266 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 267 | CLANG_WARN_BOOL_CONVERSION = YES; 268 | CLANG_WARN_COMMA = YES; 269 | CLANG_WARN_CONSTANT_CONVERSION = YES; 270 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 271 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 272 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 273 | CLANG_WARN_EMPTY_BODY = YES; 274 | CLANG_WARN_ENUM_CONVERSION = YES; 275 | CLANG_WARN_INFINITE_RECURSION = YES; 276 | CLANG_WARN_INT_CONVERSION = YES; 277 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 278 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 279 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 280 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 281 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 282 | CLANG_WARN_STRICT_PROTOTYPES = YES; 283 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 284 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 285 | CLANG_WARN_UNREACHABLE_CODE = YES; 286 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 287 | COPY_PHASE_STRIP = NO; 288 | CURRENT_PROJECT_VERSION = 1; 289 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 290 | ENABLE_NS_ASSERTIONS = NO; 291 | ENABLE_STRICT_OBJC_MSGSEND = YES; 292 | GCC_C_LANGUAGE_STANDARD = gnu11; 293 | GCC_NO_COMMON_BLOCKS = YES; 294 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 295 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 296 | GCC_WARN_UNDECLARED_SELECTOR = YES; 297 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 298 | GCC_WARN_UNUSED_FUNCTION = YES; 299 | GCC_WARN_UNUSED_VARIABLE = YES; 300 | IPHONEOS_DEPLOYMENT_TARGET = 13.5; 301 | MTL_ENABLE_DEBUG_INFO = NO; 302 | MTL_FAST_MATH = YES; 303 | SDKROOT = iphoneos; 304 | SWIFT_COMPILATION_MODE = wholemodule; 305 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 306 | VALIDATE_PRODUCT = YES; 307 | VERSIONING_SYSTEM = "apple-generic"; 308 | VERSION_INFO_PREFIX = ""; 309 | }; 310 | name = Release; 311 | }; 312 | 50FC7DCE247C9BB20079AD4D /* Debug */ = { 313 | isa = XCBuildConfiguration; 314 | buildSettings = { 315 | CODE_SIGN_STYLE = Automatic; 316 | DEFINES_MODULE = YES; 317 | DYLIB_COMPATIBILITY_VERSION = 1; 318 | DYLIB_CURRENT_VERSION = 1; 319 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 320 | INFOPLIST_FILE = CatalystOutlineView/Info.plist; 321 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 322 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 323 | LD_RUNPATH_SEARCH_PATHS = ( 324 | "$(inherited)", 325 | "@executable_path/Frameworks", 326 | "@loader_path/Frameworks", 327 | ); 328 | PRODUCT_BUNDLE_IDENTIFIER = studio.devlab.CatalystOutlineView; 329 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 330 | SKIP_INSTALL = YES; 331 | SWIFT_VERSION = 5.0; 332 | TARGETED_DEVICE_FAMILY = "1,2"; 333 | }; 334 | name = Debug; 335 | }; 336 | 50FC7DCF247C9BB20079AD4D /* Release */ = { 337 | isa = XCBuildConfiguration; 338 | buildSettings = { 339 | CODE_SIGN_STYLE = Automatic; 340 | DEFINES_MODULE = YES; 341 | DYLIB_COMPATIBILITY_VERSION = 1; 342 | DYLIB_CURRENT_VERSION = 1; 343 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 344 | INFOPLIST_FILE = CatalystOutlineView/Info.plist; 345 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 346 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 347 | LD_RUNPATH_SEARCH_PATHS = ( 348 | "$(inherited)", 349 | "@executable_path/Frameworks", 350 | "@loader_path/Frameworks", 351 | ); 352 | PRODUCT_BUNDLE_IDENTIFIER = studio.devlab.CatalystOutlineView; 353 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 354 | SKIP_INSTALL = YES; 355 | SWIFT_VERSION = 5.0; 356 | TARGETED_DEVICE_FAMILY = "1,2"; 357 | }; 358 | name = Release; 359 | }; 360 | /* End XCBuildConfiguration section */ 361 | 362 | /* Begin XCConfigurationList section */ 363 | 50FC7DBF247C9BB20079AD4D /* Build configuration list for PBXProject "CatalystOutlineView" */ = { 364 | isa = XCConfigurationList; 365 | buildConfigurations = ( 366 | 50FC7DCB247C9BB20079AD4D /* Debug */, 367 | 50FC7DCC247C9BB20079AD4D /* Release */, 368 | ); 369 | defaultConfigurationIsVisible = 0; 370 | defaultConfigurationName = Release; 371 | }; 372 | 50FC7DCD247C9BB20079AD4D /* Build configuration list for PBXNativeTarget "CatalystOutlineView" */ = { 373 | isa = XCConfigurationList; 374 | buildConfigurations = ( 375 | 50FC7DCE247C9BB20079AD4D /* Debug */, 376 | 50FC7DCF247C9BB20079AD4D /* Release */, 377 | ); 378 | defaultConfigurationIsVisible = 0; 379 | defaultConfigurationName = Release; 380 | }; 381 | /* End XCConfigurationList section */ 382 | }; 383 | rootObject = 50FC7DBC247C9BB20079AD4D /* Project object */; 384 | } 385 | -------------------------------------------------------------------------------- /CatalystOutlineView.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CatalystOutlineView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /CatalystOutlineView/0.1.0/CatalystOutlineView.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |spec| 2 | spec.name = 'CatalystOutlineView' 3 | spec.version = '0.1.0' 4 | spec.summary = 'NSOutlineView for UIKit' 5 | 6 | spec.ios.deployment_target = '13.0' 7 | spec.platform = :ios, "13.0" 8 | 9 | 10 | spec.homepage = 'https://github.com/InstaRobot/CatalystOutlineView' 11 | spec.license = { :type => 'MIT', :file => 'LICENSE' } 12 | spec.author = { 'DEVLAB' => 'v.podolskiy@devlab.studio' } 13 | spec.source = { :git => 'https://github.com/InstaRobot/CatalystOutlineView.git', :tag => spec.version.to_s } 14 | spec.swift_version = '5.0' 15 | spec.requires_arc = true 16 | 17 | spec.source_files = 'CatalystOutlineView/**/*.swift' 18 | 19 | end -------------------------------------------------------------------------------- /CatalystOutlineView/CatalystOutlineView.h: -------------------------------------------------------------------------------- 1 | // 2 | // CatalystOutlineView.h 3 | // CatalystOutlineView - https://github.com/InstaRobot/CatalystOutlineView 4 | // 5 | // Copyright © 2020 DEBLAB. All rights reserved. 6 | // 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy 8 | // of this software and associated documentation files (the "Software"), to deal 9 | // in the Software without restriction, including without limitation the rights 10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | // copies of the Software, and to permit persons to whom the Software is 12 | // furnished to do so, subject to the following conditions: 13 | // 14 | // The above copyright notice and this permission notice shall be included in 15 | // all copies or substantial portions of the Software. 16 | // 17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | // THE SOFTWARE. 24 | 25 | #import 26 | 27 | //! Project version number for CatalystOutlineView. 28 | FOUNDATION_EXPORT double CatalystOutlineViewVersionNumber; 29 | 30 | //! Project version string for CatalystOutlineView. 31 | FOUNDATION_EXPORT const unsigned char CatalystOutlineViewVersionString[]; 32 | 33 | // In this header, you should import all the public headers of your framework using statements like #import 34 | -------------------------------------------------------------------------------- /CatalystOutlineView/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | 22 | 23 | -------------------------------------------------------------------------------- /CatalystOutlineView/LICENSE.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LICENSE.swift 3 | // CatalystOutlineView 4 | // 5 | // Copyright (c) 2020 DEVLAB Studio LLC 6 | // 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy 8 | // of this software and associated documentation files (the "Software"), to deal 9 | // in the Software without restriction, including without limitation the rights 10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | // copies of the Software, and to permit persons to whom the Software is 12 | // furnished to do so, subject to the following conditions: 13 | // 14 | // The above copyright notice and this permission notice shall be included in 15 | // all copies or substantial portions of the Software. 16 | // 17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | // THE SOFTWARE. 24 | // 25 | -------------------------------------------------------------------------------- /CatalystOutlineView/Source/CatalystOutlineView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CatalystOutlineView.swift 3 | // CatalystOutlineView - https://github.com/InstaRobot/CatalystOutlineView 4 | // 5 | // Copyright © 2020 DEBLAB. All rights reserved. 6 | // 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy 8 | // of this software and associated documentation files (the "Software"), to deal 9 | // in the Software without restriction, including without limitation the rights 10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | // copies of the Software, and to permit persons to whom the Software is 12 | // furnished to do so, subject to the following conditions: 13 | // 14 | // The above copyright notice and this permission notice shall be included in 15 | // all copies or substantial portions of the Software. 16 | // 17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | // THE SOFTWARE. 24 | 25 | import UIKit 26 | 27 | public class CatalystOutlineView: UITableView { 28 | 29 | public weak var outlineDataSource: CatalystOutlineViewDataSource? 30 | public weak var outlineDelegate: CatalystOutlineViewDelegate? 31 | 32 | public var contentNode: Node! 33 | public var orderedContentArray: [Node] = [] 34 | 35 | public override init(frame: CGRect, style: UITableView.Style) { 36 | super.init(frame: frame, style: style) 37 | configure() 38 | } 39 | 40 | public required init?(coder: NSCoder) { 41 | super.init(coder: coder) 42 | configure() 43 | } 44 | 45 | public override func reloadData() { 46 | contentNode = Node(level: 0) 47 | orderedContentArray = [] 48 | createContentNode(with: contentNode, from: nil) 49 | rebuildContent() 50 | 51 | super.reloadData() 52 | } 53 | 54 | } 55 | 56 | extension CatalystOutlineView: UITableViewDataSource { 57 | 58 | public func numberOfSections(in tableView: UITableView) -> Int { 59 | return 1 60 | } 61 | 62 | public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 63 | return orderedContentArray.count 64 | } 65 | 66 | public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 67 | guard 68 | let cell = outlineDelegate?.outlineView(self, cellForItem: orderedContentArray[indexPath.row].object) else { 69 | fatalError("Cannot create cell") 70 | } 71 | if cell is NodeCell { 72 | (cell as! NodeCell).currentLevel = orderedContentArray[indexPath.row].level 73 | } 74 | return cell 75 | } 76 | 77 | } 78 | 79 | extension CatalystOutlineView: UITableViewDelegate { 80 | 81 | public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 82 | tableView.deselectRow(at: indexPath, animated: true) 83 | let node = orderedContentArray[indexPath.row] 84 | if node.isLeaf { 85 | return 86 | } 87 | node.isCollapsed = !node.isCollapsed 88 | rebuildContent() 89 | 90 | var indexPaths: [IndexPath] = [] 91 | 92 | if node.isCollapsed { 93 | let copied = node.copy() as! Node 94 | for i in 0 ..< copied.expandedCount { 95 | indexPaths.append(IndexPath(row: indexPath.row + i + 1, section: 0)) 96 | } 97 | deleteRows(at: indexPaths, with: .fade) 98 | node.resetChildren() 99 | outlineDelegate?.outlineView(self, didCollapseItem: node.object) 100 | } 101 | else { 102 | for i in 0 ..< node.children.count { 103 | indexPaths.append(IndexPath(row: indexPath.row + i + 1, section: 0)) 104 | } 105 | insertRows(at: indexPaths, with: .fade) 106 | outlineDelegate?.outlineView(self, didExpandItem: node.object) 107 | } 108 | // we can inform cell for its current state 109 | if let cell = tableView.cellForRow(at: indexPath) { 110 | if cell.conforms(to: ExpandCollapseDisplaying.self) { 111 | /* print("cell conforms to expand and collapse displaying protocol") */ 112 | } 113 | if node.isCollapsed, cell.responds(to: NSSelectorFromString("collapse")) { 114 | cell.perform(NSSelectorFromString("collapse")) 115 | } 116 | else if cell.responds(to: NSSelectorFromString("expand")) { 117 | cell.perform(NSSelectorFromString("expand")) 118 | } 119 | } 120 | } 121 | 122 | public func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool { 123 | let node = orderedContentArray[indexPath.row] 124 | if node.isLeaf { 125 | return false 126 | } 127 | return true 128 | } 129 | 130 | public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 131 | let item = self.item(at: indexPath) 132 | let height = outlineDelegate?.height(forCell: self, ofItem: item.object) 133 | return height ?? UITableView.automaticDimension 134 | } 135 | 136 | public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 137 | return outlineDelegate?.height(forHeader: self) ?? 0 138 | } 139 | 140 | public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 141 | return outlineDelegate?.view(forHeader: self) 142 | } 143 | 144 | public func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? { 145 | return outlineDelegate?.contextMenuConfiguration(for: self.item(at: indexPath)) 146 | } 147 | 148 | } 149 | 150 | // MARK: - Private Section 151 | 152 | extension CatalystOutlineView { 153 | 154 | private func configure() { 155 | dataSource = self 156 | delegate = self 157 | } 158 | 159 | /// Rebuild all nodes 160 | private func rebuildContent() { 161 | let childrenInOrder = contentNode.getChildrenInOrder 162 | orderedContentArray = childrenInOrder 163 | } 164 | 165 | /// Get current node item for indexPath 166 | /// - Parameter indexPath: indexPath 167 | /// - Returns: current node from array 168 | private func item(at indexPath: IndexPath) -> Node { 169 | return orderedContentArray[indexPath.row] 170 | } 171 | 172 | /// Create content Node 173 | /// - Parameters: 174 | /// - parent: parent node or nil 175 | /// - item: current node or nil 176 | private func createContentNode(with parent: Node?, from item: Any?) { 177 | guard 178 | let outlineDataSource = outlineDataSource, 179 | let outlineDelegate = outlineDelegate else { 180 | return 181 | } 182 | let count = outlineDataSource.outlineView(self, numberOfChildrenOfItem: item) 183 | for index in 0 ..< count { 184 | let object = outlineDataSource.outlineView(self, child: index, ofItem: item) 185 | var level = parent?.level ?? 0 186 | level += 1 187 | let newNode = Node(level: level) 188 | newNode.object = object 189 | newNode.isCollapsed = outlineDelegate.outlineView(self, shouldCollapseItem: object) 190 | parent?.children.append(newNode) 191 | createContentNode(with: newNode, from: object) 192 | } 193 | } 194 | 195 | } 196 | -------------------------------------------------------------------------------- /CatalystOutlineView/Source/Cell/NodeCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NodeCell.swift 3 | // CatalystOutlineView - https://github.com/InstaRobot/CatalystOutlineView 4 | // 5 | // Copyright © 2020 DEBLAB. All rights reserved. 6 | // 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy 8 | // of this software and associated documentation files (the "Software"), to deal 9 | // in the Software without restriction, including without limitation the rights 10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | // copies of the Software, and to permit persons to whom the Software is 12 | // furnished to do so, subject to the following conditions: 13 | // 14 | // The above copyright notice and this permission notice shall be included in 15 | // all copies or substantial portions of the Software. 16 | // 17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | // THE SOFTWARE. 24 | 25 | import UIKit 26 | 27 | open class NodeCell: UITableViewCell { 28 | public var currentLevel: Int 29 | 30 | public init(currentLevel: Int, style: UITableViewCell.CellStyle, reuseIdentifier: String?) { 31 | self.currentLevel = currentLevel 32 | super.init(style: style, reuseIdentifier: reuseIdentifier) 33 | } 34 | 35 | required public init?(coder: NSCoder) { 36 | fatalError("init(coder:) has not been implemented") 37 | } 38 | 39 | } 40 | 41 | extension NodeCell: ExpandCollapseDisplaying { 42 | 43 | public func expand() { 44 | print("cell expanded now") 45 | } 46 | 47 | public func collapse() { 48 | print("cell collapsed now") 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /CatalystOutlineView/Source/Model/Node.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Node.swift 3 | // CatalystOutlineView - https://github.com/InstaRobot/CatalystOutlineView 4 | // 5 | // Copyright © 2020 DEBLAB. All rights reserved. 6 | // 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy 8 | // of this software and associated documentation files (the "Software"), to deal 9 | // in the Software without restriction, including without limitation the rights 10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | // copies of the Software, and to permit persons to whom the Software is 12 | // furnished to do so, subject to the following conditions: 13 | // 14 | // The above copyright notice and this permission notice shall be included in 15 | // all copies or substantial portions of the Software. 16 | // 17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | // THE SOFTWARE. 24 | 25 | import Foundation 26 | 27 | public class Node: NSObject, NSCopying { 28 | 29 | public var object: Any? 30 | public var isCollapsed = false 31 | public var children: [Node] 32 | 33 | // optional: for detecting offset for child cell 34 | public var level: Int 35 | 36 | public init(object: Any? = nil, children: [Node] = [], level: Int = 0) { 37 | self.object = object 38 | self.children = children 39 | self.level = level 40 | } 41 | 42 | public func copy(with zone: NSZone? = nil) -> Any { 43 | let copy = Node(object: object, children: children, level: level) 44 | return copy 45 | } 46 | 47 | public var isLeaf: Bool { 48 | return children.isEmpty 49 | } 50 | 51 | /// expanded nodes count for main node 52 | public var expandedCount: Int { 53 | var count = 0 54 | if isCollapsed || children.isEmpty { 55 | return count 56 | } 57 | count += children.count 58 | for child in children { 59 | count += child.expandedCount 60 | } 61 | return count 62 | } 63 | 64 | public var getChildrenInOrder: [Node] { 65 | if object != nil && (children.isEmpty || isCollapsed) { 66 | return [self] 67 | } 68 | var subChildren: [Node] = [] 69 | for child in children { 70 | subChildren += child.getChildrenInOrder 71 | } 72 | if object != nil { 73 | return [self] + subChildren 74 | } 75 | else { 76 | return subChildren 77 | } 78 | } 79 | 80 | /// reset all children nodes 81 | public func resetChildren() { 82 | for child in children { 83 | child.isCollapsed = true 84 | child.resetChildren() 85 | } 86 | } 87 | 88 | } 89 | -------------------------------------------------------------------------------- /CatalystOutlineView/Source/Protocols/CatalystOutlineViewProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CatalystOutlineViewProtocols.swift 3 | // CatalystOutlineView - https://github.com/InstaRobot/CatalystOutlineView 4 | // 5 | // Copyright © 2020 DEBLAB. All rights reserved. 6 | // 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy 8 | // of this software and associated documentation files (the "Software"), to deal 9 | // in the Software without restriction, including without limitation the rights 10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | // copies of the Software, and to permit persons to whom the Software is 12 | // furnished to do so, subject to the following conditions: 13 | // 14 | // The above copyright notice and this permission notice shall be included in 15 | // all copies or substantial portions of the Software. 16 | // 17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | // THE SOFTWARE. 24 | 25 | import UIKit 26 | 27 | public protocol CatalystOutlineViewDataSource: class { 28 | func outlineView(_ outlineView: CatalystOutlineView, numberOfChildrenOfItem item: Any?) -> Int 29 | func outlineView(_ outlineView: CatalystOutlineView, child index: Int, ofItem item: Any?) -> Any 30 | func outlineView(_ outlineView: CatalystOutlineView, isItemExpandable item: Any) -> Bool 31 | } 32 | 33 | public protocol CatalystOutlineViewDelegate: class { 34 | func outlineView(_ outlineView: CatalystOutlineView?, cellForItem item: Any?) -> UITableViewCell? 35 | func outlineView(_ outlineView: CatalystOutlineView?, shouldCollapseItem item: Any?) -> Bool 36 | func outlineView(_ outlineView: CatalystOutlineView?, didExpandItem item: Any?) 37 | func outlineView(_ outlineView: CatalystOutlineView?, didCollapseItem item: Any?) 38 | func view(forHeader outlineView: CatalystOutlineView?) -> UIView? 39 | func height(forHeader outlineView: CatalystOutlineView?) -> CGFloat 40 | func height(forCell outlineView: CatalystOutlineView?, ofItem item: Any?) -> CGFloat 41 | 42 | func contextMenuConfiguration(for item: Any?) -> UIContextMenuConfiguration? 43 | } 44 | 45 | @objc public protocol ExpandCollapseDisplaying: class { 46 | func expand() 47 | func collapse() 48 | } 49 | -------------------------------------------------------------------------------- /Example/Example.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 51; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 50CC4B21247CA5C500D7139C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CC4B20247CA5C500D7139C /* AppDelegate.swift */; }; 11 | 50CC4B23247CA5C500D7139C /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CC4B22247CA5C500D7139C /* SceneDelegate.swift */; }; 12 | 50CC4B25247CA5C500D7139C /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CC4B24247CA5C500D7139C /* ViewController.swift */; }; 13 | 50CC4B28247CA5C500D7139C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 50CC4B26247CA5C500D7139C /* Main.storyboard */; }; 14 | 50CC4B2A247CA5C700D7139C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 50CC4B29247CA5C700D7139C /* Assets.xcassets */; }; 15 | 50CC4B2D247CA5C700D7139C /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 50CC4B2B247CA5C700D7139C /* LaunchScreen.storyboard */; }; 16 | 50E67DD5247D6632000A394F /* BasicViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E67DD4247D6632000A394F /* BasicViewCell.swift */; }; 17 | C7E47AEA0E109DF607A17D13 /* Pods_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A79A251EA7C1698EFF226E21 /* Pods_Example.framework */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXFileReference section */ 21 | 50CC4B1D247CA5C500D7139C /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 22 | 50CC4B20247CA5C500D7139C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 23 | 50CC4B22247CA5C500D7139C /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 24 | 50CC4B24247CA5C500D7139C /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 25 | 50CC4B27247CA5C500D7139C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 26 | 50CC4B29247CA5C700D7139C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 27 | 50CC4B2C247CA5C700D7139C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 28 | 50CC4B2E247CA5C700D7139C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 29 | 50CC4B34247CA5DD00D7139C /* Example.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Example.entitlements; sourceTree = ""; }; 30 | 50E67DD4247D6632000A394F /* BasicViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicViewCell.swift; sourceTree = ""; }; 31 | 62A76876BDE68C4AC4A82A04 /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.release.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.release.xcconfig"; sourceTree = ""; }; 32 | 8AE286E42FDBB7E3E7F6A561 /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.debug.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.debug.xcconfig"; sourceTree = ""; }; 33 | A79A251EA7C1698EFF226E21 /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 34 | /* End PBXFileReference section */ 35 | 36 | /* Begin PBXFrameworksBuildPhase section */ 37 | 50CC4B1A247CA5C500D7139C /* Frameworks */ = { 38 | isa = PBXFrameworksBuildPhase; 39 | buildActionMask = 2147483647; 40 | files = ( 41 | C7E47AEA0E109DF607A17D13 /* Pods_Example.framework in Frameworks */, 42 | ); 43 | runOnlyForDeploymentPostprocessing = 0; 44 | }; 45 | /* End PBXFrameworksBuildPhase section */ 46 | 47 | /* Begin PBXGroup section */ 48 | 0AF0BBC4E7E5A2C33A34ED86 /* Frameworks */ = { 49 | isa = PBXGroup; 50 | children = ( 51 | A79A251EA7C1698EFF226E21 /* Pods_Example.framework */, 52 | ); 53 | name = Frameworks; 54 | sourceTree = ""; 55 | }; 56 | 3C637541B649A89EDEEB8018 /* Pods */ = { 57 | isa = PBXGroup; 58 | children = ( 59 | 8AE286E42FDBB7E3E7F6A561 /* Pods-Example.debug.xcconfig */, 60 | 62A76876BDE68C4AC4A82A04 /* Pods-Example.release.xcconfig */, 61 | ); 62 | path = Pods; 63 | sourceTree = ""; 64 | }; 65 | 50C49676247D893000788BAB /* Demo Classes */ = { 66 | isa = PBXGroup; 67 | children = ( 68 | 50CC4B26247CA5C500D7139C /* Main.storyboard */, 69 | 50CC4B24247CA5C500D7139C /* ViewController.swift */, 70 | 50E67DD4247D6632000A394F /* BasicViewCell.swift */, 71 | ); 72 | path = "Demo Classes"; 73 | sourceTree = ""; 74 | }; 75 | 50CC4B14247CA5C500D7139C = { 76 | isa = PBXGroup; 77 | children = ( 78 | 50CC4B1F247CA5C500D7139C /* Example */, 79 | 50CC4B1E247CA5C500D7139C /* Products */, 80 | 3C637541B649A89EDEEB8018 /* Pods */, 81 | 0AF0BBC4E7E5A2C33A34ED86 /* Frameworks */, 82 | ); 83 | sourceTree = ""; 84 | }; 85 | 50CC4B1E247CA5C500D7139C /* Products */ = { 86 | isa = PBXGroup; 87 | children = ( 88 | 50CC4B1D247CA5C500D7139C /* Example.app */, 89 | ); 90 | name = Products; 91 | sourceTree = ""; 92 | }; 93 | 50CC4B1F247CA5C500D7139C /* Example */ = { 94 | isa = PBXGroup; 95 | children = ( 96 | 50C49676247D893000788BAB /* Demo Classes */, 97 | 50CC4B34247CA5DD00D7139C /* Example.entitlements */, 98 | 50CC4B20247CA5C500D7139C /* AppDelegate.swift */, 99 | 50CC4B22247CA5C500D7139C /* SceneDelegate.swift */, 100 | 50CC4B29247CA5C700D7139C /* Assets.xcassets */, 101 | 50CC4B2B247CA5C700D7139C /* LaunchScreen.storyboard */, 102 | 50CC4B2E247CA5C700D7139C /* Info.plist */, 103 | ); 104 | path = Example; 105 | sourceTree = ""; 106 | }; 107 | /* End PBXGroup section */ 108 | 109 | /* Begin PBXNativeTarget section */ 110 | 50CC4B1C247CA5C500D7139C /* Example */ = { 111 | isa = PBXNativeTarget; 112 | buildConfigurationList = 50CC4B31247CA5C700D7139C /* Build configuration list for PBXNativeTarget "Example" */; 113 | buildPhases = ( 114 | 8784371A473371ED0C595245 /* [CP] Check Pods Manifest.lock */, 115 | 50CC4B19247CA5C500D7139C /* Sources */, 116 | 50CC4B1A247CA5C500D7139C /* Frameworks */, 117 | 50CC4B1B247CA5C500D7139C /* Resources */, 118 | A44C2304D31F9269984A1614 /* [CP] Embed Pods Frameworks */, 119 | ); 120 | buildRules = ( 121 | ); 122 | dependencies = ( 123 | ); 124 | name = Example; 125 | productName = Example; 126 | productReference = 50CC4B1D247CA5C500D7139C /* Example.app */; 127 | productType = "com.apple.product-type.application"; 128 | }; 129 | /* End PBXNativeTarget section */ 130 | 131 | /* Begin PBXProject section */ 132 | 50CC4B15247CA5C500D7139C /* Project object */ = { 133 | isa = PBXProject; 134 | attributes = { 135 | LastSwiftUpdateCheck = 1150; 136 | LastUpgradeCheck = 1150; 137 | ORGANIZATIONNAME = "DEVLAB Studio LLC"; 138 | TargetAttributes = { 139 | 50CC4B1C247CA5C500D7139C = { 140 | CreatedOnToolsVersion = 11.5; 141 | }; 142 | }; 143 | }; 144 | buildConfigurationList = 50CC4B18247CA5C500D7139C /* Build configuration list for PBXProject "Example" */; 145 | compatibilityVersion = "Xcode 9.3"; 146 | developmentRegion = en; 147 | hasScannedForEncodings = 0; 148 | knownRegions = ( 149 | en, 150 | Base, 151 | ); 152 | mainGroup = 50CC4B14247CA5C500D7139C; 153 | productRefGroup = 50CC4B1E247CA5C500D7139C /* Products */; 154 | projectDirPath = ""; 155 | projectRoot = ""; 156 | targets = ( 157 | 50CC4B1C247CA5C500D7139C /* Example */, 158 | ); 159 | }; 160 | /* End PBXProject section */ 161 | 162 | /* Begin PBXResourcesBuildPhase section */ 163 | 50CC4B1B247CA5C500D7139C /* Resources */ = { 164 | isa = PBXResourcesBuildPhase; 165 | buildActionMask = 2147483647; 166 | files = ( 167 | 50CC4B2D247CA5C700D7139C /* LaunchScreen.storyboard in Resources */, 168 | 50CC4B2A247CA5C700D7139C /* Assets.xcassets in Resources */, 169 | 50CC4B28247CA5C500D7139C /* Main.storyboard in Resources */, 170 | ); 171 | runOnlyForDeploymentPostprocessing = 0; 172 | }; 173 | /* End PBXResourcesBuildPhase section */ 174 | 175 | /* Begin PBXShellScriptBuildPhase section */ 176 | 8784371A473371ED0C595245 /* [CP] Check Pods Manifest.lock */ = { 177 | isa = PBXShellScriptBuildPhase; 178 | buildActionMask = 2147483647; 179 | files = ( 180 | ); 181 | inputFileListPaths = ( 182 | ); 183 | inputPaths = ( 184 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 185 | "${PODS_ROOT}/Manifest.lock", 186 | ); 187 | name = "[CP] Check Pods Manifest.lock"; 188 | outputFileListPaths = ( 189 | ); 190 | outputPaths = ( 191 | "$(DERIVED_FILE_DIR)/Pods-Example-checkManifestLockResult.txt", 192 | ); 193 | runOnlyForDeploymentPostprocessing = 0; 194 | shellPath = /bin/sh; 195 | 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"; 196 | showEnvVarsInLog = 0; 197 | }; 198 | A44C2304D31F9269984A1614 /* [CP] Embed Pods Frameworks */ = { 199 | isa = PBXShellScriptBuildPhase; 200 | buildActionMask = 2147483647; 201 | files = ( 202 | ); 203 | inputFileListPaths = ( 204 | "${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks-${CONFIGURATION}-input-files.xcfilelist", 205 | ); 206 | name = "[CP] Embed Pods Frameworks"; 207 | outputFileListPaths = ( 208 | "${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks-${CONFIGURATION}-output-files.xcfilelist", 209 | ); 210 | runOnlyForDeploymentPostprocessing = 0; 211 | shellPath = /bin/sh; 212 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh\"\n"; 213 | showEnvVarsInLog = 0; 214 | }; 215 | /* End PBXShellScriptBuildPhase section */ 216 | 217 | /* Begin PBXSourcesBuildPhase section */ 218 | 50CC4B19247CA5C500D7139C /* Sources */ = { 219 | isa = PBXSourcesBuildPhase; 220 | buildActionMask = 2147483647; 221 | files = ( 222 | 50CC4B25247CA5C500D7139C /* ViewController.swift in Sources */, 223 | 50CC4B21247CA5C500D7139C /* AppDelegate.swift in Sources */, 224 | 50CC4B23247CA5C500D7139C /* SceneDelegate.swift in Sources */, 225 | 50E67DD5247D6632000A394F /* BasicViewCell.swift in Sources */, 226 | ); 227 | runOnlyForDeploymentPostprocessing = 0; 228 | }; 229 | /* End PBXSourcesBuildPhase section */ 230 | 231 | /* Begin PBXVariantGroup section */ 232 | 50CC4B26247CA5C500D7139C /* Main.storyboard */ = { 233 | isa = PBXVariantGroup; 234 | children = ( 235 | 50CC4B27247CA5C500D7139C /* Base */, 236 | ); 237 | name = Main.storyboard; 238 | sourceTree = ""; 239 | }; 240 | 50CC4B2B247CA5C700D7139C /* LaunchScreen.storyboard */ = { 241 | isa = PBXVariantGroup; 242 | children = ( 243 | 50CC4B2C247CA5C700D7139C /* Base */, 244 | ); 245 | name = LaunchScreen.storyboard; 246 | sourceTree = ""; 247 | }; 248 | /* End PBXVariantGroup section */ 249 | 250 | /* Begin XCBuildConfiguration section */ 251 | 50CC4B2F247CA5C700D7139C /* Debug */ = { 252 | isa = XCBuildConfiguration; 253 | buildSettings = { 254 | ALWAYS_SEARCH_USER_PATHS = NO; 255 | CLANG_ANALYZER_NONNULL = YES; 256 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 257 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 258 | CLANG_CXX_LIBRARY = "libc++"; 259 | CLANG_ENABLE_MODULES = YES; 260 | CLANG_ENABLE_OBJC_ARC = YES; 261 | CLANG_ENABLE_OBJC_WEAK = YES; 262 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 263 | CLANG_WARN_BOOL_CONVERSION = YES; 264 | CLANG_WARN_COMMA = YES; 265 | CLANG_WARN_CONSTANT_CONVERSION = YES; 266 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 267 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 268 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 269 | CLANG_WARN_EMPTY_BODY = YES; 270 | CLANG_WARN_ENUM_CONVERSION = YES; 271 | CLANG_WARN_INFINITE_RECURSION = YES; 272 | CLANG_WARN_INT_CONVERSION = YES; 273 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 274 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 275 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 276 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 277 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 278 | CLANG_WARN_STRICT_PROTOTYPES = YES; 279 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 280 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 281 | CLANG_WARN_UNREACHABLE_CODE = YES; 282 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 283 | COPY_PHASE_STRIP = NO; 284 | DEBUG_INFORMATION_FORMAT = dwarf; 285 | ENABLE_STRICT_OBJC_MSGSEND = YES; 286 | ENABLE_TESTABILITY = YES; 287 | GCC_C_LANGUAGE_STANDARD = gnu11; 288 | GCC_DYNAMIC_NO_PIC = NO; 289 | GCC_NO_COMMON_BLOCKS = YES; 290 | GCC_OPTIMIZATION_LEVEL = 0; 291 | GCC_PREPROCESSOR_DEFINITIONS = ( 292 | "DEBUG=1", 293 | "$(inherited)", 294 | ); 295 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 296 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 297 | GCC_WARN_UNDECLARED_SELECTOR = YES; 298 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 299 | GCC_WARN_UNUSED_FUNCTION = YES; 300 | GCC_WARN_UNUSED_VARIABLE = YES; 301 | IPHONEOS_DEPLOYMENT_TARGET = 13.5; 302 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 303 | MTL_FAST_MATH = YES; 304 | ONLY_ACTIVE_ARCH = YES; 305 | SDKROOT = iphoneos; 306 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 307 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 308 | }; 309 | name = Debug; 310 | }; 311 | 50CC4B30247CA5C700D7139C /* Release */ = { 312 | isa = XCBuildConfiguration; 313 | buildSettings = { 314 | ALWAYS_SEARCH_USER_PATHS = NO; 315 | CLANG_ANALYZER_NONNULL = YES; 316 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 317 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 318 | CLANG_CXX_LIBRARY = "libc++"; 319 | CLANG_ENABLE_MODULES = YES; 320 | CLANG_ENABLE_OBJC_ARC = YES; 321 | CLANG_ENABLE_OBJC_WEAK = YES; 322 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 323 | CLANG_WARN_BOOL_CONVERSION = YES; 324 | CLANG_WARN_COMMA = YES; 325 | CLANG_WARN_CONSTANT_CONVERSION = YES; 326 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 327 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 328 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 329 | CLANG_WARN_EMPTY_BODY = YES; 330 | CLANG_WARN_ENUM_CONVERSION = YES; 331 | CLANG_WARN_INFINITE_RECURSION = YES; 332 | CLANG_WARN_INT_CONVERSION = YES; 333 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 334 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 335 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 336 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 337 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 338 | CLANG_WARN_STRICT_PROTOTYPES = YES; 339 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 340 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 341 | CLANG_WARN_UNREACHABLE_CODE = YES; 342 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 343 | COPY_PHASE_STRIP = NO; 344 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 345 | ENABLE_NS_ASSERTIONS = NO; 346 | ENABLE_STRICT_OBJC_MSGSEND = YES; 347 | GCC_C_LANGUAGE_STANDARD = gnu11; 348 | GCC_NO_COMMON_BLOCKS = YES; 349 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 350 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 351 | GCC_WARN_UNDECLARED_SELECTOR = YES; 352 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 353 | GCC_WARN_UNUSED_FUNCTION = YES; 354 | GCC_WARN_UNUSED_VARIABLE = YES; 355 | IPHONEOS_DEPLOYMENT_TARGET = 13.5; 356 | MTL_ENABLE_DEBUG_INFO = NO; 357 | MTL_FAST_MATH = YES; 358 | SDKROOT = iphoneos; 359 | SWIFT_COMPILATION_MODE = wholemodule; 360 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 361 | VALIDATE_PRODUCT = YES; 362 | }; 363 | name = Release; 364 | }; 365 | 50CC4B32247CA5C700D7139C /* Debug */ = { 366 | isa = XCBuildConfiguration; 367 | baseConfigurationReference = 8AE286E42FDBB7E3E7F6A561 /* Pods-Example.debug.xcconfig */; 368 | buildSettings = { 369 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 370 | CODE_SIGN_ENTITLEMENTS = Example/Example.entitlements; 371 | CODE_SIGN_IDENTITY = "Apple Development"; 372 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; 373 | CODE_SIGN_STYLE = Automatic; 374 | DEVELOPMENT_TEAM = ""; 375 | "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; 376 | INFOPLIST_FILE = Example/Info.plist; 377 | IPHONEOS_DEPLOYMENT_TARGET = 13.4; 378 | LD_RUNPATH_SEARCH_PATHS = ( 379 | "$(inherited)", 380 | "@executable_path/Frameworks", 381 | ); 382 | PRODUCT_BUNDLE_IDENTIFIER = studio.devlab.Example; 383 | PRODUCT_NAME = "$(TARGET_NAME)"; 384 | PROVISIONING_PROFILE_SPECIFIER = ""; 385 | "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; 386 | SUPPORTS_MACCATALYST = YES; 387 | SWIFT_VERSION = 5.0; 388 | TARGETED_DEVICE_FAMILY = 2; 389 | }; 390 | name = Debug; 391 | }; 392 | 50CC4B33247CA5C700D7139C /* Release */ = { 393 | isa = XCBuildConfiguration; 394 | baseConfigurationReference = 62A76876BDE68C4AC4A82A04 /* Pods-Example.release.xcconfig */; 395 | buildSettings = { 396 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 397 | CODE_SIGN_ENTITLEMENTS = Example/Example.entitlements; 398 | CODE_SIGN_IDENTITY = "Apple Development"; 399 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; 400 | CODE_SIGN_STYLE = Automatic; 401 | DEVELOPMENT_TEAM = ""; 402 | "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; 403 | INFOPLIST_FILE = Example/Info.plist; 404 | IPHONEOS_DEPLOYMENT_TARGET = 13.4; 405 | LD_RUNPATH_SEARCH_PATHS = ( 406 | "$(inherited)", 407 | "@executable_path/Frameworks", 408 | ); 409 | PRODUCT_BUNDLE_IDENTIFIER = studio.devlab.Example; 410 | PRODUCT_NAME = "$(TARGET_NAME)"; 411 | PROVISIONING_PROFILE_SPECIFIER = ""; 412 | "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; 413 | SUPPORTS_MACCATALYST = YES; 414 | SWIFT_VERSION = 5.0; 415 | TARGETED_DEVICE_FAMILY = 2; 416 | }; 417 | name = Release; 418 | }; 419 | /* End XCBuildConfiguration section */ 420 | 421 | /* Begin XCConfigurationList section */ 422 | 50CC4B18247CA5C500D7139C /* Build configuration list for PBXProject "Example" */ = { 423 | isa = XCConfigurationList; 424 | buildConfigurations = ( 425 | 50CC4B2F247CA5C700D7139C /* Debug */, 426 | 50CC4B30247CA5C700D7139C /* Release */, 427 | ); 428 | defaultConfigurationIsVisible = 0; 429 | defaultConfigurationName = Release; 430 | }; 431 | 50CC4B31247CA5C700D7139C /* Build configuration list for PBXNativeTarget "Example" */ = { 432 | isa = XCConfigurationList; 433 | buildConfigurations = ( 434 | 50CC4B32247CA5C700D7139C /* Debug */, 435 | 50CC4B33247CA5C700D7139C /* Release */, 436 | ); 437 | defaultConfigurationIsVisible = 0; 438 | defaultConfigurationName = Release; 439 | }; 440 | /* End XCConfigurationList section */ 441 | }; 442 | rootObject = 50CC4B15247CA5C500D7139C /* Project object */; 443 | } 444 | -------------------------------------------------------------------------------- /Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/Example.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/Example/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Example 4 | // 5 | // Created by Vitaliy Podolskiy on 26.05.2020. 6 | // Copyright © 2020 DEVLAB Studio LLC. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 15 | // Override point for customization after application launch. 16 | return true 17 | } 18 | 19 | // MARK: UISceneSession Lifecycle 20 | 21 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 22 | // Called when a new scene session is being created. 23 | // Use this method to select a configuration to create the new scene with. 24 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 25 | } 26 | 27 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { 28 | // Called when the user discards a scene session. 29 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. 30 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return. 31 | } 32 | 33 | 34 | } 35 | 36 | -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "scale" : "1x", 46 | "size" : "20x20" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "scale" : "2x", 51 | "size" : "20x20" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "scale" : "1x", 56 | "size" : "29x29" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "29x29" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "scale" : "1x", 66 | "size" : "40x40" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "scale" : "2x", 71 | "size" : "40x40" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "scale" : "1x", 76 | "size" : "76x76" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "scale" : "2x", 81 | "size" : "76x76" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "scale" : "2x", 86 | "size" : "83.5x83.5" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "scale" : "1x", 91 | "size" : "1024x1024" 92 | } 93 | ], 94 | "info" : { 95 | "author" : "xcode", 96 | "version" : 1 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Example/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Example/Example/Demo Classes/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 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /Example/Example/Demo Classes/BasicViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BasicViewCell.swift 3 | // Example 4 | // 5 | // Created by Vitaliy Podolskiy on 26.05.2020. 6 | // Copyright © 2020 DEVLAB Studio LLC. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import CatalystOutlineView 11 | 12 | class BasicViewCell: NodeCell { 13 | 14 | override init(currentLevel: Int, style: UITableViewCell.CellStyle, reuseIdentifier: String?) { 15 | super.init(currentLevel: currentLevel, style: .default, reuseIdentifier: reuseIdentifier) 16 | } 17 | 18 | required init?(coder: NSCoder) { 19 | fatalError("init(coder:) has not been implemented") 20 | } 21 | 22 | func configure(with string: String) { 23 | backgroundColor = .secondarySystemBackground 24 | 25 | let icon: UIImage? 26 | var offset: CGFloat = 0 27 | var tintColor: UIColor? 28 | 29 | switch currentLevel { 30 | case 1: 31 | icon = UIImage(systemName: "folder.circle.fill") 32 | offset = 20 33 | tintColor = .red 34 | case 2: 35 | icon = UIImage(systemName: "folder.circle") 36 | offset = 40 37 | tintColor = .orange 38 | case 3: 39 | icon = UIImage(systemName: "doc.circle") 40 | offset = 60 41 | tintColor = .brown 42 | default: 43 | return 44 | } 45 | 46 | let imageView: UIImageView = UIImageView(image: icon) 47 | addSubview(imageView) 48 | imageView.tintColor = tintColor 49 | imageView.translatesAutoresizingMaskIntoConstraints = false 50 | 51 | NSLayoutConstraint.activate([ 52 | imageView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: offset), 53 | imageView.centerYAnchor.constraint(equalTo: centerYAnchor), 54 | imageView.heightAnchor.constraint(equalToConstant: 30), 55 | imageView.widthAnchor.constraint(equalToConstant: 30) 56 | ]) 57 | 58 | let label = UILabel(frame: .infinite) 59 | label.textColor = .gray 60 | label.text = string 61 | label.translatesAutoresizingMaskIntoConstraints = false 62 | addSubview(label) 63 | 64 | NSLayoutConstraint.activate([ 65 | label.leadingAnchor.constraint(equalTo: imageView.trailingAnchor, constant: 15), 66 | label.centerYAnchor.constraint(equalTo: centerYAnchor) 67 | ]) 68 | 69 | } 70 | 71 | } 72 | -------------------------------------------------------------------------------- /Example/Example/Demo Classes/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // Example 4 | // 5 | // Created by Vitaliy Podolskiy on 26.05.2020. 6 | // Copyright © 2020 DEVLAB Studio LLC. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import CatalystOutlineView 11 | 12 | class ViewController: UIViewController { 13 | 14 | @IBOutlet private(set) weak var back: UIView! { 15 | didSet { 16 | back.layer.cornerRadius = 10 17 | back.layer.shadowOffset = .zero 18 | back.layer.shadowRadius = 10 19 | back.layer.shadowOpacity = 0.25 20 | } 21 | } 22 | 23 | @IBOutlet private(set) weak var outlineView: CatalystOutlineView! { 24 | didSet { 25 | outlineView.outlineDataSource = self 26 | outlineView.outlineDelegate = self 27 | 28 | // don't forget to register your custom cell class 29 | outlineView.register(BasicViewCell.self, forCellReuseIdentifier: String(describing: BasicViewCell.self)) 30 | outlineView.separatorStyle = .none 31 | } 32 | } 33 | 34 | var contentNodes: [Node] = [] 35 | 36 | override func viewDidLoad() { 37 | super.viewDidLoad() 38 | 39 | #if targetEnvironment(macCatalyst) 40 | view.backgroundColor = .secondarySystemBackground 41 | outlineView.backgroundColor = .secondarySystemBackground 42 | back.backgroundColor = .secondarySystemBackground 43 | #endif 44 | 45 | var nodes: [Node] = [] 46 | 47 | for index in 0 ... 9 { 48 | let node = Node(object: "Node witn index \(index)", level: 1) 49 | for _ in 0 ... 3 { 50 | let subnode = Node(object: "Subnode", level: 2) 51 | for i in 0 ... 5 { 52 | let leaf = Node(object: "Leaf with index \(i)", level: 3) 53 | subnode.children.append(leaf) 54 | } 55 | node.children.append(subnode) 56 | } 57 | nodes.append(node) 58 | } 59 | 60 | contentNodes = nodes 61 | } 62 | 63 | } 64 | 65 | extension ViewController: CatalystOutlineViewDataSource { 66 | 67 | func outlineView(_ outlineView: CatalystOutlineView, numberOfChildrenOfItem item: Any?) -> Int { 68 | if let item = item as? Node { 69 | return item.children.count 70 | } 71 | return contentNodes.count 72 | } 73 | 74 | func outlineView(_ outlineView: CatalystOutlineView, child index: Int, ofItem item: Any?) -> Any { 75 | if let item = item as? Node { 76 | return item.children[index] 77 | } 78 | return contentNodes[index] 79 | } 80 | 81 | func outlineView(_ outlineView: CatalystOutlineView, isItemExpandable item: Any) -> Bool { 82 | if let item = item as? Node { 83 | return !item.isLeaf 84 | } 85 | return false 86 | } 87 | 88 | } 89 | 90 | extension ViewController: CatalystOutlineViewDelegate { 91 | 92 | func outlineView(_ outlineView: CatalystOutlineView?, cellForItem item: Any?) -> UITableViewCell? { 93 | guard 94 | let item = item as? Node else { 95 | fatalError("Cannot create Node") 96 | } 97 | 98 | if let object = item.object as? String { 99 | let cell = BasicViewCell(currentLevel: item.level, style: .default, reuseIdentifier: String(describing: BasicViewCell.self)) 100 | cell.configure(with: object) 101 | return cell 102 | } 103 | 104 | fatalError("Cell is nil") 105 | } 106 | 107 | func outlineView(_ outlineView: CatalystOutlineView?, shouldCollapseItem item: Any?) -> Bool { 108 | return true 109 | } 110 | 111 | func outlineView(_ outlineView: CatalystOutlineView?, didExpandItem item: Any?) {} 112 | 113 | func outlineView(_ outlineView: CatalystOutlineView?, didCollapseItem item: Any?) {} 114 | 115 | func view(forHeader outlineView: CatalystOutlineView?) -> UIView? { nil } 116 | 117 | func height(forHeader outlineView: CatalystOutlineView?) -> CGFloat { 0 } 118 | 119 | func height(forCell outlineView: CatalystOutlineView?, ofItem item: Any?) -> CGFloat { 120 | return 50 121 | } 122 | 123 | func contextMenuConfiguration(for item: Any?) -> UIContextMenuConfiguration? { 124 | let actionProvider: ([UIMenuElement]) -> UIMenu? = { _ in 125 | let action1 = UIAction(title: "First menu action", attributes: [.destructive], state: .on) { _ in 126 | print("menu action") 127 | } 128 | let action2 = UIAction(title: "Second menu action") { _ in 129 | print("menu action") 130 | } 131 | let action3 = UIAction(title: "Third menu action") { _ in 132 | print("menu action") 133 | } 134 | let actions = [action1, action2, action3] 135 | return UIMenu(title: "", children: actions) 136 | } 137 | return UIContextMenuConfiguration(identifier: nil, previewProvider: nil, actionProvider: actionProvider) 138 | } 139 | 140 | } 141 | -------------------------------------------------------------------------------- /Example/Example/Example.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.disable-library-validation 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/Example/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UIApplicationSceneManifest 24 | 25 | UIApplicationSupportsMultipleScenes 26 | 27 | UISceneConfigurations 28 | 29 | UIWindowSceneSessionRoleApplication 30 | 31 | 32 | UISceneConfigurationName 33 | Default Configuration 34 | UISceneDelegateClassName 35 | $(PRODUCT_MODULE_NAME).SceneDelegate 36 | UISceneStoryboardFile 37 | Main 38 | 39 | 40 | 41 | 42 | UILaunchStoryboardName 43 | LaunchScreen 44 | UIMainStoryboardFile 45 | Main 46 | UIRequiredDeviceCapabilities 47 | 48 | armv7 49 | 50 | UISupportedInterfaceOrientations 51 | 52 | UIInterfaceOrientationPortrait 53 | UIInterfaceOrientationLandscapeLeft 54 | UIInterfaceOrientationLandscapeRight 55 | 56 | UISupportedInterfaceOrientations~ipad 57 | 58 | UIInterfaceOrientationPortrait 59 | UIInterfaceOrientationPortraitUpsideDown 60 | UIInterfaceOrientationLandscapeLeft 61 | UIInterfaceOrientationLandscapeRight 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /Example/Example/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // Example 4 | // 5 | // Created by Vitaliy Podolskiy on 26.05.2020. 6 | // Copyright © 2020 DEVLAB Studio LLC. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 12 | 13 | var window: UIWindow? 14 | 15 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 16 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. 17 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. 18 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). 19 | guard let _ = (scene as? UIWindowScene) else { return } 20 | } 21 | 22 | func sceneDidDisconnect(_ scene: UIScene) { 23 | // Called as the scene is being released by the system. 24 | // This occurs shortly after the scene enters the background, or when its session is discarded. 25 | // Release any resources associated with this scene that can be re-created the next time the scene connects. 26 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead). 27 | } 28 | 29 | func sceneDidBecomeActive(_ scene: UIScene) { 30 | // Called when the scene has moved from an inactive state to an active state. 31 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. 32 | } 33 | 34 | func sceneWillResignActive(_ scene: UIScene) { 35 | // Called when the scene will move from an active state to an inactive state. 36 | // This may occur due to temporary interruptions (ex. an incoming phone call). 37 | } 38 | 39 | func sceneWillEnterForeground(_ scene: UIScene) { 40 | // Called as the scene transitions from the background to the foreground. 41 | // Use this method to undo the changes made on entering the background. 42 | } 43 | 44 | func sceneDidEnterBackground(_ scene: UIScene) { 45 | // Called as the scene transitions from the foreground to the background. 46 | // Use this method to save data, release shared resources, and store enough scene-specific state information 47 | // to restore the scene back to its current state. 48 | } 49 | 50 | } 51 | 52 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | platform :ios, '13.0' 3 | 4 | def pods 5 | pod 'CatalystOutlineView', :path => '../' 6 | end 7 | 8 | target 'Example' do 9 | # Comment the next line if you don't want to use dynamic frameworks 10 | use_frameworks! 11 | 12 | # Pods for Example 13 | pods 14 | end 15 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - CatalystOutlineView (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - CatalystOutlineView (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | CatalystOutlineView: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | CatalystOutlineView: ed1a869bb548742e1bfcdae6a8ee570dbe496b4a 13 | 14 | PODFILE CHECKSUM: a1494415b50169afda9de5b3693da593791df11b 15 | 16 | COCOAPODS: 1.9.1 17 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/CatalystOutlineView.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "CatalystOutlineView", 3 | "version": "0.1.0", 4 | "summary": "NSOutlineView for UIKit", 5 | "platforms": { 6 | "ios": "13.0" 7 | }, 8 | "homepage": "https://github.com/InstaRobot/CatalystOutlineView", 9 | "license": { 10 | "type": "MIT", 11 | "file": "LICENSE" 12 | }, 13 | "authors": { 14 | "DEVLAB": "v.podolskiy@devlab.studio" 15 | }, 16 | "source": { 17 | "git": "https://github.com/InstaRobot/CatalystOutlineView.git", 18 | "tag": "0.1.0" 19 | }, 20 | "swift_versions": "5.0", 21 | "requires_arc": true, 22 | "source_files": "CatalystOutlineView/**/*.swift", 23 | "swift_version": "5.0" 24 | } 25 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - CatalystOutlineView (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - CatalystOutlineView (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | CatalystOutlineView: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | CatalystOutlineView: ed1a869bb548742e1bfcdae6a8ee570dbe496b4a 13 | 14 | PODFILE CHECKSUM: a1494415b50169afda9de5b3693da593791df11b 15 | 16 | COCOAPODS: 1.9.1 17 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 51; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 050C6968078BC6A77F601D1F53FE228F /* Pods-Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7825A90E082A1582EB16256B0E722B3F /* Pods-Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | 263C22AD26C864C03E0E0CA0F16CEFF6 /* CatalystOutlineViewProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 932727415F9BA220DB6029388698A747 /* CatalystOutlineViewProtocols.swift */; }; 12 | 3237EF3139D95C546E28C6B3BFC5ACB5 /* CatalystOutlineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4248A3080449D71BB690749DC1D2DF39 /* CatalystOutlineView.swift */; }; 13 | 5BF1853D79827903672DC7CA7172CE22 /* CatalystOutlineView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = DDE028096B65AC247D90620B5BA0171B /* CatalystOutlineView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 14 | 78DCFF227C62693F49FE099EE277F31F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; 15 | 94E38E208588238FBFAC7BCC143628AC /* CatalystOutlineView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 00F1AA0575E2893901163510321D287E /* CatalystOutlineView-dummy.m */; }; 16 | 9D369E10B71EF9B949FC82C39C379A6F /* NodeCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97EBE03B03AEC3DA739634121525402A /* NodeCell.swift */; }; 17 | B11882FB2F9D2BC2FBAA52E055FE5A55 /* Pods-Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D6D7C498FA339E02BD53ECB8916CEA8E /* Pods-Example-dummy.m */; }; 18 | BCA39DFE53188C4D115BBD8DCEE77405 /* Node.swift in Sources */ = {isa = PBXBuildFile; fileRef = 976E48622389B8DDCD1A9B967C9407EE /* Node.swift */; }; 19 | EEC10409AAB2C72455AD3664B29ECC63 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXContainerItemProxy section */ 23 | 8075C690D6CA4F4D2DACCD92A9247853 /* PBXContainerItemProxy */ = { 24 | isa = PBXContainerItemProxy; 25 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 26 | proxyType = 1; 27 | remoteGlobalIDString = FC39FD3A8E951546F469D2425B9D7C48; 28 | remoteInfo = CatalystOutlineView; 29 | }; 30 | /* End PBXContainerItemProxy section */ 31 | 32 | /* Begin PBXFileReference section */ 33 | 00F1AA0575E2893901163510321D287E /* CatalystOutlineView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "CatalystOutlineView-dummy.m"; sourceTree = ""; }; 34 | 0833EA355AEE6F9F2D3C3C22D8F2E20A /* CatalystOutlineView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = CatalystOutlineView.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 35 | 1F667CC0E19EAF34E5A4119E2121F585 /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 36 | 243410B9535472556EA4BB6DBC133A0D /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.release.xcconfig"; sourceTree = ""; }; 37 | 26ADADE6429735858D69D1C5E4E4FA01 /* CatalystOutlineView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = CatalystOutlineView.modulemap; sourceTree = ""; }; 38 | 31C1D37707DFAA5E6A164BCC07834264 /* Pods-Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-Info.plist"; sourceTree = ""; }; 39 | 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 40 | 35C305D3797C284E6F5BAA1D3E6F9BF8 /* Pods-Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-Example.modulemap"; sourceTree = ""; }; 41 | 41173FCCBDA47EDD7EB541F1CDF357C9 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 42 | 4248A3080449D71BB690749DC1D2DF39 /* CatalystOutlineView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CatalystOutlineView.swift; path = CatalystOutlineView/Source/CatalystOutlineView.swift; sourceTree = ""; }; 43 | 441854E35F81731E63E53DC7E4EEAD9D /* Pods-Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Example-acknowledgements.markdown"; sourceTree = ""; }; 44 | 44CB35BA54CF63E8950D343321B13F41 /* CatalystOutlineView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CatalystOutlineView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | 47C3B36BA453D636F838B21A5647F6B2 /* CatalystOutlineView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = CatalystOutlineView.debug.xcconfig; sourceTree = ""; }; 46 | 7825A90E082A1582EB16256B0E722B3F /* Pods-Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Example-umbrella.h"; sourceTree = ""; }; 47 | 932727415F9BA220DB6029388698A747 /* CatalystOutlineViewProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CatalystOutlineViewProtocols.swift; sourceTree = ""; }; 48 | 96B59E34A7BDF705D9474ACAA016D6E1 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 49 | 976E48622389B8DDCD1A9B967C9407EE /* Node.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Node.swift; sourceTree = ""; }; 50 | 97EBE03B03AEC3DA739634121525402A /* NodeCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NodeCell.swift; sourceTree = ""; }; 51 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 52 | AFECBC24E09D0D25F822C27BD944AFD4 /* Pods-Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Example-frameworks.sh"; sourceTree = ""; }; 53 | B45138496B85A072654D1D0F8EBBEDE5 /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.debug.xcconfig"; sourceTree = ""; }; 54 | BC7558F5A5AEC56070B1AA09C47B1495 /* CatalystOutlineView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "CatalystOutlineView-Info.plist"; sourceTree = ""; }; 55 | C60080C786C7150522242A68FDFAA2E2 /* CatalystOutlineView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = CatalystOutlineView.release.xcconfig; sourceTree = ""; }; 56 | D6D7C498FA339E02BD53ECB8916CEA8E /* Pods-Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Example-dummy.m"; sourceTree = ""; }; 57 | DDE028096B65AC247D90620B5BA0171B /* CatalystOutlineView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CatalystOutlineView-umbrella.h"; sourceTree = ""; }; 58 | EA21B344259B58996DB73382B1B1521F /* Pods-Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-acknowledgements.plist"; sourceTree = ""; }; 59 | F84B4D17D1EA7A67FDE4BAC621EB1CF3 /* CatalystOutlineView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CatalystOutlineView-prefix.pch"; sourceTree = ""; }; 60 | /* End PBXFileReference section */ 61 | 62 | /* Begin PBXFrameworksBuildPhase section */ 63 | DAFD455448D3E8C5BD5DC9E351AB727B /* Frameworks */ = { 64 | isa = PBXFrameworksBuildPhase; 65 | buildActionMask = 2147483647; 66 | files = ( 67 | EEC10409AAB2C72455AD3664B29ECC63 /* Foundation.framework in Frameworks */, 68 | ); 69 | runOnlyForDeploymentPostprocessing = 0; 70 | }; 71 | DC8D8F5CDEDF3601994901F4A70A33AC /* Frameworks */ = { 72 | isa = PBXFrameworksBuildPhase; 73 | buildActionMask = 2147483647; 74 | files = ( 75 | 78DCFF227C62693F49FE099EE277F31F /* Foundation.framework in Frameworks */, 76 | ); 77 | runOnlyForDeploymentPostprocessing = 0; 78 | }; 79 | /* End PBXFrameworksBuildPhase section */ 80 | 81 | /* Begin PBXGroup section */ 82 | 34EBE1678AC53AE5374ADA35DA8E2B1C /* Cell */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | 97EBE03B03AEC3DA739634121525402A /* NodeCell.swift */, 86 | ); 87 | name = Cell; 88 | path = CatalystOutlineView/Source/Cell; 89 | sourceTree = ""; 90 | }; 91 | 411F591B7497D7949D73E2043FBC13C2 /* Protocols */ = { 92 | isa = PBXGroup; 93 | children = ( 94 | 932727415F9BA220DB6029388698A747 /* CatalystOutlineViewProtocols.swift */, 95 | ); 96 | name = Protocols; 97 | path = CatalystOutlineView/Source/Protocols; 98 | sourceTree = ""; 99 | }; 100 | 5F72373831AEBF4FDEEE15ACDBEBB30E /* Pod */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | 0833EA355AEE6F9F2D3C3C22D8F2E20A /* CatalystOutlineView.podspec */, 104 | 96B59E34A7BDF705D9474ACAA016D6E1 /* LICENSE */, 105 | 41173FCCBDA47EDD7EB541F1CDF357C9 /* README.md */, 106 | ); 107 | name = Pod; 108 | sourceTree = ""; 109 | }; 110 | 70CD12ED11082A0751475A96AA5B8763 /* Development Pods */ = { 111 | isa = PBXGroup; 112 | children = ( 113 | FF91A6891FE2D9CA14E59C1E0E59FA59 /* CatalystOutlineView */, 114 | ); 115 | name = "Development Pods"; 116 | sourceTree = ""; 117 | }; 118 | 9BDBD95ED116334D1B2835202D8D3060 /* Pods-Example */ = { 119 | isa = PBXGroup; 120 | children = ( 121 | 35C305D3797C284E6F5BAA1D3E6F9BF8 /* Pods-Example.modulemap */, 122 | 441854E35F81731E63E53DC7E4EEAD9D /* Pods-Example-acknowledgements.markdown */, 123 | EA21B344259B58996DB73382B1B1521F /* Pods-Example-acknowledgements.plist */, 124 | D6D7C498FA339E02BD53ECB8916CEA8E /* Pods-Example-dummy.m */, 125 | AFECBC24E09D0D25F822C27BD944AFD4 /* Pods-Example-frameworks.sh */, 126 | 31C1D37707DFAA5E6A164BCC07834264 /* Pods-Example-Info.plist */, 127 | 7825A90E082A1582EB16256B0E722B3F /* Pods-Example-umbrella.h */, 128 | B45138496B85A072654D1D0F8EBBEDE5 /* Pods-Example.debug.xcconfig */, 129 | 243410B9535472556EA4BB6DBC133A0D /* Pods-Example.release.xcconfig */, 130 | ); 131 | name = "Pods-Example"; 132 | path = "Target Support Files/Pods-Example"; 133 | sourceTree = ""; 134 | }; 135 | BC637F78D8502604F28E9AD2F03FF3B1 /* Products */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | 44CB35BA54CF63E8950D343321B13F41 /* CatalystOutlineView.framework */, 139 | 1F667CC0E19EAF34E5A4119E2121F585 /* Pods_Example.framework */, 140 | ); 141 | name = Products; 142 | sourceTree = ""; 143 | }; 144 | C0834CEBB1379A84116EF29F93051C60 /* iOS */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */, 148 | ); 149 | name = iOS; 150 | sourceTree = ""; 151 | }; 152 | C309DE81D29CA26185BA9FA58CBF3F0A /* Support Files */ = { 153 | isa = PBXGroup; 154 | children = ( 155 | 26ADADE6429735858D69D1C5E4E4FA01 /* CatalystOutlineView.modulemap */, 156 | 00F1AA0575E2893901163510321D287E /* CatalystOutlineView-dummy.m */, 157 | BC7558F5A5AEC56070B1AA09C47B1495 /* CatalystOutlineView-Info.plist */, 158 | F84B4D17D1EA7A67FDE4BAC621EB1CF3 /* CatalystOutlineView-prefix.pch */, 159 | DDE028096B65AC247D90620B5BA0171B /* CatalystOutlineView-umbrella.h */, 160 | 47C3B36BA453D636F838B21A5647F6B2 /* CatalystOutlineView.debug.xcconfig */, 161 | C60080C786C7150522242A68FDFAA2E2 /* CatalystOutlineView.release.xcconfig */, 162 | ); 163 | name = "Support Files"; 164 | path = "Example/Pods/Target Support Files/CatalystOutlineView"; 165 | sourceTree = ""; 166 | }; 167 | CE2E825F08D3AD0FD76E6D78D7512ED0 /* Targets Support Files */ = { 168 | isa = PBXGroup; 169 | children = ( 170 | 9BDBD95ED116334D1B2835202D8D3060 /* Pods-Example */, 171 | ); 172 | name = "Targets Support Files"; 173 | sourceTree = ""; 174 | }; 175 | CF1408CF629C7361332E53B88F7BD30C = { 176 | isa = PBXGroup; 177 | children = ( 178 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 179 | 70CD12ED11082A0751475A96AA5B8763 /* Development Pods */, 180 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, 181 | BC637F78D8502604F28E9AD2F03FF3B1 /* Products */, 182 | CE2E825F08D3AD0FD76E6D78D7512ED0 /* Targets Support Files */, 183 | ); 184 | sourceTree = ""; 185 | }; 186 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { 187 | isa = PBXGroup; 188 | children = ( 189 | C0834CEBB1379A84116EF29F93051C60 /* iOS */, 190 | ); 191 | name = Frameworks; 192 | sourceTree = ""; 193 | }; 194 | D7CACA11262E1A2A35D3019405BE5DA7 /* Model */ = { 195 | isa = PBXGroup; 196 | children = ( 197 | 976E48622389B8DDCD1A9B967C9407EE /* Node.swift */, 198 | ); 199 | name = Model; 200 | path = CatalystOutlineView/Source/Model; 201 | sourceTree = ""; 202 | }; 203 | FF91A6891FE2D9CA14E59C1E0E59FA59 /* CatalystOutlineView */ = { 204 | isa = PBXGroup; 205 | children = ( 206 | 4248A3080449D71BB690749DC1D2DF39 /* CatalystOutlineView.swift */, 207 | 34EBE1678AC53AE5374ADA35DA8E2B1C /* Cell */, 208 | D7CACA11262E1A2A35D3019405BE5DA7 /* Model */, 209 | 5F72373831AEBF4FDEEE15ACDBEBB30E /* Pod */, 210 | 411F591B7497D7949D73E2043FBC13C2 /* Protocols */, 211 | C309DE81D29CA26185BA9FA58CBF3F0A /* Support Files */, 212 | ); 213 | name = CatalystOutlineView; 214 | path = ../..; 215 | sourceTree = ""; 216 | }; 217 | /* End PBXGroup section */ 218 | 219 | /* Begin PBXHeadersBuildPhase section */ 220 | B1719B93FA79336E676E01AD8E6A2670 /* Headers */ = { 221 | isa = PBXHeadersBuildPhase; 222 | buildActionMask = 2147483647; 223 | files = ( 224 | 5BF1853D79827903672DC7CA7172CE22 /* CatalystOutlineView-umbrella.h in Headers */, 225 | ); 226 | runOnlyForDeploymentPostprocessing = 0; 227 | }; 228 | CEDC58DEF68D2EF02336B93E9D494020 /* Headers */ = { 229 | isa = PBXHeadersBuildPhase; 230 | buildActionMask = 2147483647; 231 | files = ( 232 | 050C6968078BC6A77F601D1F53FE228F /* Pods-Example-umbrella.h in Headers */, 233 | ); 234 | runOnlyForDeploymentPostprocessing = 0; 235 | }; 236 | /* End PBXHeadersBuildPhase section */ 237 | 238 | /* Begin PBXNativeTarget section */ 239 | 0AEE99A309977BD12A049FF48AF9BA4B /* Pods-Example */ = { 240 | isa = PBXNativeTarget; 241 | buildConfigurationList = 11F52F9DBB84008DED0F4DB084E5A30E /* Build configuration list for PBXNativeTarget "Pods-Example" */; 242 | buildPhases = ( 243 | CEDC58DEF68D2EF02336B93E9D494020 /* Headers */, 244 | 200C2BA7F86A08F9151FC9E4D6332C24 /* Sources */, 245 | DAFD455448D3E8C5BD5DC9E351AB727B /* Frameworks */, 246 | 90138332E54CAE5EC33E7A2F5DE85EA2 /* Resources */, 247 | ); 248 | buildRules = ( 249 | ); 250 | dependencies = ( 251 | 0D684267821DE7A871553C16B8EEEB4C /* PBXTargetDependency */, 252 | ); 253 | name = "Pods-Example"; 254 | productName = "Pods-Example"; 255 | productReference = 1F667CC0E19EAF34E5A4119E2121F585 /* Pods_Example.framework */; 256 | productType = "com.apple.product-type.framework"; 257 | }; 258 | FC39FD3A8E951546F469D2425B9D7C48 /* CatalystOutlineView */ = { 259 | isa = PBXNativeTarget; 260 | buildConfigurationList = ACA9C9FFA41640688EAE299505F9E66D /* Build configuration list for PBXNativeTarget "CatalystOutlineView" */; 261 | buildPhases = ( 262 | B1719B93FA79336E676E01AD8E6A2670 /* Headers */, 263 | 79107379FC9CF25BC5AE7FD7B6F577CF /* Sources */, 264 | DC8D8F5CDEDF3601994901F4A70A33AC /* Frameworks */, 265 | 0F2048689D5471AFF0AF1561B8B3BA04 /* Resources */, 266 | ); 267 | buildRules = ( 268 | ); 269 | dependencies = ( 270 | ); 271 | name = CatalystOutlineView; 272 | productName = CatalystOutlineView; 273 | productReference = 44CB35BA54CF63E8950D343321B13F41 /* CatalystOutlineView.framework */; 274 | productType = "com.apple.product-type.framework"; 275 | }; 276 | /* End PBXNativeTarget section */ 277 | 278 | /* Begin PBXProject section */ 279 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = { 280 | isa = PBXProject; 281 | attributes = { 282 | LastSwiftUpdateCheck = 1100; 283 | LastUpgradeCheck = 1150; 284 | }; 285 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; 286 | compatibilityVersion = "Xcode 10.0"; 287 | developmentRegion = en; 288 | hasScannedForEncodings = 0; 289 | knownRegions = ( 290 | en, 291 | Base, 292 | ); 293 | mainGroup = CF1408CF629C7361332E53B88F7BD30C; 294 | productRefGroup = BC637F78D8502604F28E9AD2F03FF3B1 /* Products */; 295 | projectDirPath = ""; 296 | projectRoot = ""; 297 | targets = ( 298 | FC39FD3A8E951546F469D2425B9D7C48 /* CatalystOutlineView */, 299 | 0AEE99A309977BD12A049FF48AF9BA4B /* Pods-Example */, 300 | ); 301 | }; 302 | /* End PBXProject section */ 303 | 304 | /* Begin PBXResourcesBuildPhase section */ 305 | 0F2048689D5471AFF0AF1561B8B3BA04 /* Resources */ = { 306 | isa = PBXResourcesBuildPhase; 307 | buildActionMask = 2147483647; 308 | files = ( 309 | ); 310 | runOnlyForDeploymentPostprocessing = 0; 311 | }; 312 | 90138332E54CAE5EC33E7A2F5DE85EA2 /* Resources */ = { 313 | isa = PBXResourcesBuildPhase; 314 | buildActionMask = 2147483647; 315 | files = ( 316 | ); 317 | runOnlyForDeploymentPostprocessing = 0; 318 | }; 319 | /* End PBXResourcesBuildPhase section */ 320 | 321 | /* Begin PBXSourcesBuildPhase section */ 322 | 200C2BA7F86A08F9151FC9E4D6332C24 /* Sources */ = { 323 | isa = PBXSourcesBuildPhase; 324 | buildActionMask = 2147483647; 325 | files = ( 326 | B11882FB2F9D2BC2FBAA52E055FE5A55 /* Pods-Example-dummy.m in Sources */, 327 | ); 328 | runOnlyForDeploymentPostprocessing = 0; 329 | }; 330 | 79107379FC9CF25BC5AE7FD7B6F577CF /* Sources */ = { 331 | isa = PBXSourcesBuildPhase; 332 | buildActionMask = 2147483647; 333 | files = ( 334 | 94E38E208588238FBFAC7BCC143628AC /* CatalystOutlineView-dummy.m in Sources */, 335 | 3237EF3139D95C546E28C6B3BFC5ACB5 /* CatalystOutlineView.swift in Sources */, 336 | 263C22AD26C864C03E0E0CA0F16CEFF6 /* CatalystOutlineViewProtocols.swift in Sources */, 337 | BCA39DFE53188C4D115BBD8DCEE77405 /* Node.swift in Sources */, 338 | 9D369E10B71EF9B949FC82C39C379A6F /* NodeCell.swift in Sources */, 339 | ); 340 | runOnlyForDeploymentPostprocessing = 0; 341 | }; 342 | /* End PBXSourcesBuildPhase section */ 343 | 344 | /* Begin PBXTargetDependency section */ 345 | 0D684267821DE7A871553C16B8EEEB4C /* PBXTargetDependency */ = { 346 | isa = PBXTargetDependency; 347 | name = CatalystOutlineView; 348 | target = FC39FD3A8E951546F469D2425B9D7C48 /* CatalystOutlineView */; 349 | targetProxy = 8075C690D6CA4F4D2DACCD92A9247853 /* PBXContainerItemProxy */; 350 | }; 351 | /* End PBXTargetDependency section */ 352 | 353 | /* Begin XCBuildConfiguration section */ 354 | 1422B121EAEAEA11307496903FA623C6 /* Release */ = { 355 | isa = XCBuildConfiguration; 356 | buildSettings = { 357 | ALWAYS_SEARCH_USER_PATHS = NO; 358 | CLANG_ANALYZER_NONNULL = YES; 359 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 360 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 361 | CLANG_CXX_LIBRARY = "libc++"; 362 | CLANG_ENABLE_MODULES = YES; 363 | CLANG_ENABLE_OBJC_ARC = YES; 364 | CLANG_ENABLE_OBJC_WEAK = YES; 365 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 366 | CLANG_WARN_BOOL_CONVERSION = YES; 367 | CLANG_WARN_COMMA = YES; 368 | CLANG_WARN_CONSTANT_CONVERSION = YES; 369 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 370 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 371 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 372 | CLANG_WARN_EMPTY_BODY = YES; 373 | CLANG_WARN_ENUM_CONVERSION = YES; 374 | CLANG_WARN_INFINITE_RECURSION = YES; 375 | CLANG_WARN_INT_CONVERSION = YES; 376 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 377 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 378 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 379 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 380 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 381 | CLANG_WARN_STRICT_PROTOTYPES = YES; 382 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 383 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 384 | CLANG_WARN_UNREACHABLE_CODE = YES; 385 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 386 | COPY_PHASE_STRIP = NO; 387 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 388 | ENABLE_NS_ASSERTIONS = NO; 389 | ENABLE_STRICT_OBJC_MSGSEND = YES; 390 | GCC_C_LANGUAGE_STANDARD = gnu11; 391 | GCC_NO_COMMON_BLOCKS = YES; 392 | GCC_PREPROCESSOR_DEFINITIONS = ( 393 | "POD_CONFIGURATION_RELEASE=1", 394 | "$(inherited)", 395 | ); 396 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 397 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 398 | GCC_WARN_UNDECLARED_SELECTOR = YES; 399 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 400 | GCC_WARN_UNUSED_FUNCTION = YES; 401 | GCC_WARN_UNUSED_VARIABLE = YES; 402 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 403 | MTL_ENABLE_DEBUG_INFO = NO; 404 | MTL_FAST_MATH = YES; 405 | PRODUCT_NAME = "$(TARGET_NAME)"; 406 | STRIP_INSTALLED_PRODUCT = NO; 407 | SWIFT_COMPILATION_MODE = wholemodule; 408 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 409 | SWIFT_VERSION = 5.0; 410 | SYMROOT = "${SRCROOT}/../build"; 411 | }; 412 | name = Release; 413 | }; 414 | 81ED239D9F05335700995F287BD5BB61 /* Release */ = { 415 | isa = XCBuildConfiguration; 416 | baseConfigurationReference = C60080C786C7150522242A68FDFAA2E2 /* CatalystOutlineView.release.xcconfig */; 417 | buildSettings = { 418 | CLANG_ENABLE_OBJC_WEAK = NO; 419 | CODE_SIGN_IDENTITY = ""; 420 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 421 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 422 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 423 | CURRENT_PROJECT_VERSION = 1; 424 | DEFINES_MODULE = YES; 425 | DEVELOPMENT_TEAM = ""; 426 | DYLIB_COMPATIBILITY_VERSION = 1; 427 | DYLIB_CURRENT_VERSION = 1; 428 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 429 | GCC_PREFIX_HEADER = "Target Support Files/CatalystOutlineView/CatalystOutlineView-prefix.pch"; 430 | INFOPLIST_FILE = "Target Support Files/CatalystOutlineView/CatalystOutlineView-Info.plist"; 431 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 432 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 433 | LD_RUNPATH_SEARCH_PATHS = ( 434 | "$(inherited)", 435 | "@executable_path/Frameworks", 436 | "@loader_path/Frameworks", 437 | ); 438 | MODULEMAP_FILE = "Target Support Files/CatalystOutlineView/CatalystOutlineView.modulemap"; 439 | PRODUCT_MODULE_NAME = CatalystOutlineView; 440 | PRODUCT_NAME = CatalystOutlineView; 441 | SDKROOT = iphoneos; 442 | SKIP_INSTALL = YES; 443 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 444 | SWIFT_VERSION = 5.0; 445 | TARGETED_DEVICE_FAMILY = "1,2"; 446 | VALIDATE_PRODUCT = YES; 447 | VERSIONING_SYSTEM = "apple-generic"; 448 | VERSION_INFO_PREFIX = ""; 449 | }; 450 | name = Release; 451 | }; 452 | A4BE61D6B59E0B52F468D3E73A47CE14 /* Release */ = { 453 | isa = XCBuildConfiguration; 454 | baseConfigurationReference = 243410B9535472556EA4BB6DBC133A0D /* Pods-Example.release.xcconfig */; 455 | buildSettings = { 456 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 457 | CLANG_ENABLE_OBJC_WEAK = NO; 458 | CODE_SIGN_IDENTITY = ""; 459 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 460 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 461 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 462 | CURRENT_PROJECT_VERSION = 1; 463 | DEFINES_MODULE = YES; 464 | DYLIB_COMPATIBILITY_VERSION = 1; 465 | DYLIB_CURRENT_VERSION = 1; 466 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 467 | INFOPLIST_FILE = "Target Support Files/Pods-Example/Pods-Example-Info.plist"; 468 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 469 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 470 | LD_RUNPATH_SEARCH_PATHS = ( 471 | "$(inherited)", 472 | "@executable_path/Frameworks", 473 | "@loader_path/Frameworks", 474 | ); 475 | MACH_O_TYPE = staticlib; 476 | MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.modulemap"; 477 | OTHER_LDFLAGS = ""; 478 | OTHER_LIBTOOLFLAGS = ""; 479 | PODS_ROOT = "$(SRCROOT)"; 480 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 481 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 482 | SDKROOT = iphoneos; 483 | SKIP_INSTALL = YES; 484 | TARGETED_DEVICE_FAMILY = "1,2"; 485 | VALIDATE_PRODUCT = YES; 486 | VERSIONING_SYSTEM = "apple-generic"; 487 | VERSION_INFO_PREFIX = ""; 488 | }; 489 | name = Release; 490 | }; 491 | ACD419260953C8A84F933678E43B96C6 /* Debug */ = { 492 | isa = XCBuildConfiguration; 493 | baseConfigurationReference = B45138496B85A072654D1D0F8EBBEDE5 /* Pods-Example.debug.xcconfig */; 494 | buildSettings = { 495 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 496 | CLANG_ENABLE_OBJC_WEAK = NO; 497 | CODE_SIGN_IDENTITY = ""; 498 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 499 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 500 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 501 | CURRENT_PROJECT_VERSION = 1; 502 | DEFINES_MODULE = YES; 503 | DYLIB_COMPATIBILITY_VERSION = 1; 504 | DYLIB_CURRENT_VERSION = 1; 505 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 506 | INFOPLIST_FILE = "Target Support Files/Pods-Example/Pods-Example-Info.plist"; 507 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 508 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 509 | LD_RUNPATH_SEARCH_PATHS = ( 510 | "$(inherited)", 511 | "@executable_path/Frameworks", 512 | "@loader_path/Frameworks", 513 | ); 514 | MACH_O_TYPE = staticlib; 515 | MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.modulemap"; 516 | OTHER_LDFLAGS = ""; 517 | OTHER_LIBTOOLFLAGS = ""; 518 | PODS_ROOT = "$(SRCROOT)"; 519 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 520 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 521 | SDKROOT = iphoneos; 522 | SKIP_INSTALL = YES; 523 | TARGETED_DEVICE_FAMILY = "1,2"; 524 | VERSIONING_SYSTEM = "apple-generic"; 525 | VERSION_INFO_PREFIX = ""; 526 | }; 527 | name = Debug; 528 | }; 529 | CA2BB9E2608D84E4A4B035969725F130 /* Debug */ = { 530 | isa = XCBuildConfiguration; 531 | baseConfigurationReference = 47C3B36BA453D636F838B21A5647F6B2 /* CatalystOutlineView.debug.xcconfig */; 532 | buildSettings = { 533 | CLANG_ENABLE_OBJC_WEAK = NO; 534 | CODE_SIGN_IDENTITY = ""; 535 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 536 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 537 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 538 | CURRENT_PROJECT_VERSION = 1; 539 | DEFINES_MODULE = YES; 540 | DEVELOPMENT_TEAM = ""; 541 | DYLIB_COMPATIBILITY_VERSION = 1; 542 | DYLIB_CURRENT_VERSION = 1; 543 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 544 | GCC_PREFIX_HEADER = "Target Support Files/CatalystOutlineView/CatalystOutlineView-prefix.pch"; 545 | INFOPLIST_FILE = "Target Support Files/CatalystOutlineView/CatalystOutlineView-Info.plist"; 546 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 547 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 548 | LD_RUNPATH_SEARCH_PATHS = ( 549 | "$(inherited)", 550 | "@executable_path/Frameworks", 551 | "@loader_path/Frameworks", 552 | ); 553 | MODULEMAP_FILE = "Target Support Files/CatalystOutlineView/CatalystOutlineView.modulemap"; 554 | PRODUCT_MODULE_NAME = CatalystOutlineView; 555 | PRODUCT_NAME = CatalystOutlineView; 556 | SDKROOT = iphoneos; 557 | SKIP_INSTALL = YES; 558 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 559 | SWIFT_VERSION = 5.0; 560 | TARGETED_DEVICE_FAMILY = "1,2"; 561 | VERSIONING_SYSTEM = "apple-generic"; 562 | VERSION_INFO_PREFIX = ""; 563 | }; 564 | name = Debug; 565 | }; 566 | ED7888FA6713EABBF66D26A8003AD1CA /* Debug */ = { 567 | isa = XCBuildConfiguration; 568 | buildSettings = { 569 | ALWAYS_SEARCH_USER_PATHS = NO; 570 | CLANG_ANALYZER_NONNULL = YES; 571 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 572 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 573 | CLANG_CXX_LIBRARY = "libc++"; 574 | CLANG_ENABLE_MODULES = YES; 575 | CLANG_ENABLE_OBJC_ARC = YES; 576 | CLANG_ENABLE_OBJC_WEAK = YES; 577 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 578 | CLANG_WARN_BOOL_CONVERSION = YES; 579 | CLANG_WARN_COMMA = YES; 580 | CLANG_WARN_CONSTANT_CONVERSION = YES; 581 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 582 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 583 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 584 | CLANG_WARN_EMPTY_BODY = YES; 585 | CLANG_WARN_ENUM_CONVERSION = YES; 586 | CLANG_WARN_INFINITE_RECURSION = YES; 587 | CLANG_WARN_INT_CONVERSION = YES; 588 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 589 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 590 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 591 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 592 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 593 | CLANG_WARN_STRICT_PROTOTYPES = YES; 594 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 595 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 596 | CLANG_WARN_UNREACHABLE_CODE = YES; 597 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 598 | COPY_PHASE_STRIP = NO; 599 | DEBUG_INFORMATION_FORMAT = dwarf; 600 | ENABLE_STRICT_OBJC_MSGSEND = YES; 601 | ENABLE_TESTABILITY = YES; 602 | GCC_C_LANGUAGE_STANDARD = gnu11; 603 | GCC_DYNAMIC_NO_PIC = NO; 604 | GCC_NO_COMMON_BLOCKS = YES; 605 | GCC_OPTIMIZATION_LEVEL = 0; 606 | GCC_PREPROCESSOR_DEFINITIONS = ( 607 | "POD_CONFIGURATION_DEBUG=1", 608 | "DEBUG=1", 609 | "$(inherited)", 610 | ); 611 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 612 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 613 | GCC_WARN_UNDECLARED_SELECTOR = YES; 614 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 615 | GCC_WARN_UNUSED_FUNCTION = YES; 616 | GCC_WARN_UNUSED_VARIABLE = YES; 617 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 618 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 619 | MTL_FAST_MATH = YES; 620 | ONLY_ACTIVE_ARCH = YES; 621 | PRODUCT_NAME = "$(TARGET_NAME)"; 622 | STRIP_INSTALLED_PRODUCT = NO; 623 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 624 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 625 | SWIFT_VERSION = 5.0; 626 | SYMROOT = "${SRCROOT}/../build"; 627 | }; 628 | name = Debug; 629 | }; 630 | /* End XCBuildConfiguration section */ 631 | 632 | /* Begin XCConfigurationList section */ 633 | 11F52F9DBB84008DED0F4DB084E5A30E /* Build configuration list for PBXNativeTarget "Pods-Example" */ = { 634 | isa = XCConfigurationList; 635 | buildConfigurations = ( 636 | ACD419260953C8A84F933678E43B96C6 /* Debug */, 637 | A4BE61D6B59E0B52F468D3E73A47CE14 /* Release */, 638 | ); 639 | defaultConfigurationIsVisible = 0; 640 | defaultConfigurationName = Release; 641 | }; 642 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { 643 | isa = XCConfigurationList; 644 | buildConfigurations = ( 645 | ED7888FA6713EABBF66D26A8003AD1CA /* Debug */, 646 | 1422B121EAEAEA11307496903FA623C6 /* Release */, 647 | ); 648 | defaultConfigurationIsVisible = 0; 649 | defaultConfigurationName = Release; 650 | }; 651 | ACA9C9FFA41640688EAE299505F9E66D /* Build configuration list for PBXNativeTarget "CatalystOutlineView" */ = { 652 | isa = XCConfigurationList; 653 | buildConfigurations = ( 654 | CA2BB9E2608D84E4A4B035969725F130 /* Debug */, 655 | 81ED239D9F05335700995F287BD5BB61 /* Release */, 656 | ); 657 | defaultConfigurationIsVisible = 0; 658 | defaultConfigurationName = Release; 659 | }; 660 | /* End XCConfigurationList section */ 661 | }; 662 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; 663 | } 664 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CatalystOutlineView/CatalystOutlineView-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CatalystOutlineView/CatalystOutlineView-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_CatalystOutlineView : NSObject 3 | @end 4 | @implementation PodsDummy_CatalystOutlineView 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CatalystOutlineView/CatalystOutlineView-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CatalystOutlineView/CatalystOutlineView-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 CatalystOutlineViewVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char CatalystOutlineViewVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CatalystOutlineView/CatalystOutlineView.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/CatalystOutlineView 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 11 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CatalystOutlineView/CatalystOutlineView.modulemap: -------------------------------------------------------------------------------- 1 | framework module CatalystOutlineView { 2 | umbrella header "CatalystOutlineView-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CatalystOutlineView/CatalystOutlineView.release.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/CatalystOutlineView 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 11 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## CatalystOutlineView 5 | 6 | MIT License 7 | 8 | Copyright (c) 2020 Vitaliy Podolskiy 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 | Generated by CocoaPods - https://cocoapods.org 28 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | MIT License 18 | 19 | Copyright (c) 2020 Vitaliy Podolskiy 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 | License 39 | MIT 40 | Title 41 | CatalystOutlineView 42 | Type 43 | PSGroupSpecifier 44 | 45 | 46 | FooterText 47 | Generated by CocoaPods - https://cocoapods.org 48 | Title 49 | 50 | Type 51 | PSGroupSpecifier 52 | 53 | 54 | StringsTable 55 | Acknowledgements 56 | Title 57 | Acknowledgements 58 | 59 | 60 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Debug-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/CatalystOutlineView/CatalystOutlineView.framework -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Debug-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CatalystOutlineView.framework -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Release-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/CatalystOutlineView/CatalystOutlineView.framework -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Release-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CatalystOutlineView.framework -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | 23 | # Used as a return value for each invocation of `strip_invalid_archs` function. 24 | STRIP_BINARY_RETVAL=0 25 | 26 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 27 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 28 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 29 | 30 | # Copies and strips a vendored framework 31 | install_framework() 32 | { 33 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 34 | local source="${BUILT_PRODUCTS_DIR}/$1" 35 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 36 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 37 | elif [ -r "$1" ]; then 38 | local source="$1" 39 | fi 40 | 41 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 42 | 43 | if [ -L "${source}" ]; then 44 | echo "Symlinked..." 45 | source="$(readlink "${source}")" 46 | fi 47 | 48 | # Use filter instead of exclude so missing patterns don't throw errors. 49 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 50 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 51 | 52 | local basename 53 | basename="$(basename -s .framework "$1")" 54 | binary="${destination}/${basename}.framework/${basename}" 55 | 56 | if ! [ -r "$binary" ]; then 57 | binary="${destination}/${basename}" 58 | elif [ -L "${binary}" ]; then 59 | echo "Destination binary is symlinked..." 60 | dirname="$(dirname "${binary}")" 61 | binary="${dirname}/$(readlink "${binary}")" 62 | fi 63 | 64 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 65 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 66 | strip_invalid_archs "$binary" 67 | fi 68 | 69 | # Resign the code if required by the build settings to avoid unstable apps 70 | code_sign_if_enabled "${destination}/$(basename "$1")" 71 | 72 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 73 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 74 | local swift_runtime_libs 75 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 76 | for lib in $swift_runtime_libs; do 77 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 78 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 79 | code_sign_if_enabled "${destination}/${lib}" 80 | done 81 | fi 82 | } 83 | 84 | # Copies and strips a vendored dSYM 85 | install_dsym() { 86 | local source="$1" 87 | warn_missing_arch=${2:-true} 88 | if [ -r "$source" ]; then 89 | # Copy the dSYM into the targets temp dir. 90 | 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}\"" 91 | 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}" 92 | 93 | local basename 94 | basename="$(basename -s .dSYM "$source")" 95 | binary_name="$(ls "$source/Contents/Resources/DWARF")" 96 | binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" 97 | 98 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 99 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then 100 | strip_invalid_archs "$binary" "$warn_missing_arch" 101 | fi 102 | 103 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 104 | # Move the stripped file into its final destination. 105 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 106 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 107 | else 108 | # 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. 109 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" 110 | fi 111 | fi 112 | } 113 | 114 | # Copies the bcsymbolmap files of a vendored framework 115 | install_bcsymbolmap() { 116 | local bcsymbolmap_path="$1" 117 | local destination="${BUILT_PRODUCTS_DIR}" 118 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" 119 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" 120 | } 121 | 122 | # Signs a framework with the provided identity 123 | code_sign_if_enabled() { 124 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 125 | # Use the current code_sign_identity 126 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 127 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 128 | 129 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 130 | code_sign_cmd="$code_sign_cmd &" 131 | fi 132 | echo "$code_sign_cmd" 133 | eval "$code_sign_cmd" 134 | fi 135 | } 136 | 137 | # Strip invalid architectures 138 | strip_invalid_archs() { 139 | binary="$1" 140 | warn_missing_arch=${2:-true} 141 | # Get architectures for current target binary 142 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 143 | # Intersect them with the architectures we are building for 144 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 145 | # If there are no archs supported by this binary then warn the user 146 | if [[ -z "$intersected_archs" ]]; then 147 | if [[ "$warn_missing_arch" == "true" ]]; then 148 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 149 | fi 150 | STRIP_BINARY_RETVAL=0 151 | return 152 | fi 153 | stripped="" 154 | for arch in $binary_archs; do 155 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 156 | # Strip non-valid architectures in-place 157 | lipo -remove "$arch" -output "$binary" "$binary" 158 | stripped="$stripped $arch" 159 | fi 160 | done 161 | if [[ "$stripped" ]]; then 162 | echo "Stripped $binary of architectures:$stripped" 163 | fi 164 | STRIP_BINARY_RETVAL=1 165 | } 166 | 167 | install_artifact() { 168 | artifact="$1" 169 | base="$(basename "$artifact")" 170 | case $base in 171 | *.framework) 172 | install_framework "$artifact" 173 | ;; 174 | *.dSYM) 175 | # Suppress arch warnings since XCFrameworks will include many dSYM files 176 | install_dsym "$artifact" "false" 177 | ;; 178 | *.bcsymbolmap) 179 | install_bcsymbolmap "$artifact" 180 | ;; 181 | *) 182 | echo "error: Unrecognized artifact "$artifact"" 183 | ;; 184 | esac 185 | } 186 | 187 | copy_artifacts() { 188 | file_list="$1" 189 | while read artifact; do 190 | install_artifact "$artifact" 191 | done <$file_list 192 | } 193 | 194 | ARTIFACT_LIST_FILE="${BUILT_PRODUCTS_DIR}/cocoapods-artifacts-${CONFIGURATION}.txt" 195 | if [ -r "${ARTIFACT_LIST_FILE}" ]; then 196 | copy_artifacts "${ARTIFACT_LIST_FILE}" 197 | fi 198 | 199 | if [[ "$CONFIGURATION" == "Debug" ]]; then 200 | install_framework "${BUILT_PRODUCTS_DIR}/CatalystOutlineView/CatalystOutlineView.framework" 201 | fi 202 | if [[ "$CONFIGURATION" == "Release" ]]; then 203 | install_framework "${BUILT_PRODUCTS_DIR}/CatalystOutlineView/CatalystOutlineView.framework" 204 | fi 205 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 206 | wait 207 | fi 208 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CatalystOutlineView" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CatalystOutlineView/CatalystOutlineView.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "CatalystOutlineView" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_Example { 2 | umbrella header "Pods-Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CatalystOutlineView" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CatalystOutlineView/CatalystOutlineView.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "CatalystOutlineView" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Vitaliy Podolskiy 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. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CatalystOutlineView 2 | NSOutlineView for UIKit (recreation of popular control from AppKit) 3 | 4 | The behavior is implemented with the maximum functionality of the classic component and is slightly expanded 5 | 6 | ## Overview 7 | 8 | 9 | 10 | ## Requirements 11 | 12 | * iOS 13.0+ (macCatalyst) 13 | * Swift 5 14 | 15 | ## Installation 16 | 17 | ### Manually 18 | 19 | Just add the `Source` folder to your project. 20 | 21 | ### CocoaPods 22 | 23 | use [CocoaPods](https://cocoapods.org) with Podfile: 24 | ``` ruby 25 | pod 'CatalystOutlineView', '~> 0.1' 26 | ``` 27 | 28 | ## Usage 29 | 30 | ### 🎨 Storyboards 31 | Just drop UITableView and set its class to be one of CatalystOutlineView. 32 | 33 | 34 | 35 | ### 💻 Code 36 | ``` swift 37 | private var outline = CatalystOutlineView(frame: .zero) { 38 | didSet { 39 | outlineView.outlineDataSource = self 40 | outlineView.outlineDelegate = self 41 | } 42 | } 43 | ``` 44 | 45 | ## Setup 46 | ### DataSource and Delegate 47 | 48 | ### Connect control for your class 49 | ``` swift 50 | @IBOutlet private(set) weak var outlineView: CatalystOutlineView! 51 | ``` 52 | than set outlineDataSource and outlineDelegate properties 53 | 54 | ``` swift 55 | outlineView.outlineDataSource = self 56 | outlineView.outlineDelegate = self 57 | ``` 58 | 59 | ## Then you should implement: 60 | 61 | ### CatalystOutlineViewDataSource 62 | ``` swift 63 | func outlineView(_ outlineView: CatalystOutlineView, numberOfChildrenOfItem item: Any?) -> Int 64 | func outlineView(_ outlineView: CatalystOutlineView, child index: Int, ofItem item: Any?) -> Any 65 | func outlineView(_ outlineView: CatalystOutlineView, isItemExpandable item: Any) -> Bool 66 | ``` 67 | 68 | ### CatalystOutlineViewDelegate 69 | ``` swift 70 | func outlineView(_ outlineView: CatalystOutlineView?, cellForItem item: Any?) -> UITableViewCell? 71 | func outlineView(_ outlineView: CatalystOutlineView?, shouldCollapseItem item: Any?) -> Bool 72 | func outlineView(_ outlineView: CatalystOutlineView?, didExpandItem item: Any?) 73 | func outlineView(_ outlineView: CatalystOutlineView?, didCollapseItem item: Any?) 74 | func view(forHeader outlineView: CatalystOutlineView?) -> UIView? 75 | func height(forHeader outlineView: CatalystOutlineView?) -> CGFloat 76 | func height(forCell outlineView: CatalystOutlineView?, ofItem item: Any?) -> CGFloat 77 | 78 | // if you want context menu for your outlineView 79 | func contextMenuConfiguration(for item: Any?) -> UIContextMenuConfiguration? 80 | ``` 81 | 82 | 83 | 84 | ### Your cell maybe conformed for ExpandCollapseDisplaying protocol 85 | 86 | ``` swift 87 | func expand() 88 | func collapse() 89 | ``` 90 | 91 | Also you can check 'Example' project from repo! 92 | 93 | ## License 94 | CatalystOutlineViewDelegate is released under the MIT license. See [LICENSE](./LICENSE) for details. 95 | --------------------------------------------------------------------------------