├── .github ├── ISSUE_TEMPLATE.md └── contributing.md ├── .gitignore ├── .swift-version ├── LICENSE ├── Podfile ├── PullToMakeFlight.podspec ├── PullToMakeFlight ├── CAKeyframeAnimation+Extensions.swift ├── FlightAnimator.swift ├── FlightView.swift ├── FlightView.xib ├── Image.xcassets │ ├── airplane.imageset │ │ ├── Contents.json │ │ ├── airplane.png │ │ ├── airplane@2x.png │ │ └── airplane@3x.png │ ├── arrow.imageset │ │ ├── Contents.json │ │ ├── arrow.png │ │ ├── arrow@2x.png │ │ └── arrow@3x.png │ ├── arrow_full.imageset │ │ ├── Contents.json │ │ ├── arrow_full.png │ │ ├── arrow_full@2x.png │ │ └── arrow_full@3x.png │ ├── bg.imageset │ │ ├── Contents.json │ │ ├── bg.png │ │ ├── bg@2x.png │ │ └── bg@3x.png │ ├── clouds_center.imageset │ │ ├── Contents.json │ │ ├── clouds_center.png │ │ ├── clouds_center@2x.png │ │ └── clouds_center@3x.png │ ├── clouds_left.imageset │ │ ├── Contents.json │ │ ├── clouds_left.png │ │ ├── clouds_left@2x.png │ │ └── clouds_left@3x.png │ └── clouds_right.imageset │ │ ├── Contents.json │ │ ├── clouds_right.png │ │ ├── clouds_right@2x.png │ │ └── clouds_right@3x.png ├── Info.plist ├── PullToMakeFlight.h └── PullToMakeFlight.swift ├── PullToMakeFlightDemo.xcodeproj ├── project.pbxproj └── project.xcworkspace │ └── contents.xcworkspacedata ├── PullToMakeFlightDemo.xcworkspace └── contents.xcworkspacedata ├── PullToMakeFlightDemo ├── AppDelegate.swift ├── Base.lproj │ ├── LaunchScreen.xib │ └── Main.storyboard ├── Images.xcassets │ └── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-60@2x.png │ │ ├── Icon-60@3x.png │ │ ├── Icon-Small-40@2x.png │ │ ├── Icon-Small-40@3x.png │ │ ├── Icon-Small@2x.png │ │ └── Icon-Small@3x.png ├── Info.plist ├── Resources │ ├── badge_dark.png │ └── tours-pull-airplane.gif └── ViewController.swift └── README.md /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | # Report 2 | 3 | > The more information you provide, the faster we can help you. 4 | 5 | ⚠️ Select what you want - **a feature request** or **report a bug**. Please remove the section you aren't interested in. 6 | 7 | ## A feature request 8 | 9 | ### What do you want to add? 10 | 11 | > Please describe what you want to add to the component. 12 | 13 | ### How should it look like? 14 | 15 | > Please add images. 16 | 17 | ## Report a bug 18 | 19 | ### What did you do? 20 | 21 | > Please replace this with what you did. 22 | 23 | ### What did you expect to happen? 24 | 25 | > Please replace this with what you expected to happen. 26 | 27 | ### What happened instead? 28 | 29 | > Please replace this with what happened instead. 30 | 31 | ### Your Environment 32 | 33 | - Version of the component: _insert here_ 34 | - Swift version: _insert here_ 35 | - iOS version: _insert here_ 36 | - Device: _insert here_ 37 | - Xcode version: _insert here_ 38 | - If you use Cocoapods: _run `pod env | pbcopy` and insert here_ 39 | - If you use Carthage: _run `carthage version | pbcopy` and insert here_ 40 | 41 | ### Project that demonstrates the bug 42 | 43 | > Please add a link to a project we can download that reproduces the bug. 44 | -------------------------------------------------------------------------------- /.github/contributing.md: -------------------------------------------------------------------------------- 1 | ## How to contribute to PullToMakeFlight 2 | 3 | #### **Did you find a bug?** 4 | 5 | * **Ensure the bug was not already reported** by searching under [Issues](https://github.com/Yalantis/PullToMakeFlight/issues). 6 | 7 | * If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/Yalantis/PullToMakeFlight/issues/new). Be sure to include a **title and clear description**, as much relevant information as possible, and a **code sample** or an **example project** demonstrating the expected behavior that is not occurring. 8 | 9 | * Fill appropriate section in issue template and remove the section you aren't interested in. 10 | 11 | #### **Did you write a patch that fixes a bug?** 12 | 13 | * Open a new GitHub pull request with the patch. 14 | 15 | * Ensure the PR description clearly describes the problem and solution. Include the relevant issue number if applicable. 16 | 17 | * Ensure the PR doesn't extend the number of existing issues. 18 | 19 | #### **Did you fix whitespace, format code, or make a purely cosmetic patch?** 20 | 21 | * Changes that are **cosmetic** in nature and **do not add anything substantial** to the stability or functionality of PullToMakeFlight will generally **not be accepted**. 22 | 23 | #### **Did you write patch that extends functionality?** 24 | 25 | * Ensure the functionality you trying to add needed not only for your case. 26 | 27 | #### Each issue will be labeled by it's `type`, `priority` and `status`. 28 | 29 | **Issue types:** 30 | * Bug 31 | * Enhancement 32 | 33 | **These are the available priority labels:** 34 | * Critical 35 | * High 36 | * Medium 37 | * Low 38 | 39 | **Status label will be assigned to your issue to keep the issue tracker easy to follow:** 40 | * Queued (will be reviewed soon) 41 | * Reviewed (assignee has read it) 42 | * Pending (will work on it soon) 43 | * Work in progress (is working on it now) 44 | * On hold 45 | * Invalid (if bug it's not reproducible) 46 | * Need feedback (signal to get people to read and comment or provide help) 47 | 48 | #### **Coding Style** 49 | 50 | * Most importantly, match the existing code style as much as possible. 51 | 52 | #### **Do you have a question?** 53 | 54 | For any usage questions that are not specific to the project itself, please ask on [Stack Overflow](https://stackoverflow.com/). By doing so, you'll be more likely to quickly solve your problem, and you'll allow anyone else with the same question to find the answer. This also allows maintainers to focus on improving the project for others. 55 | 56 | ## Thank you! 57 | 58 | #### [![Yalantis](https://raw.githubusercontent.com/Yalantis/PullToMakeSoup/master/PullToMakeSoupDemo/Resouces/badge_dark.png)](https://Yalantis.com/?utm_source=github) 59 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | xcuserdata 13 | *.xccheckout 14 | *.moved-aside 15 | DerivedData 16 | *.hmap 17 | *.ipa 18 | *.xcuserstate 19 | 20 | .xcodeproj/* 21 | !*.xcodeproj/*.pbxproj 22 | !*.xcodeproj/xcshareddata 23 | 24 | Pods 25 | Podfile.lock 26 | .idea 27 | 28 | pkg/* 29 | 30 | Pods/* -------------------------------------------------------------------------------- /.swift-version: -------------------------------------------------------------------------------- 1 | 4.0 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | platform :ios, '9.0' 2 | use_frameworks! 3 | 4 | target 'PullToMakeFlightDemo' do 5 | 6 | pod "PullToMakeFlight", :path => "./" 7 | 8 | end -------------------------------------------------------------------------------- /PullToMakeFlight.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | 3 | s.name = "PullToMakeFlight" 4 | s.version = "3.0" 5 | s.summary = "Custom animated pull-to-refresh that can be easily added to UIScrollView" 6 | 7 | s.homepage = "http://yalantis.com" 8 | s.license = { :type => "MIT", :file => "LICENSE" } 9 | s.author = "Yalantis" 10 | s.social_media_url = "https://twitter.com/yalantis" 11 | 12 | s.ios.deployment_target = "8.0" 13 | 14 | s.source = { :git => "https://github.com/Yalantis/PullToMakeFlight.git", :tag => s.version } 15 | s.source_files = "PullToMakeFlight/**/*.{h,swift}" 16 | s.resources = ['PullToMakeFlight/Image.xcassets', 'PullToMakeFlight/**/*.{png,xib}'] 17 | s.module_name = "PullToMakeFlight" 18 | s.requires_arc = true 19 | s.framework = 'CoreGraphics' 20 | 21 | s.dependency 'PullToRefresher', '~> 3.0.1' 22 | 23 | end 24 | -------------------------------------------------------------------------------- /PullToMakeFlight/CAKeyframeAnimation+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Anastasiya Gorban on 4/20/15. 3 | // Copyright (c) 2015 Yalantis. All rights reserved. 4 | // 5 | // Licensed under the MIT license: http://opensource.org/licenses/MIT 6 | // Latest version can be found at https://github.com/Yalantis/PullToMakeFlight 7 | // 8 | 9 | import CoreGraphics 10 | 11 | enum AnimationType: String { 12 | 13 | case rotation = "transform.rotation.z" 14 | case opacity = "opacity" 15 | case translationX = "transform.translation.x" 16 | case translationY = "transform.translation.y" 17 | case position = "position" 18 | case positionY = "position.y" 19 | case scaleX = "transform.scale.x" 20 | case scaleY = "transform.scale.y" 21 | } 22 | 23 | enum TimingFunction { 24 | 25 | case linear, easeIn, easeOut, easeInEaseOut 26 | } 27 | 28 | func mediaTimingFunction(_ function: TimingFunction) -> CAMediaTimingFunction { 29 | switch function { 30 | case .linear: return CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) 31 | case .easeIn: return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 32 | case .easeOut: return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) 33 | case .easeInEaseOut: return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 34 | } 35 | } 36 | 37 | extension CAKeyframeAnimation { 38 | 39 | class func animation(for type: AnimationType, values: [Any], keyTimes: [Double], duration: Double, beginTime: Double, timingFunctions: [TimingFunction] = [TimingFunction.linear]) -> CAKeyframeAnimation { 40 | let animation = CAKeyframeAnimation(keyPath: type.rawValue) 41 | animation.values = values 42 | animation.keyTimes = keyTimes as [NSNumber]? 43 | animation.duration = duration 44 | animation.beginTime = beginTime 45 | animation.timingFunctions = timingFunctions.map { timingFunction in 46 | return mediaTimingFunction(timingFunction) 47 | } 48 | 49 | return animation 50 | } 51 | 52 | class func animationPosition(_ path: CGPath, duration: Double, timingFunction: TimingFunction, beginTime: Double) -> CAKeyframeAnimation { 53 | let animation = CAKeyframeAnimation(keyPath: "position") 54 | animation.path = path 55 | animation.duration = duration 56 | animation.beginTime = beginTime 57 | animation.timingFunction = mediaTimingFunction(timingFunction) 58 | return animation 59 | } 60 | } 61 | 62 | extension UIView { 63 | 64 | func addAnimation(_ animation: CAKeyframeAnimation) { 65 | layer.add(animation, forKey: description + animation.keyPath!) 66 | layer.speed = 0 67 | } 68 | 69 | func removeAllAnimations() { 70 | layer.removeAllAnimations() 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /PullToMakeFlight/FlightAnimator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Serhii Butenko on 26/9/16. 3 | // Copyright (c) 2015 Yalantis. All rights reserved. 4 | // 5 | // Licensed under the MIT license: http://opensource.org/licenses/MIT 6 | // Latest version can be found at https://github.com/Yalantis/PullToMakeFlight 7 | // 8 | 9 | import Foundation 10 | import PullToRefresh 11 | 12 | public class FlightAnimator: RefreshViewAnimator { 13 | 14 | fileprivate let refreshView: FlightView 15 | 16 | init(refreshView: FlightView) { 17 | self.refreshView = refreshView 18 | } 19 | 20 | public func animate(_ state: State) { 21 | switch state { 22 | case .initial: 23 | layoutInitialState() 24 | 25 | case .releasing(let progress): 26 | layoutReleasingState(with: progress) 27 | 28 | case .loading: 29 | layoutLoadingState() 30 | 31 | case .finished: 32 | layoutFinishState() 33 | } 34 | } 35 | } 36 | 37 | fileprivate extension FlightAnimator { 38 | 39 | fileprivate func layoutInitialState() { 40 | initialLayoutForCenterClouds() 41 | initialLayoutForLeftClouds() 42 | initialLayoutForRightClouds() 43 | initialLayoutForAirplane() 44 | initialLayoutForArrows() 45 | } 46 | 47 | fileprivate func layoutReleasingState(with progress: CGFloat) { 48 | if progress <= 1 { 49 | refreshView.cloudsCenter.layer.timeOffset = Double(progress) * 0.3 50 | refreshView.cloudsLeft.layer.timeOffset = Double(progress) * 0.3 51 | refreshView.cloudsRight.layer.timeOffset = Double(progress) * 0.3 52 | refreshView.airplane.layer.timeOffset = Double(progress) * 0.3 53 | } 54 | 55 | refreshView.leftArrow.frame = CGRect( 56 | x: refreshView.leftArrow.frame.origin.x, 57 | y: refreshView.cloudsRight.layer.presentation()!.frame.origin.y - refreshView.leftArrow.frame.height, 58 | width: refreshView.leftArrow.frame.width, 59 | height: refreshView.leftArrow.frame.height 60 | ) 61 | 62 | refreshView.leftArrowStick.frame = CGRect( 63 | x: refreshView.leftArrowStick.frame.origin.x, 64 | y: refreshView.leftArrow.frame.origin.y - refreshView.leftArrowStick.frame.height + 5, 65 | width: refreshView.leftArrowStick.frame.width, 66 | height: 60 * progress 67 | ) 68 | 69 | refreshView.rightArrow.frame = CGRect( 70 | x: refreshView.rightArrow.frame.origin.x, 71 | y: refreshView.leftArrow.frame.origin.y, 72 | width: refreshView.rightArrow.frame.width, 73 | height: refreshView.rightArrow.frame.height 74 | ) 75 | 76 | refreshView.rightArrowStick.frame = CGRect( 77 | x: refreshView.rightArrowStick.frame.origin.x, 78 | y: refreshView.leftArrowStick.frame.origin.y, 79 | width: refreshView.rightArrowStick.frame.width, 80 | height: refreshView.leftArrowStick.frame.height 81 | ) 82 | } 83 | 84 | fileprivate func layoutLoadingState() { 85 | refreshView.airplane.center = CGPoint(x: refreshView.frame.width / 2, y: 50) 86 | let airplaneAnimation = CAKeyframeAnimation.animation( 87 | for: .positionY, 88 | values: [50, 45, 50, 55, 50], 89 | keyTimes: [0, 0.25, 0.5, 0.75, 1], 90 | duration: 2, 91 | beginTime: 0, 92 | timingFunctions: [.linear] 93 | ) 94 | 95 | airplaneAnimation.repeatCount = Float.greatestFiniteMagnitude; 96 | refreshView.airplane.layer.removeAllAnimations() 97 | refreshView.airplane.layer.add(airplaneAnimation, forKey: "") 98 | refreshView.airplane.layer.speed = 1 99 | 100 | refreshView.leftArrowStick.layer.anchorPoint = CGPoint(x: 0.5, y: 0) 101 | refreshView.rightArrowStick.layer.anchorPoint = CGPoint(x: 0.5, y: 0) 102 | UIView.animate( 103 | withDuration: 0.3, 104 | delay: 0, 105 | usingSpringWithDamping: 0.2, 106 | initialSpringVelocity: 7.0, 107 | options: .curveEaseIn, 108 | animations: { 109 | var frame = self.refreshView.leftArrowStick.frame 110 | frame.size.height = 0 111 | frame.origin.y = self.refreshView.leftArrow.frame.origin.y 112 | self.refreshView.leftArrowStick.frame = frame 113 | 114 | frame = self.refreshView.rightArrowStick.frame 115 | frame.size.height = 0 116 | frame.origin.y = self.refreshView.leftArrow.frame.origin.y 117 | self.refreshView.rightArrowStick.frame = frame 118 | }, 119 | completion: nil 120 | ) 121 | } 122 | 123 | fileprivate func layoutFinishState() { 124 | refreshView.airplane.removeAllAnimations() 125 | refreshView.airplane.layer.timeOffset = 0.0 126 | refreshView.airplane.addAnimation(CAKeyframeAnimation.animation( 127 | for: .position, 128 | values: [NSValue(cgPoint: CGPoint(x: refreshView.frame.width / 2, y: 50)), NSValue(cgPoint: CGPoint(x: refreshView.frame.width, y: -50))], 129 | keyTimes: [0, 1], 130 | duration: 0.3, 131 | beginTime:0) 132 | ) 133 | refreshView.airplane.layer.speed = 1 134 | } 135 | } 136 | 137 | // Layout 138 | fileprivate extension FlightAnimator { 139 | 140 | func initialLayoutForCenterClouds() { 141 | refreshView.cloudsCenter.removeAllAnimations() 142 | refreshView.cloudsCenter.transform = CGAffineTransform(scaleX: 1.0, y: 1.0) 143 | refreshView.cloudsCenter.layer.timeOffset = 0.0 144 | 145 | refreshView.cloudsCenter.addAnimation(CAKeyframeAnimation.animation( 146 | for: AnimationType.positionY, 147 | values: [110, 95], 148 | keyTimes: [0, 1], 149 | duration: 0.3, 150 | beginTime:0) 151 | ) 152 | 153 | refreshView.cloudsCenter.addAnimation(CAKeyframeAnimation.animation( 154 | for: AnimationType.scaleX, 155 | values: [1, 1.2], 156 | keyTimes: [0, 1], 157 | duration: 0.3, 158 | beginTime:0) 159 | ) 160 | 161 | refreshView.cloudsCenter.addAnimation(CAKeyframeAnimation.animation( 162 | for: AnimationType.scaleY, 163 | values: [1, 1.2], 164 | keyTimes: [0, 1], 165 | duration: 0.3, 166 | beginTime:0) 167 | ) 168 | } 169 | 170 | func initialLayoutForLeftClouds() { 171 | refreshView.cloudsLeft.removeAllAnimations() 172 | refreshView.cloudsLeft.transform = CGAffineTransform(scaleX: 1, y: 1) 173 | refreshView.cloudsLeft.layer.timeOffset = 0.0 174 | 175 | refreshView.cloudsLeft.addAnimation(CAKeyframeAnimation.animation( 176 | for: .positionY, 177 | values: [140, 100], 178 | keyTimes: [0, 1], 179 | duration: 0.3, 180 | beginTime:0) 181 | ) 182 | 183 | refreshView.cloudsLeft.addAnimation(CAKeyframeAnimation.animation( 184 | for: .scaleX, 185 | values: [1, 1.3], 186 | keyTimes: [0.5, 1], 187 | duration: 0.3, 188 | beginTime:0) 189 | ) 190 | 191 | refreshView.cloudsLeft.addAnimation(CAKeyframeAnimation.animation( 192 | for: .scaleY, 193 | values: [1, 1.3], 194 | keyTimes: [0.5, 1], 195 | duration: 0.3, 196 | beginTime:0) 197 | ) 198 | } 199 | 200 | func initialLayoutForRightClouds() { 201 | refreshView.cloudsRight.removeAllAnimations() 202 | refreshView.cloudsRight.transform = CGAffineTransform(scaleX: 1, y: 1) 203 | refreshView.cloudsRight.layer.timeOffset = 0.0 204 | 205 | refreshView.cloudsRight.addAnimation(CAKeyframeAnimation.animation( 206 | for: .positionY, 207 | values: [140, 100], 208 | keyTimes: [0, 1], 209 | duration: 0.3, 210 | beginTime:0) 211 | ) 212 | 213 | refreshView.cloudsRight.addAnimation(CAKeyframeAnimation.animation( 214 | for: .scaleX, 215 | values: [1, 1.3], 216 | keyTimes: [0, 1], 217 | duration: 0.3, 218 | beginTime:0) 219 | ) 220 | 221 | refreshView.cloudsRight.addAnimation(CAKeyframeAnimation.animation( 222 | for: .scaleY, 223 | values: [1, 1.3], 224 | keyTimes: [0, 1], 225 | duration: 0.3, 226 | beginTime:0) 227 | ) 228 | } 229 | 230 | func initialLayoutForAirplane() { 231 | refreshView.airplane.layer.removeAllAnimations() 232 | refreshView.airplane.frame = CGRect(x: 77, y: 140, width: refreshView.airplane.frame.width, height: refreshView.airplane.frame.height) 233 | refreshView.airplane.addAnimation(CAKeyframeAnimation.animation( 234 | for: .position, 235 | values: [NSValue(cgPoint: CGPoint(x: 77, y: 140)), NSValue(cgPoint: CGPoint(x: refreshView.frame.width / 2, y: 50))], 236 | keyTimes: [0, 1], 237 | duration: 0.3, 238 | beginTime:0) 239 | ) 240 | refreshView.airplane.layer.timeOffset = 0.0 241 | } 242 | 243 | func initialLayoutForArrows() { 244 | refreshView.leftArrowStick.layer.anchorPoint = CGPoint(x: 0.5, y: 0.5) 245 | refreshView.rightArrowStick.layer.anchorPoint = CGPoint(x: 0.5, y: 0.5) 246 | } 247 | } 248 | -------------------------------------------------------------------------------- /PullToMakeFlight/FlightView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Serhii Butenko on 26/9/16. 3 | // Copyright (c) 2015 Yalantis. All rights reserved. 4 | // 5 | // Licensed under the MIT license: http://opensource.org/licenses/MIT 6 | // Latest version can be found at https://github.com/Yalantis/PullToMakeFlight 7 | // 8 | 9 | import UIKit 10 | 11 | class FlightView: UIView { 12 | 13 | @IBOutlet var cloudsLeft: UIView! 14 | @IBOutlet var cloudsRight: UIView! 15 | @IBOutlet var cloudsCenter: UIView! 16 | @IBOutlet var airplane: UIView! 17 | @IBOutlet var leftArrow: UIView! 18 | @IBOutlet var leftArrowStick: UIImageView! 19 | @IBOutlet var rightArrow: UIView! 20 | @IBOutlet var rightArrowStick: UIView! 21 | } 22 | -------------------------------------------------------------------------------- /PullToMakeFlight/FlightView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/airplane.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "airplane.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "airplane@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x", 16 | "filename" : "airplane@3x.png" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/airplane.imageset/airplane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/airplane.imageset/airplane.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/airplane.imageset/airplane@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/airplane.imageset/airplane@2x.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/airplane.imageset/airplane@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/airplane.imageset/airplane@3x.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/arrow.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "arrow.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "arrow@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x", 16 | "filename" : "arrow@3x.png" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/arrow.imageset/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/arrow.imageset/arrow.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/arrow.imageset/arrow@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/arrow.imageset/arrow@2x.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/arrow.imageset/arrow@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/arrow.imageset/arrow@3x.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/arrow_full.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "arrow_full.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "arrow_full@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x", 16 | "filename" : "arrow_full@3x.png" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/arrow_full.imageset/arrow_full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/arrow_full.imageset/arrow_full.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/arrow_full.imageset/arrow_full@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/arrow_full.imageset/arrow_full@2x.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/arrow_full.imageset/arrow_full@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/arrow_full.imageset/arrow_full@3x.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/bg.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "bg.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "bg@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x", 16 | "filename" : "bg@3x.png" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/bg.imageset/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/bg.imageset/bg.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/bg.imageset/bg@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/bg.imageset/bg@2x.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/bg.imageset/bg@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/bg.imageset/bg@3x.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/clouds_center.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "clouds_center.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "clouds_center@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x", 16 | "filename" : "clouds_center@3x.png" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/clouds_center.imageset/clouds_center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/clouds_center.imageset/clouds_center.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/clouds_center.imageset/clouds_center@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/clouds_center.imageset/clouds_center@2x.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/clouds_center.imageset/clouds_center@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/clouds_center.imageset/clouds_center@3x.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/clouds_left.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "clouds_left.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "clouds_left@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x", 16 | "filename" : "clouds_left@3x.png" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/clouds_left.imageset/clouds_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/clouds_left.imageset/clouds_left.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/clouds_left.imageset/clouds_left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/clouds_left.imageset/clouds_left@2x.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/clouds_left.imageset/clouds_left@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/clouds_left.imageset/clouds_left@3x.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/clouds_right.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "clouds_right.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "clouds_right@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x", 16 | "filename" : "clouds_right@3x.png" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/clouds_right.imageset/clouds_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/clouds_right.imageset/clouds_right.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/clouds_right.imageset/clouds_right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/clouds_right.imageset/clouds_right@2x.png -------------------------------------------------------------------------------- /PullToMakeFlight/Image.xcassets/clouds_right.imageset/clouds_right@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlight/Image.xcassets/clouds_right.imageset/clouds_right@3x.png -------------------------------------------------------------------------------- /PullToMakeFlight/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | Yalantis.$(PRODUCT_NAME:rfc1034identifier) 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 | -------------------------------------------------------------------------------- /PullToMakeFlight/PullToMakeFlight.h: -------------------------------------------------------------------------------- 1 | // 2 | // PullToMakeFlight.h 3 | // PullToMakeFlight 4 | // 5 | // Created by Anastasiya Gorban on 5/27/15. 6 | // Copyright (c) 2015 Yalantis. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for PullToMakeFlight. 12 | FOUNDATION_EXPORT double PullToMakeFlightVersionNumber; 13 | 14 | //! Project version string for PullToMakeFlight. 15 | FOUNDATION_EXPORT const unsigned char PullToMakeFlightVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /PullToMakeFlight/PullToMakeFlight.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Anastasiya Gorban on 5/27/15. 3 | // Copyright (c) 2015 Yalantis. All rights reserved. 4 | // 5 | // Licensed under the MIT license: http://opensource.org/licenses/MIT 6 | // Latest version can be found at https://github.com/Yalantis/PullToMakeFlight 7 | // 8 | 9 | import Foundation 10 | import PullToRefresh 11 | 12 | open class PullToMakeFlight: PullToRefresh { 13 | 14 | public convenience init(at position: Position) { 15 | let height: CGFloat = 40 16 | let refreshView = Bundle(for: type(of: self)).loadNibNamed("FlightView", owner: nil, options: nil)!.first as! FlightView 17 | refreshView.clipsToBounds = true 18 | let animator = FlightAnimator(refreshView: refreshView) 19 | 20 | self.init(refreshView: refreshView, animator: animator, height: height, position: position) 21 | 22 | self.hideDelay = 0.2 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /PullToMakeFlightDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4D13DDF31B1591780023CA04 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D13DDF21B1591780023CA04 /* AppDelegate.swift */; }; 11 | 4D13DDF51B1591780023CA04 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D13DDF41B1591780023CA04 /* ViewController.swift */; }; 12 | 4D13DDF81B1591780023CA04 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4D13DDF61B1591780023CA04 /* Main.storyboard */; }; 13 | 4D13DDFA1B1591780023CA04 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4D13DDF91B1591780023CA04 /* Images.xcassets */; }; 14 | 4D13DDFD1B1591780023CA04 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4D13DDFB1B1591780023CA04 /* LaunchScreen.xib */; }; 15 | D49FB472C3F0C7B05CFB37CB /* Pods_PullToMakeFlightDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93E93EFF73AEDAB18B1A473D /* Pods_PullToMakeFlightDemo.framework */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXCopyFilesBuildPhase section */ 19 | 4D13DE351B15934C0023CA04 /* Embed Frameworks */ = { 20 | isa = PBXCopyFilesBuildPhase; 21 | buildActionMask = 2147483647; 22 | dstPath = ""; 23 | dstSubfolderSpec = 10; 24 | files = ( 25 | ); 26 | name = "Embed Frameworks"; 27 | runOnlyForDeploymentPostprocessing = 0; 28 | }; 29 | /* End PBXCopyFilesBuildPhase section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 0B522DA413220D9B9352C253 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; 33 | 4D13DDED1B1591780023CA04 /* PullToMakeFlightDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PullToMakeFlightDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 34 | 4D13DDF11B1591780023CA04 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 35 | 4D13DDF21B1591780023CA04 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 36 | 4D13DDF41B1591780023CA04 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 37 | 4D13DDF71B1591780023CA04 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 38 | 4D13DDF91B1591780023CA04 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 39 | 4D13DDFC1B1591780023CA04 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 40 | 4D44D9C01B1757C70026E116 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 41 | 898DA1FB1C4C841DA7641E61 /* Pods-PullToMakeFlightDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PullToMakeFlightDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-PullToMakeFlightDemo/Pods-PullToMakeFlightDemo.release.xcconfig"; sourceTree = ""; }; 42 | 93E93EFF73AEDAB18B1A473D /* Pods_PullToMakeFlightDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PullToMakeFlightDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | A97E95BD7A63C928A6D9D9BA /* Pods-PullToMakeFlightDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PullToMakeFlightDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-PullToMakeFlightDemo/Pods-PullToMakeFlightDemo.debug.xcconfig"; sourceTree = ""; }; 44 | AC99C0EB6152B6C1C29F99F0 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; 45 | FC18B7F9D8007266332DD1BF /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 46 | /* End PBXFileReference section */ 47 | 48 | /* Begin PBXFrameworksBuildPhase section */ 49 | 4D13DDEA1B1591780023CA04 /* Frameworks */ = { 50 | isa = PBXFrameworksBuildPhase; 51 | buildActionMask = 2147483647; 52 | files = ( 53 | D49FB472C3F0C7B05CFB37CB /* Pods_PullToMakeFlightDemo.framework in Frameworks */, 54 | ); 55 | runOnlyForDeploymentPostprocessing = 0; 56 | }; 57 | /* End PBXFrameworksBuildPhase section */ 58 | 59 | /* Begin PBXGroup section */ 60 | 4D13DDE41B1591780023CA04 = { 61 | isa = PBXGroup; 62 | children = ( 63 | 4D13DDEF1B1591780023CA04 /* PullToMakeFlightDemo */, 64 | 4D13DDEE1B1591780023CA04 /* Products */, 65 | FA75FB787A74016D4BA728E8 /* Frameworks */, 66 | CEC76B34C95EC209FCDBC56F /* Pods */, 67 | ); 68 | sourceTree = ""; 69 | }; 70 | 4D13DDEE1B1591780023CA04 /* Products */ = { 71 | isa = PBXGroup; 72 | children = ( 73 | 4D13DDED1B1591780023CA04 /* PullToMakeFlightDemo.app */, 74 | ); 75 | name = Products; 76 | sourceTree = ""; 77 | }; 78 | 4D13DDEF1B1591780023CA04 /* PullToMakeFlightDemo */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 4D13DDF21B1591780023CA04 /* AppDelegate.swift */, 82 | 4D13DDF41B1591780023CA04 /* ViewController.swift */, 83 | 4D13DDF61B1591780023CA04 /* Main.storyboard */, 84 | 4D13DDF91B1591780023CA04 /* Images.xcassets */, 85 | 4D13DDFB1B1591780023CA04 /* LaunchScreen.xib */, 86 | 4D13DDF01B1591780023CA04 /* Supporting Files */, 87 | ); 88 | path = PullToMakeFlightDemo; 89 | sourceTree = ""; 90 | }; 91 | 4D13DDF01B1591780023CA04 /* Supporting Files */ = { 92 | isa = PBXGroup; 93 | children = ( 94 | 4D13DDF11B1591780023CA04 /* Info.plist */, 95 | ); 96 | name = "Supporting Files"; 97 | sourceTree = ""; 98 | }; 99 | CEC76B34C95EC209FCDBC56F /* Pods */ = { 100 | isa = PBXGroup; 101 | children = ( 102 | AC99C0EB6152B6C1C29F99F0 /* Pods.debug.xcconfig */, 103 | 0B522DA413220D9B9352C253 /* Pods.release.xcconfig */, 104 | A97E95BD7A63C928A6D9D9BA /* Pods-PullToMakeFlightDemo.debug.xcconfig */, 105 | 898DA1FB1C4C841DA7641E61 /* Pods-PullToMakeFlightDemo.release.xcconfig */, 106 | ); 107 | name = Pods; 108 | sourceTree = ""; 109 | }; 110 | FA75FB787A74016D4BA728E8 /* Frameworks */ = { 111 | isa = PBXGroup; 112 | children = ( 113 | 4D44D9C01B1757C70026E116 /* CoreGraphics.framework */, 114 | FC18B7F9D8007266332DD1BF /* Pods.framework */, 115 | 93E93EFF73AEDAB18B1A473D /* Pods_PullToMakeFlightDemo.framework */, 116 | ); 117 | name = Frameworks; 118 | sourceTree = ""; 119 | }; 120 | /* End PBXGroup section */ 121 | 122 | /* Begin PBXNativeTarget section */ 123 | 4D13DDEC1B1591780023CA04 /* PullToMakeFlightDemo */ = { 124 | isa = PBXNativeTarget; 125 | buildConfigurationList = 4D13DE0C1B1591780023CA04 /* Build configuration list for PBXNativeTarget "PullToMakeFlightDemo" */; 126 | buildPhases = ( 127 | 18BCD7233F042AB69677A5D9 /* [CP] Check Pods Manifest.lock */, 128 | 4D13DDE91B1591780023CA04 /* Sources */, 129 | 4D13DDEA1B1591780023CA04 /* Frameworks */, 130 | 4D13DDEB1B1591780023CA04 /* Resources */, 131 | 4D13DE351B15934C0023CA04 /* Embed Frameworks */, 132 | 9B37F178735223E6A16490B4 /* [CP] Embed Pods Frameworks */, 133 | 8449DAF9E06C67DF381321A5 /* [CP] Copy Pods Resources */, 134 | ); 135 | buildRules = ( 136 | ); 137 | dependencies = ( 138 | ); 139 | name = PullToMakeFlightDemo; 140 | productName = PullToMakeFlightDemo; 141 | productReference = 4D13DDED1B1591780023CA04 /* PullToMakeFlightDemo.app */; 142 | productType = "com.apple.product-type.application"; 143 | }; 144 | /* End PBXNativeTarget section */ 145 | 146 | /* Begin PBXProject section */ 147 | 4D13DDE51B1591780023CA04 /* Project object */ = { 148 | isa = PBXProject; 149 | attributes = { 150 | LastSwiftMigration = 0700; 151 | LastSwiftUpdateCheck = 0700; 152 | LastUpgradeCheck = 0920; 153 | ORGANIZATIONNAME = Yalantis; 154 | TargetAttributes = { 155 | 4D13DDEC1B1591780023CA04 = { 156 | CreatedOnToolsVersion = 6.3.2; 157 | LastSwiftMigration = 0920; 158 | }; 159 | }; 160 | }; 161 | buildConfigurationList = 4D13DDE81B1591780023CA04 /* Build configuration list for PBXProject "PullToMakeFlightDemo" */; 162 | compatibilityVersion = "Xcode 3.2"; 163 | developmentRegion = English; 164 | hasScannedForEncodings = 0; 165 | knownRegions = ( 166 | en, 167 | Base, 168 | ); 169 | mainGroup = 4D13DDE41B1591780023CA04; 170 | productRefGroup = 4D13DDEE1B1591780023CA04 /* Products */; 171 | projectDirPath = ""; 172 | projectRoot = ""; 173 | targets = ( 174 | 4D13DDEC1B1591780023CA04 /* PullToMakeFlightDemo */, 175 | ); 176 | }; 177 | /* End PBXProject section */ 178 | 179 | /* Begin PBXResourcesBuildPhase section */ 180 | 4D13DDEB1B1591780023CA04 /* Resources */ = { 181 | isa = PBXResourcesBuildPhase; 182 | buildActionMask = 2147483647; 183 | files = ( 184 | 4D13DDF81B1591780023CA04 /* Main.storyboard in Resources */, 185 | 4D13DDFD1B1591780023CA04 /* LaunchScreen.xib in Resources */, 186 | 4D13DDFA1B1591780023CA04 /* Images.xcassets in Resources */, 187 | ); 188 | runOnlyForDeploymentPostprocessing = 0; 189 | }; 190 | /* End PBXResourcesBuildPhase section */ 191 | 192 | /* Begin PBXShellScriptBuildPhase section */ 193 | 18BCD7233F042AB69677A5D9 /* [CP] Check Pods Manifest.lock */ = { 194 | isa = PBXShellScriptBuildPhase; 195 | buildActionMask = 2147483647; 196 | files = ( 197 | ); 198 | inputPaths = ( 199 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 200 | "${PODS_ROOT}/Manifest.lock", 201 | ); 202 | name = "[CP] Check Pods Manifest.lock"; 203 | outputPaths = ( 204 | "$(DERIVED_FILE_DIR)/Pods-PullToMakeFlightDemo-checkManifestLockResult.txt", 205 | ); 206 | runOnlyForDeploymentPostprocessing = 0; 207 | shellPath = /bin/sh; 208 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 209 | showEnvVarsInLog = 0; 210 | }; 211 | 8449DAF9E06C67DF381321A5 /* [CP] Copy Pods Resources */ = { 212 | isa = PBXShellScriptBuildPhase; 213 | buildActionMask = 2147483647; 214 | files = ( 215 | ); 216 | inputPaths = ( 217 | ); 218 | name = "[CP] Copy Pods Resources"; 219 | outputPaths = ( 220 | ); 221 | runOnlyForDeploymentPostprocessing = 0; 222 | shellPath = /bin/sh; 223 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-PullToMakeFlightDemo/Pods-PullToMakeFlightDemo-resources.sh\"\n"; 224 | showEnvVarsInLog = 0; 225 | }; 226 | 9B37F178735223E6A16490B4 /* [CP] Embed Pods Frameworks */ = { 227 | isa = PBXShellScriptBuildPhase; 228 | buildActionMask = 2147483647; 229 | files = ( 230 | ); 231 | inputPaths = ( 232 | "${SRCROOT}/Pods/Target Support Files/Pods-PullToMakeFlightDemo/Pods-PullToMakeFlightDemo-frameworks.sh", 233 | "${BUILT_PRODUCTS_DIR}/PullToMakeFlight/PullToMakeFlight.framework", 234 | "${BUILT_PRODUCTS_DIR}/PullToRefresher/PullToRefresh.framework", 235 | ); 236 | name = "[CP] Embed Pods Frameworks"; 237 | outputPaths = ( 238 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PullToMakeFlight.framework", 239 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PullToRefresh.framework", 240 | ); 241 | runOnlyForDeploymentPostprocessing = 0; 242 | shellPath = /bin/sh; 243 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-PullToMakeFlightDemo/Pods-PullToMakeFlightDemo-frameworks.sh\"\n"; 244 | showEnvVarsInLog = 0; 245 | }; 246 | /* End PBXShellScriptBuildPhase section */ 247 | 248 | /* Begin PBXSourcesBuildPhase section */ 249 | 4D13DDE91B1591780023CA04 /* Sources */ = { 250 | isa = PBXSourcesBuildPhase; 251 | buildActionMask = 2147483647; 252 | files = ( 253 | 4D13DDF51B1591780023CA04 /* ViewController.swift in Sources */, 254 | 4D13DDF31B1591780023CA04 /* AppDelegate.swift in Sources */, 255 | ); 256 | runOnlyForDeploymentPostprocessing = 0; 257 | }; 258 | /* End PBXSourcesBuildPhase section */ 259 | 260 | /* Begin PBXVariantGroup section */ 261 | 4D13DDF61B1591780023CA04 /* Main.storyboard */ = { 262 | isa = PBXVariantGroup; 263 | children = ( 264 | 4D13DDF71B1591780023CA04 /* Base */, 265 | ); 266 | name = Main.storyboard; 267 | sourceTree = ""; 268 | }; 269 | 4D13DDFB1B1591780023CA04 /* LaunchScreen.xib */ = { 270 | isa = PBXVariantGroup; 271 | children = ( 272 | 4D13DDFC1B1591780023CA04 /* Base */, 273 | ); 274 | name = LaunchScreen.xib; 275 | sourceTree = ""; 276 | }; 277 | /* End PBXVariantGroup section */ 278 | 279 | /* Begin XCBuildConfiguration section */ 280 | 4D13DE0A1B1591780023CA04 /* Debug */ = { 281 | isa = XCBuildConfiguration; 282 | buildSettings = { 283 | ALWAYS_SEARCH_USER_PATHS = NO; 284 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 285 | CLANG_CXX_LIBRARY = "libc++"; 286 | CLANG_ENABLE_MODULES = YES; 287 | CLANG_ENABLE_OBJC_ARC = YES; 288 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 289 | CLANG_WARN_BOOL_CONVERSION = YES; 290 | CLANG_WARN_COMMA = YES; 291 | CLANG_WARN_CONSTANT_CONVERSION = YES; 292 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 293 | CLANG_WARN_EMPTY_BODY = YES; 294 | CLANG_WARN_ENUM_CONVERSION = YES; 295 | CLANG_WARN_INFINITE_RECURSION = YES; 296 | CLANG_WARN_INT_CONVERSION = YES; 297 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 298 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 299 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 300 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 301 | CLANG_WARN_STRICT_PROTOTYPES = YES; 302 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 303 | CLANG_WARN_UNREACHABLE_CODE = YES; 304 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 305 | CODE_SIGN_IDENTITY = "iPhone Developer"; 306 | COPY_PHASE_STRIP = NO; 307 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 308 | ENABLE_STRICT_OBJC_MSGSEND = YES; 309 | ENABLE_TESTABILITY = YES; 310 | GCC_C_LANGUAGE_STANDARD = gnu99; 311 | GCC_DYNAMIC_NO_PIC = NO; 312 | GCC_NO_COMMON_BLOCKS = YES; 313 | GCC_OPTIMIZATION_LEVEL = 0; 314 | GCC_PREPROCESSOR_DEFINITIONS = ( 315 | "DEBUG=1", 316 | "$(inherited)", 317 | ); 318 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 319 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 320 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 321 | GCC_WARN_UNDECLARED_SELECTOR = YES; 322 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 323 | GCC_WARN_UNUSED_FUNCTION = YES; 324 | GCC_WARN_UNUSED_VARIABLE = YES; 325 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 326 | MTL_ENABLE_DEBUG_INFO = YES; 327 | ONLY_ACTIVE_ARCH = YES; 328 | SDKROOT = iphoneos; 329 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 330 | SWIFT_VERSION = 3.0; 331 | }; 332 | name = Debug; 333 | }; 334 | 4D13DE0B1B1591780023CA04 /* Release */ = { 335 | isa = XCBuildConfiguration; 336 | buildSettings = { 337 | ALWAYS_SEARCH_USER_PATHS = NO; 338 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 339 | CLANG_CXX_LIBRARY = "libc++"; 340 | CLANG_ENABLE_MODULES = YES; 341 | CLANG_ENABLE_OBJC_ARC = YES; 342 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 343 | CLANG_WARN_BOOL_CONVERSION = YES; 344 | CLANG_WARN_COMMA = YES; 345 | CLANG_WARN_CONSTANT_CONVERSION = YES; 346 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 347 | CLANG_WARN_EMPTY_BODY = YES; 348 | CLANG_WARN_ENUM_CONVERSION = YES; 349 | CLANG_WARN_INFINITE_RECURSION = YES; 350 | CLANG_WARN_INT_CONVERSION = YES; 351 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 352 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 353 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 354 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 355 | CLANG_WARN_STRICT_PROTOTYPES = YES; 356 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 357 | CLANG_WARN_UNREACHABLE_CODE = YES; 358 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 359 | CODE_SIGN_IDENTITY = "iPhone Developer"; 360 | COPY_PHASE_STRIP = NO; 361 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 362 | ENABLE_NS_ASSERTIONS = NO; 363 | ENABLE_STRICT_OBJC_MSGSEND = YES; 364 | GCC_C_LANGUAGE_STANDARD = gnu99; 365 | GCC_NO_COMMON_BLOCKS = YES; 366 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 367 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 368 | GCC_WARN_UNDECLARED_SELECTOR = YES; 369 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 370 | GCC_WARN_UNUSED_FUNCTION = YES; 371 | GCC_WARN_UNUSED_VARIABLE = YES; 372 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 373 | MTL_ENABLE_DEBUG_INFO = NO; 374 | SDKROOT = iphoneos; 375 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 376 | SWIFT_VERSION = 3.0; 377 | VALIDATE_PRODUCT = YES; 378 | }; 379 | name = Release; 380 | }; 381 | 4D13DE0D1B1591780023CA04 /* Debug */ = { 382 | isa = XCBuildConfiguration; 383 | baseConfigurationReference = A97E95BD7A63C928A6D9D9BA /* Pods-PullToMakeFlightDemo.debug.xcconfig */; 384 | buildSettings = { 385 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 386 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 387 | INFOPLIST_FILE = PullToMakeFlightDemo/Info.plist; 388 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 389 | PRODUCT_BUNDLE_IDENTIFIER = "Yalantis.$(PRODUCT_NAME:rfc1034identifier)"; 390 | PRODUCT_NAME = "$(TARGET_NAME)"; 391 | SWIFT_SWIFT3_OBJC_INFERENCE = On; 392 | SWIFT_VERSION = 4.0; 393 | }; 394 | name = Debug; 395 | }; 396 | 4D13DE0E1B1591780023CA04 /* Release */ = { 397 | isa = XCBuildConfiguration; 398 | baseConfigurationReference = 898DA1FB1C4C841DA7641E61 /* Pods-PullToMakeFlightDemo.release.xcconfig */; 399 | buildSettings = { 400 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 401 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 402 | INFOPLIST_FILE = PullToMakeFlightDemo/Info.plist; 403 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 404 | PRODUCT_BUNDLE_IDENTIFIER = "Yalantis.$(PRODUCT_NAME:rfc1034identifier)"; 405 | PRODUCT_NAME = "$(TARGET_NAME)"; 406 | SWIFT_SWIFT3_OBJC_INFERENCE = On; 407 | SWIFT_VERSION = 4.0; 408 | }; 409 | name = Release; 410 | }; 411 | /* End XCBuildConfiguration section */ 412 | 413 | /* Begin XCConfigurationList section */ 414 | 4D13DDE81B1591780023CA04 /* Build configuration list for PBXProject "PullToMakeFlightDemo" */ = { 415 | isa = XCConfigurationList; 416 | buildConfigurations = ( 417 | 4D13DE0A1B1591780023CA04 /* Debug */, 418 | 4D13DE0B1B1591780023CA04 /* Release */, 419 | ); 420 | defaultConfigurationIsVisible = 0; 421 | defaultConfigurationName = Release; 422 | }; 423 | 4D13DE0C1B1591780023CA04 /* Build configuration list for PBXNativeTarget "PullToMakeFlightDemo" */ = { 424 | isa = XCConfigurationList; 425 | buildConfigurations = ( 426 | 4D13DE0D1B1591780023CA04 /* Debug */, 427 | 4D13DE0E1B1591780023CA04 /* Release */, 428 | ); 429 | defaultConfigurationIsVisible = 0; 430 | defaultConfigurationName = Release; 431 | }; 432 | /* End XCConfigurationList section */ 433 | }; 434 | rootObject = 4D13DDE51B1591780023CA04 /* Project object */; 435 | } 436 | -------------------------------------------------------------------------------- /PullToMakeFlightDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /PullToMakeFlightDemo.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /PullToMakeFlightDemo/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // PullToMakeFlightDemo 4 | // 5 | // Created by Anastasiya Gorban on 5/27/15. 6 | // Copyright (c) 2015 Yalantis. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | } 16 | -------------------------------------------------------------------------------- /PullToMakeFlightDemo/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 | -------------------------------------------------------------------------------- /PullToMakeFlightDemo/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 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 | -------------------------------------------------------------------------------- /PullToMakeFlightDemo/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "29x29", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-Small@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "29x29", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-Small@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "40x40", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-Small-40@2x.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "40x40", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-Small-40@3x.png", 25 | "scale" : "3x" 26 | }, 27 | { 28 | "size" : "60x60", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-60@2x.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "60x60", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-60@3x.png", 37 | "scale" : "3x" 38 | } 39 | ], 40 | "info" : { 41 | "version" : 1, 42 | "author" : "xcode" 43 | } 44 | } -------------------------------------------------------------------------------- /PullToMakeFlightDemo/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlightDemo/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png -------------------------------------------------------------------------------- /PullToMakeFlightDemo/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlightDemo/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png -------------------------------------------------------------------------------- /PullToMakeFlightDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlightDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png -------------------------------------------------------------------------------- /PullToMakeFlightDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlightDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png -------------------------------------------------------------------------------- /PullToMakeFlightDemo/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlightDemo/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png -------------------------------------------------------------------------------- /PullToMakeFlightDemo/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlightDemo/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png -------------------------------------------------------------------------------- /PullToMakeFlightDemo/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 | Airplane 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSApplicationCategoryType 24 | 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UIRequiredDeviceCapabilities 32 | 33 | armv7 34 | 35 | UISupportedInterfaceOrientations 36 | 37 | UIInterfaceOrientationPortrait 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /PullToMakeFlightDemo/Resources/badge_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlightDemo/Resources/badge_dark.png -------------------------------------------------------------------------------- /PullToMakeFlightDemo/Resources/tours-pull-airplane.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/f996200d5358f8d7517606a06bcbcccbbc516167/PullToMakeFlightDemo/Resources/tours-pull-airplane.gif -------------------------------------------------------------------------------- /PullToMakeFlightDemo/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // PullToMakeFlightDemo 4 | // 5 | // Created by Anastasiya Gorban on 5/27/15. 6 | // Copyright (c) 2015 Yalantis. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import PullToMakeFlight 11 | 12 | class ViewController: UITableViewController { 13 | 14 | override func viewDidAppear(_ animated: Bool) { 15 | super.viewDidAppear(animated) 16 | 17 | tableView.separatorStyle = .none 18 | 19 | tableView.addPullToRefresh(PullToMakeFlight(at: .top)) { 20 | DispatchQueue.main.asyncAfter(deadline: .now() + 5) { 21 | self.tableView.endRefreshing(at: .top) 22 | } 23 | } 24 | } 25 | 26 | @IBAction fileprivate func refresh() { 27 | tableView.startRefreshing(at: .top) 28 | } 29 | } 30 | 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ## PullToMakeFlight 3 | 4 | Custom animated pull-to-refresh that can be easily added to UIScrollView 5 | 6 | [![Yalantis](https://raw.githubusercontent.com/Yalantis/PullToMakeFlight/master/PullToMakeFlightDemo/Resources/badge_dark.png)](https://yalantis.com/?utm_source=github) 7 | 8 | 9 | 10 | ## Requirements 11 | 12 | - iOS 8.0+ 13 | - Xcode 9 14 | - Swift 4 15 | 16 | ## Installing with [CocoaPods](https://cocoapods.org) 17 | 18 | ```ruby 19 | use_frameworks! 20 | pod 'PullToMakeFlight', '~> 3.0' 21 | ``` 22 | 23 | ## Usage 24 | 25 | At first, import PullToMakeFlight framework: 26 | 27 | ```swift 28 | import PullToMakeFlight 29 | ``` 30 | 31 | Create refresher: 32 | 33 | ```swift 34 | let refresher = PullToMakeFlight() 35 | ``` 36 | 37 | Add the refresher to your UIScrollView subclass and provide action block: 38 | 39 | ```swift 40 | tableView.addPullToRefresh(refresher) { 41 |     // action to be performed (pull data from some source) 42 | } 43 | ``` 44 | 45 | After the action is completed and you want to hide the refresher: 46 | 47 | ```swift 48 | tableView.endRefreshing() 49 | ``` 50 | 51 | You can also start refreshing programmatically: 52 | 53 | ```swift 54 | tableView.startRefreshing() 55 | ``` 56 | 57 | Component was implemented based on [customizable pull-to-refresh](https://github.com/Yalantis/PullToRefresh) 58 | 59 | ## Let us know! 60 | 61 | We’d be really happy if you sent us links to your projects where you use our component. Just send an email to github@yalantis.com And do let us know if you have any questions or suggestion regarding the animation. 62 | 63 | P.S. We’re going to publish more awesomeness wrapped in code and a tutorial on how to make UI for iOS (Android) better than better. Stay tuned! 64 | 65 | ## License 66 | 67 | The MIT License (MIT) 68 | 69 | Copyright © 2017 Yalantis 70 | 71 | Permission is hereby granted, free of charge, to any person obtaining a copy 72 | of this software and associated documentation files (the "Software"), to deal 73 | in the Software without restriction, including without limitation the rights 74 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 75 | copies of the Software, and to permit persons to whom the Software is 76 | furnished to do so, subject to the following conditions: 77 | 78 | The above copyright notice and this permission notice shall be included in 79 | all copies or substantial portions of the Software. 80 | 81 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 82 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 83 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 84 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 85 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 86 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 87 | THE SOFTWARE. 88 | --------------------------------------------------------------------------------