├── _Pods.xcodeproj ├── .github └── FUNDING.yml ├── Example ├── PullToRefreshDemo │ ├── what.gif │ ├── PullToRefreshDemo-Bridging-Header.h │ ├── ObjcTableViewController.h │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── AppDelegate.swift │ ├── Info.plist │ ├── ObjcTableViewController.m │ ├── DemoTableViewController.swift │ └── Base.lproj │ │ ├── LaunchScreen.xib │ │ └── Main.storyboard ├── Pods │ ├── Target Support Files │ │ ├── BreakOutToRefresh │ │ │ ├── BreakOutToRefresh-prefix.pch │ │ │ ├── BreakOutToRefresh.modulemap │ │ │ ├── BreakOutToRefresh-dummy.m │ │ │ ├── BreakOutToRefresh-umbrella.h │ │ │ ├── BreakOutToRefresh.xcconfig │ │ │ └── Info.plist │ │ └── Pods-PullToRefreshDemo │ │ │ ├── Pods-PullToRefreshDemo.modulemap │ │ │ ├── Pods-PullToRefreshDemo-dummy.m │ │ │ ├── Pods-PullToRefreshDemo-umbrella.h │ │ │ ├── Pods-PullToRefreshDemo.debug.xcconfig │ │ │ ├── Pods-PullToRefreshDemo.release.xcconfig │ │ │ ├── Info.plist │ │ │ ├── Pods-PullToRefreshDemo-acknowledgements.markdown │ │ │ ├── Pods-PullToRefreshDemo-acknowledgements.plist │ │ │ ├── Pods-PullToRefreshDemo-frameworks.sh │ │ │ └── Pods-PullToRefreshDemo-resources.sh │ ├── Pods.xcodeproj │ │ ├── project.xcworkspace │ │ │ └── contents.xcworkspacedata │ │ ├── xcshareddata │ │ │ └── xcschemes │ │ │ │ └── BreakOutToRefresh.xcscheme │ │ └── project.pbxproj │ ├── Manifest.lock │ └── Local Podspecs │ │ └── BreakOutToRefresh.podspec.json ├── Podfile ├── PullToRefreshDemo.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── PullToRefresh.xcscheme │ └── project.pbxproj ├── PullToRefresh │ ├── BreakOutToRefresh.h │ └── Info.plist ├── Podfile.lock └── PullToRefreshDemo.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── .gitignore ├── BreakOutToRefresh.podspec ├── LICENCE ├── README.md └── BreakOutToRefresh └── BreakOutToRefreshView.swift /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: dasdom 4 | -------------------------------------------------------------------------------- /Example/PullToRefreshDemo/what.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dasdom/BreakOutToRefresh/HEAD/Example/PullToRefreshDemo/what.gif -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/BreakOutToRefresh/BreakOutToRefresh-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | source 'https://github.com/CocoaPods/Specs.git' 2 | use_frameworks! 3 | 4 | target 'PullToRefreshDemo', :exclusive => true do 5 | pod "BreakOutToRefresh", :path => "../" 6 | end 7 | -------------------------------------------------------------------------------- /Example/PullToRefreshDemo/PullToRefreshDemo-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #import "ObjcTableViewController.h" 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/BreakOutToRefresh/BreakOutToRefresh.modulemap: -------------------------------------------------------------------------------- 1 | framework module BreakOutToRefresh { 2 | umbrella header "BreakOutToRefresh-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/BreakOutToRefresh/BreakOutToRefresh-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_BreakOutToRefresh : NSObject 3 | @end 4 | @implementation PodsDummy_BreakOutToRefresh 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PullToRefreshDemo/Pods-PullToRefreshDemo.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_PullToRefreshDemo { 2 | umbrella header "Pods-PullToRefreshDemo-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PullToRefreshDemo/Pods-PullToRefreshDemo-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_PullToRefreshDemo : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_PullToRefreshDemo 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/BreakOutToRefresh/BreakOutToRefresh-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double BreakOutToRefreshVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char BreakOutToRefreshVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Example/PullToRefreshDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PullToRefreshDemo/Pods-PullToRefreshDemo-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double Pods_PullToRefreshDemoVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char Pods_PullToRefreshDemoVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Example/PullToRefresh/BreakOutToRefresh.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | //! Project version number for PullToRefresh. 4 | FOUNDATION_EXPORT double PullToRefreshVersionNumber; 5 | 6 | //! Project version string for PullToRefresh. 7 | FOUNDATION_EXPORT const unsigned char PullToRefreshVersionString[]; 8 | 9 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - BreakOutToRefresh (1.0.0) 3 | 4 | DEPENDENCIES: 5 | - BreakOutToRefresh (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | BreakOutToRefresh: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | BreakOutToRefresh: 6585099c95f5277fe7fe17b612bf7c5cbe7b8c77 13 | 14 | COCOAPODS: 0.39.0 15 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - BreakOutToRefresh (1.0.0) 3 | 4 | DEPENDENCIES: 5 | - BreakOutToRefresh (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | BreakOutToRefresh: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | BreakOutToRefresh: 6585099c95f5277fe7fe17b612bf7c5cbe7b8c77 13 | 14 | COCOAPODS: 0.39.0 15 | -------------------------------------------------------------------------------- /Example/PullToRefreshDemo.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/PullToRefreshDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/PullToRefreshDemo/ObjcTableViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ObjcTableViewController.h 3 | // PullToRefreshDemo 4 | // 5 | // Created by dasdom on 16.06.15. 6 | // Copyright (c) 2015 Dominik Hauser. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ObjcTableViewController : UITableViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/BreakOutToRefresh/BreakOutToRefresh.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/BreakOutToRefresh" "${PODS_ROOT}/Headers/Public" 3 | OTHER_LDFLAGS = -framework "SpriteKit" -framework "UIKit" 4 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 5 | PODS_ROOT = ${SRCROOT} 6 | SKIP_INSTALL = YES -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PullToRefreshDemo/Pods-PullToRefreshDemo.debug.xcconfig: -------------------------------------------------------------------------------- 1 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/BreakOutToRefresh.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -framework "BreakOutToRefresh" 6 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 7 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-PullToRefreshDemo 8 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PullToRefreshDemo/Pods-PullToRefreshDemo.release.xcconfig: -------------------------------------------------------------------------------- 1 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/BreakOutToRefresh.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -framework "BreakOutToRefresh" 6 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 7 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-PullToRefreshDemo 8 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /Example/PullToRefreshDemo/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.gitignore.io 2 | 3 | ### Swift ### 4 | # Xcode 5 | # 6 | build/ 7 | *.pbxuser 8 | !default.pbxuser 9 | *.mode1v3 10 | !default.mode1v3 11 | *.mode2v3 12 | !default.mode2v3 13 | *.perspectivev3 14 | !default.perspectivev3 15 | xcuserdata 16 | *.xccheckout 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | *.xcuserstate 22 | 23 | # CocoaPods 24 | # 25 | # We recommend against adding the Pods directory to your .gitignore. However 26 | # you should judge for yourself, the pros and cons are mentioned at: 27 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 28 | # 29 | # Pods/ 30 | 31 | # Carthage 32 | # 33 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 34 | # Carthage/Checkouts 35 | 36 | Carthage/Build 37 | -------------------------------------------------------------------------------- /Example/PullToRefresh/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 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/BreakOutToRefresh.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "BreakOutToRefresh", 3 | "version": "1.0.0", 4 | "summary": "Play BreakOut while loading - A playable pull to refresh view using SpriteKit", 5 | "description": "BreakOutToRefresh uses SpriteKit to add a playable mini game to the pull to refresh view in a table view. In this case the mini game is BreakOut but a lot of other mini games could be presented in this space.", 6 | "homepage": "https://github.com/dasdom/BreakOutToRefresh", 7 | "authors": { 8 | "Dominik Hauser": "dominik.hauser@dasdom.de" 9 | }, 10 | "source": { 11 | "git": "https://github.com/dasdom/BreakOutToRefresh.git", 12 | "tag": "1.0.0" 13 | }, 14 | "social_media_url": "https://twitter.com/dasdom", 15 | "platforms": { 16 | "ios": "8.0" 17 | }, 18 | "requires_arc": true, 19 | "source_files": "BreakOutToRefresh/**/*", 20 | "frameworks": [ 21 | "UIKit", 22 | "SpriteKit" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/BreakOutToRefresh/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-PullToRefreshDemo/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 | -------------------------------------------------------------------------------- /BreakOutToRefresh.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "BreakOutToRefresh" 3 | s.version = "1.0.0" 4 | s.summary = "Play BreakOut while loading - A playable pull to refresh view using SpriteKit" 5 | 6 | s.description = <<-DESC 7 | BreakOutToRefresh uses SpriteKit to add a playable mini game to the pull to refresh view in a table view. In this case the mini game is BreakOut but a lot of other mini games could be presented in this space. 8 | DESC 9 | 10 | s.homepage = "https://github.com/dasdom/BreakOutToRefresh" 11 | # s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2" 12 | s.author = { "Dominik Hauser" => "dominik.hauser@dasdom.de" } 13 | s.source = { :git => "https://github.com/dasdom/BreakOutToRefresh.git", :tag => s.version.to_s } 14 | s.social_media_url = 'https://twitter.com/dasdom' 15 | 16 | s.platform = :ios, '8.0' 17 | s.requires_arc = true 18 | 19 | s.source_files = 'BreakOutToRefresh/**/*' 20 | 21 | s.frameworks = 'UIKit', 'SpriteKit' 22 | end 23 | -------------------------------------------------------------------------------- /LICENCE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015 Dominik Hauser 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Example/PullToRefreshDemo/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // PullToRefreshDemo 4 | // 5 | // Created by dasdom on 17.01.15. 6 | // Copyright (c) 2015 Dominik Hauser. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? = UIWindow(frame: UIScreen.main.bounds) 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 17 | 18 | let swiftViewController = DemoTableViewController() 19 | swiftViewController.title = "Swift" 20 | let objcViewController = ObjcTableViewController() 21 | objcViewController.title = "Objective-C" 22 | 23 | let tabBarController = UITabBarController() 24 | tabBarController.viewControllers = [ 25 | UINavigationController(rootViewController: objcViewController), 26 | UINavigationController(rootViewController: swiftViewController), 27 | ] 28 | 29 | window?.rootViewController = tabBarController 30 | window?.makeKeyAndVisible() 31 | 32 | return true 33 | } 34 | } 35 | 36 | -------------------------------------------------------------------------------- /Example/PullToRefreshDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PullToRefreshDemo/Pods-PullToRefreshDemo-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## BreakOutToRefresh 5 | 6 | Copyright (c) 2015 Dominik Hauser 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - http://cocoapods.org 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PullToRefreshDemo/Pods-PullToRefreshDemo-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2015 Dominik Hauser <dominik.hauser@dasdom.de> 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | Title 38 | BreakOutToRefresh 39 | Type 40 | PSGroupSpecifier 41 | 42 | 43 | FooterText 44 | Generated by CocoaPods - http://cocoapods.org 45 | Title 46 | 47 | Type 48 | PSGroupSpecifier 49 | 50 | 51 | StringsTable 52 | Acknowledgements 53 | Title 54 | Acknowledgements 55 | 56 | 57 | -------------------------------------------------------------------------------- /Example/PullToRefreshDemo/ObjcTableViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ObjcTableViewController.m 3 | // PullToRefreshDemo 4 | // 5 | // Created by dasdom on 16.06.15. 6 | // Copyright (c) 2015 Dominik Hauser. All rights reserved. 7 | // 8 | 9 | #import "ObjcTableViewController.h" 10 | @import BreakOutToRefresh; 11 | 12 | @interface ObjcTableViewController () 13 | @property (nonatomic, strong) BreakOutToRefreshView *refreshView; 14 | @end 15 | 16 | @implementation ObjcTableViewController 17 | 18 | - (void)viewDidLoad { 19 | [super viewDidLoad]; 20 | 21 | 22 | [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"DemoCell"]; 23 | } 24 | 25 | - (void)viewWillAppear:(BOOL)animated { 26 | [super viewWillAppear:animated]; 27 | 28 | self.refreshView = [[BreakOutToRefreshView alloc] initWithScrollView:self.tableView]; 29 | self.refreshView.refreshDelegate = self; 30 | [self.tableView addSubview:self.refreshView]; 31 | } 32 | 33 | - (void)viewWillDisappear:(BOOL)animated { 34 | [super viewWillDisappear:animated]; 35 | 36 | [self.refreshView removeFromSuperview]; 37 | self.refreshView = nil; 38 | } 39 | 40 | #pragma mark - Table view data source 41 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 42 | return 20; 43 | } 44 | 45 | 46 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 47 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"DemoCell" forIndexPath:indexPath]; 48 | 49 | cell.textLabel.text = [NSString stringWithFormat:@"Row %ld", (long)indexPath.row]; 50 | 51 | return cell; 52 | } 53 | 54 | #pragma mark - UIScrollViewDelegate 55 | - (void)scrollViewDidScroll:(UIScrollView *)scrollView { 56 | [self.refreshView scrollViewDidScroll:scrollView]; 57 | } 58 | 59 | -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 60 | { 61 | [self.refreshView scrollViewWillBeginDragging:scrollView]; 62 | } 63 | 64 | -(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 65 | { 66 | [self.refreshView scrollViewWillEndDragging:scrollView withVelocity:velocity targetContentOffset:targetContentOffset]; 67 | } 68 | 69 | - (void)refreshViewDidRefresh:(BreakOutToRefreshView * __nonnull)refreshView { 70 | // this code is to simulage the loading from the internet 71 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 3), dispatch_get_main_queue(), ^{ 72 | [self.refreshView endRefreshing]; 73 | }); 74 | } 75 | 76 | @end 77 | -------------------------------------------------------------------------------- /Example/PullToRefreshDemo/DemoTableViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DemoTableViewController.swift 3 | // PullToRefreshDemo 4 | // 5 | // Created by dasdom on 17.01.15. 6 | // Copyright (c) 2015 Dominik Hauser. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import BreakOutToRefresh 11 | 12 | class DemoTableViewController: UITableViewController { 13 | 14 | var refreshView: BreakOutToRefreshView! 15 | 16 | override func viewDidLoad() { 17 | super.viewDidLoad() 18 | 19 | tableView.register(UITableViewCell.self, forCellReuseIdentifier: "DemoCell") 20 | } 21 | 22 | override func viewWillAppear(_ animated: Bool) { 23 | super.viewWillAppear(animated) 24 | 25 | refreshView = BreakOutToRefreshView(scrollView: tableView) 26 | refreshView.refreshDelegate = self 27 | 28 | // configure the refresh view 29 | refreshView.scenebackgroundColor = .white 30 | refreshView.textColor = .black 31 | refreshView.paddleColor = .brown 32 | refreshView.ballColor = .darkGray 33 | refreshView.blockColors = [.blue, .green, .red] 34 | 35 | tableView.addSubview(refreshView) 36 | } 37 | 38 | override func viewWillDisappear(_ animated: Bool) { 39 | super.viewWillDisappear(animated) 40 | 41 | refreshView.removeFromSuperview() 42 | refreshView = nil 43 | } 44 | 45 | // MARK: - Table view data source 46 | override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 47 | return 20 48 | } 49 | 50 | 51 | override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 52 | let cell = tableView.dequeueReusableCell(withIdentifier: "DemoCell", for: indexPath) 53 | 54 | cell.textLabel?.text = "Row \((indexPath as NSIndexPath).row)" 55 | 56 | return cell 57 | } 58 | 59 | } 60 | 61 | extension DemoTableViewController { 62 | 63 | override func scrollViewDidScroll(_ scrollView: UIScrollView) { 64 | refreshView.scrollViewDidScroll(scrollView) 65 | } 66 | 67 | override func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { 68 | refreshView.scrollViewWillEndDragging(scrollView, withVelocity: velocity, targetContentOffset: targetContentOffset) 69 | } 70 | 71 | override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { 72 | refreshView.scrollViewWillBeginDragging(scrollView) 73 | } 74 | } 75 | 76 | extension DemoTableViewController: BreakOutToRefreshDelegate { 77 | 78 | func refreshViewDidRefresh(_ refreshView: BreakOutToRefreshView) { 79 | // this code is to simulage the loading from the internet 80 | DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(NSEC_PER_SEC * 10)) / Double(NSEC_PER_SEC), execute: { () -> Void in 81 | refreshView.endRefreshing() 82 | }) 83 | } 84 | 85 | } 86 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/BreakOutToRefresh.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 66 | 67 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /Example/PullToRefreshDemo/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PullToRefreshDemo/Pods-PullToRefreshDemo-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 6 | 7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 8 | 9 | install_framework() 10 | { 11 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 12 | local source="${BUILT_PRODUCTS_DIR}/$1" 13 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 14 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 15 | elif [ -r "$1" ]; then 16 | local source="$1" 17 | fi 18 | 19 | local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 20 | 21 | if [ -L "${source}" ]; then 22 | echo "Symlinked..." 23 | source="$(readlink "${source}")" 24 | fi 25 | 26 | # use filter instead of exclude so missing patterns dont' throw errors 27 | echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 28 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 29 | 30 | local basename 31 | basename="$(basename -s .framework "$1")" 32 | binary="${destination}/${basename}.framework/${basename}" 33 | if ! [ -r "$binary" ]; then 34 | binary="${destination}/${basename}" 35 | fi 36 | 37 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 38 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 39 | strip_invalid_archs "$binary" 40 | fi 41 | 42 | # Resign the code if required by the build settings to avoid unstable apps 43 | code_sign_if_enabled "${destination}/$(basename "$1")" 44 | 45 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 46 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 47 | local swift_runtime_libs 48 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 49 | for lib in $swift_runtime_libs; do 50 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 51 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 52 | code_sign_if_enabled "${destination}/${lib}" 53 | done 54 | fi 55 | } 56 | 57 | # Signs a framework with the provided identity 58 | code_sign_if_enabled() { 59 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 60 | # Use the current code_sign_identitiy 61 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 62 | echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"" 63 | /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" 64 | fi 65 | } 66 | 67 | # Strip invalid architectures 68 | strip_invalid_archs() { 69 | binary="$1" 70 | # Get architectures for current file 71 | archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" 72 | stripped="" 73 | for arch in $archs; do 74 | if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then 75 | # Strip non-valid architectures in-place 76 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 77 | stripped="$stripped $arch" 78 | fi 79 | done 80 | if [[ "$stripped" ]]; then 81 | echo "Stripped $binary of architectures:$stripped" 82 | fi 83 | } 84 | 85 | 86 | if [[ "$CONFIGURATION" == "Debug" ]]; then 87 | install_framework "Pods-PullToRefreshDemo/BreakOutToRefresh.framework" 88 | fi 89 | if [[ "$CONFIGURATION" == "Release" ]]; then 90 | install_framework "Pods-PullToRefreshDemo/BreakOutToRefresh.framework" 91 | fi 92 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BreakOutToRefresh 2 | Play BreakOut while loading - A playable pull to refresh view using SpriteKit 3 | 4 | ![](https://raw.githubusercontent.com/dasdom/BreakOutToRefresh/master/Example/PullToRefreshDemo/what.gif) 5 | 6 | BreakOutToRefresh uses SpriteKit to add a playable mini game to the pull to refresh view in a table view. In this case the mini game is BreakOut but a lot of other mini games could be presented in this space. 7 | 8 | ## Book 9 | 10 | If you like this repository and like'd to give me something back, I wrote a book about funny location based projects for iOS. Please check it out: [Build Location-Based Projects for iOS](https://pragprog.com/book/dhios/build-location-based-projects-for-ios) 11 | 12 | ## Installation 13 | 14 | ### CocoaPods 15 | 16 | Add this to your Podfile: 17 | 18 | ``` 19 | use_frameworks! 20 | 21 | pod 'BreakOutToRefresh' 22 | ``` 23 | 24 | ### Manual 25 | 26 | Add **BreakOutToRefreshView.swift** to your project. 27 | 28 | ## Usage 29 | 30 | If you need it only once in your app, add this to your table view controller: 31 | ```swift 32 | class DemoTableViewController: UITableViewController { 33 | 34 | var refreshView: BreakOutToRefreshView! 35 | 36 | // ... 37 | 38 | override func viewDidLoad() { 39 | super.viewDidLoad() 40 | 41 | refreshView = BreakOutToRefreshView(scrollView: tableView) 42 | refreshView.refreshDelegate = self 43 | 44 | // configure the refresh view 45 | refreshView.scenebackgroundColor = .white 46 | refreshView.textColor = .black 47 | refreshView.paddleColor = .brown 48 | refreshView.ballColor = .darkGray 49 | refreshView.blockColors = [.blue, .green, .red] 50 | 51 | tableView.addSubview(refreshView) 52 | } 53 | } 54 | 55 | extension DemoTableViewController: UIScrollViewDelegate { 56 | 57 | override func scrollViewDidScroll(scrollView: UIScrollView) { 58 | refreshView.scrollViewDidScroll(scrollView) 59 | } 60 | 61 | override func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { 62 | refreshView.scrollViewWillEndDragging(scrollView, withVelocity: velocity, targetContentOffset: targetContentOffset) 63 | } 64 | 65 | override func scrollViewWillBeginDragging(scrollView: UIScrollView) { 66 | refreshView.scrollViewWillBeginDragging(scrollView) 67 | } 68 | } 69 | 70 | extension DemoTableViewController: BreakOutToRefreshDelegate { 71 | 72 | func refreshViewDidRefresh(refreshView: BreakOutToRefreshView) { 73 | // load stuff from the internet 74 | } 75 | 76 | } 77 | ``` 78 | 79 | In case you need it more than once in your app, add the setup to `viewWillAppear` and clean up in `viewWillDisappear` like this: 80 | 81 | ```swift 82 | override func viewWillAppear(_ animated: Bool) { 83 | super.viewWillAppear(animated) 84 | 85 | refreshView = BreakOutToRefreshView(scrollView: tableView) 86 | refreshView.refreshDelegate = self 87 | 88 | // configure the refresh view 89 | refreshView.scenebackgroundColor = .white 90 | refreshView.textColor = .black 91 | refreshView.paddleColor = .brown 92 | refreshView.ballColor = .darkGray 93 | refreshView.blockColors = [.blue, .green, .red] 94 | 95 | tableView.addSubview(refreshView) 96 | } 97 | 98 | override func viewWillDisappear(_ animated: Bool) { 99 | super.viewWillDisappear(animated) 100 | 101 | refreshView.removeFromSuperview() 102 | refreshView = nil 103 | } 104 | ``` 105 | 106 | When the loading of new content is finished, call `endRefreshing()` of the `refreshView`. 107 | 108 | When `endRefreshing()` is called the mini game doesn't stop immediately. The game stops (and the view is dismissed) when the user lifts the finger. If you like to end the mini game immediately set the `forceEnd` property to true. 109 | 110 | ## Status 111 | 112 | It's kind of beta status. 113 | 114 | ## Feedback 115 | 116 | If you use this code or got inspired by the idea and build an app with an even more awesome PullToRefresh game, please let me know. 117 | 118 | ## Author 119 | 120 | Dominik Hauser 121 | 122 | [Twitter: @dasdom](https://twitter.com/dasdom) 123 | 124 | [dasdom.github.io](https://dasdom.github.io/) 125 | 126 | ## Support 127 | 128 | If you want to give me something back, I would highly appreciate if you buy [my book about Test-Driven Development with Swift](https://leanpub.com/tddfakebookforios) and give me feedback about it. 129 | 130 | ## Thanks 131 | 132 | Thanks to [Ben Oztalay](https://github.com/boztalay/BOZPongRefreshControl) and [raywenderlich.com](http://www.raywenderlich.com) for inspiration. 133 | 134 | ## Licence 135 | 136 | MIT 137 | -------------------------------------------------------------------------------- /Example/PullToRefreshDemo.xcodeproj/xcshareddata/xcschemes/PullToRefresh.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 67 | 68 | 78 | 79 | 85 | 86 | 87 | 88 | 89 | 90 | 96 | 97 | 103 | 104 | 105 | 106 | 108 | 109 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PullToRefreshDemo/Pods-PullToRefreshDemo-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | XCASSET_FILES=() 10 | 11 | realpath() { 12 | DIRECTORY="$(cd "${1%/*}" && pwd)" 13 | FILENAME="${1##*/}" 14 | echo "$DIRECTORY/$FILENAME" 15 | } 16 | 17 | install_resource() 18 | { 19 | case $1 in 20 | *.storyboard) 21 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 22 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 23 | ;; 24 | *.xib) 25 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 26 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 27 | ;; 28 | *.framework) 29 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 30 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 31 | echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 32 | rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 33 | ;; 34 | *.xcdatamodel) 35 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" 36 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" 37 | ;; 38 | *.xcdatamodeld) 39 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" 40 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" 41 | ;; 42 | *.xcmappingmodel) 43 | echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" 44 | xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" 45 | ;; 46 | *.xcassets) 47 | ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") 48 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 49 | ;; 50 | /*) 51 | echo "$1" 52 | echo "$1" >> "$RESOURCES_TO_COPY" 53 | ;; 54 | *) 55 | echo "${PODS_ROOT}/$1" 56 | echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" 57 | ;; 58 | esac 59 | } 60 | 61 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 62 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 63 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 64 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 65 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 66 | fi 67 | rm -f "$RESOURCES_TO_COPY" 68 | 69 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 70 | then 71 | case "${TARGETED_DEVICE_FAMILY}" in 72 | 1,2) 73 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 74 | ;; 75 | 1) 76 | TARGET_DEVICE_ARGS="--target-device iphone" 77 | ;; 78 | 2) 79 | TARGET_DEVICE_ARGS="--target-device ipad" 80 | ;; 81 | *) 82 | TARGET_DEVICE_ARGS="--target-device mac" 83 | ;; 84 | esac 85 | 86 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 87 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 88 | while read line; do 89 | if [[ $line != "`realpath $PODS_ROOT`*" ]]; then 90 | XCASSET_FILES+=("$line") 91 | fi 92 | done <<<"$OTHER_XCASSETS" 93 | 94 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 95 | fi 96 | -------------------------------------------------------------------------------- /Example/PullToRefreshDemo/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 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | -------------------------------------------------------------------------------- /BreakOutToRefresh/BreakOutToRefreshView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BreakOutToRefreshView.swift 3 | // PullToRefreshDemo 4 | // 5 | // Created by dasdom on 17.01.15. 6 | // 7 | // Copyright (c) 2015 Dominik Hauser 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | 27 | 28 | import UIKit 29 | import SpriteKit 30 | 31 | @objc public protocol BreakOutToRefreshDelegate: class { 32 | func refreshViewDidRefresh(_ refreshView: BreakOutToRefreshView) 33 | } 34 | 35 | open class BreakOutToRefreshView: SKView { 36 | 37 | fileprivate let sceneHeight = CGFloat(100) 38 | 39 | fileprivate let breakOutScene: BreakOutScene 40 | fileprivate unowned let scrollView: UIScrollView 41 | @objc open weak var refreshDelegate: BreakOutToRefreshDelegate? 42 | open var forceEnd = false 43 | 44 | open var isRefreshing = false 45 | fileprivate var isDragging = false 46 | fileprivate var isVisible = false 47 | 48 | open var scenebackgroundColor: UIColor { 49 | didSet { 50 | breakOutScene.scenebackgroundColor = scenebackgroundColor 51 | startScene.backgroundColor = scenebackgroundColor 52 | } 53 | } 54 | 55 | open var textColor: UIColor { 56 | didSet { 57 | breakOutScene.textColor = textColor 58 | startScene.textColor = textColor 59 | } 60 | } 61 | 62 | open var paddleColor: UIColor { 63 | didSet { 64 | breakOutScene.paddleColor = paddleColor 65 | } 66 | } 67 | open var ballColor: UIColor { 68 | didSet { 69 | breakOutScene.ballColor = ballColor 70 | } 71 | } 72 | 73 | open var blockColors: [UIColor] { 74 | didSet { 75 | breakOutScene.blockColors = blockColors 76 | } 77 | } 78 | 79 | fileprivate lazy var startScene: StartScene = { 80 | let size = CGSize(width: self.scrollView.frame.size.width, height: self.sceneHeight) 81 | let startScene = StartScene(size: size) 82 | startScene.backgroundColor = self.scenebackgroundColor 83 | startScene.textColor = self.textColor 84 | return startScene 85 | }() 86 | 87 | public override init(frame: CGRect) { 88 | fatalError("Use init(scrollView:) instead.") 89 | } 90 | 91 | @objc public init(scrollView inScrollView: UIScrollView) { 92 | 93 | let frame = CGRect(x: 0.0, y: -sceneHeight, width: inScrollView.frame.size.width, height: sceneHeight) 94 | 95 | breakOutScene = BreakOutScene(size: frame.size) 96 | self.scrollView = inScrollView 97 | 98 | scenebackgroundColor = UIColor.white 99 | textColor = UIColor.black 100 | paddleColor = UIColor.gray 101 | ballColor = UIColor.black 102 | blockColors = [UIColor(white: 0.2, alpha: 1.0), UIColor(white: 0.4, alpha: 1.0), UIColor(white: 0.6, alpha: 1.0)] 103 | 104 | breakOutScene.scenebackgroundColor = scenebackgroundColor 105 | breakOutScene.textColor = textColor 106 | breakOutScene.paddleColor = paddleColor 107 | breakOutScene.ballColor = ballColor 108 | breakOutScene.blockColors = blockColors 109 | 110 | super.init(frame: frame) 111 | 112 | layer.borderColor = UIColor.gray.cgColor 113 | layer.borderWidth = 1.0 114 | 115 | presentScene(startScene) 116 | } 117 | 118 | public required init(coder aDecoder: NSCoder) { 119 | fatalError("init(coder:) has not been implemented") 120 | } 121 | 122 | 123 | open func beginRefreshing() { 124 | isRefreshing = true 125 | 126 | presentScene(breakOutScene, transition: .doorsOpenVertical(withDuration: 0.4)) 127 | breakOutScene.updateLabel("Loading...") 128 | 129 | if self.scrollView.contentOffset.y < -60 { 130 | self.breakOutScene.reset() 131 | self.breakOutScene.start() 132 | } 133 | UIView.animate(withDuration: 0.4, delay: 0, options: UIViewAnimationOptions(), animations: { () -> Void in 134 | if #available(iOS 11.0, *) { 135 | // self.scrollView.contentInset.top += self.sceneHeight + self.scrollView.adjustedContentInset.top 136 | self.scrollView.contentInset.top += self.sceneHeight + self.scrollView.safeAreaInsets.top 137 | } else { 138 | self.scrollView.contentInset.top += self.sceneHeight 139 | } 140 | }) { (_) -> Void in 141 | self.isVisible = true 142 | } 143 | } 144 | 145 | @objc open func endRefreshing() { 146 | if (!isDragging || forceEnd) && isVisible { 147 | self.isVisible = false 148 | UIView.animate(withDuration: 0.4, delay: 0, options: UIViewAnimationOptions(), animations: { () -> Void in 149 | if #available(iOS 11.0, *) { 150 | self.scrollView.contentInset.top -= self.sceneHeight + self.scrollView.safeAreaInsets.top 151 | } else { 152 | self.scrollView.contentInset.top -= self.sceneHeight 153 | } 154 | }) { (_) -> Void in 155 | self.isRefreshing = false 156 | // self.presentScene(StartScene(size: CGSize(width: self.scrollView.frame.size.width, height: self.sceneHeight))) 157 | self.presentScene(self.startScene, transition: .doorsCloseVertical(withDuration: 0.3)) 158 | } 159 | } else { 160 | breakOutScene.updateLabel("Loading Finished") 161 | isRefreshing = false 162 | } 163 | } 164 | } 165 | 166 | extension BreakOutToRefreshView: UIScrollViewDelegate { 167 | 168 | public func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { 169 | isDragging = true 170 | } 171 | 172 | public func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { 173 | isDragging = false 174 | 175 | if !isRefreshing && scrollView.contentOffset.y + scrollView.contentInset.top < -sceneHeight { 176 | beginRefreshing() 177 | targetContentOffset.pointee.y = -scrollView.contentInset.top 178 | refreshDelegate?.refreshViewDidRefresh(self) 179 | } 180 | 181 | if !isRefreshing { 182 | endRefreshing() 183 | } 184 | 185 | } 186 | 187 | public func scrollViewDidScroll(_ scrollView: UIScrollView) { 188 | let yPosition = sceneHeight - (-scrollView.contentInset.top-scrollView.contentOffset.y)*2 189 | 190 | breakOutScene.moveHandle(yPosition) 191 | } 192 | } 193 | 194 | class BreakOutScene: SKScene, SKPhysicsContactDelegate { 195 | 196 | let ballName = "ball" 197 | let paddleName = "paddle" 198 | let blockName = "block" 199 | let backgroundLabelName = "backgroundLabel" 200 | 201 | let ballCategory : UInt32 = 0x1 << 0 202 | let backCategory : UInt32 = 0x1 << 1 203 | let blockCategory : UInt32 = 0x1 << 2 204 | let paddleCategory : UInt32 = 0x1 << 3 205 | 206 | var contentCreated = false 207 | var isStarted = false 208 | 209 | var scenebackgroundColor: UIColor! 210 | var textColor: UIColor! 211 | var paddleColor: UIColor! 212 | var ballColor: UIColor! 213 | var blockColors: [UIColor]! 214 | 215 | override func didMove(to view: SKView) { 216 | super.didMove(to: view) 217 | if !contentCreated { 218 | createSceneContents() 219 | contentCreated = true 220 | } 221 | } 222 | 223 | override func update(_ currentTime: TimeInterval) { 224 | guard let ball = self.childNode(withName: ballName) as? SKSpriteNode, 225 | let physicsBody = ball.physicsBody else { 226 | return; 227 | } 228 | 229 | let maxSpeed: CGFloat = 600.0 230 | let speed = sqrt(physicsBody.velocity.dx * physicsBody.velocity.dx + physicsBody.velocity.dy * physicsBody.velocity.dy) 231 | 232 | if speed > maxSpeed { 233 | physicsBody.linearDamping = 0.4 234 | } 235 | else { 236 | physicsBody.linearDamping = 0.0 237 | } 238 | } 239 | 240 | func createSceneContents() { 241 | physicsWorld.gravity = CGVector(dx: 0.0, dy: 0.0) 242 | physicsWorld.contactDelegate = self 243 | 244 | backgroundColor = scenebackgroundColor 245 | scaleMode = .aspectFit 246 | 247 | physicsBody = SKPhysicsBody(edgeLoopFrom: frame) 248 | physicsBody?.restitution = 1.0 249 | physicsBody?.friction = 0.0 250 | name = "scene" 251 | 252 | let back = SKNode() 253 | back.physicsBody = SKPhysicsBody(edgeFrom: CGPoint(x: frame.size.width - 1, y: 0), 254 | to: CGPoint(x: frame.size.width - 1, y: frame.size.height)) 255 | back.physicsBody?.categoryBitMask = backCategory 256 | addChild(back) 257 | 258 | createLoadingLabelNode() 259 | 260 | let paddle = createPaddle() 261 | paddle.position = CGPoint(x: frame.size.width-30.0, y: frame.midY) 262 | addChild(paddle) 263 | 264 | createBall() 265 | createBlocks() 266 | 267 | } 268 | 269 | func createPaddle() -> SKSpriteNode { 270 | let paddle = SKSpriteNode(color: paddleColor, size: CGSize(width: 5, height: 30)) 271 | 272 | paddle.physicsBody = SKPhysicsBody(rectangleOf: paddle.size) 273 | paddle.physicsBody?.isDynamic = false 274 | paddle.physicsBody?.restitution = 1.0 275 | paddle.physicsBody?.friction = 0.0 276 | 277 | paddle.name = paddleName 278 | 279 | return paddle 280 | } 281 | 282 | func createBlocks() { 283 | for i in 0..<3 { 284 | var color = blockColors.count > 0 ? blockColors[0] : UIColor(white: 0.2, alpha: 1.0) 285 | if i == 1 { 286 | color = blockColors.count > 1 ? blockColors[1] : UIColor(white: 0.4, alpha: 1.0) 287 | } else if i == 2 { 288 | color = blockColors.count > 2 ? blockColors[2] : UIColor(white: 0.6, alpha: 1.0) 289 | } 290 | 291 | for j in 0..<5 { 292 | let block = SKSpriteNode(color: color, size: CGSize(width: 5, height: 19)) 293 | block.position = CGPoint(x: 20+CGFloat(i)*6, y: CGFloat(j)*20 + 10) 294 | block.name = blockName 295 | block.physicsBody = SKPhysicsBody(rectangleOf: block.size) 296 | 297 | block.physicsBody?.categoryBitMask = blockCategory 298 | block.physicsBody?.allowsRotation = false 299 | block.physicsBody?.restitution = 1.0 300 | block.physicsBody?.friction = 0.0 301 | block.physicsBody?.isDynamic = false 302 | 303 | addChild(block) 304 | } 305 | } 306 | } 307 | 308 | func removeBlocks() { 309 | var node = childNode(withName: blockName) 310 | while (node != nil) { 311 | node?.removeFromParent() 312 | node = childNode(withName: blockName) 313 | } 314 | } 315 | 316 | func createBall() { 317 | let ball = SKSpriteNode(color: ballColor, size: CGSize(width: 8, height: 8)) 318 | 319 | 320 | ball.position = CGPoint(x: frame.size.width - 30.0 - ball.size.width, y: frame.height*CGFloat(arc4random())/CGFloat(UINT32_MAX)) 321 | ball.name = ballName 322 | 323 | ball.physicsBody = SKPhysicsBody(circleOfRadius: ceil(ball.size.width/2.0)) 324 | ball.physicsBody?.usesPreciseCollisionDetection = true 325 | ball.physicsBody?.categoryBitMask = ballCategory 326 | ball.physicsBody?.contactTestBitMask = blockCategory | paddleCategory | backCategory 327 | ball.physicsBody?.allowsRotation = false 328 | 329 | ball.physicsBody?.linearDamping = 0.0 330 | ball.physicsBody?.restitution = 1.0 331 | ball.physicsBody?.friction = 0.0 332 | 333 | addChild(ball) 334 | } 335 | 336 | func removeBall() { 337 | if let ball = childNode(withName: ballName) { 338 | ball.removeFromParent() 339 | } 340 | } 341 | 342 | func createLoadingLabelNode() { 343 | let loadingLabelNode = SKLabelNode(text: "Loading...") 344 | loadingLabelNode.fontColor = textColor 345 | loadingLabelNode.fontSize = 20 346 | loadingLabelNode.position = CGPoint(x: frame.midX, y: frame.midY) 347 | loadingLabelNode.name = backgroundLabelName 348 | 349 | addChild(loadingLabelNode) 350 | } 351 | 352 | func reset() { 353 | removeBlocks() 354 | createBlocks() 355 | removeBall() 356 | createBall() 357 | } 358 | 359 | func start() { 360 | isStarted = true 361 | 362 | let ball = childNode(withName: ballName) 363 | ball?.physicsBody?.applyImpulse(CGVector(dx: -0.5, dy: 0.2)) 364 | } 365 | 366 | func updateLabel(_ text: String) { 367 | if let label: SKLabelNode = childNode(withName: backgroundLabelName) as? SKLabelNode { 368 | label.text = text 369 | } 370 | } 371 | 372 | func moveHandle(_ value: CGFloat) { 373 | let paddle = childNode(withName: paddleName) 374 | 375 | paddle?.position.y = value 376 | } 377 | 378 | func didEnd(_ contact: SKPhysicsContact) { 379 | var ballBody: SKPhysicsBody? 380 | var otherBody: SKPhysicsBody? 381 | 382 | if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 383 | ballBody = contact.bodyA 384 | otherBody = contact.bodyB 385 | } else { 386 | ballBody = contact.bodyB 387 | otherBody = contact.bodyA 388 | } 389 | 390 | if ((otherBody?.categoryBitMask ?? 0) == backCategory) { 391 | reset() 392 | start() 393 | } else if ballBody!.categoryBitMask & ballCategory != 0 { 394 | let minimalXVelocity = CGFloat(20.0) 395 | let minimalYVelocity = CGFloat(20.0) 396 | var velocity = ballBody!.velocity as CGVector 397 | if velocity.dx > -minimalXVelocity && velocity.dx <= 0 { 398 | velocity.dx = -minimalXVelocity-1 399 | } else if velocity.dx > 0 && velocity.dx < minimalXVelocity { 400 | velocity.dx = minimalXVelocity+1 401 | } 402 | if velocity.dy > -minimalYVelocity && velocity.dy <= 0 { 403 | velocity.dy = -minimalYVelocity-1 404 | } else if velocity.dy > 0 && velocity.dy < minimalYVelocity { 405 | velocity.dy = minimalYVelocity+1 406 | } 407 | ballBody?.velocity = velocity 408 | } 409 | 410 | if let body = otherBody , (body.categoryBitMask & blockCategory != 0) && body.categoryBitMask == blockCategory { 411 | body.node?.removeFromParent() 412 | if isGameWon() { 413 | reset() 414 | start() 415 | } 416 | } 417 | } 418 | 419 | func isGameWon() -> Bool { 420 | var numberOfBricks = 0 421 | self.enumerateChildNodes(withName: blockName) { node, stop in 422 | numberOfBricks = numberOfBricks + 1 423 | } 424 | return numberOfBricks == 0 425 | } 426 | } 427 | 428 | class StartScene: SKScene { 429 | var contentCreated = false 430 | 431 | var textColor = SKColor.black { 432 | didSet { 433 | self.startLabelNode.fontColor = textColor 434 | self.descriptionLabelNode.fontColor = textColor 435 | } 436 | } 437 | 438 | lazy var startLabelNode: SKLabelNode = { 439 | let startNode = SKLabelNode(text: "Pull to Break Out!") 440 | startNode.fontColor = self.textColor 441 | startNode.fontSize = 20 442 | startNode.position = CGPoint(x: self.frame.midX, y: self.frame.midY) 443 | startNode.name = "start" 444 | 445 | return startNode 446 | }() 447 | 448 | lazy var descriptionLabelNode: SKLabelNode = { 449 | let descriptionNode = SKLabelNode(text: "Scroll to move handle") 450 | descriptionNode.fontColor = self.textColor 451 | descriptionNode.fontSize = 17 452 | descriptionNode.position = CGPoint(x: self.frame.midX, y: self.frame.midY-20) 453 | descriptionNode.name = "description" 454 | 455 | return descriptionNode 456 | }() 457 | 458 | override func didMove(to view: SKView) { 459 | super.didMove(to: view) 460 | if !contentCreated { 461 | createSceneContents() 462 | contentCreated = true 463 | } 464 | } 465 | 466 | func createSceneContents() { 467 | scaleMode = .aspectFit 468 | addChild(startLabelNode) 469 | addChild(descriptionLabelNode) 470 | } 471 | } 472 | -------------------------------------------------------------------------------- /Example/PullToRefreshDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 44DC47883061B3677771A93C /* Pods_PullToRefreshDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E4B37C388DA8945A27A57DC /* Pods_PullToRefreshDemo.framework */; }; 11 | 89CB98551B12C77700C87160 /* BreakOutToRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 89CB98541B12C77700C87160 /* BreakOutToRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12 | F27D845F1B30AA1400894E82 /* ObjcTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F27D845E1B30AA1400894E82 /* ObjcTableViewController.m */; }; 13 | F2DA3FB61A6B009300F5576F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2DA3FB51A6B009300F5576F /* AppDelegate.swift */; }; 14 | F2DA3FBB1A6B009300F5576F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F2DA3FB91A6B009300F5576F /* Main.storyboard */; }; 15 | F2DA3FBD1A6B009300F5576F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F2DA3FBC1A6B009300F5576F /* Images.xcassets */; }; 16 | F2DA3FC01A6B009300F5576F /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = F2DA3FBE1A6B009300F5576F /* LaunchScreen.xib */; }; 17 | F2DA3FD61A6B01A100F5576F /* DemoTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2DA3FD51A6B01A100F5576F /* DemoTableViewController.swift */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXFileReference section */ 21 | 7E4B37C388DA8945A27A57DC /* Pods_PullToRefreshDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PullToRefreshDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 22 | 89CB98501B12C77700C87160 /* BreakOutToRefresh.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BreakOutToRefresh.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 23 | 89CB98531B12C77700C87160 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 24 | 89CB98541B12C77700C87160 /* BreakOutToRefresh.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BreakOutToRefresh.h; sourceTree = ""; }; 25 | 919E6B5F4D7F8BF6399AA510 /* Pods-PullToRefreshDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PullToRefreshDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-PullToRefreshDemo/Pods-PullToRefreshDemo.debug.xcconfig"; sourceTree = ""; }; 26 | A75EB5FD286CFB405F320638 /* Pods-PullToRefreshDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PullToRefreshDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-PullToRefreshDemo/Pods-PullToRefreshDemo.release.xcconfig"; sourceTree = ""; }; 27 | F27D845C1B30AA1400894E82 /* PullToRefreshDemo-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "PullToRefreshDemo-Bridging-Header.h"; sourceTree = ""; }; 28 | F27D845D1B30AA1400894E82 /* ObjcTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjcTableViewController.h; sourceTree = ""; }; 29 | F27D845E1B30AA1400894E82 /* ObjcTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjcTableViewController.m; sourceTree = ""; }; 30 | F2DA3FB01A6B009300F5576F /* PullToRefreshDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PullToRefreshDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 31 | F2DA3FB41A6B009300F5576F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 32 | F2DA3FB51A6B009300F5576F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33 | F2DA3FBA1A6B009300F5576F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 34 | F2DA3FBC1A6B009300F5576F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 35 | F2DA3FBF1A6B009300F5576F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 36 | F2DA3FD51A6B01A100F5576F /* DemoTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemoTableViewController.swift; sourceTree = ""; }; 37 | /* End PBXFileReference section */ 38 | 39 | /* Begin PBXFrameworksBuildPhase section */ 40 | 89CB984C1B12C77700C87160 /* Frameworks */ = { 41 | isa = PBXFrameworksBuildPhase; 42 | buildActionMask = 2147483647; 43 | files = ( 44 | ); 45 | runOnlyForDeploymentPostprocessing = 0; 46 | }; 47 | F2DA3FAD1A6B009300F5576F /* Frameworks */ = { 48 | isa = PBXFrameworksBuildPhase; 49 | buildActionMask = 2147483647; 50 | files = ( 51 | 44DC47883061B3677771A93C /* Pods_PullToRefreshDemo.framework in Frameworks */, 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 10D4A8D8CF74059A0BABABA1 /* Frameworks */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 7E4B37C388DA8945A27A57DC /* Pods_PullToRefreshDemo.framework */, 62 | ); 63 | name = Frameworks; 64 | sourceTree = ""; 65 | }; 66 | 87CE463A7D04A165BBE6F1F5 /* Pods */ = { 67 | isa = PBXGroup; 68 | children = ( 69 | 919E6B5F4D7F8BF6399AA510 /* Pods-PullToRefreshDemo.debug.xcconfig */, 70 | A75EB5FD286CFB405F320638 /* Pods-PullToRefreshDemo.release.xcconfig */, 71 | ); 72 | name = Pods; 73 | sourceTree = ""; 74 | }; 75 | 89CB98511B12C77700C87160 /* PullToRefresh */ = { 76 | isa = PBXGroup; 77 | children = ( 78 | 89CB98541B12C77700C87160 /* BreakOutToRefresh.h */, 79 | 89CB98521B12C77700C87160 /* Supporting Files */, 80 | ); 81 | path = PullToRefresh; 82 | sourceTree = ""; 83 | }; 84 | 89CB98521B12C77700C87160 /* Supporting Files */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | 89CB98531B12C77700C87160 /* Info.plist */, 88 | ); 89 | name = "Supporting Files"; 90 | sourceTree = ""; 91 | }; 92 | F2DA3FA71A6B009200F5576F = { 93 | isa = PBXGroup; 94 | children = ( 95 | F2DA3FB21A6B009300F5576F /* PullToRefreshDemo */, 96 | 89CB98511B12C77700C87160 /* PullToRefresh */, 97 | F2DA3FB11A6B009300F5576F /* Products */, 98 | 87CE463A7D04A165BBE6F1F5 /* Pods */, 99 | 10D4A8D8CF74059A0BABABA1 /* Frameworks */, 100 | ); 101 | sourceTree = ""; 102 | }; 103 | F2DA3FB11A6B009300F5576F /* Products */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | F2DA3FB01A6B009300F5576F /* PullToRefreshDemo.app */, 107 | 89CB98501B12C77700C87160 /* BreakOutToRefresh.framework */, 108 | ); 109 | name = Products; 110 | sourceTree = ""; 111 | }; 112 | F2DA3FB21A6B009300F5576F /* PullToRefreshDemo */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | F2DA3FB51A6B009300F5576F /* AppDelegate.swift */, 116 | F2DA3FD51A6B01A100F5576F /* DemoTableViewController.swift */, 117 | F27D845D1B30AA1400894E82 /* ObjcTableViewController.h */, 118 | F27D845E1B30AA1400894E82 /* ObjcTableViewController.m */, 119 | F2DA3FB91A6B009300F5576F /* Main.storyboard */, 120 | F2DA3FBC1A6B009300F5576F /* Images.xcassets */, 121 | F2DA3FBE1A6B009300F5576F /* LaunchScreen.xib */, 122 | F2DA3FB31A6B009300F5576F /* Supporting Files */, 123 | F27D845C1B30AA1400894E82 /* PullToRefreshDemo-Bridging-Header.h */, 124 | ); 125 | path = PullToRefreshDemo; 126 | sourceTree = ""; 127 | }; 128 | F2DA3FB31A6B009300F5576F /* Supporting Files */ = { 129 | isa = PBXGroup; 130 | children = ( 131 | F2DA3FB41A6B009300F5576F /* Info.plist */, 132 | ); 133 | name = "Supporting Files"; 134 | sourceTree = ""; 135 | }; 136 | /* End PBXGroup section */ 137 | 138 | /* Begin PBXHeadersBuildPhase section */ 139 | 89CB984D1B12C77700C87160 /* Headers */ = { 140 | isa = PBXHeadersBuildPhase; 141 | buildActionMask = 2147483647; 142 | files = ( 143 | 89CB98551B12C77700C87160 /* BreakOutToRefresh.h in Headers */, 144 | ); 145 | runOnlyForDeploymentPostprocessing = 0; 146 | }; 147 | /* End PBXHeadersBuildPhase section */ 148 | 149 | /* Begin PBXNativeTarget section */ 150 | 89CB984F1B12C77700C87160 /* PullToRefresh */ = { 151 | isa = PBXNativeTarget; 152 | buildConfigurationList = 89CB98671B12C77700C87160 /* Build configuration list for PBXNativeTarget "PullToRefresh" */; 153 | buildPhases = ( 154 | 89CB984B1B12C77700C87160 /* Sources */, 155 | 89CB984C1B12C77700C87160 /* Frameworks */, 156 | 89CB984D1B12C77700C87160 /* Headers */, 157 | 89CB984E1B12C77700C87160 /* Resources */, 158 | ); 159 | buildRules = ( 160 | ); 161 | dependencies = ( 162 | ); 163 | name = PullToRefresh; 164 | productName = PullToRefresh; 165 | productReference = 89CB98501B12C77700C87160 /* BreakOutToRefresh.framework */; 166 | productType = "com.apple.product-type.framework"; 167 | }; 168 | F2DA3FAF1A6B009300F5576F /* PullToRefreshDemo */ = { 169 | isa = PBXNativeTarget; 170 | buildConfigurationList = F2DA3FCF1A6B009300F5576F /* Build configuration list for PBXNativeTarget "PullToRefreshDemo" */; 171 | buildPhases = ( 172 | E78DF821473B5AB422EBAA02 /* Check Pods Manifest.lock */, 173 | F2DA3FAC1A6B009300F5576F /* Sources */, 174 | F2DA3FAD1A6B009300F5576F /* Frameworks */, 175 | F2DA3FAE1A6B009300F5576F /* Resources */, 176 | 2BF190FA3FA975204C6A9FCF /* Embed Pods Frameworks */, 177 | 21C7A03E73911C71CB472CDD /* Copy Pods Resources */, 178 | ); 179 | buildRules = ( 180 | ); 181 | dependencies = ( 182 | ); 183 | name = PullToRefreshDemo; 184 | productName = PullToRefreshDemo; 185 | productReference = F2DA3FB01A6B009300F5576F /* PullToRefreshDemo.app */; 186 | productType = "com.apple.product-type.application"; 187 | }; 188 | /* End PBXNativeTarget section */ 189 | 190 | /* Begin PBXProject section */ 191 | F2DA3FA81A6B009200F5576F /* Project object */ = { 192 | isa = PBXProject; 193 | attributes = { 194 | LastSwiftUpdateCheck = 0700; 195 | LastUpgradeCheck = 1010; 196 | ORGANIZATIONNAME = "Dominik Hauser"; 197 | TargetAttributes = { 198 | 89CB984F1B12C77700C87160 = { 199 | CreatedOnToolsVersion = 6.3.2; 200 | }; 201 | F2DA3FAF1A6B009300F5576F = { 202 | CreatedOnToolsVersion = 6.1.1; 203 | LastSwiftMigration = 0910; 204 | }; 205 | }; 206 | }; 207 | buildConfigurationList = F2DA3FAB1A6B009200F5576F /* Build configuration list for PBXProject "PullToRefreshDemo" */; 208 | compatibilityVersion = "Xcode 3.2"; 209 | developmentRegion = English; 210 | hasScannedForEncodings = 0; 211 | knownRegions = ( 212 | en, 213 | Base, 214 | ); 215 | mainGroup = F2DA3FA71A6B009200F5576F; 216 | productRefGroup = F2DA3FB11A6B009300F5576F /* Products */; 217 | projectDirPath = ""; 218 | projectRoot = ""; 219 | targets = ( 220 | F2DA3FAF1A6B009300F5576F /* PullToRefreshDemo */, 221 | 89CB984F1B12C77700C87160 /* PullToRefresh */, 222 | ); 223 | }; 224 | /* End PBXProject section */ 225 | 226 | /* Begin PBXResourcesBuildPhase section */ 227 | 89CB984E1B12C77700C87160 /* Resources */ = { 228 | isa = PBXResourcesBuildPhase; 229 | buildActionMask = 2147483647; 230 | files = ( 231 | ); 232 | runOnlyForDeploymentPostprocessing = 0; 233 | }; 234 | F2DA3FAE1A6B009300F5576F /* Resources */ = { 235 | isa = PBXResourcesBuildPhase; 236 | buildActionMask = 2147483647; 237 | files = ( 238 | F2DA3FBB1A6B009300F5576F /* Main.storyboard in Resources */, 239 | F2DA3FC01A6B009300F5576F /* LaunchScreen.xib in Resources */, 240 | F2DA3FBD1A6B009300F5576F /* Images.xcassets in Resources */, 241 | ); 242 | runOnlyForDeploymentPostprocessing = 0; 243 | }; 244 | /* End PBXResourcesBuildPhase section */ 245 | 246 | /* Begin PBXShellScriptBuildPhase section */ 247 | 21C7A03E73911C71CB472CDD /* Copy Pods Resources */ = { 248 | isa = PBXShellScriptBuildPhase; 249 | buildActionMask = 2147483647; 250 | files = ( 251 | ); 252 | inputPaths = ( 253 | ); 254 | name = "Copy Pods Resources"; 255 | outputPaths = ( 256 | ); 257 | runOnlyForDeploymentPostprocessing = 0; 258 | shellPath = /bin/sh; 259 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-PullToRefreshDemo/Pods-PullToRefreshDemo-resources.sh\"\n"; 260 | showEnvVarsInLog = 0; 261 | }; 262 | 2BF190FA3FA975204C6A9FCF /* Embed Pods Frameworks */ = { 263 | isa = PBXShellScriptBuildPhase; 264 | buildActionMask = 2147483647; 265 | files = ( 266 | ); 267 | inputPaths = ( 268 | ); 269 | name = "Embed Pods Frameworks"; 270 | outputPaths = ( 271 | ); 272 | runOnlyForDeploymentPostprocessing = 0; 273 | shellPath = /bin/sh; 274 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-PullToRefreshDemo/Pods-PullToRefreshDemo-frameworks.sh\"\n"; 275 | showEnvVarsInLog = 0; 276 | }; 277 | E78DF821473B5AB422EBAA02 /* Check Pods Manifest.lock */ = { 278 | isa = PBXShellScriptBuildPhase; 279 | buildActionMask = 2147483647; 280 | files = ( 281 | ); 282 | inputPaths = ( 283 | ); 284 | name = "Check Pods Manifest.lock"; 285 | outputPaths = ( 286 | ); 287 | runOnlyForDeploymentPostprocessing = 0; 288 | shellPath = /bin/sh; 289 | shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; 290 | showEnvVarsInLog = 0; 291 | }; 292 | /* End PBXShellScriptBuildPhase section */ 293 | 294 | /* Begin PBXSourcesBuildPhase section */ 295 | 89CB984B1B12C77700C87160 /* Sources */ = { 296 | isa = PBXSourcesBuildPhase; 297 | buildActionMask = 2147483647; 298 | files = ( 299 | ); 300 | runOnlyForDeploymentPostprocessing = 0; 301 | }; 302 | F2DA3FAC1A6B009300F5576F /* Sources */ = { 303 | isa = PBXSourcesBuildPhase; 304 | buildActionMask = 2147483647; 305 | files = ( 306 | F27D845F1B30AA1400894E82 /* ObjcTableViewController.m in Sources */, 307 | F2DA3FD61A6B01A100F5576F /* DemoTableViewController.swift in Sources */, 308 | F2DA3FB61A6B009300F5576F /* AppDelegate.swift in Sources */, 309 | ); 310 | runOnlyForDeploymentPostprocessing = 0; 311 | }; 312 | /* End PBXSourcesBuildPhase section */ 313 | 314 | /* Begin PBXVariantGroup section */ 315 | F2DA3FB91A6B009300F5576F /* Main.storyboard */ = { 316 | isa = PBXVariantGroup; 317 | children = ( 318 | F2DA3FBA1A6B009300F5576F /* Base */, 319 | ); 320 | name = Main.storyboard; 321 | sourceTree = ""; 322 | }; 323 | F2DA3FBE1A6B009300F5576F /* LaunchScreen.xib */ = { 324 | isa = PBXVariantGroup; 325 | children = ( 326 | F2DA3FBF1A6B009300F5576F /* Base */, 327 | ); 328 | name = LaunchScreen.xib; 329 | sourceTree = ""; 330 | }; 331 | /* End PBXVariantGroup section */ 332 | 333 | /* Begin XCBuildConfiguration section */ 334 | 89CB98631B12C77700C87160 /* Debug */ = { 335 | isa = XCBuildConfiguration; 336 | buildSettings = { 337 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 338 | CURRENT_PROJECT_VERSION = 1; 339 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 340 | DEFINES_MODULE = YES; 341 | DYLIB_COMPATIBILITY_VERSION = 1; 342 | DYLIB_CURRENT_VERSION = 1; 343 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 344 | GCC_NO_COMMON_BLOCKS = YES; 345 | GCC_PREPROCESSOR_DEFINITIONS = ( 346 | "DEBUG=1", 347 | "$(inherited)", 348 | ); 349 | INFOPLIST_FILE = PullToRefresh/Info.plist; 350 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 351 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 352 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 353 | PRODUCT_BUNDLE_IDENTIFIER = "de.dasdom.$(PRODUCT_NAME:rfc1034identifier)"; 354 | PRODUCT_NAME = BreakOutToRefresh; 355 | SKIP_INSTALL = YES; 356 | TARGETED_DEVICE_FAMILY = "1,2"; 357 | VERSIONING_SYSTEM = "apple-generic"; 358 | VERSION_INFO_PREFIX = ""; 359 | }; 360 | name = Debug; 361 | }; 362 | 89CB98641B12C77700C87160 /* Release */ = { 363 | isa = XCBuildConfiguration; 364 | buildSettings = { 365 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 366 | COPY_PHASE_STRIP = NO; 367 | CURRENT_PROJECT_VERSION = 1; 368 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 369 | DEFINES_MODULE = YES; 370 | DYLIB_COMPATIBILITY_VERSION = 1; 371 | DYLIB_CURRENT_VERSION = 1; 372 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 373 | GCC_NO_COMMON_BLOCKS = YES; 374 | INFOPLIST_FILE = PullToRefresh/Info.plist; 375 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 376 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 377 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 378 | PRODUCT_BUNDLE_IDENTIFIER = "de.dasdom.$(PRODUCT_NAME:rfc1034identifier)"; 379 | PRODUCT_NAME = BreakOutToRefresh; 380 | SKIP_INSTALL = YES; 381 | TARGETED_DEVICE_FAMILY = "1,2"; 382 | VERSIONING_SYSTEM = "apple-generic"; 383 | VERSION_INFO_PREFIX = ""; 384 | }; 385 | name = Release; 386 | }; 387 | F2DA3FCD1A6B009300F5576F /* Debug */ = { 388 | isa = XCBuildConfiguration; 389 | buildSettings = { 390 | ALWAYS_SEARCH_USER_PATHS = NO; 391 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 392 | CLANG_CXX_LIBRARY = "libc++"; 393 | CLANG_ENABLE_MODULES = YES; 394 | CLANG_ENABLE_OBJC_ARC = YES; 395 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 396 | CLANG_WARN_BOOL_CONVERSION = YES; 397 | CLANG_WARN_COMMA = YES; 398 | CLANG_WARN_CONSTANT_CONVERSION = YES; 399 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 400 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 401 | CLANG_WARN_EMPTY_BODY = YES; 402 | CLANG_WARN_ENUM_CONVERSION = YES; 403 | CLANG_WARN_INFINITE_RECURSION = YES; 404 | CLANG_WARN_INT_CONVERSION = YES; 405 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 406 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 407 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 408 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 409 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 410 | CLANG_WARN_STRICT_PROTOTYPES = YES; 411 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 412 | CLANG_WARN_UNREACHABLE_CODE = YES; 413 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 414 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 415 | COPY_PHASE_STRIP = NO; 416 | ENABLE_STRICT_OBJC_MSGSEND = YES; 417 | ENABLE_TESTABILITY = YES; 418 | GCC_C_LANGUAGE_STANDARD = gnu99; 419 | GCC_DYNAMIC_NO_PIC = NO; 420 | GCC_NO_COMMON_BLOCKS = YES; 421 | GCC_OPTIMIZATION_LEVEL = 0; 422 | GCC_PREPROCESSOR_DEFINITIONS = ( 423 | "DEBUG=1", 424 | "$(inherited)", 425 | ); 426 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 427 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 428 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 429 | GCC_WARN_UNDECLARED_SELECTOR = YES; 430 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 431 | GCC_WARN_UNUSED_FUNCTION = YES; 432 | GCC_WARN_UNUSED_VARIABLE = YES; 433 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 434 | MTL_ENABLE_DEBUG_INFO = YES; 435 | ONLY_ACTIVE_ARCH = YES; 436 | SDKROOT = iphoneos; 437 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 438 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 439 | }; 440 | name = Debug; 441 | }; 442 | F2DA3FCE1A6B009300F5576F /* Release */ = { 443 | isa = XCBuildConfiguration; 444 | buildSettings = { 445 | ALWAYS_SEARCH_USER_PATHS = NO; 446 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 447 | CLANG_CXX_LIBRARY = "libc++"; 448 | CLANG_ENABLE_MODULES = YES; 449 | CLANG_ENABLE_OBJC_ARC = YES; 450 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 451 | CLANG_WARN_BOOL_CONVERSION = YES; 452 | CLANG_WARN_COMMA = YES; 453 | CLANG_WARN_CONSTANT_CONVERSION = YES; 454 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 455 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 456 | CLANG_WARN_EMPTY_BODY = YES; 457 | CLANG_WARN_ENUM_CONVERSION = YES; 458 | CLANG_WARN_INFINITE_RECURSION = YES; 459 | CLANG_WARN_INT_CONVERSION = YES; 460 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 461 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 462 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 463 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 464 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 465 | CLANG_WARN_STRICT_PROTOTYPES = YES; 466 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 467 | CLANG_WARN_UNREACHABLE_CODE = YES; 468 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 469 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 470 | COPY_PHASE_STRIP = YES; 471 | ENABLE_NS_ASSERTIONS = NO; 472 | ENABLE_STRICT_OBJC_MSGSEND = YES; 473 | GCC_C_LANGUAGE_STANDARD = gnu99; 474 | GCC_NO_COMMON_BLOCKS = YES; 475 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 476 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 477 | GCC_WARN_UNDECLARED_SELECTOR = YES; 478 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 479 | GCC_WARN_UNUSED_FUNCTION = YES; 480 | GCC_WARN_UNUSED_VARIABLE = YES; 481 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 482 | MTL_ENABLE_DEBUG_INFO = NO; 483 | SDKROOT = iphoneos; 484 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 485 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 486 | VALIDATE_PRODUCT = YES; 487 | }; 488 | name = Release; 489 | }; 490 | F2DA3FD01A6B009300F5576F /* Debug */ = { 491 | isa = XCBuildConfiguration; 492 | baseConfigurationReference = 919E6B5F4D7F8BF6399AA510 /* Pods-PullToRefreshDemo.debug.xcconfig */; 493 | buildSettings = { 494 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 495 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 496 | CLANG_ENABLE_MODULES = YES; 497 | INFOPLIST_FILE = PullToRefreshDemo/Info.plist; 498 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 499 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 500 | PRODUCT_BUNDLE_IDENTIFIER = "de.dasdom.$(PRODUCT_NAME:rfc1034identifier)"; 501 | PRODUCT_NAME = "$(TARGET_NAME)"; 502 | SWIFT_OBJC_BRIDGING_HEADER = "PullToRefreshDemo/PullToRefreshDemo-Bridging-Header.h"; 503 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 504 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 505 | SWIFT_VERSION = 4.0; 506 | }; 507 | name = Debug; 508 | }; 509 | F2DA3FD11A6B009300F5576F /* Release */ = { 510 | isa = XCBuildConfiguration; 511 | baseConfigurationReference = A75EB5FD286CFB405F320638 /* Pods-PullToRefreshDemo.release.xcconfig */; 512 | buildSettings = { 513 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 514 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 515 | CLANG_ENABLE_MODULES = YES; 516 | INFOPLIST_FILE = PullToRefreshDemo/Info.plist; 517 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 518 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 519 | PRODUCT_BUNDLE_IDENTIFIER = "de.dasdom.$(PRODUCT_NAME:rfc1034identifier)"; 520 | PRODUCT_NAME = "$(TARGET_NAME)"; 521 | SWIFT_OBJC_BRIDGING_HEADER = "PullToRefreshDemo/PullToRefreshDemo-Bridging-Header.h"; 522 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 523 | SWIFT_VERSION = 4.0; 524 | }; 525 | name = Release; 526 | }; 527 | /* End XCBuildConfiguration section */ 528 | 529 | /* Begin XCConfigurationList section */ 530 | 89CB98671B12C77700C87160 /* Build configuration list for PBXNativeTarget "PullToRefresh" */ = { 531 | isa = XCConfigurationList; 532 | buildConfigurations = ( 533 | 89CB98631B12C77700C87160 /* Debug */, 534 | 89CB98641B12C77700C87160 /* Release */, 535 | ); 536 | defaultConfigurationIsVisible = 0; 537 | defaultConfigurationName = Release; 538 | }; 539 | F2DA3FAB1A6B009200F5576F /* Build configuration list for PBXProject "PullToRefreshDemo" */ = { 540 | isa = XCConfigurationList; 541 | buildConfigurations = ( 542 | F2DA3FCD1A6B009300F5576F /* Debug */, 543 | F2DA3FCE1A6B009300F5576F /* Release */, 544 | ); 545 | defaultConfigurationIsVisible = 0; 546 | defaultConfigurationName = Release; 547 | }; 548 | F2DA3FCF1A6B009300F5576F /* Build configuration list for PBXNativeTarget "PullToRefreshDemo" */ = { 549 | isa = XCConfigurationList; 550 | buildConfigurations = ( 551 | F2DA3FD01A6B009300F5576F /* Debug */, 552 | F2DA3FD11A6B009300F5576F /* Release */, 553 | ); 554 | defaultConfigurationIsVisible = 0; 555 | defaultConfigurationName = Release; 556 | }; 557 | /* End XCConfigurationList section */ 558 | }; 559 | rootObject = F2DA3FA81A6B009200F5576F /* Project object */; 560 | } 561 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1AA69F17929E854C2529D27D36C5F70B /* BreakOutToRefresh-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = BA7BA69E778ECB4C92A9DD1590F72CCB /* BreakOutToRefresh-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | 404F5D509A8433816443DA44EEBEDD16 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1D43C348AC5FACE34E933855B6F8A07 /* Foundation.framework */; }; 12 | 45834A3ABE69480B8BB384A4D2E8C554 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E160EC9FBA49EED4D05E9A3B3AB99ED /* UIKit.framework */; }; 13 | 6995EB064FA4203F480BBC02AA46BE62 /* SpriteKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6E1398E4485B9A1D67F6BBAF6A86E32F /* SpriteKit.framework */; }; 14 | BB82C9491FABDB0600101DF68987C15B /* BreakOutToRefreshView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4181207B5C0D8A402246716A3FA9DFD /* BreakOutToRefreshView.swift */; }; 15 | D0009F70E37ACCDD48D73A027E189FCF /* BreakOutToRefresh-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 69BBCDB4CFBB568DB1D0E4FC646CC24E /* BreakOutToRefresh-dummy.m */; }; 16 | D28752E618FDBBB002A9CD4B1080CA3B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1D43C348AC5FACE34E933855B6F8A07 /* Foundation.framework */; }; 17 | F179EF66C22A01534F9B7E54010FF63F /* Pods-PullToRefreshDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AA91CEFAF59442DA0FAF316D2D77438 /* Pods-PullToRefreshDemo-dummy.m */; }; 18 | F5FE4F4187B931849D7F4FE6A9307804 /* Pods-PullToRefreshDemo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B34036ECC792E0705288A5DFB964380B /* Pods-PullToRefreshDemo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | 04181D621A737A69037719D836B93808 /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = 43B24E635073D0739017DFB7C0783010; 27 | remoteInfo = BreakOutToRefresh; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 12E46A47D79473C146F1E7320BA223E4 /* Pods_PullToRefreshDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PullToRefreshDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 33 | 2BFD7A247DD00FFAC600BB4B48E04D47 /* BreakOutToRefresh-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BreakOutToRefresh-prefix.pch"; sourceTree = ""; }; 34 | 31D5ADB695A92FD953002AEF8B730A56 /* BreakOutToRefresh.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = BreakOutToRefresh.modulemap; sourceTree = ""; }; 35 | 3362CCA5C2A324609907FDAB80831722 /* Pods-PullToRefreshDemo-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-PullToRefreshDemo-resources.sh"; sourceTree = ""; }; 36 | 3BCD16C360BA8958E861C66B121DC9D7 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 37 | 47BE575CB71AFFFE5381512468AA56F9 /* Pods-PullToRefreshDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PullToRefreshDemo.debug.xcconfig"; sourceTree = ""; }; 38 | 507E911A8DB72A368AEE5FB77A8247FA /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 39 | 5513E551ABB3864A6C1E20A0936E8728 /* Pods-PullToRefreshDemo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-PullToRefreshDemo.modulemap"; sourceTree = ""; }; 40 | 5D8CBC4BC7DB2873FD840BA5B72B54FD /* Pods-PullToRefreshDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PullToRefreshDemo.release.xcconfig"; sourceTree = ""; }; 41 | 69BBCDB4CFBB568DB1D0E4FC646CC24E /* BreakOutToRefresh-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "BreakOutToRefresh-dummy.m"; sourceTree = ""; }; 42 | 6E1398E4485B9A1D67F6BBAF6A86E32F /* SpriteKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SpriteKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/SpriteKit.framework; sourceTree = DEVELOPER_DIR; }; 43 | 6E2A5FE426E75CC9648035392BC740DD /* Pods-PullToRefreshDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PullToRefreshDemo-acknowledgements.plist"; sourceTree = ""; }; 44 | 707F5BF13786CF8149846D5FD9AC7489 /* BreakOutToRefresh.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BreakOutToRefresh.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | 7AA91CEFAF59442DA0FAF316D2D77438 /* Pods-PullToRefreshDemo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-PullToRefreshDemo-dummy.m"; sourceTree = ""; }; 46 | 7E160EC9FBA49EED4D05E9A3B3AB99ED /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; 47 | A26F9CCDE6EBFA53A155A34F49ECA54F /* Pods-PullToRefreshDemo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-PullToRefreshDemo-acknowledgements.markdown"; sourceTree = ""; }; 48 | A797821CD0178A0D64E97F47497FF182 /* BreakOutToRefresh.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BreakOutToRefresh.xcconfig; sourceTree = ""; }; 49 | B08559D2281AF2833AD03AFBAD4EBC1B /* Pods-PullToRefreshDemo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-PullToRefreshDemo-frameworks.sh"; sourceTree = ""; }; 50 | B1D43C348AC5FACE34E933855B6F8A07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 51 | B34036ECC792E0705288A5DFB964380B /* Pods-PullToRefreshDemo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-PullToRefreshDemo-umbrella.h"; sourceTree = ""; }; 52 | BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 53 | BA7BA69E778ECB4C92A9DD1590F72CCB /* BreakOutToRefresh-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BreakOutToRefresh-umbrella.h"; sourceTree = ""; }; 54 | E4181207B5C0D8A402246716A3FA9DFD /* BreakOutToRefreshView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BreakOutToRefreshView.swift; sourceTree = ""; }; 55 | /* End PBXFileReference section */ 56 | 57 | /* Begin PBXFrameworksBuildPhase section */ 58 | 1C19B1951FF187782EA8B11378EB7FA7 /* Frameworks */ = { 59 | isa = PBXFrameworksBuildPhase; 60 | buildActionMask = 2147483647; 61 | files = ( 62 | D28752E618FDBBB002A9CD4B1080CA3B /* Foundation.framework in Frameworks */, 63 | 6995EB064FA4203F480BBC02AA46BE62 /* SpriteKit.framework in Frameworks */, 64 | 45834A3ABE69480B8BB384A4D2E8C554 /* UIKit.framework in Frameworks */, 65 | ); 66 | runOnlyForDeploymentPostprocessing = 0; 67 | }; 68 | E1CEF721548FC1E458B715FC95C5F0C9 /* Frameworks */ = { 69 | isa = PBXFrameworksBuildPhase; 70 | buildActionMask = 2147483647; 71 | files = ( 72 | 404F5D509A8433816443DA44EEBEDD16 /* Foundation.framework in Frameworks */, 73 | ); 74 | runOnlyForDeploymentPostprocessing = 0; 75 | }; 76 | /* End PBXFrameworksBuildPhase section */ 77 | 78 | /* Begin PBXGroup section */ 79 | 122DA2E5084A4393C29BE363C764795C /* Frameworks */ = { 80 | isa = PBXGroup; 81 | children = ( 82 | 91BBEF3DA3BDDCFC77FBE782D94FA859 /* iOS */, 83 | ); 84 | name = Frameworks; 85 | sourceTree = ""; 86 | }; 87 | 30F5952AF22B531D70AE36A0E14CB3EB /* Support Files */ = { 88 | isa = PBXGroup; 89 | children = ( 90 | 31D5ADB695A92FD953002AEF8B730A56 /* BreakOutToRefresh.modulemap */, 91 | A797821CD0178A0D64E97F47497FF182 /* BreakOutToRefresh.xcconfig */, 92 | 69BBCDB4CFBB568DB1D0E4FC646CC24E /* BreakOutToRefresh-dummy.m */, 93 | 2BFD7A247DD00FFAC600BB4B48E04D47 /* BreakOutToRefresh-prefix.pch */, 94 | BA7BA69E778ECB4C92A9DD1590F72CCB /* BreakOutToRefresh-umbrella.h */, 95 | 3BCD16C360BA8958E861C66B121DC9D7 /* Info.plist */, 96 | ); 97 | name = "Support Files"; 98 | path = "Example/Pods/Target Support Files/BreakOutToRefresh"; 99 | sourceTree = ""; 100 | }; 101 | 6EA30D522723C922937FE32E17499DE3 /* Products */ = { 102 | isa = PBXGroup; 103 | children = ( 104 | 707F5BF13786CF8149846D5FD9AC7489 /* BreakOutToRefresh.framework */, 105 | 12E46A47D79473C146F1E7320BA223E4 /* Pods_PullToRefreshDemo.framework */, 106 | ); 107 | name = Products; 108 | sourceTree = ""; 109 | }; 110 | 7DB346D0F39D3F0E887471402A8071AB = { 111 | isa = PBXGroup; 112 | children = ( 113 | BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */, 114 | AB549BAAF8F6B77AB5AD8F660B42B21F /* Development Pods */, 115 | 122DA2E5084A4393C29BE363C764795C /* Frameworks */, 116 | 6EA30D522723C922937FE32E17499DE3 /* Products */, 117 | 7F72320D7836A4D6483F523CEE5DF1F5 /* Targets Support Files */, 118 | ); 119 | sourceTree = ""; 120 | }; 121 | 7F72320D7836A4D6483F523CEE5DF1F5 /* Targets Support Files */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | A272E5BDABE9672035DDACE919C85C7E /* Pods-PullToRefreshDemo */, 125 | ); 126 | name = "Targets Support Files"; 127 | sourceTree = ""; 128 | }; 129 | 91BBEF3DA3BDDCFC77FBE782D94FA859 /* iOS */ = { 130 | isa = PBXGroup; 131 | children = ( 132 | B1D43C348AC5FACE34E933855B6F8A07 /* Foundation.framework */, 133 | 6E1398E4485B9A1D67F6BBAF6A86E32F /* SpriteKit.framework */, 134 | 7E160EC9FBA49EED4D05E9A3B3AB99ED /* UIKit.framework */, 135 | ); 136 | name = iOS; 137 | sourceTree = ""; 138 | }; 139 | A272E5BDABE9672035DDACE919C85C7E /* Pods-PullToRefreshDemo */ = { 140 | isa = PBXGroup; 141 | children = ( 142 | 507E911A8DB72A368AEE5FB77A8247FA /* Info.plist */, 143 | 5513E551ABB3864A6C1E20A0936E8728 /* Pods-PullToRefreshDemo.modulemap */, 144 | A26F9CCDE6EBFA53A155A34F49ECA54F /* Pods-PullToRefreshDemo-acknowledgements.markdown */, 145 | 6E2A5FE426E75CC9648035392BC740DD /* Pods-PullToRefreshDemo-acknowledgements.plist */, 146 | 7AA91CEFAF59442DA0FAF316D2D77438 /* Pods-PullToRefreshDemo-dummy.m */, 147 | B08559D2281AF2833AD03AFBAD4EBC1B /* Pods-PullToRefreshDemo-frameworks.sh */, 148 | 3362CCA5C2A324609907FDAB80831722 /* Pods-PullToRefreshDemo-resources.sh */, 149 | B34036ECC792E0705288A5DFB964380B /* Pods-PullToRefreshDemo-umbrella.h */, 150 | 47BE575CB71AFFFE5381512468AA56F9 /* Pods-PullToRefreshDemo.debug.xcconfig */, 151 | 5D8CBC4BC7DB2873FD840BA5B72B54FD /* Pods-PullToRefreshDemo.release.xcconfig */, 152 | ); 153 | name = "Pods-PullToRefreshDemo"; 154 | path = "Target Support Files/Pods-PullToRefreshDemo"; 155 | sourceTree = ""; 156 | }; 157 | AB549BAAF8F6B77AB5AD8F660B42B21F /* Development Pods */ = { 158 | isa = PBXGroup; 159 | children = ( 160 | FB14871F4240A15109D3C93D1D004260 /* BreakOutToRefresh */, 161 | ); 162 | name = "Development Pods"; 163 | sourceTree = ""; 164 | }; 165 | E174CD315069582743799A5FC9EBC19D /* BreakOutToRefresh */ = { 166 | isa = PBXGroup; 167 | children = ( 168 | E4181207B5C0D8A402246716A3FA9DFD /* BreakOutToRefreshView.swift */, 169 | ); 170 | path = BreakOutToRefresh; 171 | sourceTree = ""; 172 | }; 173 | FB14871F4240A15109D3C93D1D004260 /* BreakOutToRefresh */ = { 174 | isa = PBXGroup; 175 | children = ( 176 | E174CD315069582743799A5FC9EBC19D /* BreakOutToRefresh */, 177 | 30F5952AF22B531D70AE36A0E14CB3EB /* Support Files */, 178 | ); 179 | name = BreakOutToRefresh; 180 | path = ../..; 181 | sourceTree = ""; 182 | }; 183 | /* End PBXGroup section */ 184 | 185 | /* Begin PBXHeadersBuildPhase section */ 186 | EA598B1AD94E74F878EB89A8E49594C9 /* Headers */ = { 187 | isa = PBXHeadersBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | 1AA69F17929E854C2529D27D36C5F70B /* BreakOutToRefresh-umbrella.h in Headers */, 191 | ); 192 | runOnlyForDeploymentPostprocessing = 0; 193 | }; 194 | EB99DFDB25104655AD031F964D1BDF9B /* Headers */ = { 195 | isa = PBXHeadersBuildPhase; 196 | buildActionMask = 2147483647; 197 | files = ( 198 | F5FE4F4187B931849D7F4FE6A9307804 /* Pods-PullToRefreshDemo-umbrella.h in Headers */, 199 | ); 200 | runOnlyForDeploymentPostprocessing = 0; 201 | }; 202 | /* End PBXHeadersBuildPhase section */ 203 | 204 | /* Begin PBXNativeTarget section */ 205 | 43B24E635073D0739017DFB7C0783010 /* BreakOutToRefresh */ = { 206 | isa = PBXNativeTarget; 207 | buildConfigurationList = 881616381FD836B36FD48ED47546FB9C /* Build configuration list for PBXNativeTarget "BreakOutToRefresh" */; 208 | buildPhases = ( 209 | 5E39A6BFF6D3A0E8925AB5699650254F /* Sources */, 210 | 1C19B1951FF187782EA8B11378EB7FA7 /* Frameworks */, 211 | EA598B1AD94E74F878EB89A8E49594C9 /* Headers */, 212 | ); 213 | buildRules = ( 214 | ); 215 | dependencies = ( 216 | ); 217 | name = BreakOutToRefresh; 218 | productName = BreakOutToRefresh; 219 | productReference = 707F5BF13786CF8149846D5FD9AC7489 /* BreakOutToRefresh.framework */; 220 | productType = "com.apple.product-type.framework"; 221 | }; 222 | 88C50736D939A0ED7D72F0066F898E75 /* Pods-PullToRefreshDemo */ = { 223 | isa = PBXNativeTarget; 224 | buildConfigurationList = 448A59D61426378EE3EC3982040BFCB6 /* Build configuration list for PBXNativeTarget "Pods-PullToRefreshDemo" */; 225 | buildPhases = ( 226 | 6946F84592CFB4C2518E89D988623A28 /* Sources */, 227 | E1CEF721548FC1E458B715FC95C5F0C9 /* Frameworks */, 228 | EB99DFDB25104655AD031F964D1BDF9B /* Headers */, 229 | ); 230 | buildRules = ( 231 | ); 232 | dependencies = ( 233 | 1D4600218C1751C361F42E1ABE4011A4 /* PBXTargetDependency */, 234 | ); 235 | name = "Pods-PullToRefreshDemo"; 236 | productName = "Pods-PullToRefreshDemo"; 237 | productReference = 12E46A47D79473C146F1E7320BA223E4 /* Pods_PullToRefreshDemo.framework */; 238 | productType = "com.apple.product-type.framework"; 239 | }; 240 | /* End PBXNativeTarget section */ 241 | 242 | /* Begin PBXProject section */ 243 | D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { 244 | isa = PBXProject; 245 | attributes = { 246 | LastSwiftUpdateCheck = 0700; 247 | LastUpgradeCheck = 1010; 248 | TargetAttributes = { 249 | 43B24E635073D0739017DFB7C0783010 = { 250 | LastSwiftMigration = 0910; 251 | }; 252 | 88C50736D939A0ED7D72F0066F898E75 = { 253 | LastSwiftMigration = 0800; 254 | }; 255 | }; 256 | }; 257 | buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; 258 | compatibilityVersion = "Xcode 3.2"; 259 | developmentRegion = English; 260 | hasScannedForEncodings = 0; 261 | knownRegions = ( 262 | en, 263 | ); 264 | mainGroup = 7DB346D0F39D3F0E887471402A8071AB; 265 | productRefGroup = 6EA30D522723C922937FE32E17499DE3 /* Products */; 266 | projectDirPath = ""; 267 | projectRoot = ""; 268 | targets = ( 269 | 43B24E635073D0739017DFB7C0783010 /* BreakOutToRefresh */, 270 | 88C50736D939A0ED7D72F0066F898E75 /* Pods-PullToRefreshDemo */, 271 | ); 272 | }; 273 | /* End PBXProject section */ 274 | 275 | /* Begin PBXSourcesBuildPhase section */ 276 | 5E39A6BFF6D3A0E8925AB5699650254F /* Sources */ = { 277 | isa = PBXSourcesBuildPhase; 278 | buildActionMask = 2147483647; 279 | files = ( 280 | D0009F70E37ACCDD48D73A027E189FCF /* BreakOutToRefresh-dummy.m in Sources */, 281 | BB82C9491FABDB0600101DF68987C15B /* BreakOutToRefreshView.swift in Sources */, 282 | ); 283 | runOnlyForDeploymentPostprocessing = 0; 284 | }; 285 | 6946F84592CFB4C2518E89D988623A28 /* Sources */ = { 286 | isa = PBXSourcesBuildPhase; 287 | buildActionMask = 2147483647; 288 | files = ( 289 | F179EF66C22A01534F9B7E54010FF63F /* Pods-PullToRefreshDemo-dummy.m in Sources */, 290 | ); 291 | runOnlyForDeploymentPostprocessing = 0; 292 | }; 293 | /* End PBXSourcesBuildPhase section */ 294 | 295 | /* Begin PBXTargetDependency section */ 296 | 1D4600218C1751C361F42E1ABE4011A4 /* PBXTargetDependency */ = { 297 | isa = PBXTargetDependency; 298 | name = BreakOutToRefresh; 299 | target = 43B24E635073D0739017DFB7C0783010 /* BreakOutToRefresh */; 300 | targetProxy = 04181D621A737A69037719D836B93808 /* PBXContainerItemProxy */; 301 | }; 302 | /* End PBXTargetDependency section */ 303 | 304 | /* Begin XCBuildConfiguration section */ 305 | 0ECED873AC3F04CC534A1BD37D7BCE63 /* Release */ = { 306 | isa = XCBuildConfiguration; 307 | baseConfigurationReference = 5D8CBC4BC7DB2873FD840BA5B72B54FD /* Pods-PullToRefreshDemo.release.xcconfig */; 308 | buildSettings = { 309 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 310 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 311 | CURRENT_PROJECT_VERSION = 1; 312 | DEFINES_MODULE = YES; 313 | DYLIB_COMPATIBILITY_VERSION = 1; 314 | DYLIB_CURRENT_VERSION = 1; 315 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 316 | ENABLE_STRICT_OBJC_MSGSEND = YES; 317 | INFOPLIST_FILE = "Target Support Files/Pods-PullToRefreshDemo/Info.plist"; 318 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 319 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 320 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 321 | MACH_O_TYPE = staticlib; 322 | MODULEMAP_FILE = "Target Support Files/Pods-PullToRefreshDemo/Pods-PullToRefreshDemo.modulemap"; 323 | MTL_ENABLE_DEBUG_INFO = NO; 324 | OTHER_LDFLAGS = ""; 325 | OTHER_LIBTOOLFLAGS = ""; 326 | PODS_ROOT = "$(SRCROOT)"; 327 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 328 | PRODUCT_NAME = Pods_PullToRefreshDemo; 329 | SDKROOT = iphoneos; 330 | SKIP_INSTALL = YES; 331 | SWIFT_VERSION = 3.0; 332 | TARGETED_DEVICE_FAMILY = "1,2"; 333 | VERSIONING_SYSTEM = "apple-generic"; 334 | VERSION_INFO_PREFIX = ""; 335 | }; 336 | name = Release; 337 | }; 338 | 273913ABB16729456EB53209C0FDAF7E /* Debug */ = { 339 | isa = XCBuildConfiguration; 340 | baseConfigurationReference = 47BE575CB71AFFFE5381512468AA56F9 /* Pods-PullToRefreshDemo.debug.xcconfig */; 341 | buildSettings = { 342 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 343 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 344 | CURRENT_PROJECT_VERSION = 1; 345 | DEFINES_MODULE = YES; 346 | DYLIB_COMPATIBILITY_VERSION = 1; 347 | DYLIB_CURRENT_VERSION = 1; 348 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 349 | ENABLE_STRICT_OBJC_MSGSEND = YES; 350 | INFOPLIST_FILE = "Target Support Files/Pods-PullToRefreshDemo/Info.plist"; 351 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 352 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 353 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 354 | MACH_O_TYPE = staticlib; 355 | MODULEMAP_FILE = "Target Support Files/Pods-PullToRefreshDemo/Pods-PullToRefreshDemo.modulemap"; 356 | MTL_ENABLE_DEBUG_INFO = YES; 357 | OTHER_LDFLAGS = ""; 358 | OTHER_LIBTOOLFLAGS = ""; 359 | PODS_ROOT = "$(SRCROOT)"; 360 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 361 | PRODUCT_NAME = Pods_PullToRefreshDemo; 362 | SDKROOT = iphoneos; 363 | SKIP_INSTALL = YES; 364 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 365 | SWIFT_VERSION = 3.0; 366 | TARGETED_DEVICE_FAMILY = "1,2"; 367 | VERSIONING_SYSTEM = "apple-generic"; 368 | VERSION_INFO_PREFIX = ""; 369 | }; 370 | name = Debug; 371 | }; 372 | 91A4E4BA5BC98876FADAC42E7912243C /* Debug */ = { 373 | isa = XCBuildConfiguration; 374 | baseConfigurationReference = A797821CD0178A0D64E97F47497FF182 /* BreakOutToRefresh.xcconfig */; 375 | buildSettings = { 376 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 377 | CURRENT_PROJECT_VERSION = 1; 378 | DEFINES_MODULE = YES; 379 | DYLIB_COMPATIBILITY_VERSION = 1; 380 | DYLIB_CURRENT_VERSION = 1; 381 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 382 | ENABLE_STRICT_OBJC_MSGSEND = YES; 383 | GCC_PREFIX_HEADER = "Target Support Files/BreakOutToRefresh/BreakOutToRefresh-prefix.pch"; 384 | INFOPLIST_FILE = "Target Support Files/BreakOutToRefresh/Info.plist"; 385 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 386 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 387 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 388 | MODULEMAP_FILE = "Target Support Files/BreakOutToRefresh/BreakOutToRefresh.modulemap"; 389 | MTL_ENABLE_DEBUG_INFO = YES; 390 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 391 | PRODUCT_NAME = BreakOutToRefresh; 392 | SDKROOT = iphoneos; 393 | SKIP_INSTALL = YES; 394 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 395 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 396 | SWIFT_VERSION = 4.0; 397 | TARGETED_DEVICE_FAMILY = "1,2"; 398 | VERSIONING_SYSTEM = "apple-generic"; 399 | VERSION_INFO_PREFIX = ""; 400 | }; 401 | name = Debug; 402 | }; 403 | 9EB645C612834738B99727720210C23E /* Debug */ = { 404 | isa = XCBuildConfiguration; 405 | buildSettings = { 406 | ALWAYS_SEARCH_USER_PATHS = NO; 407 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 408 | CLANG_CXX_LIBRARY = "libc++"; 409 | CLANG_ENABLE_MODULES = YES; 410 | CLANG_ENABLE_OBJC_ARC = YES; 411 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 412 | CLANG_WARN_BOOL_CONVERSION = YES; 413 | CLANG_WARN_COMMA = YES; 414 | CLANG_WARN_CONSTANT_CONVERSION = YES; 415 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 416 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 417 | CLANG_WARN_EMPTY_BODY = YES; 418 | CLANG_WARN_ENUM_CONVERSION = YES; 419 | CLANG_WARN_INFINITE_RECURSION = YES; 420 | CLANG_WARN_INT_CONVERSION = YES; 421 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 422 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 423 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 424 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 425 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 426 | CLANG_WARN_STRICT_PROTOTYPES = YES; 427 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 428 | CLANG_WARN_UNREACHABLE_CODE = YES; 429 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 430 | COPY_PHASE_STRIP = NO; 431 | ENABLE_STRICT_OBJC_MSGSEND = YES; 432 | ENABLE_TESTABILITY = YES; 433 | GCC_C_LANGUAGE_STANDARD = gnu99; 434 | GCC_DYNAMIC_NO_PIC = NO; 435 | GCC_NO_COMMON_BLOCKS = YES; 436 | GCC_OPTIMIZATION_LEVEL = 0; 437 | GCC_PREPROCESSOR_DEFINITIONS = ( 438 | "DEBUG=1", 439 | "$(inherited)", 440 | ); 441 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 442 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 443 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 444 | GCC_WARN_UNDECLARED_SELECTOR = YES; 445 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 446 | GCC_WARN_UNUSED_FUNCTION = YES; 447 | GCC_WARN_UNUSED_VARIABLE = YES; 448 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 449 | ONLY_ACTIVE_ARCH = YES; 450 | STRIP_INSTALLED_PRODUCT = NO; 451 | SYMROOT = "${SRCROOT}/../build"; 452 | }; 453 | name = Debug; 454 | }; 455 | E39CD1E764776175CB82EEC82A6C9948 /* Release */ = { 456 | isa = XCBuildConfiguration; 457 | buildSettings = { 458 | ALWAYS_SEARCH_USER_PATHS = NO; 459 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 460 | CLANG_CXX_LIBRARY = "libc++"; 461 | CLANG_ENABLE_MODULES = YES; 462 | CLANG_ENABLE_OBJC_ARC = YES; 463 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 464 | CLANG_WARN_BOOL_CONVERSION = YES; 465 | CLANG_WARN_COMMA = YES; 466 | CLANG_WARN_CONSTANT_CONVERSION = YES; 467 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 468 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 469 | CLANG_WARN_EMPTY_BODY = YES; 470 | CLANG_WARN_ENUM_CONVERSION = YES; 471 | CLANG_WARN_INFINITE_RECURSION = YES; 472 | CLANG_WARN_INT_CONVERSION = YES; 473 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 474 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 475 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 476 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 477 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 478 | CLANG_WARN_STRICT_PROTOTYPES = YES; 479 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 480 | CLANG_WARN_UNREACHABLE_CODE = YES; 481 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 482 | COPY_PHASE_STRIP = YES; 483 | ENABLE_NS_ASSERTIONS = NO; 484 | ENABLE_STRICT_OBJC_MSGSEND = YES; 485 | GCC_C_LANGUAGE_STANDARD = gnu99; 486 | GCC_NO_COMMON_BLOCKS = YES; 487 | GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1"; 488 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 489 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 490 | GCC_WARN_UNDECLARED_SELECTOR = YES; 491 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 492 | GCC_WARN_UNUSED_FUNCTION = YES; 493 | GCC_WARN_UNUSED_VARIABLE = YES; 494 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 495 | STRIP_INSTALLED_PRODUCT = NO; 496 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 497 | SYMROOT = "${SRCROOT}/../build"; 498 | VALIDATE_PRODUCT = YES; 499 | }; 500 | name = Release; 501 | }; 502 | ECB96239A42935A86CBF2C19FAB588A9 /* Release */ = { 503 | isa = XCBuildConfiguration; 504 | baseConfigurationReference = A797821CD0178A0D64E97F47497FF182 /* BreakOutToRefresh.xcconfig */; 505 | buildSettings = { 506 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 507 | CURRENT_PROJECT_VERSION = 1; 508 | DEFINES_MODULE = YES; 509 | DYLIB_COMPATIBILITY_VERSION = 1; 510 | DYLIB_CURRENT_VERSION = 1; 511 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 512 | ENABLE_STRICT_OBJC_MSGSEND = YES; 513 | GCC_PREFIX_HEADER = "Target Support Files/BreakOutToRefresh/BreakOutToRefresh-prefix.pch"; 514 | INFOPLIST_FILE = "Target Support Files/BreakOutToRefresh/Info.plist"; 515 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 516 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 517 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 518 | MODULEMAP_FILE = "Target Support Files/BreakOutToRefresh/BreakOutToRefresh.modulemap"; 519 | MTL_ENABLE_DEBUG_INFO = NO; 520 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 521 | PRODUCT_NAME = BreakOutToRefresh; 522 | SDKROOT = iphoneos; 523 | SKIP_INSTALL = YES; 524 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 525 | SWIFT_VERSION = 4.0; 526 | TARGETED_DEVICE_FAMILY = "1,2"; 527 | VERSIONING_SYSTEM = "apple-generic"; 528 | VERSION_INFO_PREFIX = ""; 529 | }; 530 | name = Release; 531 | }; 532 | /* End XCBuildConfiguration section */ 533 | 534 | /* Begin XCConfigurationList section */ 535 | 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { 536 | isa = XCConfigurationList; 537 | buildConfigurations = ( 538 | 9EB645C612834738B99727720210C23E /* Debug */, 539 | E39CD1E764776175CB82EEC82A6C9948 /* Release */, 540 | ); 541 | defaultConfigurationIsVisible = 0; 542 | defaultConfigurationName = Release; 543 | }; 544 | 448A59D61426378EE3EC3982040BFCB6 /* Build configuration list for PBXNativeTarget "Pods-PullToRefreshDemo" */ = { 545 | isa = XCConfigurationList; 546 | buildConfigurations = ( 547 | 273913ABB16729456EB53209C0FDAF7E /* Debug */, 548 | 0ECED873AC3F04CC534A1BD37D7BCE63 /* Release */, 549 | ); 550 | defaultConfigurationIsVisible = 0; 551 | defaultConfigurationName = Release; 552 | }; 553 | 881616381FD836B36FD48ED47546FB9C /* Build configuration list for PBXNativeTarget "BreakOutToRefresh" */ = { 554 | isa = XCConfigurationList; 555 | buildConfigurations = ( 556 | 91A4E4BA5BC98876FADAC42E7912243C /* Debug */, 557 | ECB96239A42935A86CBF2C19FAB588A9 /* Release */, 558 | ); 559 | defaultConfigurationIsVisible = 0; 560 | defaultConfigurationName = Release; 561 | }; 562 | /* End XCConfigurationList section */ 563 | }; 564 | rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 565 | } 566 | --------------------------------------------------------------------------------