├── .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 | ![Spring Animation Demonstration App](demo.gif) 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 --------------------------------------------------------------------------------