├── .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 | #### [](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 | [](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 |
--------------------------------------------------------------------------------