├── .gitignore
├── LICENSE.md
├── README.md
├── Resources
├── AppIcon.sketch
│ ├── Data
│ ├── QuickLook
│ │ ├── Preview.png
│ │ └── Thumbnail.png
│ ├── metadata
│ └── version
└── DownArrow.sketch
│ ├── Data
│ ├── QuickLook
│ ├── Preview.png
│ └── Thumbnail.png
│ ├── metadata
│ └── version
├── SpringAnimation.xcodeproj
├── project.pbxproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
└── xcuserdata
│ └── matt.xcuserdatad
│ └── xcschemes
│ └── xcschememanagement.plist
├── SpringAnimation
├── AbstractClass.h
├── Base.lproj
│ └── Main_iPad.storyboard
├── Images.xcassets
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── Spring.png
│ │ └── Spring@2x.png
│ ├── DownArrow.imageset
│ │ ├── Contents.json
│ │ ├── DownArrow.png
│ │ └── DownArrow@2x.png
│ ├── LaunchImage.launchimage
│ │ └── Contents.json
│ └── Play.imageset
│ │ ├── Contents.json
│ │ ├── Play.png
│ │ └── Play@2x.png
├── MTZAnimationSelectTableViewController.h
├── MTZAnimationSelectTableViewController.m
├── MTZAppDelegate.h
├── MTZAppDelegate.m
├── MTZPlaybackControlsView.h
├── MTZPlaybackControlsView.m
├── MTZSpringAnimationExpandViewController.h
├── MTZSpringAnimationExpandViewController.m
├── MTZSpringAnimationExpandViewController.xib
├── MTZSpringAnimationParametersViewController.h
├── MTZSpringAnimationParametersViewController.m
├── MTZSpringAnimationParametersViewController.xib
├── MTZSpringAnimationRotateViewController.h
├── MTZSpringAnimationRotateViewController.m
├── MTZSpringAnimationRotateViewController.xib
├── MTZSpringAnimationTranslateViewController.h
├── MTZSpringAnimationTranslateViewController.m
├── MTZSpringAnimationTranslateViewController.xib
├── MTZSpringAnimationViewerController.h
├── MTZSpringAnimationViewerController.m
├── MTZViewController.h
├── MTZViewController.m
├── SpringAnimation-Info.plist
├── SpringAnimation-Prefix.pch
├── en.lproj
│ └── InfoPlist.strings
└── main.m
├── SpringAnimationTests
├── SpringAnimationTests-Info.plist
├── SpringAnimationTests.m
└── en.lproj
│ └── InfoPlist.strings
├── demo.gif
└── demo.mov
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | .DS_Store
3 | */build/*
4 | build/*
5 | *.pbxuser
6 | !default.pbxuser
7 | *.mode1v3
8 | !default.mode1v3
9 | *.mode2v3
10 | !default.mode2v3
11 | *.perspectivev3
12 | !default.perspectivev3
13 | xcuserdata
14 | profile
15 | *.moved-aside
16 | DerivedData
17 | .idea/
18 | *.hmap
19 | *.xccheckout
20 |
21 | #CocoaPods
22 | Pods
23 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014 Matt Zanchelli.
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 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Spring Animation Demonstration
2 |
3 | A simple iOS app demonstrating spring animations.
4 |
5 | ## Why
6 |
7 | The way spring animations work on might not be entirely clear to those developing iOS apps. iOS developers and designers need to learn how each parameter affects a spring animation.
8 |
9 | ## What
10 |
11 | A simple iOS demonstration app to easily adjust the parameters of a spring animation.
12 |
13 | 
14 |
--------------------------------------------------------------------------------
/Resources/AppIcon.sketch/Data:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdznr/Spring-Animation/761e0f29ff4dec3102f096e563d15027c1cd519b/Resources/AppIcon.sketch/Data
--------------------------------------------------------------------------------
/Resources/AppIcon.sketch/QuickLook/Preview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdznr/Spring-Animation/761e0f29ff4dec3102f096e563d15027c1cd519b/Resources/AppIcon.sketch/QuickLook/Preview.png
--------------------------------------------------------------------------------
/Resources/AppIcon.sketch/QuickLook/Thumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdznr/Spring-Animation/761e0f29ff4dec3102f096e563d15027c1cd519b/Resources/AppIcon.sketch/QuickLook/Thumbnail.png
--------------------------------------------------------------------------------
/Resources/AppIcon.sketch/metadata:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | app
6 | com.bohemiancoding.sketch.beta
7 | build
8 | 5347
9 | commit
10 | 9c36051e8fd492279e960780830d475c5696520c
11 | fonts
12 |
13 | length
14 | 75354
15 | version
16 | 18
17 |
18 |
19 |
--------------------------------------------------------------------------------
/Resources/AppIcon.sketch/version:
--------------------------------------------------------------------------------
1 | 18
--------------------------------------------------------------------------------
/Resources/DownArrow.sketch/Data:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdznr/Spring-Animation/761e0f29ff4dec3102f096e563d15027c1cd519b/Resources/DownArrow.sketch/Data
--------------------------------------------------------------------------------
/Resources/DownArrow.sketch/QuickLook/Preview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdznr/Spring-Animation/761e0f29ff4dec3102f096e563d15027c1cd519b/Resources/DownArrow.sketch/QuickLook/Preview.png
--------------------------------------------------------------------------------
/Resources/DownArrow.sketch/QuickLook/Thumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdznr/Spring-Animation/761e0f29ff4dec3102f096e563d15027c1cd519b/Resources/DownArrow.sketch/QuickLook/Thumbnail.png
--------------------------------------------------------------------------------
/Resources/DownArrow.sketch/metadata:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | app
6 | com.bohemiancoding.sketch.beta
7 | build
8 | 5347
9 | commit
10 | 9c36051e8fd492279e960780830d475c5696520c
11 | fonts
12 |
13 | HelveticaNeue
14 |
15 | length
16 | 136621
17 | version
18 | 18
19 |
20 |
21 |
--------------------------------------------------------------------------------
/Resources/DownArrow.sketch/version:
--------------------------------------------------------------------------------
1 | 18
--------------------------------------------------------------------------------
/SpringAnimation.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | C914B28D18D6414B00EC9C80 /* MTZSpringAnimationExpandViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C914B28B18D6414B00EC9C80 /* MTZSpringAnimationExpandViewController.m */; };
11 | C914B28E18D6414B00EC9C80 /* MTZSpringAnimationExpandViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C914B28C18D6414B00EC9C80 /* MTZSpringAnimationExpandViewController.xib */; };
12 | C935723018CEABF00022F5D6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C935722F18CEABF00022F5D6 /* Foundation.framework */; };
13 | C935723218CEABF00022F5D6 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C935723118CEABF00022F5D6 /* CoreGraphics.framework */; };
14 | C935723418CEABF00022F5D6 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C935723318CEABF00022F5D6 /* UIKit.framework */; };
15 | C935725218CEABF00022F5D6 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C935725118CEABF00022F5D6 /* XCTest.framework */; };
16 | C935725318CEABF00022F5D6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C935722F18CEABF00022F5D6 /* Foundation.framework */; };
17 | C935725418CEABF00022F5D6 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C935723318CEABF00022F5D6 /* UIKit.framework */; };
18 | C9C090A018CED136000E69CD /* MTZAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C9C0909D18CED136000E69CD /* MTZAppDelegate.m */; };
19 | C9C090A118CED136000E69CD /* MTZViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C9C0909F18CED136000E69CD /* MTZViewController.m */; };
20 | C9C090A318CED13C000E69CD /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C9C090A218CED13C000E69CD /* Images.xcassets */; };
21 | C9C090AE18CED161000E69CD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C9C090AD18CED161000E69CD /* main.m */; };
22 | C9C090BB18CED219000E69CD /* Main_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C9C090A418CED14C000E69CD /* Main_iPad.storyboard */; };
23 | C9C090BC18CED232000E69CD /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C9C090AA18CED15D000E69CD /* InfoPlist.strings */; };
24 | C9C090C018CEDAEC000E69CD /* MTZSpringAnimationParametersViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C9C090BE18CEDAEC000E69CD /* MTZSpringAnimationParametersViewController.m */; };
25 | C9C090C118CEDAEC000E69CD /* MTZSpringAnimationParametersViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C9C090BF18CEDAEC000E69CD /* MTZSpringAnimationParametersViewController.xib */; };
26 | C9C090C418CEDE63000E69CD /* MTZSpringAnimationViewerController.m in Sources */ = {isa = PBXBuildFile; fileRef = C9C090C318CEDE63000E69CD /* MTZSpringAnimationViewerController.m */; };
27 | C9C090CA18CEE6CE000E69CD /* MTZSpringAnimationTranslateViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C9C090C818CEE6CE000E69CD /* MTZSpringAnimationTranslateViewController.m */; };
28 | C9C090CB18CEE6CE000E69CD /* MTZSpringAnimationTranslateViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C9C090C918CEE6CE000E69CD /* MTZSpringAnimationTranslateViewController.xib */; };
29 | C9C090D218CEEC4F000E69CD /* MTZPlaybackControlsView.m in Sources */ = {isa = PBXBuildFile; fileRef = C9C090D118CEEC4F000E69CD /* MTZPlaybackControlsView.m */; };
30 | C9C090D618CF0A77000E69CD /* MTZSpringAnimationRotateViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C9C090D418CF0A77000E69CD /* MTZSpringAnimationRotateViewController.m */; };
31 | C9C090D718CF0A77000E69CD /* MTZSpringAnimationRotateViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C9C090D518CF0A77000E69CD /* MTZSpringAnimationRotateViewController.xib */; };
32 | C9C090ED18CFF696000E69CD /* MTZAnimationSelectTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C9C090EB18CFF696000E69CD /* MTZAnimationSelectTableViewController.m */; };
33 | /* End PBXBuildFile section */
34 |
35 | /* Begin PBXContainerItemProxy section */
36 | C935725518CEABF00022F5D6 /* PBXContainerItemProxy */ = {
37 | isa = PBXContainerItemProxy;
38 | containerPortal = C935722418CEABF00022F5D6 /* Project object */;
39 | proxyType = 1;
40 | remoteGlobalIDString = C935722B18CEABF00022F5D6;
41 | remoteInfo = SpringDampingTest;
42 | };
43 | /* End PBXContainerItemProxy section */
44 |
45 | /* Begin PBXFileReference section */
46 | C914B28A18D6414B00EC9C80 /* MTZSpringAnimationExpandViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MTZSpringAnimationExpandViewController.h; path = SpringAnimation/MTZSpringAnimationExpandViewController.h; sourceTree = SOURCE_ROOT; };
47 | C914B28B18D6414B00EC9C80 /* MTZSpringAnimationExpandViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MTZSpringAnimationExpandViewController.m; path = SpringAnimation/MTZSpringAnimationExpandViewController.m; sourceTree = SOURCE_ROOT; };
48 | C914B28C18D6414B00EC9C80 /* MTZSpringAnimationExpandViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = MTZSpringAnimationExpandViewController.xib; path = SpringAnimation/MTZSpringAnimationExpandViewController.xib; sourceTree = SOURCE_ROOT; };
49 | C935722C18CEABF00022F5D6 /* SpringAnimation.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SpringAnimation.app; sourceTree = BUILT_PRODUCTS_DIR; };
50 | C935722F18CEABF00022F5D6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
51 | C935723118CEABF00022F5D6 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
52 | C935723318CEABF00022F5D6 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
53 | C935725018CEABF00022F5D6 /* SpringAnimationTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SpringAnimationTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
54 | C935725118CEABF00022F5D6 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
55 | C9C0907D18CECA90000E69CD /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };
56 | C9C0909C18CED136000E69CD /* MTZAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MTZAppDelegate.h; path = SpringAnimation/MTZAppDelegate.h; sourceTree = SOURCE_ROOT; };
57 | C9C0909D18CED136000E69CD /* MTZAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MTZAppDelegate.m; path = SpringAnimation/MTZAppDelegate.m; sourceTree = SOURCE_ROOT; };
58 | C9C0909E18CED136000E69CD /* MTZViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MTZViewController.h; path = SpringAnimation/MTZViewController.h; sourceTree = SOURCE_ROOT; };
59 | C9C0909F18CED136000E69CD /* MTZViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MTZViewController.m; path = SpringAnimation/MTZViewController.m; sourceTree = SOURCE_ROOT; };
60 | C9C090A218CED13C000E69CD /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = SpringAnimation/Images.xcassets; sourceTree = SOURCE_ROOT; };
61 | C9C090A518CED14C000E69CD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = SpringAnimation/Base.lproj/Main_iPad.storyboard; sourceTree = SOURCE_ROOT; };
62 | C9C090AB18CED15D000E69CD /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = SpringAnimation/en.lproj/InfoPlist.strings; sourceTree = SOURCE_ROOT; };
63 | C9C090AD18CED161000E69CD /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = SpringAnimation/main.m; sourceTree = SOURCE_ROOT; };
64 | C9C090AF18CED166000E69CD /* SpringAnimation-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "SpringAnimation-Info.plist"; path = "SpringAnimation/SpringAnimation-Info.plist"; sourceTree = SOURCE_ROOT; };
65 | C9C090B018CED166000E69CD /* SpringAnimation-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "SpringAnimation-Prefix.pch"; path = "SpringAnimation/SpringAnimation-Prefix.pch"; sourceTree = SOURCE_ROOT; };
66 | C9C090B318CED183000E69CD /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = SpringAnimationTests/en.lproj/InfoPlist.strings; sourceTree = SOURCE_ROOT; };
67 | C9C090B518CED188000E69CD /* SpringAnimationTests-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "SpringAnimationTests-Info.plist"; path = "SpringAnimationTests/SpringAnimationTests-Info.plist"; sourceTree = SOURCE_ROOT; };
68 | C9C090B718CED18D000E69CD /* SpringAnimationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SpringAnimationTests.m; path = SpringAnimationTests/SpringAnimationTests.m; sourceTree = SOURCE_ROOT; };
69 | C9C090BD18CEDAEC000E69CD /* MTZSpringAnimationParametersViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MTZSpringAnimationParametersViewController.h; path = SpringAnimation/MTZSpringAnimationParametersViewController.h; sourceTree = SOURCE_ROOT; };
70 | C9C090BE18CEDAEC000E69CD /* MTZSpringAnimationParametersViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MTZSpringAnimationParametersViewController.m; path = SpringAnimation/MTZSpringAnimationParametersViewController.m; sourceTree = SOURCE_ROOT; };
71 | C9C090BF18CEDAEC000E69CD /* MTZSpringAnimationParametersViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = MTZSpringAnimationParametersViewController.xib; path = SpringAnimation/MTZSpringAnimationParametersViewController.xib; sourceTree = SOURCE_ROOT; };
72 | C9C090C218CEDE63000E69CD /* MTZSpringAnimationViewerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MTZSpringAnimationViewerController.h; path = SpringAnimation/MTZSpringAnimationViewerController.h; sourceTree = SOURCE_ROOT; };
73 | C9C090C318CEDE63000E69CD /* MTZSpringAnimationViewerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MTZSpringAnimationViewerController.m; path = SpringAnimation/MTZSpringAnimationViewerController.m; sourceTree = SOURCE_ROOT; };
74 | C9C090C718CEE6CE000E69CD /* MTZSpringAnimationTranslateViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MTZSpringAnimationTranslateViewController.h; path = SpringAnimation/MTZSpringAnimationTranslateViewController.h; sourceTree = SOURCE_ROOT; };
75 | C9C090C818CEE6CE000E69CD /* MTZSpringAnimationTranslateViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MTZSpringAnimationTranslateViewController.m; path = SpringAnimation/MTZSpringAnimationTranslateViewController.m; sourceTree = SOURCE_ROOT; };
76 | C9C090C918CEE6CE000E69CD /* MTZSpringAnimationTranslateViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = MTZSpringAnimationTranslateViewController.xib; path = SpringAnimation/MTZSpringAnimationTranslateViewController.xib; sourceTree = SOURCE_ROOT; };
77 | C9C090CE18CEE9A1000E69CD /* AbstractClass.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AbstractClass.h; path = SpringAnimation/AbstractClass.h; sourceTree = SOURCE_ROOT; };
78 | C9C090D018CEEC4F000E69CD /* MTZPlaybackControlsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MTZPlaybackControlsView.h; path = SpringAnimation/MTZPlaybackControlsView.h; sourceTree = SOURCE_ROOT; };
79 | C9C090D118CEEC4F000E69CD /* MTZPlaybackControlsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MTZPlaybackControlsView.m; path = SpringAnimation/MTZPlaybackControlsView.m; sourceTree = SOURCE_ROOT; };
80 | C9C090D318CF0A77000E69CD /* MTZSpringAnimationRotateViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MTZSpringAnimationRotateViewController.h; path = SpringAnimation/MTZSpringAnimationRotateViewController.h; sourceTree = SOURCE_ROOT; };
81 | C9C090D418CF0A77000E69CD /* MTZSpringAnimationRotateViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MTZSpringAnimationRotateViewController.m; path = SpringAnimation/MTZSpringAnimationRotateViewController.m; sourceTree = SOURCE_ROOT; };
82 | C9C090D518CF0A77000E69CD /* MTZSpringAnimationRotateViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = MTZSpringAnimationRotateViewController.xib; path = SpringAnimation/MTZSpringAnimationRotateViewController.xib; sourceTree = SOURCE_ROOT; };
83 | C9C090EA18CFF696000E69CD /* MTZAnimationSelectTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MTZAnimationSelectTableViewController.h; path = SpringAnimation/MTZAnimationSelectTableViewController.h; sourceTree = SOURCE_ROOT; };
84 | C9C090EB18CFF696000E69CD /* MTZAnimationSelectTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MTZAnimationSelectTableViewController.m; path = SpringAnimation/MTZAnimationSelectTableViewController.m; sourceTree = SOURCE_ROOT; };
85 | /* End PBXFileReference section */
86 |
87 | /* Begin PBXFrameworksBuildPhase section */
88 | C935722918CEABF00022F5D6 /* Frameworks */ = {
89 | isa = PBXFrameworksBuildPhase;
90 | buildActionMask = 2147483647;
91 | files = (
92 | C935723218CEABF00022F5D6 /* CoreGraphics.framework in Frameworks */,
93 | C935723418CEABF00022F5D6 /* UIKit.framework in Frameworks */,
94 | C935723018CEABF00022F5D6 /* Foundation.framework in Frameworks */,
95 | );
96 | runOnlyForDeploymentPostprocessing = 0;
97 | };
98 | C935724D18CEABF00022F5D6 /* Frameworks */ = {
99 | isa = PBXFrameworksBuildPhase;
100 | buildActionMask = 2147483647;
101 | files = (
102 | C935725218CEABF00022F5D6 /* XCTest.framework in Frameworks */,
103 | C935725418CEABF00022F5D6 /* UIKit.framework in Frameworks */,
104 | C935725318CEABF00022F5D6 /* Foundation.framework in Frameworks */,
105 | );
106 | runOnlyForDeploymentPostprocessing = 0;
107 | };
108 | /* End PBXFrameworksBuildPhase section */
109 |
110 | /* Begin PBXGroup section */
111 | C914B28918D640F300EC9C80 /* Expand */ = {
112 | isa = PBXGroup;
113 | children = (
114 | C914B28A18D6414B00EC9C80 /* MTZSpringAnimationExpandViewController.h */,
115 | C914B28B18D6414B00EC9C80 /* MTZSpringAnimationExpandViewController.m */,
116 | C914B28C18D6414B00EC9C80 /* MTZSpringAnimationExpandViewController.xib */,
117 | );
118 | name = Expand;
119 | sourceTree = "";
120 | };
121 | C935722318CEABF00022F5D6 = {
122 | isa = PBXGroup;
123 | children = (
124 | C935723518CEABF00022F5D6 /* SpringAnimation */,
125 | C935725718CEABF00022F5D6 /* SpringAnimationTests */,
126 | C935722E18CEABF00022F5D6 /* Frameworks */,
127 | C935722D18CEABF00022F5D6 /* Products */,
128 | );
129 | sourceTree = "";
130 | };
131 | C935722D18CEABF00022F5D6 /* Products */ = {
132 | isa = PBXGroup;
133 | children = (
134 | C935722C18CEABF00022F5D6 /* SpringAnimation.app */,
135 | C935725018CEABF00022F5D6 /* SpringAnimationTests.xctest */,
136 | );
137 | name = Products;
138 | sourceTree = "";
139 | };
140 | C935722E18CEABF00022F5D6 /* Frameworks */ = {
141 | isa = PBXGroup;
142 | children = (
143 | C9C0907D18CECA90000E69CD /* CoreText.framework */,
144 | C935722F18CEABF00022F5D6 /* Foundation.framework */,
145 | C935723118CEABF00022F5D6 /* CoreGraphics.framework */,
146 | C935723318CEABF00022F5D6 /* UIKit.framework */,
147 | C935725118CEABF00022F5D6 /* XCTest.framework */,
148 | );
149 | name = Frameworks;
150 | sourceTree = "";
151 | };
152 | C935723518CEABF00022F5D6 /* SpringAnimation */ = {
153 | isa = PBXGroup;
154 | children = (
155 | C9C0909C18CED136000E69CD /* MTZAppDelegate.h */,
156 | C9C0909D18CED136000E69CD /* MTZAppDelegate.m */,
157 | C9C090A418CED14C000E69CD /* Main_iPad.storyboard */,
158 | C9C0909E18CED136000E69CD /* MTZViewController.h */,
159 | C9C0909F18CED136000E69CD /* MTZViewController.m */,
160 | C9C090D018CEEC4F000E69CD /* MTZPlaybackControlsView.h */,
161 | C9C090D118CEEC4F000E69CD /* MTZPlaybackControlsView.m */,
162 | C9C090EA18CFF696000E69CD /* MTZAnimationSelectTableViewController.h */,
163 | C9C090EB18CFF696000E69CD /* MTZAnimationSelectTableViewController.m */,
164 | C9C090C518CEDEFD000E69CD /* Parameters */,
165 | C9C090C618CEDF03000E69CD /* Animations */,
166 | C9C090CF18CEEC18000E69CD /* Helper */,
167 | C9C090A218CED13C000E69CD /* Images.xcassets */,
168 | C935723618CEABF00022F5D6 /* Supporting Files */,
169 | );
170 | name = SpringAnimation;
171 | path = SpringDampingTest;
172 | sourceTree = "";
173 | };
174 | C935723618CEABF00022F5D6 /* Supporting Files */ = {
175 | isa = PBXGroup;
176 | children = (
177 | C9C090AF18CED166000E69CD /* SpringAnimation-Info.plist */,
178 | C9C090AA18CED15D000E69CD /* InfoPlist.strings */,
179 | C9C090AD18CED161000E69CD /* main.m */,
180 | C9C090B018CED166000E69CD /* SpringAnimation-Prefix.pch */,
181 | );
182 | name = "Supporting Files";
183 | sourceTree = "";
184 | };
185 | C935725718CEABF00022F5D6 /* SpringAnimationTests */ = {
186 | isa = PBXGroup;
187 | children = (
188 | C9C090B718CED18D000E69CD /* SpringAnimationTests.m */,
189 | C935725818CEABF00022F5D6 /* Supporting Files */,
190 | );
191 | name = SpringAnimationTests;
192 | path = SpringDampingTestTests;
193 | sourceTree = "";
194 | };
195 | C935725818CEABF00022F5D6 /* Supporting Files */ = {
196 | isa = PBXGroup;
197 | children = (
198 | C9C090B518CED188000E69CD /* SpringAnimationTests-Info.plist */,
199 | C9C090B218CED183000E69CD /* InfoPlist.strings */,
200 | );
201 | name = "Supporting Files";
202 | sourceTree = "";
203 | };
204 | C9C090C518CEDEFD000E69CD /* Parameters */ = {
205 | isa = PBXGroup;
206 | children = (
207 | C9C090BD18CEDAEC000E69CD /* MTZSpringAnimationParametersViewController.h */,
208 | C9C090BE18CEDAEC000E69CD /* MTZSpringAnimationParametersViewController.m */,
209 | C9C090BF18CEDAEC000E69CD /* MTZSpringAnimationParametersViewController.xib */,
210 | );
211 | name = Parameters;
212 | sourceTree = "";
213 | };
214 | C9C090C618CEDF03000E69CD /* Animations */ = {
215 | isa = PBXGroup;
216 | children = (
217 | C9C090CD18CEE6DD000E69CD /* Generic */,
218 | C914B28918D640F300EC9C80 /* Expand */,
219 | C9C090D818CF0A7A000E69CD /* Rotate */,
220 | C9C090CC18CEE6D3000E69CD /* Translate */,
221 | );
222 | name = Animations;
223 | sourceTree = "";
224 | };
225 | C9C090CC18CEE6D3000E69CD /* Translate */ = {
226 | isa = PBXGroup;
227 | children = (
228 | C9C090C718CEE6CE000E69CD /* MTZSpringAnimationTranslateViewController.h */,
229 | C9C090C818CEE6CE000E69CD /* MTZSpringAnimationTranslateViewController.m */,
230 | C9C090C918CEE6CE000E69CD /* MTZSpringAnimationTranslateViewController.xib */,
231 | );
232 | name = Translate;
233 | sourceTree = "";
234 | };
235 | C9C090CD18CEE6DD000E69CD /* Generic */ = {
236 | isa = PBXGroup;
237 | children = (
238 | C9C090C218CEDE63000E69CD /* MTZSpringAnimationViewerController.h */,
239 | C9C090C318CEDE63000E69CD /* MTZSpringAnimationViewerController.m */,
240 | );
241 | name = Generic;
242 | sourceTree = "";
243 | };
244 | C9C090CF18CEEC18000E69CD /* Helper */ = {
245 | isa = PBXGroup;
246 | children = (
247 | C9C090CE18CEE9A1000E69CD /* AbstractClass.h */,
248 | );
249 | name = Helper;
250 | sourceTree = "";
251 | };
252 | C9C090D818CF0A7A000E69CD /* Rotate */ = {
253 | isa = PBXGroup;
254 | children = (
255 | C9C090D318CF0A77000E69CD /* MTZSpringAnimationRotateViewController.h */,
256 | C9C090D418CF0A77000E69CD /* MTZSpringAnimationRotateViewController.m */,
257 | C9C090D518CF0A77000E69CD /* MTZSpringAnimationRotateViewController.xib */,
258 | );
259 | name = Rotate;
260 | sourceTree = "";
261 | };
262 | /* End PBXGroup section */
263 |
264 | /* Begin PBXNativeTarget section */
265 | C935722B18CEABF00022F5D6 /* SpringAnimation */ = {
266 | isa = PBXNativeTarget;
267 | buildConfigurationList = C935726118CEABF00022F5D6 /* Build configuration list for PBXNativeTarget "SpringAnimation" */;
268 | buildPhases = (
269 | C935722818CEABF00022F5D6 /* Sources */,
270 | C935722918CEABF00022F5D6 /* Frameworks */,
271 | C935722A18CEABF00022F5D6 /* Resources */,
272 | );
273 | buildRules = (
274 | );
275 | dependencies = (
276 | );
277 | name = SpringAnimation;
278 | productName = SpringDampingTest;
279 | productReference = C935722C18CEABF00022F5D6 /* SpringAnimation.app */;
280 | productType = "com.apple.product-type.application";
281 | };
282 | C935724F18CEABF00022F5D6 /* SpringAnimationTests */ = {
283 | isa = PBXNativeTarget;
284 | buildConfigurationList = C935726418CEABF00022F5D6 /* Build configuration list for PBXNativeTarget "SpringAnimationTests" */;
285 | buildPhases = (
286 | C935724C18CEABF00022F5D6 /* Sources */,
287 | C935724D18CEABF00022F5D6 /* Frameworks */,
288 | C935724E18CEABF00022F5D6 /* Resources */,
289 | );
290 | buildRules = (
291 | );
292 | dependencies = (
293 | C935725618CEABF00022F5D6 /* PBXTargetDependency */,
294 | );
295 | name = SpringAnimationTests;
296 | productName = SpringDampingTestTests;
297 | productReference = C935725018CEABF00022F5D6 /* SpringAnimationTests.xctest */;
298 | productType = "com.apple.product-type.bundle.unit-test";
299 | };
300 | /* End PBXNativeTarget section */
301 |
302 | /* Begin PBXProject section */
303 | C935722418CEABF00022F5D6 /* Project object */ = {
304 | isa = PBXProject;
305 | attributes = {
306 | CLASSPREFIX = MTZ;
307 | LastUpgradeCheck = 0700;
308 | ORGANIZATIONNAME = "Matt Zanchelli";
309 | TargetAttributes = {
310 | C935724F18CEABF00022F5D6 = {
311 | TestTargetID = C935722B18CEABF00022F5D6;
312 | };
313 | };
314 | };
315 | buildConfigurationList = C935722718CEABF00022F5D6 /* Build configuration list for PBXProject "SpringAnimation" */;
316 | compatibilityVersion = "Xcode 3.2";
317 | developmentRegion = English;
318 | hasScannedForEncodings = 0;
319 | knownRegions = (
320 | en,
321 | Base,
322 | );
323 | mainGroup = C935722318CEABF00022F5D6;
324 | productRefGroup = C935722D18CEABF00022F5D6 /* Products */;
325 | projectDirPath = "";
326 | projectRoot = "";
327 | targets = (
328 | C935722B18CEABF00022F5D6 /* SpringAnimation */,
329 | C935724F18CEABF00022F5D6 /* SpringAnimationTests */,
330 | );
331 | };
332 | /* End PBXProject section */
333 |
334 | /* Begin PBXResourcesBuildPhase section */
335 | C935722A18CEABF00022F5D6 /* Resources */ = {
336 | isa = PBXResourcesBuildPhase;
337 | buildActionMask = 2147483647;
338 | files = (
339 | C9C090C118CEDAEC000E69CD /* MTZSpringAnimationParametersViewController.xib in Resources */,
340 | C9C090BC18CED232000E69CD /* InfoPlist.strings in Resources */,
341 | C9C090CB18CEE6CE000E69CD /* MTZSpringAnimationTranslateViewController.xib in Resources */,
342 | C9C090BB18CED219000E69CD /* Main_iPad.storyboard in Resources */,
343 | C9C090A318CED13C000E69CD /* Images.xcassets in Resources */,
344 | C9C090D718CF0A77000E69CD /* MTZSpringAnimationRotateViewController.xib in Resources */,
345 | C914B28E18D6414B00EC9C80 /* MTZSpringAnimationExpandViewController.xib in Resources */,
346 | );
347 | runOnlyForDeploymentPostprocessing = 0;
348 | };
349 | C935724E18CEABF00022F5D6 /* Resources */ = {
350 | isa = PBXResourcesBuildPhase;
351 | buildActionMask = 2147483647;
352 | files = (
353 | );
354 | runOnlyForDeploymentPostprocessing = 0;
355 | };
356 | /* End PBXResourcesBuildPhase section */
357 |
358 | /* Begin PBXSourcesBuildPhase section */
359 | C935722818CEABF00022F5D6 /* Sources */ = {
360 | isa = PBXSourcesBuildPhase;
361 | buildActionMask = 2147483647;
362 | files = (
363 | C9C090C418CEDE63000E69CD /* MTZSpringAnimationViewerController.m in Sources */,
364 | C9C090CA18CEE6CE000E69CD /* MTZSpringAnimationTranslateViewController.m in Sources */,
365 | C9C090C018CEDAEC000E69CD /* MTZSpringAnimationParametersViewController.m in Sources */,
366 | C9C090ED18CFF696000E69CD /* MTZAnimationSelectTableViewController.m in Sources */,
367 | C9C090D218CEEC4F000E69CD /* MTZPlaybackControlsView.m in Sources */,
368 | C9C090A018CED136000E69CD /* MTZAppDelegate.m in Sources */,
369 | C914B28D18D6414B00EC9C80 /* MTZSpringAnimationExpandViewController.m in Sources */,
370 | C9C090AE18CED161000E69CD /* main.m in Sources */,
371 | C9C090A118CED136000E69CD /* MTZViewController.m in Sources */,
372 | C9C090D618CF0A77000E69CD /* MTZSpringAnimationRotateViewController.m in Sources */,
373 | );
374 | runOnlyForDeploymentPostprocessing = 0;
375 | };
376 | C935724C18CEABF00022F5D6 /* Sources */ = {
377 | isa = PBXSourcesBuildPhase;
378 | buildActionMask = 2147483647;
379 | files = (
380 | );
381 | runOnlyForDeploymentPostprocessing = 0;
382 | };
383 | /* End PBXSourcesBuildPhase section */
384 |
385 | /* Begin PBXTargetDependency section */
386 | C935725618CEABF00022F5D6 /* PBXTargetDependency */ = {
387 | isa = PBXTargetDependency;
388 | target = C935722B18CEABF00022F5D6 /* SpringAnimation */;
389 | targetProxy = C935725518CEABF00022F5D6 /* PBXContainerItemProxy */;
390 | };
391 | /* End PBXTargetDependency section */
392 |
393 | /* Begin PBXVariantGroup section */
394 | C9C090A418CED14C000E69CD /* Main_iPad.storyboard */ = {
395 | isa = PBXVariantGroup;
396 | children = (
397 | C9C090A518CED14C000E69CD /* Base */,
398 | );
399 | name = Main_iPad.storyboard;
400 | sourceTree = "";
401 | };
402 | C9C090AA18CED15D000E69CD /* InfoPlist.strings */ = {
403 | isa = PBXVariantGroup;
404 | children = (
405 | C9C090AB18CED15D000E69CD /* en */,
406 | );
407 | name = InfoPlist.strings;
408 | sourceTree = "";
409 | };
410 | C9C090B218CED183000E69CD /* InfoPlist.strings */ = {
411 | isa = PBXVariantGroup;
412 | children = (
413 | C9C090B318CED183000E69CD /* en */,
414 | );
415 | name = InfoPlist.strings;
416 | sourceTree = "";
417 | };
418 | /* End PBXVariantGroup section */
419 |
420 | /* Begin XCBuildConfiguration section */
421 | C935725F18CEABF00022F5D6 /* Debug */ = {
422 | isa = XCBuildConfiguration;
423 | buildSettings = {
424 | ALWAYS_SEARCH_USER_PATHS = NO;
425 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
426 | CLANG_CXX_LIBRARY = "libc++";
427 | CLANG_ENABLE_MODULES = YES;
428 | CLANG_ENABLE_OBJC_ARC = YES;
429 | CLANG_WARN_BOOL_CONVERSION = YES;
430 | CLANG_WARN_CONSTANT_CONVERSION = YES;
431 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
432 | CLANG_WARN_EMPTY_BODY = YES;
433 | CLANG_WARN_ENUM_CONVERSION = YES;
434 | CLANG_WARN_INT_CONVERSION = YES;
435 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
436 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
437 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
438 | COPY_PHASE_STRIP = NO;
439 | ENABLE_TESTABILITY = YES;
440 | GCC_C_LANGUAGE_STANDARD = gnu99;
441 | GCC_DYNAMIC_NO_PIC = NO;
442 | GCC_OPTIMIZATION_LEVEL = 0;
443 | GCC_PREPROCESSOR_DEFINITIONS = (
444 | "DEBUG=1",
445 | "$(inherited)",
446 | );
447 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
448 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
449 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
450 | GCC_WARN_UNDECLARED_SELECTOR = YES;
451 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
452 | GCC_WARN_UNUSED_FUNCTION = YES;
453 | GCC_WARN_UNUSED_VARIABLE = YES;
454 | IPHONEOS_DEPLOYMENT_TARGET = 7.1;
455 | ONLY_ACTIVE_ARCH = YES;
456 | SDKROOT = iphoneos;
457 | TARGETED_DEVICE_FAMILY = 2;
458 | };
459 | name = Debug;
460 | };
461 | C935726018CEABF00022F5D6 /* Release */ = {
462 | isa = XCBuildConfiguration;
463 | buildSettings = {
464 | ALWAYS_SEARCH_USER_PATHS = NO;
465 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
466 | CLANG_CXX_LIBRARY = "libc++";
467 | CLANG_ENABLE_MODULES = YES;
468 | CLANG_ENABLE_OBJC_ARC = YES;
469 | CLANG_WARN_BOOL_CONVERSION = YES;
470 | CLANG_WARN_CONSTANT_CONVERSION = YES;
471 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
472 | CLANG_WARN_EMPTY_BODY = YES;
473 | CLANG_WARN_ENUM_CONVERSION = YES;
474 | CLANG_WARN_INT_CONVERSION = YES;
475 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
476 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
477 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
478 | COPY_PHASE_STRIP = YES;
479 | ENABLE_NS_ASSERTIONS = NO;
480 | GCC_C_LANGUAGE_STANDARD = gnu99;
481 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
482 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
483 | GCC_WARN_UNDECLARED_SELECTOR = YES;
484 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
485 | GCC_WARN_UNUSED_FUNCTION = YES;
486 | GCC_WARN_UNUSED_VARIABLE = YES;
487 | IPHONEOS_DEPLOYMENT_TARGET = 7.1;
488 | SDKROOT = iphoneos;
489 | TARGETED_DEVICE_FAMILY = 2;
490 | VALIDATE_PRODUCT = YES;
491 | };
492 | name = Release;
493 | };
494 | C935726218CEABF00022F5D6 /* Debug */ = {
495 | isa = XCBuildConfiguration;
496 | buildSettings = {
497 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
498 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
499 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
500 | GCC_PREFIX_HEADER = "SpringAnimation/SpringAnimation-Prefix.pch";
501 | INFOPLIST_FILE = "SpringAnimation/SpringAnimation-Info.plist";
502 | PRODUCT_BUNDLE_IDENTIFIER = "mattzanchelli.${PRODUCT_NAME:rfc1034identifier}";
503 | PRODUCT_NAME = SpringAnimation;
504 | TARGETED_DEVICE_FAMILY = 2;
505 | WRAPPER_EXTENSION = app;
506 | };
507 | name = Debug;
508 | };
509 | C935726318CEABF00022F5D6 /* Release */ = {
510 | isa = XCBuildConfiguration;
511 | buildSettings = {
512 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
513 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
514 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
515 | GCC_PREFIX_HEADER = "SpringAnimation/SpringAnimation-Prefix.pch";
516 | INFOPLIST_FILE = "SpringAnimation/SpringAnimation-Info.plist";
517 | PRODUCT_BUNDLE_IDENTIFIER = "mattzanchelli.${PRODUCT_NAME:rfc1034identifier}";
518 | PRODUCT_NAME = SpringAnimation;
519 | TARGETED_DEVICE_FAMILY = 2;
520 | WRAPPER_EXTENSION = app;
521 | };
522 | name = Release;
523 | };
524 | C935726518CEABF00022F5D6 /* Debug */ = {
525 | isa = XCBuildConfiguration;
526 | buildSettings = {
527 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/SpringAnimation.app/SpringAnimation";
528 | FRAMEWORK_SEARCH_PATHS = (
529 | "$(SDKROOT)/Developer/Library/Frameworks",
530 | "$(inherited)",
531 | "$(DEVELOPER_FRAMEWORKS_DIR)",
532 | );
533 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
534 | GCC_PREFIX_HEADER = "SpringAnimation/SpringAnimation-Prefix.pch";
535 | GCC_PREPROCESSOR_DEFINITIONS = (
536 | "DEBUG=1",
537 | "$(inherited)",
538 | );
539 | INFOPLIST_FILE = "SpringAnimationTests/SpringAnimationTests-Info.plist";
540 | PRODUCT_BUNDLE_IDENTIFIER = "mattzanchelli.${PRODUCT_NAME:rfc1034identifier}";
541 | PRODUCT_NAME = SpringAnimationTests;
542 | TEST_HOST = "$(BUNDLE_LOADER)";
543 | WRAPPER_EXTENSION = xctest;
544 | };
545 | name = Debug;
546 | };
547 | C935726618CEABF00022F5D6 /* Release */ = {
548 | isa = XCBuildConfiguration;
549 | buildSettings = {
550 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/SpringAnimation.app/SpringAnimation";
551 | FRAMEWORK_SEARCH_PATHS = (
552 | "$(SDKROOT)/Developer/Library/Frameworks",
553 | "$(inherited)",
554 | "$(DEVELOPER_FRAMEWORKS_DIR)",
555 | );
556 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
557 | GCC_PREFIX_HEADER = "SpringAnimation/SpringAnimation-Prefix.pch";
558 | INFOPLIST_FILE = "SpringAnimationTests/SpringAnimationTests-Info.plist";
559 | PRODUCT_BUNDLE_IDENTIFIER = "mattzanchelli.${PRODUCT_NAME:rfc1034identifier}";
560 | PRODUCT_NAME = SpringAnimationTests;
561 | TEST_HOST = "$(BUNDLE_LOADER)";
562 | WRAPPER_EXTENSION = xctest;
563 | };
564 | name = Release;
565 | };
566 | /* End XCBuildConfiguration section */
567 |
568 | /* Begin XCConfigurationList section */
569 | C935722718CEABF00022F5D6 /* Build configuration list for PBXProject "SpringAnimation" */ = {
570 | isa = XCConfigurationList;
571 | buildConfigurations = (
572 | C935725F18CEABF00022F5D6 /* Debug */,
573 | C935726018CEABF00022F5D6 /* Release */,
574 | );
575 | defaultConfigurationIsVisible = 0;
576 | defaultConfigurationName = Release;
577 | };
578 | C935726118CEABF00022F5D6 /* Build configuration list for PBXNativeTarget "SpringAnimation" */ = {
579 | isa = XCConfigurationList;
580 | buildConfigurations = (
581 | C935726218CEABF00022F5D6 /* Debug */,
582 | C935726318CEABF00022F5D6 /* Release */,
583 | );
584 | defaultConfigurationIsVisible = 0;
585 | defaultConfigurationName = Release;
586 | };
587 | C935726418CEABF00022F5D6 /* Build configuration list for PBXNativeTarget "SpringAnimationTests" */ = {
588 | isa = XCConfigurationList;
589 | buildConfigurations = (
590 | C935726518CEABF00022F5D6 /* Debug */,
591 | C935726618CEABF00022F5D6 /* Release */,
592 | );
593 | defaultConfigurationIsVisible = 0;
594 | defaultConfigurationName = Release;
595 | };
596 | /* End XCConfigurationList section */
597 | };
598 | rootObject = C935722418CEABF00022F5D6 /* Project object */;
599 | }
600 |
--------------------------------------------------------------------------------
/SpringAnimation.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/SpringAnimation.xcodeproj/xcuserdata/matt.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | SpringAnimation.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | C935722B18CEABF00022F5D6
16 |
17 | primary
18 |
19 |
20 | C935724F18CEABF00022F5D6
21 |
22 | primary
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/SpringAnimation/AbstractClass.h:
--------------------------------------------------------------------------------
1 | //
2 | // AbstractClass.h
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/11/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #ifndef SpringAnimation_AbstractClass_h
10 | #define SpringAnimation_AbstractClass_h
11 |
12 | /// Put this as the implementation of abstract methods that must be overriden.
13 | /// @attribution http://stackoverflow.com/questions/1034373/creating-an-abstract-class-in-objective-c
14 | #define MTZ_METHOD_MUST_BE_OVERRIDDEN @throw [NSException exceptionWithName:NSInvalidArgumentException reason:[NSString stringWithFormat:@"%s must be overridden in a subclass", __PRETTY_FUNCTION__] userInfo:nil];
15 |
16 | #endif
17 |
--------------------------------------------------------------------------------
/SpringAnimation/Base.lproj/Main_iPad.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
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 |
83 |
84 |
85 |
86 |
87 |
88 |
--------------------------------------------------------------------------------
/SpringAnimation/Images.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "29x29",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "40x40",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "60x60",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "ipad",
20 | "size" : "29x29",
21 | "scale" : "1x"
22 | },
23 | {
24 | "idiom" : "ipad",
25 | "size" : "29x29",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "ipad",
30 | "size" : "40x40",
31 | "scale" : "1x"
32 | },
33 | {
34 | "idiom" : "ipad",
35 | "size" : "40x40",
36 | "scale" : "2x"
37 | },
38 | {
39 | "size" : "76x76",
40 | "idiom" : "ipad",
41 | "filename" : "Spring.png",
42 | "scale" : "1x"
43 | },
44 | {
45 | "size" : "76x76",
46 | "idiom" : "ipad",
47 | "filename" : "Spring@2x.png",
48 | "scale" : "2x"
49 | }
50 | ],
51 | "info" : {
52 | "version" : 1,
53 | "author" : "xcode"
54 | }
55 | }
--------------------------------------------------------------------------------
/SpringAnimation/Images.xcassets/AppIcon.appiconset/Spring.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdznr/Spring-Animation/761e0f29ff4dec3102f096e563d15027c1cd519b/SpringAnimation/Images.xcassets/AppIcon.appiconset/Spring.png
--------------------------------------------------------------------------------
/SpringAnimation/Images.xcassets/AppIcon.appiconset/Spring@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdznr/Spring-Animation/761e0f29ff4dec3102f096e563d15027c1cd519b/SpringAnimation/Images.xcassets/AppIcon.appiconset/Spring@2x.png
--------------------------------------------------------------------------------
/SpringAnimation/Images.xcassets/DownArrow.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "DownArrow.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x",
11 | "filename" : "DownArrow@2x.png"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/SpringAnimation/Images.xcassets/DownArrow.imageset/DownArrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdznr/Spring-Animation/761e0f29ff4dec3102f096e563d15027c1cd519b/SpringAnimation/Images.xcassets/DownArrow.imageset/DownArrow.png
--------------------------------------------------------------------------------
/SpringAnimation/Images.xcassets/DownArrow.imageset/DownArrow@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdznr/Spring-Animation/761e0f29ff4dec3102f096e563d15027c1cd519b/SpringAnimation/Images.xcassets/DownArrow.imageset/DownArrow@2x.png
--------------------------------------------------------------------------------
/SpringAnimation/Images.xcassets/LaunchImage.launchimage/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "orientation" : "portrait",
5 | "idiom" : "iphone",
6 | "extent" : "full-screen",
7 | "minimum-system-version" : "7.0",
8 | "scale" : "2x"
9 | },
10 | {
11 | "orientation" : "portrait",
12 | "idiom" : "iphone",
13 | "subtype" : "retina4",
14 | "extent" : "full-screen",
15 | "minimum-system-version" : "7.0",
16 | "scale" : "2x"
17 | },
18 | {
19 | "orientation" : "portrait",
20 | "idiom" : "ipad",
21 | "extent" : "full-screen",
22 | "minimum-system-version" : "7.0",
23 | "scale" : "1x"
24 | },
25 | {
26 | "orientation" : "landscape",
27 | "idiom" : "ipad",
28 | "extent" : "full-screen",
29 | "minimum-system-version" : "7.0",
30 | "scale" : "1x"
31 | },
32 | {
33 | "orientation" : "portrait",
34 | "idiom" : "ipad",
35 | "extent" : "full-screen",
36 | "minimum-system-version" : "7.0",
37 | "scale" : "2x"
38 | },
39 | {
40 | "orientation" : "landscape",
41 | "idiom" : "ipad",
42 | "extent" : "full-screen",
43 | "minimum-system-version" : "7.0",
44 | "scale" : "2x"
45 | }
46 | ],
47 | "info" : {
48 | "version" : 1,
49 | "author" : "xcode"
50 | }
51 | }
--------------------------------------------------------------------------------
/SpringAnimation/Images.xcassets/Play.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "Play.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x",
11 | "filename" : "Play@2x.png"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/SpringAnimation/Images.xcassets/Play.imageset/Play.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdznr/Spring-Animation/761e0f29ff4dec3102f096e563d15027c1cd519b/SpringAnimation/Images.xcassets/Play.imageset/Play.png
--------------------------------------------------------------------------------
/SpringAnimation/Images.xcassets/Play.imageset/Play@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdznr/Spring-Animation/761e0f29ff4dec3102f096e563d15027c1cd519b/SpringAnimation/Images.xcassets/Play.imageset/Play@2x.png
--------------------------------------------------------------------------------
/SpringAnimation/MTZAnimationSelectTableViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // MTZAnimationSelectTableViewController.h
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/11/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @class MTZAnimationSelectTableViewController;
12 |
13 | @protocol MTZAnimationSelectTableViewControllerDelgate
14 |
15 | /// An animation was selected.
16 | /// @param tableViewController The table view controller sending this message.
17 | /// @param name The name of the animation that was selected.
18 | - (void)tableViewController:(MTZAnimationSelectTableViewController *)tableViewController
19 | didSelectAnimationNamed:(NSString *)name;
20 |
21 | @end
22 |
23 |
24 | @interface MTZAnimationSelectTableViewController : UITableViewController
25 |
26 | /// The animation select table view controller's delegate
27 | @property (nonatomic) id delegate;
28 |
29 | /// The names of all the animations shown.
30 | @property (strong, nonatomic) NSArray *animationNames;
31 |
32 | /// The name of the selected animation in the table view.
33 | @property (strong, nonatomic) NSString *currentAnimationName;
34 |
35 | @end
36 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZAnimationSelectTableViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // MTZAnimationSelectTableViewController.m
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/11/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import "MTZAnimationSelectTableViewController.h"
10 |
11 | @interface MTZAnimationSelectTableViewController ()
12 |
13 | @end
14 |
15 |
16 | @implementation MTZAnimationSelectTableViewController
17 |
18 | - (void)viewDidLoad
19 | {
20 | [super viewDidLoad];
21 | }
22 |
23 |
24 | - (void)setCurrentAnimationName:(NSString *)currentAnimationName
25 | {
26 | for ( NSUInteger i=0; i
10 |
11 | @interface MTZAppDelegate : UIResponder
12 |
13 | @property (strong, nonatomic) UIWindow *window;
14 |
15 | @end
16 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZAppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // MTZAppDelegate.m
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/10/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import "MTZAppDelegate.h"
10 |
11 | @implementation MTZAppDelegate
12 |
13 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
14 | {
15 | // Override point for customization after application launch.
16 | return YES;
17 | }
18 |
19 | - (void)applicationWillResignActive:(UIApplication *)application
20 | {
21 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
22 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
23 | }
24 |
25 | - (void)applicationDidEnterBackground:(UIApplication *)application
26 | {
27 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
28 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
29 | }
30 |
31 | - (void)applicationWillEnterForeground:(UIApplication *)application
32 | {
33 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
34 | }
35 |
36 | - (void)applicationDidBecomeActive:(UIApplication *)application
37 | {
38 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
39 | }
40 |
41 | - (void)applicationWillTerminate:(UIApplication *)application
42 | {
43 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
44 | }
45 |
46 | @end
47 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZPlaybackControlsView.h:
--------------------------------------------------------------------------------
1 | //
2 | // MTZPlaybackControlsView.h
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/11/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface MTZPlaybackControlsView : UIView
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZPlaybackControlsView.m:
--------------------------------------------------------------------------------
1 | //
2 | // MTZPlaybackControlsView.m
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/11/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import "MTZPlaybackControlsView.h"
10 |
11 | @interface MTZPlaybackControlsView ()
12 |
13 | @property (strong, nonatomic) UIButton *playPauseButton;
14 |
15 | @end
16 |
17 | @implementation MTZPlaybackControlsView
18 |
19 | - (instancetype)initWithFrame:(CGRect)frame
20 | {
21 | self = [super initWithFrame:frame];
22 | if (self) {
23 | // Initialization code
24 | [self __MTZPlaybackControlsView__setup];
25 | }
26 | return self;
27 | }
28 |
29 | - (instancetype)initWithCoder:(NSCoder *)aDecoder
30 | {
31 | self = [super initWithCoder:aDecoder];
32 | if (self) {
33 | // Initialization code
34 | [self __MTZPlaybackControlsView__setup];
35 | }
36 | return self;
37 | }
38 |
39 | - (instancetype)init
40 | {
41 | self = [super init];
42 | if (self) {
43 | // Initialization code
44 | [self __MTZPlaybackControlsView__setup];
45 | }
46 | return self;
47 | }
48 |
49 | - (void)__MTZPlaybackControlsView__setup
50 | {
51 | // Light gray background.
52 | self.backgroundColor = [UIColor lightGrayColor];
53 |
54 | // Play/Pause button on the left.
55 | _playPauseButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, self.frame.size.height)];
56 | _playPauseButton.autoresizingMask = UIViewAutoresizingFlexibleHeight;
57 | [_playPauseButton setImage:nil forState:UIControlStateNormal];
58 |
59 | [self addSubview:_playPauseButton];
60 | }
61 |
62 | @end
63 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZSpringAnimationExpandViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // MTZSpringAnimationExpandViewController.h
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/16/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import "MTZSpringAnimationViewerController.h"
10 |
11 | @interface MTZSpringAnimationExpandViewController : MTZSpringAnimationViewerController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZSpringAnimationExpandViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // MTZSpringAnimationExpandViewController.m
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/16/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import "MTZSpringAnimationExpandViewController.h"
10 |
11 | @interface MTZSpringAnimationExpandViewController ()
12 |
13 | @property (weak, nonatomic) IBOutlet UIView *blockView;
14 |
15 | @end
16 |
17 | @implementation MTZSpringAnimationExpandViewController
18 |
19 | - (void)animate
20 | {
21 | // Scale the block up.
22 | _blockView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.618, 1.618);
23 | }
24 |
25 | - (void)reset
26 | {
27 | // Put the test view back where it belongs.
28 | _blockView.transform = CGAffineTransformIdentity;
29 | }
30 |
31 | @end
32 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZSpringAnimationExpandViewController.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 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZSpringAnimationParametersViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // MTZSpringAnimationParametersViewController.h
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/11/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface MTZSpringAnimationParametersViewController : UIViewController
12 |
13 | /// The desired duration of the spring animation.
14 | @property (readonly) float duration;
15 |
16 | /// The desired damping ratio of the spring animation.
17 | @property (readonly) float dampingRatio;
18 |
19 | /// The desired initial velocity of the spring animation.
20 | @property (readonly) float velocity;
21 |
22 | @end
23 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZSpringAnimationParametersViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // MTZSpringAnimationParametersViewController.m
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/11/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import "MTZSpringAnimationParametersViewController.h"
10 |
11 | @interface MTZSpringAnimationParametersViewController ()
12 |
13 | /// The label for the example code.
14 | @property (weak, nonatomic) IBOutlet UILabel *codeLabel;
15 |
16 | /// The slider for the animation duration parameter.
17 | @property (weak, nonatomic) IBOutlet UISlider *durationSlider;
18 | /// The slider for the spring damping parameter.
19 | @property (weak, nonatomic) IBOutlet UISlider *dampingSlider;
20 | /// The slider for the inital velocity parameter.
21 | @property (weak, nonatomic) IBOutlet UISlider *velocitySlider;
22 |
23 | @end
24 |
25 | @implementation MTZSpringAnimationParametersViewController
26 |
27 | - (void)viewDidLoad
28 | {
29 | [super viewDidLoad];
30 |
31 | // Force update of parameter values in example code.
32 | [self parameterSliderDidChange:nil];
33 | }
34 |
35 | /// Perfomed when parameter slider values are changed.
36 | - (IBAction)parameterSliderDidChange:(id)sender
37 | {
38 | // The example code.
39 | NSString *string = [NSString stringWithFormat:@" [UIView animateWithDuration:%.2f\n delay:0.0\n usingSpringWithDamping:%.2f\n initialSpringVelocity:%.2f\n options:0\n animations:...\n completion:...];", _durationSlider.value, _dampingSlider.value, _velocitySlider.value];
40 |
41 | // Create an attributed string to color in the parameters.
42 | NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:string];
43 |
44 |
45 | #warning What is the easiest way to not hard-code the location of each parameter?
46 |
47 | // Duration
48 | [attrString addAttribute:NSForegroundColorAttributeName
49 | value:_durationSlider.tintColor
50 | range:NSMakeRange(32, 4)];
51 |
52 | // Damping
53 | [attrString addAttribute:NSForegroundColorAttributeName
54 | value:_dampingSlider.tintColor
55 | range:NSMakeRange(105, 4)];
56 |
57 | // Initial Velocity
58 | [attrString addAttribute:NSForegroundColorAttributeName
59 | value:_velocitySlider.tintColor
60 | range:NSMakeRange(142, 4)];
61 |
62 | // Update the code label.
63 | _codeLabel.attributedText = attrString;
64 | }
65 |
66 |
67 | #pragma mark Public Properties
68 |
69 | - (float)duration
70 | {
71 | return _durationSlider.value;
72 | }
73 |
74 | - (float)dampingRatio
75 | {
76 | return _dampingSlider.value;
77 | }
78 |
79 | - (float)velocity
80 | {
81 | return _velocitySlider.value;
82 | }
83 |
84 | @end
85 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZSpringAnimationParametersViewController.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZSpringAnimationRotateViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // MTZSpringAnimationRotateViewController.h
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/11/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import "MTZSpringAnimationViewerController.h"
10 |
11 | @interface MTZSpringAnimationRotateViewController : MTZSpringAnimationViewerController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZSpringAnimationRotateViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // MTZSpringAnimationRotateViewController.m
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/11/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import "MTZSpringAnimationRotateViewController.h"
10 |
11 | @interface MTZSpringAnimationRotateViewController ()
12 |
13 | @property (weak, nonatomic) IBOutlet UIView *blockView;
14 |
15 | @end
16 |
17 | @implementation MTZSpringAnimationRotateViewController
18 |
19 | - (void)animate
20 | {
21 | // Translate the block over 320 points.
22 | _blockView.transform = CGAffineTransformRotate(CGAffineTransformIdentity, M_PI_2);
23 | }
24 |
25 | - (void)reset
26 | {
27 | // Put the test view back where it belongs.
28 | _blockView.transform = CGAffineTransformIdentity;
29 | }
30 |
31 | @end
32 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZSpringAnimationRotateViewController.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 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZSpringAnimationTranslateViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // MTZSpringAnimationTranslateViewController.h
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/11/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import "MTZSpringAnimationViewerController.h"
10 |
11 | @interface MTZSpringAnimationTranslateViewController : MTZSpringAnimationViewerController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZSpringAnimationTranslateViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // MTZSpringAnimationTranslateViewController.m
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/11/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import "MTZSpringAnimationTranslateViewController.h"
10 |
11 | @interface MTZSpringAnimationTranslateViewController ()
12 |
13 | @property (weak, nonatomic) IBOutlet UIView *blockView;
14 |
15 | @end
16 |
17 | @implementation MTZSpringAnimationTranslateViewController
18 |
19 | - (void)animate
20 | {
21 | // Translate the block over 320 points.
22 | _blockView.transform = CGAffineTransformTranslate(CGAffineTransformIdentity, 320, 0);
23 | }
24 |
25 | - (void)reset
26 | {
27 | // Put the test view back where it belongs.
28 | _blockView.transform = CGAffineTransformIdentity;
29 | }
30 |
31 | @end
32 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZSpringAnimationTranslateViewController.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 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZSpringAnimationViewerController.h:
--------------------------------------------------------------------------------
1 | //
2 | // MTZSpringAnimationViewerController.h
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/11/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | #define TIME_TO_WAIT_AFTER_ANIMATION 1
12 |
13 | @interface MTZSpringAnimationViewerController : UIViewController
14 |
15 | /*
16 | Defines an abstract class for a view controller with demo spring animations.
17 | This class itself does not have any spring animation. You must subclass to use.
18 | */
19 |
20 |
21 | #pragma mark - Public API
22 |
23 | /// Begin the spring animation.
24 | /// @discussion This method is not meant to be overriden.
25 | - (void)animateWithDuration:(NSTimeInterval)duration
26 | usingSpringWithDamping:(float)dampingRatio
27 | initialSpringVelocity:(float)velocity;
28 |
29 |
30 | #pragma mark - Methods for Subclasses to Override.
31 |
32 | /// The animation to demonstrate.
33 | /// @discussion Do not call this method directly.
34 | /// @discussion Subclasses must override this method. Do not call this method on @c super.
35 | - (void)animate;
36 |
37 | /// Reset the state of the animation to the beginning.
38 | /// @discussion Do not call this method directly.
39 | /// @discussion Subclasses must override this method. Do not call this method on @c super.
40 | - (void)reset;
41 |
42 | @end
43 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZSpringAnimationViewerController.m:
--------------------------------------------------------------------------------
1 | //
2 | // MTZSpringAnimationViewerController.m
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/11/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import "MTZSpringAnimationViewerController.h"
10 |
11 | #import "AbstractClass.h"
12 |
13 | @interface MTZSpringAnimationViewerController ()
14 |
15 | @end
16 |
17 | @implementation MTZSpringAnimationViewerController
18 |
19 | - (void)animateWithDuration:(NSTimeInterval)duration
20 | usingSpringWithDamping:(float)dampingRatio
21 | initialSpringVelocity:(float)velocity
22 | {
23 | // Ensure animation won't be interrupted by a pending reset (completion of a prior animation).
24 | [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(reset) object:nil];
25 |
26 | // Reset the animation.
27 | [self reset];
28 |
29 | // Perform the spring animation.
30 | [UIView animateWithDuration:duration
31 | delay:0.0f
32 | usingSpringWithDamping:dampingRatio
33 | initialSpringVelocity:velocity
34 | options:0
35 | animations:^{
36 | // Perform the subclass's animation.
37 | [self animate];
38 | }
39 | completion:^(BOOL finished) {
40 | // Reset shortly after the expected completion of the animation.
41 | [self performSelector:@selector(reset)
42 | withObject:nil
43 | afterDelay:TIME_TO_WAIT_AFTER_ANIMATION];
44 | }];
45 | }
46 |
47 | - (void)animate
48 | {
49 | // Empty implementation.
50 | // Subclasses must override this method.
51 | MTZ_METHOD_MUST_BE_OVERRIDDEN
52 | }
53 |
54 | - (void)reset
55 | {
56 | // Empty implementation.
57 | // Subclasses must override this method.
58 | MTZ_METHOD_MUST_BE_OVERRIDDEN
59 | }
60 |
61 | @end
62 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // MTZViewController.h
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/10/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface MTZViewController : UIViewController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/SpringAnimation/MTZViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // MTZViewController.m
3 | // SpringAnimation
4 | //
5 | // Created by Matt Zanchelli on 3/10/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import "MTZViewController.h"
10 |
11 | #import "MTZSpringAnimationParametersViewController.h"
12 |
13 | #import "MTZSpringAnimationTranslateViewController.h"
14 | #import "MTZSpringAnimationRotateViewController.h"
15 | #import "MTZSpringAnimationExpandViewController.h"
16 | #import "MTZAnimationSelectTableViewController.h"
17 |
18 | @interface MTZViewController ()
19 |
20 | @property (weak, nonatomic) IBOutlet UINavigationBar *navigationBar;
21 |
22 | /// The control to interact with in the title view of the navigation bar.
23 | @property (strong, nonatomic) UIButton *titleButton;
24 |
25 | /// The animation names and corresponding classes.
26 | @property (strong, nonatomic) NSDictionary *animations;
27 |
28 | /// The table view controller for selecting the animation (appears in a popover).
29 | @property (strong, nonatomic) MTZAnimationSelectTableViewController *animationsList;
30 |
31 | /// The popover showing the list of animations.
32 | @property (strong, nonatomic) UIPopoverController *animationsSelectPopover;
33 |
34 | /// The view controller housing the parameters of a spring animation.
35 | @property (strong, nonatomic) MTZSpringAnimationParametersViewController *parametersVC;
36 |
37 | /// The view controller housing the animations.
38 | @property (strong, nonatomic) MTZSpringAnimationViewerController *animationsVC;
39 |
40 | /// The subview for the animations view.
41 | @property (weak, nonatomic) IBOutlet UIView *animationsView;
42 |
43 | /// The subview for the parameters view.
44 | @property (weak, nonatomic) IBOutlet UIView *parametersView;
45 |
46 | /// The subview for the playback controls.
47 | @property (weak, nonatomic) IBOutlet UIView *playBackControls;
48 | @property (weak, nonatomic) IBOutlet UIProgressView *progressView;
49 |
50 | @end
51 |
52 | @implementation MTZViewController
53 |
54 | - (void)viewDidLoad
55 | {
56 | [super viewDidLoad];
57 | // Do any additional setup after loading the view, typically from a nib.
58 |
59 | // All the possible animations.
60 | _animations = @{
61 | @"Translate": [MTZSpringAnimationTranslateViewController class],
62 | @"Rotate": [MTZSpringAnimationRotateViewController class],
63 | @"Expand": [MTZSpringAnimationExpandViewController class]
64 | };
65 |
66 | // Create the means to select the animation.
67 | _titleButton = [UIButton buttonWithType:UIButtonTypeSystem];
68 | _titleButton.frame = CGRectMake(0, 0, 100, 40);
69 | _titleButton.titleLabel.font = [UIFont boldSystemFontOfSize:17.0f];
70 | [_titleButton setTitleColor:[UIApplication sharedApplication].keyWindow.tintColor
71 | forState:UIControlStateNormal];
72 | UIImage *image = [UIImage imageNamed:@"DownArrow"];
73 | [_titleButton setImage:image forState:UIControlStateNormal];
74 | [_titleButton addTarget:self action:@selector(didTapTitle:) forControlEvents:UIControlEventTouchUpInside];
75 |
76 | // Add the item to the navigation bar.
77 | UINavigationItem *item = [[UINavigationItem alloc] init];
78 | item.titleView = _titleButton;
79 | self.navigationBar.items = @[item];
80 |
81 | // Create the animation select table view.
82 | self.animationsList = [[MTZAnimationSelectTableViewController alloc] initWithStyle:UITableViewStylePlain];
83 | self.animationsList.delegate = self;
84 | self.animationsList.animationNames = [self.animations allKeys];
85 |
86 | // Create the popover.
87 | self.animationsSelectPopover = [[UIPopoverController alloc] initWithContentViewController:self.animationsList];
88 | self.animationsSelectPopover.popoverContentSize = CGSizeMake(280, 132);
89 |
90 | // Create parameters view controller.
91 | self.parametersVC = [[MTZSpringAnimationParametersViewController alloc] initWithNibName:@"MTZSpringAnimationParametersViewController" bundle:nil];
92 | // Add it to the appropriate container view.
93 | [self.parametersView addSubview:self.parametersVC.view];
94 |
95 | // The default animation.
96 | [self loadAnimationNamed:@"Translate"];
97 | }
98 |
99 | - (void)loadAnimationNamed:(NSString *)name
100 | {
101 | // Find the animation.
102 | BOOL foundAnimation = NO;
103 | for ( NSString *animationName in [self.animations allKeys] ) {
104 | if ( [animationName isEqualToString:name] ) {
105 | // Create the animations view controller.
106 | Class animationVC = [self.animations valueForKey:animationName];
107 | NSString *nibName = NSStringFromClass(animationVC);
108 | self.animationsVC = [[animationVC alloc] initWithNibName:nibName bundle:nil];;
109 | foundAnimation = YES;
110 | break;
111 | }
112 | }
113 |
114 | if ( !foundAnimation ) {
115 | NSLog(@"Error: No animation named \"%@\"", name);
116 | return;
117 | }
118 |
119 | // Update the title (in the navigation bar).
120 | self.title = name;
121 |
122 | // Remove all subviews of animations view
123 | for ( UIView *subview in [self.animationsView subviews] ) {
124 | [subview removeFromSuperview];
125 | }
126 |
127 | // Add it to the appropriate container view.
128 | [self.animationsView addSubview:self.animationsVC.view];
129 | }
130 |
131 | - (void)setTitle:(NSString *)title
132 | {
133 | [super setTitle:title];
134 | [_titleButton setTitle:title forState:UIControlStateNormal];
135 |
136 | UIImage *image = [_titleButton imageForState:UIControlStateNormal];
137 |
138 | _titleButton.imageEdgeInsets = UIEdgeInsetsMake(0.0f, _titleButton.frame.size.width - image.size.width, 0.0f, 0.0f);
139 | _titleButton.titleEdgeInsets = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, image.size.width);
140 | }
141 |
142 | // When the animate/play button is tapped.
143 | - (IBAction)animate:(id)sender
144 | {
145 | // Tell the animations view controller to animate based on the parameters.
146 | [self.animationsVC animateWithDuration:self.parametersVC.duration
147 | usingSpringWithDamping:self.parametersVC.dampingRatio
148 | initialSpringVelocity:self.parametersVC.velocity];
149 |
150 | [NSObject cancelPreviousPerformRequestsWithTarget:self
151 | selector:@selector(resetProgress)
152 | object:nil];
153 | [self resetProgress];
154 |
155 | // Animate the progress of the animation at the same rate.
156 | [UIView animateWithDuration:self.parametersVC.duration
157 | delay:0.0f
158 | options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveLinear
159 | animations:^{
160 | [self.progressView setProgress:1.0f animated:YES];
161 | }
162 | completion:^(BOOL finished) {}];
163 |
164 | // Reset the progress view after the completion of the animation.
165 | [self performSelector:@selector(resetProgress)
166 | withObject:nil
167 | afterDelay:self.parametersVC.duration + TIME_TO_WAIT_AFTER_ANIMATION];
168 | }
169 |
170 | // The animation ended, reset the progress bar.
171 | - (void)resetProgress
172 | {
173 | [self.progressView setProgress:0.0f animated:NO];
174 | }
175 |
176 | // The title in the navigation bar was tapped.
177 | - (void)didTapTitle:(id)sender
178 | {
179 | NSString *currentAnimationName = [self.titleButton titleForState:UIControlStateNormal];
180 | MTZAnimationSelectTableViewController *vc = (MTZAnimationSelectTableViewController *) self.animationsSelectPopover.contentViewController;
181 | vc.currentAnimationName = currentAnimationName;
182 |
183 | [self.animationsSelectPopover presentPopoverFromRect:self.navigationBar.frame
184 | inView:self.view
185 | permittedArrowDirections:UIPopoverArrowDirectionUp
186 | animated:YES];
187 | }
188 |
189 |
190 | #pragma mark - MTZAnimationSelectTableViewControllerDelgate
191 |
192 | - (void)tableViewController:(MTZAnimationSelectTableViewController *)tableViewController
193 | didSelectAnimationNamed:(NSString *)name
194 | {
195 | [self loadAnimationNamed:name];
196 | [self.animationsSelectPopover dismissPopoverAnimated:YES];
197 | }
198 |
199 |
200 | #pragma mark - UIViewController Misc.
201 |
202 | - (BOOL)prefersStatusBarHidden
203 | {
204 | return YES;
205 | }
206 |
207 | @end
208 |
--------------------------------------------------------------------------------
/SpringAnimation/SpringAnimation-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleDisplayName
8 | ${PRODUCT_NAME}
9 | CFBundleExecutable
10 | ${EXECUTABLE_NAME}
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | ${PRODUCT_NAME}
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleSignature
22 | ????
23 | CFBundleURLTypes
24 |
25 |
26 | CFBundleURLName
27 | com.mattzanchelli.SpringAnimation
28 | CFBundleURLSchemes
29 |
30 | springanimation
31 |
32 |
33 |
34 | CFBundleVersion
35 | 1.0
36 | LSRequiresIPhoneOS
37 |
38 | UIMainStoryboardFile
39 | Main_iPhone
40 | UIMainStoryboardFile~ipad
41 | Main_iPad
42 | UIRequiredDeviceCapabilities
43 |
44 | armv7
45 |
46 | UIStatusBarHidden
47 |
48 | UISupportedInterfaceOrientations
49 |
50 | UIInterfaceOrientationPortrait
51 |
52 | UISupportedInterfaceOrientations~ipad
53 |
54 | UIInterfaceOrientationPortrait
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/SpringAnimation/SpringAnimation-Prefix.pch:
--------------------------------------------------------------------------------
1 | //
2 | // Prefix header
3 | //
4 | // The contents of this file are implicitly included at the beginning of every source file.
5 | //
6 |
7 | #import
8 |
9 | #ifndef __IPHONE_5_0
10 | #warning "This project uses features only available in iOS SDK 5.0 and later."
11 | #endif
12 |
13 | #ifdef __OBJC__
14 | #import
15 | #import
16 | #endif
17 |
--------------------------------------------------------------------------------
/SpringAnimation/en.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Localized versions of Info.plist keys */
2 |
3 |
--------------------------------------------------------------------------------
/SpringAnimation/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // SpringDampingTest
4 | //
5 | // Created by Matt Zanchelli on 3/10/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | #import "MTZAppDelegate.h"
12 |
13 | int main(int argc, char * argv[])
14 | {
15 | @autoreleasepool {
16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([MTZAppDelegate class]));
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/SpringAnimationTests/SpringAnimationTests-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 | CFBundlePackageType
14 | BNDL
15 | CFBundleShortVersionString
16 | 1.0
17 | CFBundleSignature
18 | ????
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/SpringAnimationTests/SpringAnimationTests.m:
--------------------------------------------------------------------------------
1 | //
2 | // SpringDampingTestTests.m
3 | // SpringAnimationTests
4 | //
5 | // Created by Matt Zanchelli on 3/10/14.
6 | // Copyright (c) 2014 Matt Zanchelli. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface SpringDampingTestTests : XCTestCase
12 |
13 | @end
14 |
15 | @implementation SpringDampingTestTests
16 |
17 | - (void)setUp
18 | {
19 | [super setUp];
20 | // Put setup code here. This method is called before the invocation of each test method in the class.
21 | }
22 |
23 | - (void)tearDown
24 | {
25 | // Put teardown code here. This method is called after the invocation of each test method in the class.
26 | [super tearDown];
27 | }
28 |
29 | - (void)testExample
30 | {
31 | XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__);
32 | }
33 |
34 | @end
35 |
--------------------------------------------------------------------------------
/SpringAnimationTests/en.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Localized versions of Info.plist keys */
2 |
3 |
--------------------------------------------------------------------------------
/demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdznr/Spring-Animation/761e0f29ff4dec3102f096e563d15027c1cd519b/demo.gif
--------------------------------------------------------------------------------
/demo.mov:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdznr/Spring-Animation/761e0f29ff4dec3102f096e563d15027c1cd519b/demo.mov
--------------------------------------------------------------------------------