├── .gitignore ├── .gitmodules ├── Cartfile ├── Cartfile.private ├── Cartfile.resolved ├── LICENSE.md ├── README.md ├── ReactiveAnimation.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcshareddata │ └── xcschemes │ ├── ReactiveAnimation Mac.xcscheme │ └── ReactiveAnimation iOS.xcscheme ├── ReactiveAnimation.xcworkspace └── contents.xcworkspacedata ├── ReactiveAnimation ├── Animation.swift ├── Info.plist ├── ReactiveAnimation.h └── View.swift └── ReactiveAnimationTests ├── Info.plist ├── ReactiveAnimationTests-Bridging-Header.h ├── ReactiveAnimationTests.m └── SwiftJunk.swift /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | xcuserdata 13 | *.xccheckout 14 | *.moved-aside 15 | DerivedData 16 | *.hmap 17 | *.ipa 18 | *.xcuserstate 19 | 20 | # CocoaPods 21 | # 22 | # We recommend against adding the Pods directory to your .gitignore. However 23 | # you should judge for yourself, the pros and cons are mentioned at: 24 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 25 | # 26 | # Pods/ 27 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "Carthage/Checkouts/LlamaKit"] 2 | path = Carthage/Checkouts/LlamaKit 3 | url = https://github.com/LlamaKit/LlamaKit.git 4 | [submodule "Carthage/Checkouts/xcconfigs"] 5 | path = Carthage/Checkouts/xcconfigs 6 | url = https://github.com/jspahrsummers/xcconfigs.git 7 | [submodule "Carthage/Checkouts/ReactiveCocoa"] 8 | path = Carthage/Checkouts/ReactiveCocoa 9 | url = https://github.com/ReactiveCocoa/ReactiveCocoa.git 10 | -------------------------------------------------------------------------------- /Cartfile: -------------------------------------------------------------------------------- 1 | github "ReactiveCocoa/ReactiveCocoa" "v3.0-alpha.3" 2 | -------------------------------------------------------------------------------- /Cartfile.private: -------------------------------------------------------------------------------- 1 | github "jspahrsummers/xcconfigs" 2 | -------------------------------------------------------------------------------- /Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "LlamaKit/LlamaKit" "v0.6.0" 2 | github "jspahrsummers/xcconfigs" "0.7.2" 3 | github "ReactiveCocoa/ReactiveCocoa" "ad02d8356b43e2c38f3d4d87ea0127c5f8572668" 4 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | **The MIT License (MIT)**
2 | Copyright (c) ReactiveAnimation contributors 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ReactiveAnimation [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 2 | 3 | Declarative animations using [ReactiveCocoa](https://github.com/ReactiveCocoa/ReactiveCocoa) signals. See the [Mac 4 | demo](https://github.com/ReactiveCocoa/ReactiveAnimation-MacDemo) for an example 5 | of how the library works. 6 | 7 | ReactiveAnimation is released under the [MIT license](LICENSE.md). 8 | 9 | ### Getting Started 10 | 11 | To import the ReactiveAnimation framework, add `ReactiveAnimation.xcodeproj` as 12 | a subproject and add the appropriate framework target to your application. 13 | 14 | Alternatively, you can use [Carthage](https://github.com/Carthage/Carthage) to 15 | build the framework for you. 16 | -------------------------------------------------------------------------------- /ReactiveAnimation.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D04EE1F01ABFB9AD00AC8E65 /* ReactiveAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = D04EE1EF1ABFB9AD00AC8E65 /* ReactiveAnimation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | D04EE1F61ABFB9AD00AC8E65 /* ReactiveAnimation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D04EE1EA1ABFB9AD00AC8E65 /* ReactiveAnimation.framework */; }; 12 | D04EE1FD1ABFB9AD00AC8E65 /* ReactiveAnimationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D04EE1FC1ABFB9AD00AC8E65 /* ReactiveAnimationTests.m */; }; 13 | D04EE22E1ABFBA1E00AC8E65 /* ReactiveAnimation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D04EE2231ABFBA1E00AC8E65 /* ReactiveAnimation.framework */; }; 14 | D04EE2461ABFBB0200AC8E65 /* ReactiveAnimationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D04EE1FC1ABFB9AD00AC8E65 /* ReactiveAnimationTests.m */; }; 15 | D04EE2471ABFBB0400AC8E65 /* ReactiveAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = D04EE1EF1ABFB9AD00AC8E65 /* ReactiveAnimation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16 | D04EE24E1ABFBB6900AC8E65 /* LlamaKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D04EE24C1ABFBB6900AC8E65 /* LlamaKit.framework */; }; 17 | D04EE24F1ABFBB6900AC8E65 /* ReactiveCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D04EE24D1ABFBB6900AC8E65 /* ReactiveCocoa.framework */; }; 18 | D04EE2501ABFBB8500AC8E65 /* LlamaKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D04EE24C1ABFBB6900AC8E65 /* LlamaKit.framework */; }; 19 | D04EE2511ABFBB8500AC8E65 /* ReactiveCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D04EE24D1ABFBB6900AC8E65 /* ReactiveCocoa.framework */; }; 20 | D04EE2521ABFBB8900AC8E65 /* LlamaKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D04EE24C1ABFBB6900AC8E65 /* LlamaKit.framework */; }; 21 | D04EE2531ABFBB8900AC8E65 /* ReactiveCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D04EE24D1ABFBB6900AC8E65 /* ReactiveCocoa.framework */; }; 22 | D04EE2541ABFBB9100AC8E65 /* LlamaKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D04EE24C1ABFBB6900AC8E65 /* LlamaKit.framework */; }; 23 | D04EE2551ABFBB9100AC8E65 /* ReactiveCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D04EE24D1ABFBB6900AC8E65 /* ReactiveCocoa.framework */; }; 24 | D04EE2571ABFBBB100AC8E65 /* LlamaKit.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = D04EE24C1ABFBB6900AC8E65 /* LlamaKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 25 | D04EE2581ABFBBB100AC8E65 /* ReactiveCocoa.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = D04EE24D1ABFBB6900AC8E65 /* ReactiveCocoa.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 26 | D04EE25C1ABFBBDF00AC8E65 /* SwiftJunk.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04EE25B1ABFBBDF00AC8E65 /* SwiftJunk.swift */; }; 27 | D04EE25D1ABFBBDF00AC8E65 /* SwiftJunk.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04EE25B1ABFBBDF00AC8E65 /* SwiftJunk.swift */; }; 28 | D04EE2601ABFBD9100AC8E65 /* Animation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04EE25F1ABFBD9100AC8E65 /* Animation.swift */; }; 29 | D04EE2611ABFBD9100AC8E65 /* Animation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04EE25F1ABFBD9100AC8E65 /* Animation.swift */; }; 30 | D04EE2671ABFC79200AC8E65 /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04EE2661ABFC79200AC8E65 /* View.swift */; }; 31 | D04EE2681ABFC79200AC8E65 /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04EE2661ABFC79200AC8E65 /* View.swift */; }; 32 | /* End PBXBuildFile section */ 33 | 34 | /* Begin PBXContainerItemProxy section */ 35 | D04EE1F71ABFB9AD00AC8E65 /* PBXContainerItemProxy */ = { 36 | isa = PBXContainerItemProxy; 37 | containerPortal = D04EE1E11ABFB9AD00AC8E65 /* Project object */; 38 | proxyType = 1; 39 | remoteGlobalIDString = D04EE1E91ABFB9AD00AC8E65; 40 | remoteInfo = ReactiveAnimation; 41 | }; 42 | D04EE22F1ABFBA1E00AC8E65 /* PBXContainerItemProxy */ = { 43 | isa = PBXContainerItemProxy; 44 | containerPortal = D04EE1E11ABFB9AD00AC8E65 /* Project object */; 45 | proxyType = 1; 46 | remoteGlobalIDString = D04EE2221ABFBA1E00AC8E65; 47 | remoteInfo = ReactiveAnimation; 48 | }; 49 | /* End PBXContainerItemProxy section */ 50 | 51 | /* Begin PBXCopyFilesBuildPhase section */ 52 | D04EE2561ABFBBA900AC8E65 /* Copy Frameworks */ = { 53 | isa = PBXCopyFilesBuildPhase; 54 | buildActionMask = 2147483647; 55 | dstPath = ""; 56 | dstSubfolderSpec = 10; 57 | files = ( 58 | D04EE2571ABFBBB100AC8E65 /* LlamaKit.framework in Copy Frameworks */, 59 | D04EE2581ABFBBB100AC8E65 /* ReactiveCocoa.framework in Copy Frameworks */, 60 | ); 61 | name = "Copy Frameworks"; 62 | runOnlyForDeploymentPostprocessing = 0; 63 | }; 64 | /* End PBXCopyFilesBuildPhase section */ 65 | 66 | /* Begin PBXFileReference section */ 67 | D04EE1EA1ABFB9AD00AC8E65 /* ReactiveAnimation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ReactiveAnimation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 68 | D04EE1EE1ABFB9AD00AC8E65 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 69 | D04EE1EF1ABFB9AD00AC8E65 /* ReactiveAnimation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ReactiveAnimation.h; sourceTree = ""; }; 70 | D04EE1F51ABFB9AD00AC8E65 /* ReactiveAnimation-MacTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "ReactiveAnimation-MacTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 71 | D04EE1FB1ABFB9AD00AC8E65 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 72 | D04EE1FC1ABFB9AD00AC8E65 /* ReactiveAnimationTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ReactiveAnimationTests.m; sourceTree = ""; }; 73 | D04EE2081ABFB9E100AC8E65 /* Common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Common.xcconfig; sourceTree = ""; }; 74 | D04EE20A1ABFB9E100AC8E65 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; 75 | D04EE20B1ABFB9E100AC8E65 /* Profile.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Profile.xcconfig; sourceTree = ""; }; 76 | D04EE20C1ABFB9E100AC8E65 /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 77 | D04EE20D1ABFB9E100AC8E65 /* Test.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Test.xcconfig; sourceTree = ""; }; 78 | D04EE20F1ABFB9E100AC8E65 /* Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Application.xcconfig; sourceTree = ""; }; 79 | D04EE2101ABFB9E100AC8E65 /* Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Framework.xcconfig; sourceTree = ""; }; 80 | D04EE2111ABFB9E100AC8E65 /* StaticLibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = StaticLibrary.xcconfig; sourceTree = ""; }; 81 | D04EE2131ABFB9E100AC8E65 /* iOS-Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "iOS-Application.xcconfig"; sourceTree = ""; }; 82 | D04EE2141ABFB9E100AC8E65 /* iOS-Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "iOS-Base.xcconfig"; sourceTree = ""; }; 83 | D04EE2151ABFB9E100AC8E65 /* iOS-Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "iOS-Framework.xcconfig"; sourceTree = ""; }; 84 | D04EE2161ABFB9E100AC8E65 /* iOS-StaticLibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "iOS-StaticLibrary.xcconfig"; sourceTree = ""; }; 85 | D04EE2181ABFB9E100AC8E65 /* Mac-Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Mac-Application.xcconfig"; sourceTree = ""; }; 86 | D04EE2191ABFB9E100AC8E65 /* Mac-Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Mac-Base.xcconfig"; sourceTree = ""; }; 87 | D04EE21A1ABFB9E100AC8E65 /* Mac-DynamicLibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Mac-DynamicLibrary.xcconfig"; sourceTree = ""; }; 88 | D04EE21B1ABFB9E100AC8E65 /* Mac-Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Mac-Framework.xcconfig"; sourceTree = ""; }; 89 | D04EE21C1ABFB9E100AC8E65 /* Mac-StaticLibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Mac-StaticLibrary.xcconfig"; sourceTree = ""; }; 90 | D04EE21D1ABFB9E100AC8E65 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 91 | D04EE2231ABFBA1E00AC8E65 /* ReactiveAnimation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ReactiveAnimation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 92 | D04EE22D1ABFBA1E00AC8E65 /* ReactiveAnimation-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "ReactiveAnimation-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 93 | D04EE24C1ABFBB6900AC8E65 /* LlamaKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = LlamaKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 94 | D04EE24D1ABFBB6900AC8E65 /* ReactiveCocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = ReactiveCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 95 | D04EE2591ABFBBDE00AC8E65 /* ReactiveAnimationTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ReactiveAnimationTests-Bridging-Header.h"; sourceTree = ""; }; 96 | D04EE25B1ABFBBDF00AC8E65 /* SwiftJunk.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftJunk.swift; sourceTree = ""; }; 97 | D04EE25F1ABFBD9100AC8E65 /* Animation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Animation.swift; sourceTree = ""; }; 98 | D04EE2661ABFC79200AC8E65 /* View.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = View.swift; sourceTree = ""; }; 99 | /* End PBXFileReference section */ 100 | 101 | /* Begin PBXFrameworksBuildPhase section */ 102 | D04EE1E61ABFB9AD00AC8E65 /* Frameworks */ = { 103 | isa = PBXFrameworksBuildPhase; 104 | buildActionMask = 2147483647; 105 | files = ( 106 | D04EE24E1ABFBB6900AC8E65 /* LlamaKit.framework in Frameworks */, 107 | D04EE24F1ABFBB6900AC8E65 /* ReactiveCocoa.framework in Frameworks */, 108 | ); 109 | runOnlyForDeploymentPostprocessing = 0; 110 | }; 111 | D04EE1F21ABFB9AD00AC8E65 /* Frameworks */ = { 112 | isa = PBXFrameworksBuildPhase; 113 | buildActionMask = 2147483647; 114 | files = ( 115 | D04EE1F61ABFB9AD00AC8E65 /* ReactiveAnimation.framework in Frameworks */, 116 | D04EE2501ABFBB8500AC8E65 /* LlamaKit.framework in Frameworks */, 117 | D04EE2511ABFBB8500AC8E65 /* ReactiveCocoa.framework in Frameworks */, 118 | ); 119 | runOnlyForDeploymentPostprocessing = 0; 120 | }; 121 | D04EE21F1ABFBA1E00AC8E65 /* Frameworks */ = { 122 | isa = PBXFrameworksBuildPhase; 123 | buildActionMask = 2147483647; 124 | files = ( 125 | D04EE2521ABFBB8900AC8E65 /* LlamaKit.framework in Frameworks */, 126 | D04EE2531ABFBB8900AC8E65 /* ReactiveCocoa.framework in Frameworks */, 127 | ); 128 | runOnlyForDeploymentPostprocessing = 0; 129 | }; 130 | D04EE22A1ABFBA1E00AC8E65 /* Frameworks */ = { 131 | isa = PBXFrameworksBuildPhase; 132 | buildActionMask = 2147483647; 133 | files = ( 134 | D04EE22E1ABFBA1E00AC8E65 /* ReactiveAnimation.framework in Frameworks */, 135 | D04EE2541ABFBB9100AC8E65 /* LlamaKit.framework in Frameworks */, 136 | D04EE2551ABFBB9100AC8E65 /* ReactiveCocoa.framework in Frameworks */, 137 | ); 138 | runOnlyForDeploymentPostprocessing = 0; 139 | }; 140 | /* End PBXFrameworksBuildPhase section */ 141 | 142 | /* Begin PBXGroup section */ 143 | D04EE1E01ABFB9AD00AC8E65 = { 144 | isa = PBXGroup; 145 | children = ( 146 | D04EE1EC1ABFB9AD00AC8E65 /* ReactiveAnimation */, 147 | D04EE1F91ABFB9AD00AC8E65 /* ReactiveAnimationTests */, 148 | D04EE2061ABFB9E100AC8E65 /* Configuration */, 149 | D04EE1EB1ABFB9AD00AC8E65 /* Products */, 150 | ); 151 | sourceTree = ""; 152 | }; 153 | D04EE1EB1ABFB9AD00AC8E65 /* Products */ = { 154 | isa = PBXGroup; 155 | children = ( 156 | D04EE1EA1ABFB9AD00AC8E65 /* ReactiveAnimation.framework */, 157 | D04EE1F51ABFB9AD00AC8E65 /* ReactiveAnimation-MacTests.xctest */, 158 | D04EE2231ABFBA1E00AC8E65 /* ReactiveAnimation.framework */, 159 | D04EE22D1ABFBA1E00AC8E65 /* ReactiveAnimation-iOSTests.xctest */, 160 | ); 161 | name = Products; 162 | sourceTree = ""; 163 | }; 164 | D04EE1EC1ABFB9AD00AC8E65 /* ReactiveAnimation */ = { 165 | isa = PBXGroup; 166 | children = ( 167 | D04EE1EF1ABFB9AD00AC8E65 /* ReactiveAnimation.h */, 168 | D04EE2621ABFC2F500AC8E65 /* Cross-Platform */, 169 | D04EE1ED1ABFB9AD00AC8E65 /* Supporting Files */, 170 | ); 171 | path = ReactiveAnimation; 172 | sourceTree = ""; 173 | }; 174 | D04EE1ED1ABFB9AD00AC8E65 /* Supporting Files */ = { 175 | isa = PBXGroup; 176 | children = ( 177 | D04EE24C1ABFBB6900AC8E65 /* LlamaKit.framework */, 178 | D04EE24D1ABFBB6900AC8E65 /* ReactiveCocoa.framework */, 179 | D04EE1EE1ABFB9AD00AC8E65 /* Info.plist */, 180 | ); 181 | name = "Supporting Files"; 182 | sourceTree = ""; 183 | }; 184 | D04EE1F91ABFB9AD00AC8E65 /* ReactiveAnimationTests */ = { 185 | isa = PBXGroup; 186 | children = ( 187 | D04EE1FC1ABFB9AD00AC8E65 /* ReactiveAnimationTests.m */, 188 | D04EE1FA1ABFB9AD00AC8E65 /* Supporting Files */, 189 | ); 190 | path = ReactiveAnimationTests; 191 | sourceTree = ""; 192 | }; 193 | D04EE1FA1ABFB9AD00AC8E65 /* Supporting Files */ = { 194 | isa = PBXGroup; 195 | children = ( 196 | D04EE1FB1ABFB9AD00AC8E65 /* Info.plist */, 197 | D04EE25B1ABFBBDF00AC8E65 /* SwiftJunk.swift */, 198 | D04EE2591ABFBBDE00AC8E65 /* ReactiveAnimationTests-Bridging-Header.h */, 199 | ); 200 | name = "Supporting Files"; 201 | sourceTree = ""; 202 | }; 203 | D04EE2061ABFB9E100AC8E65 /* Configuration */ = { 204 | isa = PBXGroup; 205 | children = ( 206 | D04EE2071ABFB9E100AC8E65 /* Base */, 207 | D04EE2121ABFB9E100AC8E65 /* iOS */, 208 | D04EE2171ABFB9E100AC8E65 /* Mac OS X */, 209 | D04EE21D1ABFB9E100AC8E65 /* README.md */, 210 | ); 211 | name = Configuration; 212 | path = Carthage/Checkouts/xcconfigs; 213 | sourceTree = ""; 214 | }; 215 | D04EE2071ABFB9E100AC8E65 /* Base */ = { 216 | isa = PBXGroup; 217 | children = ( 218 | D04EE2081ABFB9E100AC8E65 /* Common.xcconfig */, 219 | D04EE2091ABFB9E100AC8E65 /* Configurations */, 220 | D04EE20E1ABFB9E100AC8E65 /* Targets */, 221 | ); 222 | path = Base; 223 | sourceTree = ""; 224 | }; 225 | D04EE2091ABFB9E100AC8E65 /* Configurations */ = { 226 | isa = PBXGroup; 227 | children = ( 228 | D04EE20A1ABFB9E100AC8E65 /* Debug.xcconfig */, 229 | D04EE20B1ABFB9E100AC8E65 /* Profile.xcconfig */, 230 | D04EE20C1ABFB9E100AC8E65 /* Release.xcconfig */, 231 | D04EE20D1ABFB9E100AC8E65 /* Test.xcconfig */, 232 | ); 233 | path = Configurations; 234 | sourceTree = ""; 235 | }; 236 | D04EE20E1ABFB9E100AC8E65 /* Targets */ = { 237 | isa = PBXGroup; 238 | children = ( 239 | D04EE20F1ABFB9E100AC8E65 /* Application.xcconfig */, 240 | D04EE2101ABFB9E100AC8E65 /* Framework.xcconfig */, 241 | D04EE2111ABFB9E100AC8E65 /* StaticLibrary.xcconfig */, 242 | ); 243 | path = Targets; 244 | sourceTree = ""; 245 | }; 246 | D04EE2121ABFB9E100AC8E65 /* iOS */ = { 247 | isa = PBXGroup; 248 | children = ( 249 | D04EE2131ABFB9E100AC8E65 /* iOS-Application.xcconfig */, 250 | D04EE2141ABFB9E100AC8E65 /* iOS-Base.xcconfig */, 251 | D04EE2151ABFB9E100AC8E65 /* iOS-Framework.xcconfig */, 252 | D04EE2161ABFB9E100AC8E65 /* iOS-StaticLibrary.xcconfig */, 253 | ); 254 | path = iOS; 255 | sourceTree = ""; 256 | }; 257 | D04EE2171ABFB9E100AC8E65 /* Mac OS X */ = { 258 | isa = PBXGroup; 259 | children = ( 260 | D04EE2181ABFB9E100AC8E65 /* Mac-Application.xcconfig */, 261 | D04EE2191ABFB9E100AC8E65 /* Mac-Base.xcconfig */, 262 | D04EE21A1ABFB9E100AC8E65 /* Mac-DynamicLibrary.xcconfig */, 263 | D04EE21B1ABFB9E100AC8E65 /* Mac-Framework.xcconfig */, 264 | D04EE21C1ABFB9E100AC8E65 /* Mac-StaticLibrary.xcconfig */, 265 | ); 266 | path = "Mac OS X"; 267 | sourceTree = ""; 268 | }; 269 | D04EE2621ABFC2F500AC8E65 /* Cross-Platform */ = { 270 | isa = PBXGroup; 271 | children = ( 272 | D04EE25F1ABFBD9100AC8E65 /* Animation.swift */, 273 | D04EE2661ABFC79200AC8E65 /* View.swift */, 274 | ); 275 | name = "Cross-Platform"; 276 | sourceTree = ""; 277 | }; 278 | /* End PBXGroup section */ 279 | 280 | /* Begin PBXHeadersBuildPhase section */ 281 | D04EE1E71ABFB9AD00AC8E65 /* Headers */ = { 282 | isa = PBXHeadersBuildPhase; 283 | buildActionMask = 2147483647; 284 | files = ( 285 | D04EE1F01ABFB9AD00AC8E65 /* ReactiveAnimation.h in Headers */, 286 | ); 287 | runOnlyForDeploymentPostprocessing = 0; 288 | }; 289 | D04EE2201ABFBA1E00AC8E65 /* Headers */ = { 290 | isa = PBXHeadersBuildPhase; 291 | buildActionMask = 2147483647; 292 | files = ( 293 | D04EE2471ABFBB0400AC8E65 /* ReactiveAnimation.h in Headers */, 294 | ); 295 | runOnlyForDeploymentPostprocessing = 0; 296 | }; 297 | /* End PBXHeadersBuildPhase section */ 298 | 299 | /* Begin PBXNativeTarget section */ 300 | D04EE1E91ABFB9AD00AC8E65 /* ReactiveAnimation-Mac */ = { 301 | isa = PBXNativeTarget; 302 | buildConfigurationList = D04EE2001ABFB9AD00AC8E65 /* Build configuration list for PBXNativeTarget "ReactiveAnimation-Mac" */; 303 | buildPhases = ( 304 | D04EE1E51ABFB9AD00AC8E65 /* Sources */, 305 | D04EE1E61ABFB9AD00AC8E65 /* Frameworks */, 306 | D04EE1E71ABFB9AD00AC8E65 /* Headers */, 307 | D04EE1E81ABFB9AD00AC8E65 /* Resources */, 308 | ); 309 | buildRules = ( 310 | ); 311 | dependencies = ( 312 | ); 313 | name = "ReactiveAnimation-Mac"; 314 | productName = ReactiveAnimation; 315 | productReference = D04EE1EA1ABFB9AD00AC8E65 /* ReactiveAnimation.framework */; 316 | productType = "com.apple.product-type.framework"; 317 | }; 318 | D04EE1F41ABFB9AD00AC8E65 /* ReactiveAnimation-MacTests */ = { 319 | isa = PBXNativeTarget; 320 | buildConfigurationList = D04EE2031ABFB9AD00AC8E65 /* Build configuration list for PBXNativeTarget "ReactiveAnimation-MacTests" */; 321 | buildPhases = ( 322 | D04EE1F11ABFB9AD00AC8E65 /* Sources */, 323 | D04EE1F21ABFB9AD00AC8E65 /* Frameworks */, 324 | D04EE1F31ABFB9AD00AC8E65 /* Resources */, 325 | D04EE2561ABFBBA900AC8E65 /* Copy Frameworks */, 326 | ); 327 | buildRules = ( 328 | ); 329 | dependencies = ( 330 | D04EE1F81ABFB9AD00AC8E65 /* PBXTargetDependency */, 331 | ); 332 | name = "ReactiveAnimation-MacTests"; 333 | productName = ReactiveAnimationTests; 334 | productReference = D04EE1F51ABFB9AD00AC8E65 /* ReactiveAnimation-MacTests.xctest */; 335 | productType = "com.apple.product-type.bundle.unit-test"; 336 | }; 337 | D04EE2221ABFBA1E00AC8E65 /* ReactiveAnimation-iOS */ = { 338 | isa = PBXNativeTarget; 339 | buildConfigurationList = D04EE2361ABFBA1E00AC8E65 /* Build configuration list for PBXNativeTarget "ReactiveAnimation-iOS" */; 340 | buildPhases = ( 341 | D04EE21E1ABFBA1E00AC8E65 /* Sources */, 342 | D04EE21F1ABFBA1E00AC8E65 /* Frameworks */, 343 | D04EE2201ABFBA1E00AC8E65 /* Headers */, 344 | D04EE2211ABFBA1E00AC8E65 /* Resources */, 345 | ); 346 | buildRules = ( 347 | ); 348 | dependencies = ( 349 | ); 350 | name = "ReactiveAnimation-iOS"; 351 | productName = ReactiveAnimation; 352 | productReference = D04EE2231ABFBA1E00AC8E65 /* ReactiveAnimation.framework */; 353 | productType = "com.apple.product-type.framework"; 354 | }; 355 | D04EE22C1ABFBA1E00AC8E65 /* ReactiveAnimation-iOSTests */ = { 356 | isa = PBXNativeTarget; 357 | buildConfigurationList = D04EE2391ABFBA1E00AC8E65 /* Build configuration list for PBXNativeTarget "ReactiveAnimation-iOSTests" */; 358 | buildPhases = ( 359 | D04EE2291ABFBA1E00AC8E65 /* Sources */, 360 | D04EE22A1ABFBA1E00AC8E65 /* Frameworks */, 361 | D04EE22B1ABFBA1E00AC8E65 /* Resources */, 362 | ); 363 | buildRules = ( 364 | ); 365 | dependencies = ( 366 | D04EE2301ABFBA1E00AC8E65 /* PBXTargetDependency */, 367 | ); 368 | name = "ReactiveAnimation-iOSTests"; 369 | productName = ReactiveAnimationTests; 370 | productReference = D04EE22D1ABFBA1E00AC8E65 /* ReactiveAnimation-iOSTests.xctest */; 371 | productType = "com.apple.product-type.bundle.unit-test"; 372 | }; 373 | /* End PBXNativeTarget section */ 374 | 375 | /* Begin PBXProject section */ 376 | D04EE1E11ABFB9AD00AC8E65 /* Project object */ = { 377 | isa = PBXProject; 378 | attributes = { 379 | CLASSPREFIX = RAN; 380 | LastUpgradeCheck = 0630; 381 | ORGANIZATIONNAME = ReactiveCocoa; 382 | TargetAttributes = { 383 | D04EE1E91ABFB9AD00AC8E65 = { 384 | CreatedOnToolsVersion = 6.3; 385 | }; 386 | D04EE1F41ABFB9AD00AC8E65 = { 387 | CreatedOnToolsVersion = 6.3; 388 | }; 389 | D04EE2221ABFBA1E00AC8E65 = { 390 | CreatedOnToolsVersion = 6.3; 391 | }; 392 | D04EE22C1ABFBA1E00AC8E65 = { 393 | CreatedOnToolsVersion = 6.3; 394 | }; 395 | }; 396 | }; 397 | buildConfigurationList = D04EE1E41ABFB9AD00AC8E65 /* Build configuration list for PBXProject "ReactiveAnimation" */; 398 | compatibilityVersion = "Xcode 3.2"; 399 | developmentRegion = English; 400 | hasScannedForEncodings = 0; 401 | knownRegions = ( 402 | en, 403 | ); 404 | mainGroup = D04EE1E01ABFB9AD00AC8E65; 405 | productRefGroup = D04EE1EB1ABFB9AD00AC8E65 /* Products */; 406 | projectDirPath = ""; 407 | projectRoot = ""; 408 | targets = ( 409 | D04EE1E91ABFB9AD00AC8E65 /* ReactiveAnimation-Mac */, 410 | D04EE1F41ABFB9AD00AC8E65 /* ReactiveAnimation-MacTests */, 411 | D04EE2221ABFBA1E00AC8E65 /* ReactiveAnimation-iOS */, 412 | D04EE22C1ABFBA1E00AC8E65 /* ReactiveAnimation-iOSTests */, 413 | ); 414 | }; 415 | /* End PBXProject section */ 416 | 417 | /* Begin PBXResourcesBuildPhase section */ 418 | D04EE1E81ABFB9AD00AC8E65 /* Resources */ = { 419 | isa = PBXResourcesBuildPhase; 420 | buildActionMask = 2147483647; 421 | files = ( 422 | ); 423 | runOnlyForDeploymentPostprocessing = 0; 424 | }; 425 | D04EE1F31ABFB9AD00AC8E65 /* Resources */ = { 426 | isa = PBXResourcesBuildPhase; 427 | buildActionMask = 2147483647; 428 | files = ( 429 | ); 430 | runOnlyForDeploymentPostprocessing = 0; 431 | }; 432 | D04EE2211ABFBA1E00AC8E65 /* Resources */ = { 433 | isa = PBXResourcesBuildPhase; 434 | buildActionMask = 2147483647; 435 | files = ( 436 | ); 437 | runOnlyForDeploymentPostprocessing = 0; 438 | }; 439 | D04EE22B1ABFBA1E00AC8E65 /* Resources */ = { 440 | isa = PBXResourcesBuildPhase; 441 | buildActionMask = 2147483647; 442 | files = ( 443 | ); 444 | runOnlyForDeploymentPostprocessing = 0; 445 | }; 446 | /* End PBXResourcesBuildPhase section */ 447 | 448 | /* Begin PBXSourcesBuildPhase section */ 449 | D04EE1E51ABFB9AD00AC8E65 /* Sources */ = { 450 | isa = PBXSourcesBuildPhase; 451 | buildActionMask = 2147483647; 452 | files = ( 453 | D04EE2671ABFC79200AC8E65 /* View.swift in Sources */, 454 | D04EE2601ABFBD9100AC8E65 /* Animation.swift in Sources */, 455 | ); 456 | runOnlyForDeploymentPostprocessing = 0; 457 | }; 458 | D04EE1F11ABFB9AD00AC8E65 /* Sources */ = { 459 | isa = PBXSourcesBuildPhase; 460 | buildActionMask = 2147483647; 461 | files = ( 462 | D04EE1FD1ABFB9AD00AC8E65 /* ReactiveAnimationTests.m in Sources */, 463 | D04EE25C1ABFBBDF00AC8E65 /* SwiftJunk.swift in Sources */, 464 | ); 465 | runOnlyForDeploymentPostprocessing = 0; 466 | }; 467 | D04EE21E1ABFBA1E00AC8E65 /* Sources */ = { 468 | isa = PBXSourcesBuildPhase; 469 | buildActionMask = 2147483647; 470 | files = ( 471 | D04EE2681ABFC79200AC8E65 /* View.swift in Sources */, 472 | D04EE2611ABFBD9100AC8E65 /* Animation.swift in Sources */, 473 | ); 474 | runOnlyForDeploymentPostprocessing = 0; 475 | }; 476 | D04EE2291ABFBA1E00AC8E65 /* Sources */ = { 477 | isa = PBXSourcesBuildPhase; 478 | buildActionMask = 2147483647; 479 | files = ( 480 | D04EE2461ABFBB0200AC8E65 /* ReactiveAnimationTests.m in Sources */, 481 | D04EE25D1ABFBBDF00AC8E65 /* SwiftJunk.swift in Sources */, 482 | ); 483 | runOnlyForDeploymentPostprocessing = 0; 484 | }; 485 | /* End PBXSourcesBuildPhase section */ 486 | 487 | /* Begin PBXTargetDependency section */ 488 | D04EE1F81ABFB9AD00AC8E65 /* PBXTargetDependency */ = { 489 | isa = PBXTargetDependency; 490 | target = D04EE1E91ABFB9AD00AC8E65 /* ReactiveAnimation-Mac */; 491 | targetProxy = D04EE1F71ABFB9AD00AC8E65 /* PBXContainerItemProxy */; 492 | }; 493 | D04EE2301ABFBA1E00AC8E65 /* PBXTargetDependency */ = { 494 | isa = PBXTargetDependency; 495 | target = D04EE2221ABFBA1E00AC8E65 /* ReactiveAnimation-iOS */; 496 | targetProxy = D04EE22F1ABFBA1E00AC8E65 /* PBXContainerItemProxy */; 497 | }; 498 | /* End PBXTargetDependency section */ 499 | 500 | /* Begin XCBuildConfiguration section */ 501 | D04EE1FE1ABFB9AD00AC8E65 /* Debug */ = { 502 | isa = XCBuildConfiguration; 503 | baseConfigurationReference = D04EE20A1ABFB9E100AC8E65 /* Debug.xcconfig */; 504 | buildSettings = { 505 | CURRENT_PROJECT_VERSION = 1; 506 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 507 | MACOSX_DEPLOYMENT_TARGET = 10.9; 508 | PRODUCT_NAME = "$(PROJECT_NAME)"; 509 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 510 | TARGETED_DEVICE_FAMILY = "1,2"; 511 | VERSIONING_SYSTEM = "apple-generic"; 512 | VERSION_INFO_PREFIX = ""; 513 | }; 514 | name = Debug; 515 | }; 516 | D04EE1FF1ABFB9AD00AC8E65 /* Release */ = { 517 | isa = XCBuildConfiguration; 518 | baseConfigurationReference = D04EE20C1ABFB9E100AC8E65 /* Release.xcconfig */; 519 | buildSettings = { 520 | CURRENT_PROJECT_VERSION = 1; 521 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 522 | MACOSX_DEPLOYMENT_TARGET = 10.9; 523 | PRODUCT_NAME = "$(PROJECT_NAME)"; 524 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 525 | TARGETED_DEVICE_FAMILY = "1,2"; 526 | VERSIONING_SYSTEM = "apple-generic"; 527 | VERSION_INFO_PREFIX = ""; 528 | }; 529 | name = Release; 530 | }; 531 | D04EE2011ABFB9AD00AC8E65 /* Debug */ = { 532 | isa = XCBuildConfiguration; 533 | baseConfigurationReference = D04EE21B1ABFB9E100AC8E65 /* Mac-Framework.xcconfig */; 534 | buildSettings = { 535 | DYLIB_COMPATIBILITY_VERSION = 1; 536 | DYLIB_CURRENT_VERSION = 1; 537 | FRAMEWORK_VERSION = A; 538 | INFOPLIST_FILE = ReactiveAnimation/Info.plist; 539 | }; 540 | name = Debug; 541 | }; 542 | D04EE2021ABFB9AD00AC8E65 /* Release */ = { 543 | isa = XCBuildConfiguration; 544 | baseConfigurationReference = D04EE21B1ABFB9E100AC8E65 /* Mac-Framework.xcconfig */; 545 | buildSettings = { 546 | DYLIB_COMPATIBILITY_VERSION = 1; 547 | DYLIB_CURRENT_VERSION = 1; 548 | FRAMEWORK_VERSION = A; 549 | INFOPLIST_FILE = ReactiveAnimation/Info.plist; 550 | }; 551 | name = Release; 552 | }; 553 | D04EE2041ABFB9AD00AC8E65 /* Debug */ = { 554 | isa = XCBuildConfiguration; 555 | baseConfigurationReference = D04EE2181ABFB9E100AC8E65 /* Mac-Application.xcconfig */; 556 | buildSettings = { 557 | FRAMEWORK_SEARCH_PATHS = ( 558 | "$(DEVELOPER_FRAMEWORKS_DIR)", 559 | "$(inherited)", 560 | ); 561 | INFOPLIST_FILE = ReactiveAnimationTests/Info.plist; 562 | PRODUCT_NAME = "$(TARGET_NAME)"; 563 | SWIFT_OBJC_BRIDGING_HEADER = "ReactiveAnimationTests/ReactiveAnimationTests-Bridging-Header.h"; 564 | }; 565 | name = Debug; 566 | }; 567 | D04EE2051ABFB9AD00AC8E65 /* Release */ = { 568 | isa = XCBuildConfiguration; 569 | baseConfigurationReference = D04EE2181ABFB9E100AC8E65 /* Mac-Application.xcconfig */; 570 | buildSettings = { 571 | FRAMEWORK_SEARCH_PATHS = ( 572 | "$(DEVELOPER_FRAMEWORKS_DIR)", 573 | "$(inherited)", 574 | ); 575 | INFOPLIST_FILE = ReactiveAnimationTests/Info.plist; 576 | PRODUCT_NAME = "$(TARGET_NAME)"; 577 | SWIFT_OBJC_BRIDGING_HEADER = "ReactiveAnimationTests/ReactiveAnimationTests-Bridging-Header.h"; 578 | }; 579 | name = Release; 580 | }; 581 | D04EE2371ABFBA1E00AC8E65 /* Debug */ = { 582 | isa = XCBuildConfiguration; 583 | baseConfigurationReference = D04EE2151ABFB9E100AC8E65 /* iOS-Framework.xcconfig */; 584 | buildSettings = { 585 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 586 | DYLIB_COMPATIBILITY_VERSION = 1; 587 | DYLIB_CURRENT_VERSION = 1; 588 | INFOPLIST_FILE = ReactiveAnimation/Info.plist; 589 | }; 590 | name = Debug; 591 | }; 592 | D04EE2381ABFBA1E00AC8E65 /* Release */ = { 593 | isa = XCBuildConfiguration; 594 | baseConfigurationReference = D04EE2151ABFB9E100AC8E65 /* iOS-Framework.xcconfig */; 595 | buildSettings = { 596 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 597 | DYLIB_COMPATIBILITY_VERSION = 1; 598 | DYLIB_CURRENT_VERSION = 1; 599 | INFOPLIST_FILE = ReactiveAnimation/Info.plist; 600 | }; 601 | name = Release; 602 | }; 603 | D04EE23A1ABFBA1E00AC8E65 /* Debug */ = { 604 | isa = XCBuildConfiguration; 605 | baseConfigurationReference = D04EE2131ABFB9E100AC8E65 /* iOS-Application.xcconfig */; 606 | buildSettings = { 607 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 608 | FRAMEWORK_SEARCH_PATHS = ( 609 | "$(SDKROOT)/Developer/Library/Frameworks", 610 | "$(inherited)", 611 | ); 612 | INFOPLIST_FILE = ReactiveAnimationTests/Info.plist; 613 | PRODUCT_NAME = "$(TARGET_NAME)"; 614 | SWIFT_OBJC_BRIDGING_HEADER = "ReactiveAnimationTests/ReactiveAnimationTests-Bridging-Header.h"; 615 | }; 616 | name = Debug; 617 | }; 618 | D04EE23B1ABFBA1E00AC8E65 /* Release */ = { 619 | isa = XCBuildConfiguration; 620 | baseConfigurationReference = D04EE2131ABFB9E100AC8E65 /* iOS-Application.xcconfig */; 621 | buildSettings = { 622 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 623 | FRAMEWORK_SEARCH_PATHS = ( 624 | "$(SDKROOT)/Developer/Library/Frameworks", 625 | "$(inherited)", 626 | ); 627 | INFOPLIST_FILE = ReactiveAnimationTests/Info.plist; 628 | PRODUCT_NAME = "$(TARGET_NAME)"; 629 | SWIFT_OBJC_BRIDGING_HEADER = "ReactiveAnimationTests/ReactiveAnimationTests-Bridging-Header.h"; 630 | }; 631 | name = Release; 632 | }; 633 | D04EE23C1ABFBA8800AC8E65 /* Profile */ = { 634 | isa = XCBuildConfiguration; 635 | baseConfigurationReference = D04EE20B1ABFB9E100AC8E65 /* Profile.xcconfig */; 636 | buildSettings = { 637 | CURRENT_PROJECT_VERSION = 1; 638 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 639 | MACOSX_DEPLOYMENT_TARGET = 10.9; 640 | PRODUCT_NAME = "$(PROJECT_NAME)"; 641 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 642 | TARGETED_DEVICE_FAMILY = "1,2"; 643 | VERSIONING_SYSTEM = "apple-generic"; 644 | VERSION_INFO_PREFIX = ""; 645 | }; 646 | name = Profile; 647 | }; 648 | D04EE23D1ABFBA8800AC8E65 /* Profile */ = { 649 | isa = XCBuildConfiguration; 650 | baseConfigurationReference = D04EE21B1ABFB9E100AC8E65 /* Mac-Framework.xcconfig */; 651 | buildSettings = { 652 | DYLIB_COMPATIBILITY_VERSION = 1; 653 | DYLIB_CURRENT_VERSION = 1; 654 | FRAMEWORK_VERSION = A; 655 | INFOPLIST_FILE = ReactiveAnimation/Info.plist; 656 | }; 657 | name = Profile; 658 | }; 659 | D04EE23E1ABFBA8800AC8E65 /* Profile */ = { 660 | isa = XCBuildConfiguration; 661 | baseConfigurationReference = D04EE2181ABFB9E100AC8E65 /* Mac-Application.xcconfig */; 662 | buildSettings = { 663 | FRAMEWORK_SEARCH_PATHS = ( 664 | "$(DEVELOPER_FRAMEWORKS_DIR)", 665 | "$(inherited)", 666 | ); 667 | INFOPLIST_FILE = ReactiveAnimationTests/Info.plist; 668 | PRODUCT_NAME = "$(TARGET_NAME)"; 669 | SWIFT_OBJC_BRIDGING_HEADER = "ReactiveAnimationTests/ReactiveAnimationTests-Bridging-Header.h"; 670 | }; 671 | name = Profile; 672 | }; 673 | D04EE23F1ABFBA8800AC8E65 /* Profile */ = { 674 | isa = XCBuildConfiguration; 675 | baseConfigurationReference = D04EE2151ABFB9E100AC8E65 /* iOS-Framework.xcconfig */; 676 | buildSettings = { 677 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 678 | DYLIB_COMPATIBILITY_VERSION = 1; 679 | DYLIB_CURRENT_VERSION = 1; 680 | INFOPLIST_FILE = ReactiveAnimation/Info.plist; 681 | }; 682 | name = Profile; 683 | }; 684 | D04EE2401ABFBA8800AC8E65 /* Profile */ = { 685 | isa = XCBuildConfiguration; 686 | baseConfigurationReference = D04EE2131ABFB9E100AC8E65 /* iOS-Application.xcconfig */; 687 | buildSettings = { 688 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 689 | FRAMEWORK_SEARCH_PATHS = ( 690 | "$(SDKROOT)/Developer/Library/Frameworks", 691 | "$(inherited)", 692 | ); 693 | INFOPLIST_FILE = ReactiveAnimationTests/Info.plist; 694 | PRODUCT_NAME = "$(TARGET_NAME)"; 695 | SWIFT_OBJC_BRIDGING_HEADER = "ReactiveAnimationTests/ReactiveAnimationTests-Bridging-Header.h"; 696 | }; 697 | name = Profile; 698 | }; 699 | D04EE2411ABFBA8D00AC8E65 /* Test */ = { 700 | isa = XCBuildConfiguration; 701 | baseConfigurationReference = D04EE20D1ABFB9E100AC8E65 /* Test.xcconfig */; 702 | buildSettings = { 703 | CURRENT_PROJECT_VERSION = 1; 704 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 705 | MACOSX_DEPLOYMENT_TARGET = 10.9; 706 | PRODUCT_NAME = "$(PROJECT_NAME)"; 707 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 708 | TARGETED_DEVICE_FAMILY = "1,2"; 709 | VERSIONING_SYSTEM = "apple-generic"; 710 | VERSION_INFO_PREFIX = ""; 711 | }; 712 | name = Test; 713 | }; 714 | D04EE2421ABFBA8D00AC8E65 /* Test */ = { 715 | isa = XCBuildConfiguration; 716 | baseConfigurationReference = D04EE21B1ABFB9E100AC8E65 /* Mac-Framework.xcconfig */; 717 | buildSettings = { 718 | DYLIB_COMPATIBILITY_VERSION = 1; 719 | DYLIB_CURRENT_VERSION = 1; 720 | FRAMEWORK_VERSION = A; 721 | INFOPLIST_FILE = ReactiveAnimation/Info.plist; 722 | }; 723 | name = Test; 724 | }; 725 | D04EE2431ABFBA8D00AC8E65 /* Test */ = { 726 | isa = XCBuildConfiguration; 727 | baseConfigurationReference = D04EE2181ABFB9E100AC8E65 /* Mac-Application.xcconfig */; 728 | buildSettings = { 729 | FRAMEWORK_SEARCH_PATHS = ( 730 | "$(DEVELOPER_FRAMEWORKS_DIR)", 731 | "$(inherited)", 732 | ); 733 | INFOPLIST_FILE = ReactiveAnimationTests/Info.plist; 734 | PRODUCT_NAME = "$(TARGET_NAME)"; 735 | SWIFT_OBJC_BRIDGING_HEADER = "ReactiveAnimationTests/ReactiveAnimationTests-Bridging-Header.h"; 736 | }; 737 | name = Test; 738 | }; 739 | D04EE2441ABFBA8D00AC8E65 /* Test */ = { 740 | isa = XCBuildConfiguration; 741 | baseConfigurationReference = D04EE2151ABFB9E100AC8E65 /* iOS-Framework.xcconfig */; 742 | buildSettings = { 743 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 744 | DYLIB_COMPATIBILITY_VERSION = 1; 745 | DYLIB_CURRENT_VERSION = 1; 746 | INFOPLIST_FILE = ReactiveAnimation/Info.plist; 747 | }; 748 | name = Test; 749 | }; 750 | D04EE2451ABFBA8D00AC8E65 /* Test */ = { 751 | isa = XCBuildConfiguration; 752 | baseConfigurationReference = D04EE2131ABFB9E100AC8E65 /* iOS-Application.xcconfig */; 753 | buildSettings = { 754 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 755 | FRAMEWORK_SEARCH_PATHS = ( 756 | "$(SDKROOT)/Developer/Library/Frameworks", 757 | "$(inherited)", 758 | ); 759 | INFOPLIST_FILE = ReactiveAnimationTests/Info.plist; 760 | PRODUCT_NAME = "$(TARGET_NAME)"; 761 | SWIFT_OBJC_BRIDGING_HEADER = "ReactiveAnimationTests/ReactiveAnimationTests-Bridging-Header.h"; 762 | }; 763 | name = Test; 764 | }; 765 | /* End XCBuildConfiguration section */ 766 | 767 | /* Begin XCConfigurationList section */ 768 | D04EE1E41ABFB9AD00AC8E65 /* Build configuration list for PBXProject "ReactiveAnimation" */ = { 769 | isa = XCConfigurationList; 770 | buildConfigurations = ( 771 | D04EE1FE1ABFB9AD00AC8E65 /* Debug */, 772 | D04EE2411ABFBA8D00AC8E65 /* Test */, 773 | D04EE1FF1ABFB9AD00AC8E65 /* Release */, 774 | D04EE23C1ABFBA8800AC8E65 /* Profile */, 775 | ); 776 | defaultConfigurationIsVisible = 0; 777 | defaultConfigurationName = Release; 778 | }; 779 | D04EE2001ABFB9AD00AC8E65 /* Build configuration list for PBXNativeTarget "ReactiveAnimation-Mac" */ = { 780 | isa = XCConfigurationList; 781 | buildConfigurations = ( 782 | D04EE2011ABFB9AD00AC8E65 /* Debug */, 783 | D04EE2421ABFBA8D00AC8E65 /* Test */, 784 | D04EE2021ABFB9AD00AC8E65 /* Release */, 785 | D04EE23D1ABFBA8800AC8E65 /* Profile */, 786 | ); 787 | defaultConfigurationIsVisible = 0; 788 | defaultConfigurationName = Release; 789 | }; 790 | D04EE2031ABFB9AD00AC8E65 /* Build configuration list for PBXNativeTarget "ReactiveAnimation-MacTests" */ = { 791 | isa = XCConfigurationList; 792 | buildConfigurations = ( 793 | D04EE2041ABFB9AD00AC8E65 /* Debug */, 794 | D04EE2431ABFBA8D00AC8E65 /* Test */, 795 | D04EE2051ABFB9AD00AC8E65 /* Release */, 796 | D04EE23E1ABFBA8800AC8E65 /* Profile */, 797 | ); 798 | defaultConfigurationIsVisible = 0; 799 | defaultConfigurationName = Release; 800 | }; 801 | D04EE2361ABFBA1E00AC8E65 /* Build configuration list for PBXNativeTarget "ReactiveAnimation-iOS" */ = { 802 | isa = XCConfigurationList; 803 | buildConfigurations = ( 804 | D04EE2371ABFBA1E00AC8E65 /* Debug */, 805 | D04EE2441ABFBA8D00AC8E65 /* Test */, 806 | D04EE2381ABFBA1E00AC8E65 /* Release */, 807 | D04EE23F1ABFBA8800AC8E65 /* Profile */, 808 | ); 809 | defaultConfigurationIsVisible = 0; 810 | }; 811 | D04EE2391ABFBA1E00AC8E65 /* Build configuration list for PBXNativeTarget "ReactiveAnimation-iOSTests" */ = { 812 | isa = XCConfigurationList; 813 | buildConfigurations = ( 814 | D04EE23A1ABFBA1E00AC8E65 /* Debug */, 815 | D04EE2451ABFBA8D00AC8E65 /* Test */, 816 | D04EE23B1ABFBA1E00AC8E65 /* Release */, 817 | D04EE2401ABFBA8800AC8E65 /* Profile */, 818 | ); 819 | defaultConfigurationIsVisible = 0; 820 | }; 821 | /* End XCConfigurationList section */ 822 | }; 823 | rootObject = D04EE1E11ABFB9AD00AC8E65 /* Project object */; 824 | } 825 | -------------------------------------------------------------------------------- /ReactiveAnimation.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ReactiveAnimation.xcodeproj/xcshareddata/xcschemes/ReactiveAnimation Mac.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /ReactiveAnimation.xcodeproj/xcshareddata/xcschemes/ReactiveAnimation iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /ReactiveAnimation.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /ReactiveAnimation/Animation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Animation.swift 3 | // ReactiveAnimation 4 | // 5 | // Created by Justin Spahr-Summers on 2015-03-22. 6 | // Copyright (c) 2015 ReactiveCocoa. All rights reserved. 7 | // 8 | 9 | #if os(OSX) 10 | import AppKit 11 | 12 | public typealias AnimationCurveRawValue = Int 13 | #elseif os(iOS) 14 | import UIKit 15 | 16 | public typealias AnimationCurveRawValue = UIViewAnimationCurve.RawValue 17 | #endif 18 | 19 | import ReactiveCocoa 20 | 21 | /// Creates an animated SignalProducer for each value that arrives on 22 | /// `producer`. 23 | /// 24 | /// The `JoinStrategy` used on the inner producers will hint to 25 | /// ReactiveAnimation whether the animations should be interruptible: 26 | /// 27 | /// - `Concat` will result in new animations only beginning after all previous 28 | /// animations have completed. 29 | /// - `Merge` or `Latest` will start new animations as soon as possible, and 30 | /// use the current (in progress) UI state for animating. 31 | /// 32 | /// These animation behaviors are only a hint, and the framework may not be able 33 | /// to satisfy them. 34 | /// 35 | /// However the inner producers are joined, binding the resulting stream of 36 | /// values to a view property will result in those value changes being 37 | /// automatically animated. 38 | /// 39 | /// To delay an animation, use delay() or throttle() _before_ this function. 40 | /// Because the aforementioned operators delay delivery of `Next` events, 41 | /// applying them _after_ this function may cause values to be delivered outside 42 | /// of any animation block. 43 | /// 44 | /// Examples 45 | /// 46 | /// RAN(self.textField).alpha <~ alphaValues 47 | /// |> animateEach(duration: 0.2) 48 | /// /* Animate alpha without interruption. */ 49 | /// |> join(.Concat) 50 | /// 51 | /// RAN(self.button).alpha <~ alphaValues 52 | /// /* Delay animations by 0.1 seconds. */ 53 | /// |> delay(0.1) 54 | /// |> animateEach(curve: .Linear) 55 | /// /* Animate alpha, and interrupt for new animations. */ 56 | /// |> join(.Latest) 57 | /// 58 | /// Returns a producer of producers, where each inner producer sends one `next` 59 | /// that corresponds to a value from the receiver, then completes when the 60 | /// animation corresponding to that value has finished. Deferring the events of 61 | /// the returned producer or having them delivered on another thread is considered 62 | /// undefined behavior. 63 | public func animateEach(duration: NSTimeInterval? = nil, curve: AnimationCurve = .Default)(producer: SignalProducer) -> SignalProducer, Error> { 64 | return producer |> map { value in 65 | return SignalProducer { observer, disposable in 66 | OSAtomicIncrement32(&runningInAnimationCount) 67 | disposable.addDisposable { 68 | OSAtomicDecrement32(&runningInAnimationCount) 69 | } 70 | 71 | #if os(OSX) 72 | NSAnimationContext.runAnimationGroup({ context in 73 | if let duration = duration { 74 | context.duration = duration 75 | } 76 | 77 | if curve != .Default { 78 | context.timingFunction = CAMediaTimingFunction(name: curve.mediaTimingFunction) 79 | } 80 | 81 | sendNext(observer, value) 82 | }, completionHandler: { 83 | // Avoids weird AppKit deadlocks when interrupting an 84 | // existing animation. 85 | UIScheduler().schedule { 86 | sendCompleted(observer) 87 | } 88 | }) 89 | #elseif os(iOS) 90 | var options = UIViewAnimationOptions(UInt(curve.rawValue)) 91 | options |= UIViewAnimationOptions.LayoutSubviews 92 | options |= UIViewAnimationOptions.BeginFromCurrentState 93 | if curve != .Default { 94 | options |= UIViewAnimationOptions.OverrideInheritedCurve 95 | } 96 | 97 | UIView.animateWithDuration(duration ?? 0.2, delay: 0, options: options, animations: { 98 | sendNext(observer, value) 99 | }, completion: { finished in 100 | if finished { 101 | sendCompleted(observer) 102 | } else { 103 | sendInterrupted(observer) 104 | } 105 | }) 106 | #endif 107 | } 108 | } 109 | } 110 | 111 | /// The number of animated signals in the call stack. 112 | /// 113 | /// This variable should be manipulated with OSAtomic functions. 114 | private var runningInAnimationCount: Int32 = 0 115 | 116 | /// Determines whether the calling code is running from within an animation 117 | /// definition. 118 | /// 119 | /// This can be used to conditionalize behavior based on whether a signal 120 | /// somewhere in the chain is supposed to be animated. 121 | /// 122 | /// This property is thread-safe. 123 | public var runningInAnimation: Bool { 124 | return runningInAnimationCount > 0 125 | } 126 | 127 | /// Describes the curve (timing function) for an animation. 128 | public enum AnimationCurve: AnimationCurveRawValue, Equatable { 129 | /// The default or inherited animation curve. 130 | case Default = 0 131 | 132 | /// Begins the animation slowly, speeds up in the middle, then slows to 133 | /// a stop. 134 | case EaseInOut 135 | #if os(iOS) 136 | = UIViewAnimationCurve.EaseInOut 137 | #endif 138 | 139 | /// Begins the animation slowly and speeds up to a stop. 140 | case EaseIn 141 | #if os(iOS) 142 | = UIViewAnimationCurve.EaseIn 143 | #endif 144 | 145 | /// Begins the animation quickly and slows down to a stop. 146 | case EaseOut 147 | #if os(iOS) 148 | = UIViewAnimationCurve.EaseOut 149 | #endif 150 | 151 | /// Animates with the same pace over the duration of the animation. 152 | case Linear 153 | #if os(iOS) 154 | = UIViewAnimationCurve.Linear 155 | #endif 156 | 157 | /// The name of the CAMediaTimingFunction corresponding to this curve. 158 | public var mediaTimingFunction: String { 159 | switch self { 160 | case .Default: 161 | return kCAMediaTimingFunctionDefault 162 | 163 | case .EaseInOut: 164 | return kCAMediaTimingFunctionEaseInEaseOut 165 | 166 | case .EaseIn: 167 | return kCAMediaTimingFunctionEaseIn 168 | 169 | case .EaseOut: 170 | return kCAMediaTimingFunctionEaseOut 171 | 172 | case .Linear: 173 | return kCAMediaTimingFunctionLinear 174 | } 175 | } 176 | } 177 | 178 | public func == (lhs: AnimationCurve, rhs: AnimationCurve) -> Bool { 179 | switch (lhs, rhs) { 180 | case (.Default, .Default), (.EaseInOut, .EaseInOut), (.EaseIn, .EaseIn), (.EaseOut, .EaseOut), (.Linear, .Linear): 181 | return true 182 | 183 | default: 184 | return false 185 | } 186 | } 187 | 188 | extension AnimationCurve: Printable { 189 | public var description: String { 190 | switch self { 191 | case .Default: 192 | return "Default" 193 | 194 | case .EaseInOut: 195 | return "EaseInOut" 196 | 197 | case .EaseIn: 198 | return "EaseIn" 199 | 200 | case .EaseOut: 201 | return "EaseOut" 202 | 203 | case .Linear: 204 | return "Linear" 205 | } 206 | } 207 | } 208 | -------------------------------------------------------------------------------- /ReactiveAnimation/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactivecocoa.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ReactiveAnimation/ReactiveAnimation.h: -------------------------------------------------------------------------------- 1 | // 2 | // ReactiveAnimation.h 3 | // ReactiveAnimation 4 | // 5 | // Created by Justin Spahr-Summers on 2015-03-22. 6 | // Copyright (c) 2015 ReactiveCocoa. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for ReactiveAnimation. 12 | FOUNDATION_EXPORT double ReactiveAnimationVersionNumber; 13 | 14 | //! Project version string for ReactiveAnimation. 15 | FOUNDATION_EXPORT const unsigned char ReactiveAnimationVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /ReactiveAnimation/View.swift: -------------------------------------------------------------------------------- 1 | // 2 | // View.swift 3 | // ReactiveAnimation 4 | // 5 | // Created by Justin Spahr-Summers on 2015-03-22. 6 | // Copyright (c) 2015 ReactiveCocoa. All rights reserved. 7 | // 8 | 9 | #if os(OSX) 10 | import AppKit 11 | 12 | public typealias View = NSView 13 | #elseif os(iOS) 14 | import UIKit 15 | 16 | public typealias View = UIView 17 | #endif 18 | 19 | import ReactiveCocoa 20 | 21 | /// Wraps an NSView or UIView with bindable properties for animations. 22 | public struct RAN { 23 | private weak var view: View? 24 | private let willDealloc: SignalProducer<(), NoError> 25 | 26 | private var animator: View? { 27 | #if os(OSX) 28 | if runningInAnimation { 29 | return view.map { $0.animator() } 30 | } 31 | #endif 32 | 33 | return view 34 | } 35 | 36 | /// Creates a wrapper for the given view's properties. 37 | public init(_ view: View) { 38 | self.view = view 39 | self.willDealloc = view.rac_willDeallocSignal().toSignalProducer() 40 | |> map { _ in () } 41 | |> catch { error in 42 | assert(false, "rac_willDeallocSignal failed with error: \(error)") 43 | return .empty 44 | } 45 | } 46 | 47 | private func viewProperty(setter: T -> ()) -> ViewProperty { 48 | return ViewProperty(willDealloc: self.willDealloc, setter: setter) 49 | } 50 | 51 | public var frame: ViewProperty { 52 | return viewProperty { self.animator?.frame = $0 } 53 | } 54 | 55 | public var bounds: ViewProperty { 56 | return viewProperty { self.animator?.bounds = $0 } 57 | } 58 | 59 | #if os(iOS) 60 | public var center: ViewProperty { 61 | return viewProperty { self.animator?.center = $0 } 62 | } 63 | 64 | public var backgroundColor: ViewProperty { 65 | return viewProperty { self.animator?.backgroundColor = $0 } 66 | } 67 | 68 | public var transform: ViewProperty { 69 | return viewProperty { self.animator?.transform = $0 } 70 | } 71 | #endif 72 | 73 | public var alpha: ViewProperty { 74 | return viewProperty { value in 75 | #if os(OSX) 76 | self.animator?.alphaValue = value 77 | #elseif os(iOS) 78 | self.animator?.alpha = value 79 | #endif 80 | } 81 | } 82 | 83 | #if os(OSX) 84 | public var frameOrigin: ViewProperty { 85 | return viewProperty { self.animator?.setFrameOrigin($0) } 86 | } 87 | 88 | public var frameSize: ViewProperty { 89 | return viewProperty { self.animator?.setFrameSize($0) } 90 | } 91 | 92 | public var boundsOrigin: ViewProperty { 93 | return viewProperty { self.animator?.setBoundsOrigin($0) } 94 | } 95 | 96 | public var boundsSize: ViewProperty { 97 | return viewProperty { self.animator?.setBoundsSize($0) } 98 | } 99 | #endif 100 | 101 | } 102 | 103 | /// A property on a view that can be animated. 104 | public struct ViewProperty { 105 | private let willDealloc: SignalProducer<(), NoError> 106 | private let setter: T -> () 107 | } 108 | 109 | extension ViewProperty: SinkType { 110 | public func put(value: T) { 111 | setter(value) 112 | } 113 | } 114 | 115 | /// Binds a (potentially animated) signal to a view property. 116 | public func <~ (property: ViewProperty, signal: Signal) -> Disposable { 117 | let disposable = CompositeDisposable() 118 | let propertyDisposable = property.willDealloc.start(completed: { 119 | disposable.dispose() 120 | }) 121 | 122 | disposable.addDisposable(propertyDisposable) 123 | 124 | let signalDisposable = signal.observe(next: property.setter, completed: { 125 | disposable.dispose() 126 | }) 127 | 128 | disposable.addDisposable(signalDisposable) 129 | return disposable 130 | } 131 | 132 | /// Binds a (potentially animated) signal producer to a view property. 133 | public func <~ (property: ViewProperty, producer: SignalProducer) -> Disposable { 134 | var disposable: Disposable! 135 | 136 | producer.startWithSignal { signal, signalDisposable in 137 | property <~ signal 138 | disposable = signalDisposable 139 | 140 | property.willDealloc.start(completed: { 141 | signalDisposable.dispose() 142 | }) 143 | } 144 | 145 | return disposable 146 | } 147 | 148 | /// Binds the view property to the latest values of `sourceProperty`. 149 | public func <~ (destinationProperty: ViewProperty, sourceProperty: P) -> Disposable { 150 | return destinationProperty <~ sourceProperty.producer 151 | } 152 | -------------------------------------------------------------------------------- /ReactiveAnimationTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactivecocoa.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /ReactiveAnimationTests/ReactiveAnimationTests-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | -------------------------------------------------------------------------------- /ReactiveAnimationTests/ReactiveAnimationTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // ReactiveAnimationTests.m 3 | // ReactiveAnimationTests 4 | // 5 | // Created by Justin Spahr-Summers on 2015-03-22. 6 | // Copyright (c) 2015 ReactiveCocoa. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ReactiveAnimationTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation ReactiveAnimationTests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | // Put setup code here. This method is called before the invocation of each test method in the class. 20 | } 21 | 22 | - (void)tearDown { 23 | // Put teardown code here. This method is called after the invocation of each test method in the class. 24 | [super tearDown]; 25 | } 26 | 27 | - (void)testExample { 28 | // This is an example of a functional test case. 29 | XCTAssert(YES, @"Pass"); 30 | } 31 | 32 | - (void)testPerformanceExample { 33 | // This is an example of a performance test case. 34 | [self measureBlock:^{ 35 | // Put the code you want to measure the time of here. 36 | }]; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /ReactiveAnimationTests/SwiftJunk.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftJunk.swift 3 | // ReactiveAnimation 4 | // 5 | // Created by Justin Spahr-Summers on 2015-03-22. 6 | // Copyright (c) 2015 ReactiveCocoa. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import LlamaKit 11 | import ReactiveCocoa 12 | import XCTest 13 | 14 | // Forces Xcode to link the Swift stdlib. 15 | final class SwiftJunkSpec: XCTestCase {} 16 | --------------------------------------------------------------------------------