├── .DS_Store ├── LICENSE ├── README.md ├── RadialTransitionExample ├── .DS_Store ├── RadialTransitionExample.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ ├── xcshareddata │ │ │ └── RadialTransitionExample.xccheckout │ │ └── xcuserdata │ │ │ ├── alexpadalko.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ │ │ └── zeieshan.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── xcuserdata │ │ ├── alexpadalko.xcuserdatad │ │ └── xcschemes │ │ │ ├── RadialTransitionExample.xcscheme │ │ │ └── xcschememanagement.plist │ │ └── zeieshan.xcuserdatad │ │ └── xcschemes │ │ ├── RadialTransitionExample.xcscheme │ │ └── xcschememanagement.plist ├── RadialTransitionExample │ ├── AppDelegate.swift │ ├── Base.lproj │ │ └── LaunchScreen.xib │ ├── FirstViewController.swift │ ├── FirstViewController.xib │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Info.plist │ ├── SecondViewController.swift │ ├── SecondViewController.xib │ ├── Yoda-Art-Wallpaper.jpg │ └── star-wars_00409801.jpg └── RadialTransitionExampleTests │ ├── Info.plist │ └── RadialTransitionExampleTests.swift ├── RadialTransitionSource ├── AAPTransactionDirector.swift ├── UINavigationController+RadialTransaction.swift └── UIView+Radial.swift ├── radialDemo_short.gif └── radilaDemo_long.gif /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apadalko/RadialTransition_swift/1e09963d52e1d8c88835b187766c89d0c6aaa61c/.DS_Store -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Alex Padalko 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 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | RadialTransition_swift 2 | ===================== 3 | 4 | Great ios radial transition for navigation controller, with custom back swipe. 5 | 6 | 7 | Demo 8 | ---- 9 | ![alt tag](https://raw.githubusercontent.com/apadalko/RadialTransition_objC/master/radilaDemo_long.gif) 10 | 11 | 12 | Usage 13 | ---- 14 | 15 | for push simple use 16 | ``` swift 17 | self.navigationController?.radialPushViewController(SecondViewController(nibName: "SecondViewController", bundle: nil),startFrame: CGRectMake(self.view.frame.size.width, 0, 0, 0),duration:0.9,transitionCompletion: { () -> Void in 18 | 19 | }) 20 | ``` 21 | for pop use 22 | ``` swift 23 | self.navigationController?.radialPopViewController(startFrame:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height, 0, 0),duration: 0.9,transitionCompletion: { () -> Void in 24 | 25 | }) 26 | ``` 27 | to enable swipe to back just use 28 | ``` swift 29 | self.navigationController?.enableRadialSwipe() 30 | 31 | ``` 32 | to disable 33 | ``` swift 34 | self.navigationController?.disableRadialSwipe() 35 | ``` 36 | Requirements 37 | --- 38 | ios 7 +,xcode 6+ 39 | 40 | Futher Work 41 | --- 42 | -add TabbarController transaction 43 | -add radial circle options (shadow,color etc) 44 | -other improvements 45 | 46 | -------------------------------------------------------------------------------- /RadialTransitionExample/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apadalko/RadialTransition_swift/1e09963d52e1d8c88835b187766c89d0c6aaa61c/RadialTransitionExample/.DS_Store -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | B8B7C82019D39EED00EA3D24 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B7C81F19D39EED00EA3D24 /* AppDelegate.swift */; }; 11 | B8B7C82719D39EED00EA3D24 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B8B7C82619D39EED00EA3D24 /* Images.xcassets */; }; 12 | B8B7C82A19D39EED00EA3D24 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = B8B7C82819D39EED00EA3D24 /* LaunchScreen.xib */; }; 13 | B8B7C83619D39EED00EA3D24 /* RadialTransitionExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B7C83519D39EED00EA3D24 /* RadialTransitionExampleTests.swift */; }; 14 | B8B7C84319D39EFC00EA3D24 /* AAPTransactionDirector.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B7C84019D39EFC00EA3D24 /* AAPTransactionDirector.swift */; }; 15 | B8B7C84419D39EFC00EA3D24 /* UINavigationController+RadialTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B7C84119D39EFC00EA3D24 /* UINavigationController+RadialTransaction.swift */; }; 16 | B8B7C84519D39EFC00EA3D24 /* UIView+Radial.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B7C84219D39EFC00EA3D24 /* UIView+Radial.swift */; }; 17 | B8B7C84719D39F3100EA3D24 /* FirstViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B7C84619D39F3100EA3D24 /* FirstViewController.swift */; }; 18 | B8B7C84919D39F3B00EA3D24 /* SecondViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B7C84819D39F3B00EA3D24 /* SecondViewController.swift */; }; 19 | B8B7C84B19D39F8200EA3D24 /* FirstViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = B8B7C84A19D39F8200EA3D24 /* FirstViewController.xib */; }; 20 | B8B7C84F19D39F9A00EA3D24 /* Yoda-Art-Wallpaper.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B8B7C84D19D39F9A00EA3D24 /* Yoda-Art-Wallpaper.jpg */; }; 21 | B8B7C85019D39F9A00EA3D24 /* star-wars_00409801.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B8B7C84E19D39F9A00EA3D24 /* star-wars_00409801.jpg */; }; 22 | B8B7C85219D3A16100EA3D24 /* SecondViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = B8B7C85119D3A16100EA3D24 /* SecondViewController.xib */; }; 23 | /* End PBXBuildFile section */ 24 | 25 | /* Begin PBXContainerItemProxy section */ 26 | B8B7C83019D39EED00EA3D24 /* PBXContainerItemProxy */ = { 27 | isa = PBXContainerItemProxy; 28 | containerPortal = B8B7C81219D39EED00EA3D24 /* Project object */; 29 | proxyType = 1; 30 | remoteGlobalIDString = B8B7C81919D39EED00EA3D24; 31 | remoteInfo = RadialTransitionExample; 32 | }; 33 | /* End PBXContainerItemProxy section */ 34 | 35 | /* Begin PBXFileReference section */ 36 | B8B7C81A19D39EED00EA3D24 /* RadialTransitionExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RadialTransitionExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 37 | B8B7C81E19D39EED00EA3D24 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 38 | B8B7C81F19D39EED00EA3D24 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 39 | B8B7C82619D39EED00EA3D24 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 40 | B8B7C82919D39EED00EA3D24 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 41 | B8B7C82F19D39EED00EA3D24 /* RadialTransitionExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RadialTransitionExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 42 | B8B7C83419D39EED00EA3D24 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 43 | B8B7C83519D39EED00EA3D24 /* RadialTransitionExampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadialTransitionExampleTests.swift; sourceTree = ""; }; 44 | B8B7C84019D39EFC00EA3D24 /* AAPTransactionDirector.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAPTransactionDirector.swift; sourceTree = ""; }; 45 | B8B7C84119D39EFC00EA3D24 /* UINavigationController+RadialTransaction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UINavigationController+RadialTransaction.swift"; sourceTree = ""; }; 46 | B8B7C84219D39EFC00EA3D24 /* UIView+Radial.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+Radial.swift"; sourceTree = ""; }; 47 | B8B7C84619D39F3100EA3D24 /* FirstViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FirstViewController.swift; sourceTree = ""; }; 48 | B8B7C84819D39F3B00EA3D24 /* SecondViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecondViewController.swift; sourceTree = ""; }; 49 | B8B7C84A19D39F8200EA3D24 /* FirstViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FirstViewController.xib; sourceTree = ""; }; 50 | B8B7C84D19D39F9A00EA3D24 /* Yoda-Art-Wallpaper.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Yoda-Art-Wallpaper.jpg"; sourceTree = ""; }; 51 | B8B7C84E19D39F9A00EA3D24 /* star-wars_00409801.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "star-wars_00409801.jpg"; sourceTree = ""; }; 52 | B8B7C85119D3A16100EA3D24 /* SecondViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SecondViewController.xib; sourceTree = ""; }; 53 | /* End PBXFileReference section */ 54 | 55 | /* Begin PBXFrameworksBuildPhase section */ 56 | B8B7C81719D39EED00EA3D24 /* Frameworks */ = { 57 | isa = PBXFrameworksBuildPhase; 58 | buildActionMask = 2147483647; 59 | files = ( 60 | ); 61 | runOnlyForDeploymentPostprocessing = 0; 62 | }; 63 | B8B7C82C19D39EED00EA3D24 /* Frameworks */ = { 64 | isa = PBXFrameworksBuildPhase; 65 | buildActionMask = 2147483647; 66 | files = ( 67 | ); 68 | runOnlyForDeploymentPostprocessing = 0; 69 | }; 70 | /* End PBXFrameworksBuildPhase section */ 71 | 72 | /* Begin PBXGroup section */ 73 | B8B7C81119D39EED00EA3D24 = { 74 | isa = PBXGroup; 75 | children = ( 76 | B8B7C81C19D39EED00EA3D24 /* RadialTransitionExample */, 77 | B8B7C83219D39EED00EA3D24 /* RadialTransitionExampleTests */, 78 | B8B7C81B19D39EED00EA3D24 /* Products */, 79 | ); 80 | sourceTree = ""; 81 | }; 82 | B8B7C81B19D39EED00EA3D24 /* Products */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | B8B7C81A19D39EED00EA3D24 /* RadialTransitionExample.app */, 86 | B8B7C82F19D39EED00EA3D24 /* RadialTransitionExampleTests.xctest */, 87 | ); 88 | name = Products; 89 | sourceTree = ""; 90 | }; 91 | B8B7C81C19D39EED00EA3D24 /* RadialTransitionExample */ = { 92 | isa = PBXGroup; 93 | children = ( 94 | B8B7C84C19D39F9000EA3D24 /* resources */, 95 | B8B7C83F19D39EFC00EA3D24 /* RadialTransitionSource */, 96 | B8B7C81F19D39EED00EA3D24 /* AppDelegate.swift */, 97 | B8B7C84619D39F3100EA3D24 /* FirstViewController.swift */, 98 | B8B7C84A19D39F8200EA3D24 /* FirstViewController.xib */, 99 | B8B7C84819D39F3B00EA3D24 /* SecondViewController.swift */, 100 | B8B7C85119D3A16100EA3D24 /* SecondViewController.xib */, 101 | B8B7C82619D39EED00EA3D24 /* Images.xcassets */, 102 | B8B7C82819D39EED00EA3D24 /* LaunchScreen.xib */, 103 | B8B7C81D19D39EED00EA3D24 /* Supporting Files */, 104 | ); 105 | path = RadialTransitionExample; 106 | sourceTree = ""; 107 | }; 108 | B8B7C81D19D39EED00EA3D24 /* Supporting Files */ = { 109 | isa = PBXGroup; 110 | children = ( 111 | B8B7C81E19D39EED00EA3D24 /* Info.plist */, 112 | ); 113 | name = "Supporting Files"; 114 | sourceTree = ""; 115 | }; 116 | B8B7C83219D39EED00EA3D24 /* RadialTransitionExampleTests */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | B8B7C83519D39EED00EA3D24 /* RadialTransitionExampleTests.swift */, 120 | B8B7C83319D39EED00EA3D24 /* Supporting Files */, 121 | ); 122 | path = RadialTransitionExampleTests; 123 | sourceTree = ""; 124 | }; 125 | B8B7C83319D39EED00EA3D24 /* Supporting Files */ = { 126 | isa = PBXGroup; 127 | children = ( 128 | B8B7C83419D39EED00EA3D24 /* Info.plist */, 129 | ); 130 | name = "Supporting Files"; 131 | sourceTree = ""; 132 | }; 133 | B8B7C83F19D39EFC00EA3D24 /* RadialTransitionSource */ = { 134 | isa = PBXGroup; 135 | children = ( 136 | B8B7C84019D39EFC00EA3D24 /* AAPTransactionDirector.swift */, 137 | B8B7C84119D39EFC00EA3D24 /* UINavigationController+RadialTransaction.swift */, 138 | B8B7C84219D39EFC00EA3D24 /* UIView+Radial.swift */, 139 | ); 140 | name = RadialTransitionSource; 141 | path = ../../RadialTransitionSource; 142 | sourceTree = ""; 143 | }; 144 | B8B7C84C19D39F9000EA3D24 /* resources */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | B8B7C84D19D39F9A00EA3D24 /* Yoda-Art-Wallpaper.jpg */, 148 | B8B7C84E19D39F9A00EA3D24 /* star-wars_00409801.jpg */, 149 | ); 150 | name = resources; 151 | sourceTree = ""; 152 | }; 153 | /* End PBXGroup section */ 154 | 155 | /* Begin PBXNativeTarget section */ 156 | B8B7C81919D39EED00EA3D24 /* RadialTransitionExample */ = { 157 | isa = PBXNativeTarget; 158 | buildConfigurationList = B8B7C83919D39EED00EA3D24 /* Build configuration list for PBXNativeTarget "RadialTransitionExample" */; 159 | buildPhases = ( 160 | B8B7C81619D39EED00EA3D24 /* Sources */, 161 | B8B7C81719D39EED00EA3D24 /* Frameworks */, 162 | B8B7C81819D39EED00EA3D24 /* Resources */, 163 | ); 164 | buildRules = ( 165 | ); 166 | dependencies = ( 167 | ); 168 | name = RadialTransitionExample; 169 | productName = RadialTransitionExample; 170 | productReference = B8B7C81A19D39EED00EA3D24 /* RadialTransitionExample.app */; 171 | productType = "com.apple.product-type.application"; 172 | }; 173 | B8B7C82E19D39EED00EA3D24 /* RadialTransitionExampleTests */ = { 174 | isa = PBXNativeTarget; 175 | buildConfigurationList = B8B7C83C19D39EED00EA3D24 /* Build configuration list for PBXNativeTarget "RadialTransitionExampleTests" */; 176 | buildPhases = ( 177 | B8B7C82B19D39EED00EA3D24 /* Sources */, 178 | B8B7C82C19D39EED00EA3D24 /* Frameworks */, 179 | B8B7C82D19D39EED00EA3D24 /* Resources */, 180 | ); 181 | buildRules = ( 182 | ); 183 | dependencies = ( 184 | B8B7C83119D39EED00EA3D24 /* PBXTargetDependency */, 185 | ); 186 | name = RadialTransitionExampleTests; 187 | productName = RadialTransitionExampleTests; 188 | productReference = B8B7C82F19D39EED00EA3D24 /* RadialTransitionExampleTests.xctest */; 189 | productType = "com.apple.product-type.bundle.unit-test"; 190 | }; 191 | /* End PBXNativeTarget section */ 192 | 193 | /* Begin PBXProject section */ 194 | B8B7C81219D39EED00EA3D24 /* Project object */ = { 195 | isa = PBXProject; 196 | attributes = { 197 | LastUpgradeCheck = 0600; 198 | ORGANIZATIONNAME = "Alex Padalko"; 199 | TargetAttributes = { 200 | B8B7C81919D39EED00EA3D24 = { 201 | CreatedOnToolsVersion = 6.0.1; 202 | }; 203 | B8B7C82E19D39EED00EA3D24 = { 204 | CreatedOnToolsVersion = 6.0.1; 205 | TestTargetID = B8B7C81919D39EED00EA3D24; 206 | }; 207 | }; 208 | }; 209 | buildConfigurationList = B8B7C81519D39EED00EA3D24 /* Build configuration list for PBXProject "RadialTransitionExample" */; 210 | compatibilityVersion = "Xcode 3.2"; 211 | developmentRegion = English; 212 | hasScannedForEncodings = 0; 213 | knownRegions = ( 214 | en, 215 | Base, 216 | ); 217 | mainGroup = B8B7C81119D39EED00EA3D24; 218 | productRefGroup = B8B7C81B19D39EED00EA3D24 /* Products */; 219 | projectDirPath = ""; 220 | projectRoot = ""; 221 | targets = ( 222 | B8B7C81919D39EED00EA3D24 /* RadialTransitionExample */, 223 | B8B7C82E19D39EED00EA3D24 /* RadialTransitionExampleTests */, 224 | ); 225 | }; 226 | /* End PBXProject section */ 227 | 228 | /* Begin PBXResourcesBuildPhase section */ 229 | B8B7C81819D39EED00EA3D24 /* Resources */ = { 230 | isa = PBXResourcesBuildPhase; 231 | buildActionMask = 2147483647; 232 | files = ( 233 | B8B7C82A19D39EED00EA3D24 /* LaunchScreen.xib in Resources */, 234 | B8B7C84B19D39F8200EA3D24 /* FirstViewController.xib in Resources */, 235 | B8B7C85219D3A16100EA3D24 /* SecondViewController.xib in Resources */, 236 | B8B7C85019D39F9A00EA3D24 /* star-wars_00409801.jpg in Resources */, 237 | B8B7C82719D39EED00EA3D24 /* Images.xcassets in Resources */, 238 | B8B7C84F19D39F9A00EA3D24 /* Yoda-Art-Wallpaper.jpg in Resources */, 239 | ); 240 | runOnlyForDeploymentPostprocessing = 0; 241 | }; 242 | B8B7C82D19D39EED00EA3D24 /* Resources */ = { 243 | isa = PBXResourcesBuildPhase; 244 | buildActionMask = 2147483647; 245 | files = ( 246 | ); 247 | runOnlyForDeploymentPostprocessing = 0; 248 | }; 249 | /* End PBXResourcesBuildPhase section */ 250 | 251 | /* Begin PBXSourcesBuildPhase section */ 252 | B8B7C81619D39EED00EA3D24 /* Sources */ = { 253 | isa = PBXSourcesBuildPhase; 254 | buildActionMask = 2147483647; 255 | files = ( 256 | B8B7C84919D39F3B00EA3D24 /* SecondViewController.swift in Sources */, 257 | B8B7C84719D39F3100EA3D24 /* FirstViewController.swift in Sources */, 258 | B8B7C84519D39EFC00EA3D24 /* UIView+Radial.swift in Sources */, 259 | B8B7C84319D39EFC00EA3D24 /* AAPTransactionDirector.swift in Sources */, 260 | B8B7C84419D39EFC00EA3D24 /* UINavigationController+RadialTransaction.swift in Sources */, 261 | B8B7C82019D39EED00EA3D24 /* AppDelegate.swift in Sources */, 262 | ); 263 | runOnlyForDeploymentPostprocessing = 0; 264 | }; 265 | B8B7C82B19D39EED00EA3D24 /* Sources */ = { 266 | isa = PBXSourcesBuildPhase; 267 | buildActionMask = 2147483647; 268 | files = ( 269 | B8B7C83619D39EED00EA3D24 /* RadialTransitionExampleTests.swift in Sources */, 270 | ); 271 | runOnlyForDeploymentPostprocessing = 0; 272 | }; 273 | /* End PBXSourcesBuildPhase section */ 274 | 275 | /* Begin PBXTargetDependency section */ 276 | B8B7C83119D39EED00EA3D24 /* PBXTargetDependency */ = { 277 | isa = PBXTargetDependency; 278 | target = B8B7C81919D39EED00EA3D24 /* RadialTransitionExample */; 279 | targetProxy = B8B7C83019D39EED00EA3D24 /* PBXContainerItemProxy */; 280 | }; 281 | /* End PBXTargetDependency section */ 282 | 283 | /* Begin PBXVariantGroup section */ 284 | B8B7C82819D39EED00EA3D24 /* LaunchScreen.xib */ = { 285 | isa = PBXVariantGroup; 286 | children = ( 287 | B8B7C82919D39EED00EA3D24 /* Base */, 288 | ); 289 | name = LaunchScreen.xib; 290 | sourceTree = ""; 291 | }; 292 | /* End PBXVariantGroup section */ 293 | 294 | /* Begin XCBuildConfiguration section */ 295 | B8B7C83719D39EED00EA3D24 /* Debug */ = { 296 | isa = XCBuildConfiguration; 297 | buildSettings = { 298 | ALWAYS_SEARCH_USER_PATHS = NO; 299 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 300 | CLANG_CXX_LIBRARY = "libc++"; 301 | CLANG_ENABLE_MODULES = YES; 302 | CLANG_ENABLE_OBJC_ARC = YES; 303 | CLANG_WARN_BOOL_CONVERSION = YES; 304 | CLANG_WARN_CONSTANT_CONVERSION = YES; 305 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 306 | CLANG_WARN_EMPTY_BODY = YES; 307 | CLANG_WARN_ENUM_CONVERSION = YES; 308 | CLANG_WARN_INT_CONVERSION = YES; 309 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 310 | CLANG_WARN_UNREACHABLE_CODE = YES; 311 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 312 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 313 | COPY_PHASE_STRIP = NO; 314 | ENABLE_STRICT_OBJC_MSGSEND = YES; 315 | GCC_C_LANGUAGE_STANDARD = gnu99; 316 | GCC_DYNAMIC_NO_PIC = NO; 317 | GCC_OPTIMIZATION_LEVEL = 0; 318 | GCC_PREPROCESSOR_DEFINITIONS = ( 319 | "DEBUG=1", 320 | "$(inherited)", 321 | ); 322 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 323 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 324 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 325 | GCC_WARN_UNDECLARED_SELECTOR = YES; 326 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 327 | GCC_WARN_UNUSED_FUNCTION = YES; 328 | GCC_WARN_UNUSED_VARIABLE = YES; 329 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 330 | MTL_ENABLE_DEBUG_INFO = YES; 331 | ONLY_ACTIVE_ARCH = YES; 332 | SDKROOT = iphoneos; 333 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 334 | }; 335 | name = Debug; 336 | }; 337 | B8B7C83819D39EED00EA3D24 /* Release */ = { 338 | isa = XCBuildConfiguration; 339 | buildSettings = { 340 | ALWAYS_SEARCH_USER_PATHS = NO; 341 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 342 | CLANG_CXX_LIBRARY = "libc++"; 343 | CLANG_ENABLE_MODULES = YES; 344 | CLANG_ENABLE_OBJC_ARC = YES; 345 | CLANG_WARN_BOOL_CONVERSION = YES; 346 | CLANG_WARN_CONSTANT_CONVERSION = YES; 347 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 348 | CLANG_WARN_EMPTY_BODY = YES; 349 | CLANG_WARN_ENUM_CONVERSION = YES; 350 | CLANG_WARN_INT_CONVERSION = YES; 351 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 352 | CLANG_WARN_UNREACHABLE_CODE = YES; 353 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 354 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 355 | COPY_PHASE_STRIP = YES; 356 | ENABLE_NS_ASSERTIONS = NO; 357 | ENABLE_STRICT_OBJC_MSGSEND = YES; 358 | GCC_C_LANGUAGE_STANDARD = gnu99; 359 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 360 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 361 | GCC_WARN_UNDECLARED_SELECTOR = YES; 362 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 363 | GCC_WARN_UNUSED_FUNCTION = YES; 364 | GCC_WARN_UNUSED_VARIABLE = YES; 365 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 366 | MTL_ENABLE_DEBUG_INFO = NO; 367 | SDKROOT = iphoneos; 368 | VALIDATE_PRODUCT = YES; 369 | }; 370 | name = Release; 371 | }; 372 | B8B7C83A19D39EED00EA3D24 /* Debug */ = { 373 | isa = XCBuildConfiguration; 374 | buildSettings = { 375 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 376 | INFOPLIST_FILE = RadialTransitionExample/Info.plist; 377 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 378 | PRODUCT_NAME = "$(TARGET_NAME)"; 379 | }; 380 | name = Debug; 381 | }; 382 | B8B7C83B19D39EED00EA3D24 /* Release */ = { 383 | isa = XCBuildConfiguration; 384 | buildSettings = { 385 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 386 | INFOPLIST_FILE = RadialTransitionExample/Info.plist; 387 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 388 | PRODUCT_NAME = "$(TARGET_NAME)"; 389 | }; 390 | name = Release; 391 | }; 392 | B8B7C83D19D39EED00EA3D24 /* Debug */ = { 393 | isa = XCBuildConfiguration; 394 | buildSettings = { 395 | BUNDLE_LOADER = "$(TEST_HOST)"; 396 | FRAMEWORK_SEARCH_PATHS = ( 397 | "$(SDKROOT)/Developer/Library/Frameworks", 398 | "$(inherited)", 399 | ); 400 | GCC_PREPROCESSOR_DEFINITIONS = ( 401 | "DEBUG=1", 402 | "$(inherited)", 403 | ); 404 | INFOPLIST_FILE = RadialTransitionExampleTests/Info.plist; 405 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 406 | PRODUCT_NAME = "$(TARGET_NAME)"; 407 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RadialTransitionExample.app/RadialTransitionExample"; 408 | }; 409 | name = Debug; 410 | }; 411 | B8B7C83E19D39EED00EA3D24 /* Release */ = { 412 | isa = XCBuildConfiguration; 413 | buildSettings = { 414 | BUNDLE_LOADER = "$(TEST_HOST)"; 415 | FRAMEWORK_SEARCH_PATHS = ( 416 | "$(SDKROOT)/Developer/Library/Frameworks", 417 | "$(inherited)", 418 | ); 419 | INFOPLIST_FILE = RadialTransitionExampleTests/Info.plist; 420 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 421 | PRODUCT_NAME = "$(TARGET_NAME)"; 422 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RadialTransitionExample.app/RadialTransitionExample"; 423 | }; 424 | name = Release; 425 | }; 426 | /* End XCBuildConfiguration section */ 427 | 428 | /* Begin XCConfigurationList section */ 429 | B8B7C81519D39EED00EA3D24 /* Build configuration list for PBXProject "RadialTransitionExample" */ = { 430 | isa = XCConfigurationList; 431 | buildConfigurations = ( 432 | B8B7C83719D39EED00EA3D24 /* Debug */, 433 | B8B7C83819D39EED00EA3D24 /* Release */, 434 | ); 435 | defaultConfigurationIsVisible = 0; 436 | defaultConfigurationName = Release; 437 | }; 438 | B8B7C83919D39EED00EA3D24 /* Build configuration list for PBXNativeTarget "RadialTransitionExample" */ = { 439 | isa = XCConfigurationList; 440 | buildConfigurations = ( 441 | B8B7C83A19D39EED00EA3D24 /* Debug */, 442 | B8B7C83B19D39EED00EA3D24 /* Release */, 443 | ); 444 | defaultConfigurationIsVisible = 0; 445 | }; 446 | B8B7C83C19D39EED00EA3D24 /* Build configuration list for PBXNativeTarget "RadialTransitionExampleTests" */ = { 447 | isa = XCConfigurationList; 448 | buildConfigurations = ( 449 | B8B7C83D19D39EED00EA3D24 /* Debug */, 450 | B8B7C83E19D39EED00EA3D24 /* Release */, 451 | ); 452 | defaultConfigurationIsVisible = 0; 453 | }; 454 | /* End XCConfigurationList section */ 455 | }; 456 | rootObject = B8B7C81219D39EED00EA3D24 /* Project object */; 457 | } 458 | -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample.xcodeproj/project.xcworkspace/xcshareddata/RadialTransitionExample.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | D5ACC858-2AF9-4069-B4D1-2CDBD927F272 9 | IDESourceControlProjectName 10 | RadialTransitionExample 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | AE8B3389A34A289DCBD885B52F92D34293A73547 14 | github.com:zeectm/RadialTransition_swift.git 15 | 16 | IDESourceControlProjectPath 17 | RadialTransitionExample/RadialTransitionExample.xcodeproj 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | AE8B3389A34A289DCBD885B52F92D34293A73547 21 | ../../.. 22 | 23 | IDESourceControlProjectURL 24 | github.com:zeectm/RadialTransition_swift.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | AE8B3389A34A289DCBD885B52F92D34293A73547 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | AE8B3389A34A289DCBD885B52F92D34293A73547 36 | IDESourceControlWCCName 37 | RadialTransition_swift 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample.xcodeproj/project.xcworkspace/xcuserdata/alexpadalko.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apadalko/RadialTransition_swift/1e09963d52e1d8c88835b187766c89d0c6aaa61c/RadialTransitionExample/RadialTransitionExample.xcodeproj/project.xcworkspace/xcuserdata/alexpadalko.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample.xcodeproj/project.xcworkspace/xcuserdata/zeieshan.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apadalko/RadialTransition_swift/1e09963d52e1d8c88835b187766c89d0c6aaa61c/RadialTransitionExample/RadialTransitionExample.xcodeproj/project.xcworkspace/xcuserdata/zeieshan.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample.xcodeproj/xcuserdata/alexpadalko.xcuserdatad/xcschemes/RadialTransitionExample.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 | -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample.xcodeproj/xcuserdata/alexpadalko.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | RadialTransitionExample.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | B8B7C81919D39EED00EA3D24 16 | 17 | primary 18 | 19 | 20 | B8B7C82E19D39EED00EA3D24 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample.xcodeproj/xcuserdata/zeieshan.xcuserdatad/xcschemes/RadialTransitionExample.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 | 77 | 83 | 84 | 85 | 86 | 87 | 88 | 94 | 96 | 102 | 103 | 104 | 105 | 107 | 108 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample.xcodeproj/xcuserdata/zeieshan.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | RadialTransitionExample.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | B8B7C81919D39EED00EA3D24 16 | 17 | primary 18 | 19 | 20 | B8B7C82E19D39EED00EA3D24 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // RadialTransitionExample 4 | // 5 | // Created by Alex Padalko on 9/24/14. 6 | // Copyright (c) 2014 Alex Padalko. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 18 | 19 | self.window = UIWindow(frame: UIScreen.mainScreen().bounds); 20 | 21 | var nav = UINavigationController(rootViewController: FirstViewController(nibName: "FirstViewController", bundle: nil)); 22 | 23 | 24 | 25 | 26 | self.window?.rootViewController = nav; 27 | self.window?.makeKeyAndVisible(); 28 | return true 29 | } 30 | 31 | func applicationWillResignActive(application: UIApplication) { 32 | // 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. 33 | // 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. 34 | } 35 | 36 | func applicationDidEnterBackground(application: UIApplication) { 37 | // 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. 38 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 39 | } 40 | 41 | func applicationWillEnterForeground(application: UIApplication) { 42 | // 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. 43 | } 44 | 45 | func applicationDidBecomeActive(application: UIApplication) { 46 | // 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. 47 | } 48 | 49 | func applicationWillTerminate(application: UIApplication) { 50 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 51 | } 52 | 53 | 54 | } 55 | 56 | -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample/FirstViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FirstViewController.swift 3 | // RadialTransitionExample 4 | // 5 | // Created by Alex Padalko on 9/24/14. 6 | // Copyright (c) 2014 Alex Padalko. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class FirstViewController: UIViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | self.navigationController?.enableRadialSwipe() 16 | self.title="First ViewController" 17 | 18 | // Do any additional setup after loading the view. 19 | } 20 | 21 | override func didReceiveMemoryWarning() { 22 | super.didReceiveMemoryWarning() 23 | // Dispose of any resources that can be recreated. 24 | } 25 | @IBAction func simplePush(sender: UIButton) { 26 | 27 | self.navigationController?.radialPushViewController(SecondViewController(nibName: "SecondViewController", bundle: nil),transitionCompletion: { () -> Void in 28 | 29 | 30 | 31 | }) 32 | 33 | } 34 | 35 | @IBAction func customFrame1(sender: UIButton) { 36 | 37 | 38 | self.navigationController?.radialPushViewController(SecondViewController(nibName: "SecondViewController", bundle: nil),startFrame: sender.frame,duration:0.9,transitionCompletion: { () -> Void in 39 | 40 | 41 | 42 | }) 43 | } 44 | 45 | @IBAction func customFrame2(sender: UIButton) { 46 | 47 | self.navigationController?.radialPushViewController(SecondViewController(nibName: "SecondViewController", bundle: nil),startFrame: CGRectMake(self.view.frame.size.width, 0, 0, 0),duration:0.9,transitionCompletion: { () -> Void in 48 | 49 | 50 | 51 | }) 52 | 53 | } 54 | 55 | /* 56 | // MARK: - Navigation 57 | 58 | // In a storyboard-based application, you will often want to do a little preparation before navigation 59 | override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { 60 | // Get the new view controller using segue.destinationViewController. 61 | // Pass the selected object to the new view controller. 62 | } 63 | */ 64 | 65 | } 66 | -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample/FirstViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 38 | 56 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample/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" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.vv.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample/SecondViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SecondViewController.swift 3 | // RadialTransitionExample 4 | // 5 | // Created by Alex Padalko on 9/24/14. 6 | // Copyright (c) 2014 Alex Padalko. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class SecondViewController: UIViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "back", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("simplePop:")) 16 | self.title="Second ViewController" 17 | 18 | } 19 | 20 | override func didReceiveMemoryWarning() { 21 | super.didReceiveMemoryWarning() 22 | // Dispose of any resources that can be recreated. 23 | } 24 | 25 | @IBAction func simplePop(sender: UIButton) { 26 | 27 | self.navigationController?.radialPopViewController() 28 | 29 | } 30 | 31 | @IBAction func cutimFrame1(sender: UIButton) { 32 | self.navigationController?.radialPopViewController(startFrame:CGRectZero,duration: 0.9) 33 | } 34 | @IBAction func customFrame2(sender: UIButton) { 35 | 36 | self.navigationController?.radialPopViewController(startFrame:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height, 0, 0),duration: 0.9,transitionCompletion: { () -> Void in 37 | 38 | 39 | 40 | }) 41 | } 42 | /* 43 | // MARK: - Navigation 44 | 45 | // In a storyboard-based application, you will often want to do a little preparation before navigation 46 | override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { 47 | // Get the new view controller using segue.destinationViewController. 48 | // Pass the selected object to the new view controller. 49 | } 50 | */ 51 | 52 | } 53 | -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample/SecondViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 38 | 56 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample/Yoda-Art-Wallpaper.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apadalko/RadialTransition_swift/1e09963d52e1d8c88835b187766c89d0c6aaa61c/RadialTransitionExample/RadialTransitionExample/Yoda-Art-Wallpaper.jpg -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExample/star-wars_00409801.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apadalko/RadialTransition_swift/1e09963d52e1d8c88835b187766c89d0c6aaa61c/RadialTransitionExample/RadialTransitionExample/star-wars_00409801.jpg -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExampleTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.vv.$(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 | -------------------------------------------------------------------------------- /RadialTransitionExample/RadialTransitionExampleTests/RadialTransitionExampleTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RadialTransitionExampleTests.swift 3 | // RadialTransitionExampleTests 4 | // 5 | // Created by Alex Padalko on 9/24/14. 6 | // Copyright (c) 2014 Alex Padalko. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import XCTest 11 | 12 | class RadialTransitionExampleTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | XCTAssert(true, "Pass") 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measureBlock() { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /RadialTransitionSource/AAPTransactionDirector.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AAPTransactionDirector.swift 3 | // AAPRadialTransaction_swift 4 | // 5 | // Created by Alex Padalko on 9/23/14. 6 | // Copyright (c) 2014 Alex Padalko. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class AAPTransactionDirector: NSObject,UIViewControllerAnimatedTransitioning,UINavigationControllerDelegate,UIViewControllerInteractiveTransitioning { 12 | 13 | private var _context:UIViewControllerContextTransitioning? 14 | 15 | /** 16 | * animation block.Use transactionContext to get all needed views. toViewController will be above. NOTE: if you use it for animation without interactive YOU MUST RUN complitBlock at end. 17 | * 18 | */ 19 | lazy var animationBlock:((transactionContext:UIViewControllerContextTransitioning, animationTime: CGFloat , transitionCompletion:()->Void)->Void)? = nil 20 | /** 21 | * interactive update block.Use transactionContext to get all needed views.updating after percent changing 22 | * 23 | */ 24 | lazy var interactiveUpdateBlock:((transactionContext:UIViewControllerContextTransitioning, percent: CGFloat)->Void)? = nil 25 | 26 | lazy var interactiveEndBlock:(()->Void)? = nil 27 | 28 | 29 | var isInteractive:Bool = false 30 | var duration:CGFloat? 31 | private var displayLink:CADisplayLink? = nil 32 | private var _percent:CGFloat = 0 33 | var precent:CGFloat { 34 | 35 | get { 36 | return _percent 37 | } 38 | set { 39 | 40 | _percent = newValue 41 | 42 | 43 | self._context?.updateInteractiveTransition(_percent) 44 | 45 | 46 | 47 | self._context?.containerView().layer.timeOffset = CFTimeInterval(_percent*self.duration!) 48 | if (self._context != nil) { 49 | 50 | self.interactiveUpdateBlock?(transactionContext:_context!,percent:_percent) 51 | 52 | } 53 | 54 | 55 | 56 | } 57 | 58 | } 59 | var timeOffset:CFTimeInterval{ 60 | get { 61 | return self._context!.containerView().layer.timeOffset 62 | } 63 | set { 64 | self.precent = CGFloat(CGFloat(newValue)/self.duration!) 65 | //self._context?.containerView().layer.timeOffset=CFTimeInterval(newValue) 66 | 67 | } 68 | 69 | 70 | } 71 | 72 | //MARK: Interactive transaction ending 73 | /** 74 | * run to end interactive transaction 75 | * 76 | */ 77 | func endInteractiveTranscation(#canceled: Bool , endBlock:()->Void){ 78 | self.interactiveEndBlock=endBlock 79 | if canceled { 80 | _context?.cancelInteractiveTransition() 81 | displayLink = CADisplayLink (target: self, selector: Selector("updateCancelAnimation")) 82 | 83 | } else { 84 | 85 | displayLink = CADisplayLink (target: self, selector: Selector("updateFinishAnimation")) 86 | } 87 | 88 | displayLink?.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes) 89 | 90 | } 91 | 92 | 93 | func updateFinishAnimation(){ 94 | 95 | 96 | let offset = CFTimeInterval( self.timeOffset) + displayLink!.duration 97 | 98 | if offset > CFTimeInterval(self.duration!) { 99 | transitionFinishedFinishing() 100 | }else{ 101 | self.timeOffset=offset 102 | } 103 | 104 | 105 | } 106 | 107 | func updateCancelAnimation(){ 108 | 109 | let offset = CFTimeInterval( self.timeOffset) - displayLink!.duration 110 | 111 | if offset < 0 { 112 | transitionFinishedCanceling() 113 | }else{ 114 | self.timeOffset=offset 115 | 116 | } 117 | } 118 | 119 | private func transitionFinishedCanceling(){ 120 | self._context?.containerView().layer.timeOffset=0 121 | displayLink?.invalidate() 122 | 123 | _context?.completeTransition(false) 124 | 125 | self.interactiveEndBlock?(); 126 | 127 | } 128 | 129 | private func transitionFinishedFinishing(){ 130 | displayLink?.invalidate() 131 | _context?.finishInteractiveTransition() 132 | _context?.completeTransition(true) 133 | self.interactiveEndBlock?(); 134 | 135 | } 136 | 137 | 138 | 139 | //MARK: init & deinit 140 | 141 | override init() { 142 | 143 | } 144 | 145 | deinit{ 146 | 147 | } 148 | 149 | 150 | 151 | //MARK: animation transaction delegate 152 | func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval{ 153 | 154 | return NSTimeInterval(self.duration!); 155 | } 156 | 157 | func animateTransition(transitionContext: UIViewControllerContextTransitioning){ 158 | self._context=transitionContext 159 | 160 | 161 | var v1=transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!.view 162 | var v2=transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!.view 163 | 164 | 165 | 166 | self.animationBlock?(transactionContext: self._context!, animationTime: self.duration!, transitionCompletion: { () -> Void in 167 | 168 | 169 | 170 | transitionContext.completeTransition(true) 171 | 172 | }); 173 | 174 | } 175 | 176 | //MARK: interactive transaction delegate 177 | func startInteractiveTransition(transitionContext: UIViewControllerContextTransitioning){ 178 | 179 | self._context=transitionContext 180 | 181 | 182 | self.animationBlock?(transactionContext: self._context!, animationTime: self.duration!, transitionCompletion: { () -> Void in 183 | 184 | 185 | 186 | }); 187 | } 188 | 189 | //MARK: navigation controller delegate 190 | func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { 191 | 192 | 193 | 194 | return self 195 | } 196 | 197 | 198 | 199 | 200 | func navigationController(navigationController: UINavigationController, interactionControllerForAnimationController animationController: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { 201 | 202 | return self.isInteractive ? self : nil; 203 | 204 | } 205 | } 206 | -------------------------------------------------------------------------------- /RadialTransitionSource/UINavigationController+RadialTransaction.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UINavigationController+RadialTransaction.swift 3 | // AAPRadialTransaction_swift 4 | // 5 | // Created by Alex Padalko on 9/23/14. 6 | // Copyright (c) 2014 Alex Padalko. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | let abc=AAPTransactionDirector(); 11 | 12 | var defaultRadialDuration:CGFloat = 0.5 13 | 14 | extension UINavigationController { 15 | 16 | 17 | 18 | 19 | func getLeftRect()->CGRect{ 20 | 21 | return CGRectZero 22 | 23 | } 24 | //MARK: PUSH 25 | /** 26 | * radial pushing view controller 27 | * 28 | * @param startFrame where circle start 29 | */ 30 | func radialPushViewController(viewController: UIViewController, duration: CGFloat = 0.33 ,startFrame:CGRect = CGRectNull, transitionCompletion: (() -> Void)? = nil ){ 31 | 32 | var rect = startFrame 33 | if(rect == CGRectNull){ 34 | 35 | rect = CGRectMake(self.visibleViewController.view.frame.size.width, self.visibleViewController.view.frame.size.height/2, 0, 0) 36 | } 37 | 38 | 39 | var animatorDirector:AAPTransactionDirector?=AAPTransactionDirector(); 40 | animatorDirector?.duration=duration 41 | 42 | 43 | self.delegate=animatorDirector; 44 | animatorDirector?.animationBlock={(transactionContext:UIViewControllerContextTransitioning, animationTime: CGFloat ,completion:()->Void)->Void in 45 | 46 | let toViewController = transactionContext.viewControllerForKey(UITransitionContextToViewControllerKey) 47 | let fromViewController = transactionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) 48 | let containerView = transactionContext.containerView() 49 | 50 | containerView.insertSubview(toViewController!.view, aboveSubview: fromViewController!.view) 51 | 52 | toViewController?.view .radialAppireanceWithStartFrame(rect, duration: animationTime, complitBlock: { () -> Void in 53 | 54 | 55 | completion(); 56 | 57 | transitionCompletion?(); 58 | 59 | 60 | }) 61 | 62 | } 63 | self.pushViewController(viewController, animated: true) 64 | 65 | 66 | 67 | self.delegate = nil; 68 | 69 | } 70 | //MARK: POP 71 | /** 72 | * radial pop view controller 73 | * 74 | * @param startFrame where circle start 75 | */ 76 | func radialPopViewController( duration: CGFloat = 0.33 ,startFrame:CGRect = CGRectNull, transitionCompletion: (() -> Void)? = nil ){ 77 | 78 | var rect = startFrame 79 | if(rect == CGRectNull){ 80 | 81 | rect = CGRectMake(0, self.visibleViewController.view.frame.size.height/2, 0, 0) 82 | } 83 | 84 | 85 | var animatorDirector=AAPTransactionDirector(); 86 | animatorDirector.duration=duration 87 | self.delegate=animatorDirector; 88 | animatorDirector.animationBlock={(transactionContext:UIViewControllerContextTransitioning, animationTime: CGFloat ,completion:()->Void)->Void in 89 | 90 | let toViewController = transactionContext.viewControllerForKey(UITransitionContextToViewControllerKey) 91 | let fromViewController = transactionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) 92 | let containerView = transactionContext.containerView() 93 | 94 | containerView.insertSubview(toViewController!.view, aboveSubview: fromViewController!.view) 95 | 96 | toViewController?.view .radialAppireanceWithStartFrame(rect, duration: animationTime, complitBlock: { () -> Void in 97 | completion(); 98 | transitionCompletion?(); 99 | 100 | 101 | }) 102 | 103 | } 104 | 105 | self.popViewControllerAnimated(true) 106 | self.delegate = nil; 107 | } 108 | 109 | 110 | //MARK: Swipe 111 | 112 | func enableRadialSwipe(){ 113 | 114 | 115 | 116 | 117 | self.enableGesture(true) 118 | 119 | 120 | 121 | } 122 | func disableRadialSwipe(){ 123 | self.enableGesture(false) 124 | 125 | } 126 | 127 | /** 128 | * enabling swipe back gesture. NOTE interactivePopGestureRecognizer will be disabled 129 | * 130 | */ 131 | private func enableGesture(enabled:Bool){ 132 | 133 | struct StaticStruct { 134 | 135 | static var recognizerData = Dictionary() 136 | 137 | } 138 | 139 | if enabled == true { 140 | 141 | if self.respondsToSelector(Selector("interactivePopGestureRecognizer")) { 142 | 143 | self.interactivePopGestureRecognizer.enabled = false 144 | } 145 | 146 | let panGesture = UIScreenEdgePanGestureRecognizer(target: self, action: Selector("screenPan:")) 147 | panGesture.edges = UIRectEdge.Left 148 | 149 | self.view.addGestureRecognizer(panGesture) 150 | 151 | StaticStruct.recognizerData[self.description] = panGesture 152 | 153 | 154 | 155 | }else { 156 | 157 | self.view.removeGestureRecognizer(StaticStruct.recognizerData[self.description]!) 158 | StaticStruct.recognizerData[self.description] = nil 159 | 160 | } 161 | } 162 | 163 | func screenPan(sender: AnyObject){ 164 | 165 | 166 | let pan: UIPanGestureRecognizer = sender as! UIPanGestureRecognizer 167 | 168 | 169 | let state: UIGestureRecognizerState = pan.state 170 | 171 | let location:CGPoint = pan.locationInView(self.view) 172 | 173 | struct StaticStruct { 174 | static var firstTouch:CGPoint = CGPointZero 175 | static var d:CGFloat = 0 176 | static var animDirector:AAPTransactionDirector? = nil 177 | 178 | 179 | static func clean(){ 180 | 181 | d=0; 182 | firstTouch=CGPointZero 183 | animDirector=nil 184 | } 185 | 186 | } 187 | 188 | switch state { 189 | 190 | case UIGestureRecognizerState.Began: 191 | 192 | if (self.viewControllers.count<2) { 193 | StaticStruct.clean() 194 | return; 195 | } 196 | 197 | StaticStruct.animDirector = AAPTransactionDirector() 198 | StaticStruct.animDirector?.isInteractive=true 199 | StaticStruct.animDirector?.duration = defaultRadialDuration 200 | self.delegate=StaticStruct.animDirector 201 | 202 | 203 | 204 | self.popViewControllerAnimated(true) 205 | self.delegate=nil 206 | StaticStruct.d = sqrt(pow(self.visibleViewController.view.frame.size.width, 2)+pow(self.visibleViewController.view.frame.size.height, 2) )*2 207 | 208 | StaticStruct.firstTouch = location 209 | 210 | 211 | 212 | StaticStruct.animDirector?.animationBlock={(transactionContext:UIViewControllerContextTransitioning, animationTime: CGFloat ,completion:()->Void)->Void in 213 | 214 | 215 | let toViewController = transactionContext.viewControllerForKey(UITransitionContextToViewControllerKey) 216 | let fromViewController = transactionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) 217 | let containerView = transactionContext.containerView() 218 | 219 | containerView.insertSubview(toViewController!.view, aboveSubview: fromViewController!.view) 220 | 221 | let maskLayer = CAShapeLayer() 222 | let maskRect = CGRectMake(location.x-location.x/2, location.y-location.x/2, 0, 0); 223 | let path = CGPathCreateWithEllipseInRect(maskRect, nil) 224 | maskLayer.path=path 225 | toViewController?.view.layer.mask=maskLayer 226 | 227 | 228 | } 229 | 230 | 231 | case UIGestureRecognizerState.Changed: 232 | 233 | 234 | 235 | StaticStruct.animDirector?.interactiveUpdateBlock={(transactionContext:UIViewControllerContextTransitioning, percent: CGFloat)->Void in 236 | 237 | let maskLayer:CAShapeLayer = transactionContext.viewControllerForKey(UITransitionContextToViewControllerKey)?.view.layer.mask as! CAShapeLayer 238 | 239 | let mainD = percent * StaticStruct.d 240 | 241 | let maskRect : CGRect = CGRectMake(-mainD/2, location.y-mainD/2, mainD, mainD); 242 | 243 | let path = CGPathCreateWithEllipseInRect(maskRect, nil) 244 | 245 | 246 | maskLayer.path=path 247 | 248 | } 249 | 250 | let mainD = location.x*StaticStruct.d/self.view.frame.size.width 251 | 252 | 253 | StaticStruct.animDirector?.precent=mainD/StaticStruct.d 254 | 255 | default: 256 | 257 | 258 | let mainD = location.x*StaticStruct.d/self.view.frame.size.width; 259 | 260 | let canceled = mainD>StaticStruct.d*0.5 ? false : true; 261 | 262 | StaticStruct.animDirector?.endInteractiveTranscation(canceled: canceled, endBlock: { () -> Void in 263 | StaticStruct.clean() 264 | }) 265 | } 266 | } 267 | } 268 | 269 | 270 | 271 | 272 | 273 | 274 | -------------------------------------------------------------------------------- /RadialTransitionSource/UIView+Radial.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Radial.swift 3 | // AAPRadialTransaction_swift 4 | // 5 | // Created by Alex Padalko on 9/23/14. 6 | // Copyright (c) 2014 Alex Padalko. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | 12 | 13 | class LayerAnimator : NSObject{ 14 | 15 | var complitionBlock:(()->Void)? 16 | var animLayer:CALayer? 17 | var caAnimation:CAAnimation? 18 | 19 | 20 | init(layer: CALayer , animation:CAAnimation) { 21 | 22 | self.caAnimation=animation; 23 | self.animLayer=layer; 24 | 25 | 26 | 27 | } 28 | 29 | func startAnimationWithBlock(block:(()->Void)){ 30 | self.caAnimation?.delegate=self 31 | self.complitionBlock=block; 32 | 33 | self.animLayer?.addAnimation(self.caAnimation, forKey: "anim") 34 | } 35 | 36 | override func animationDidStop(anim: CAAnimation!, finished flag: Bool) { 37 | self.complitionBlock?() 38 | } 39 | 40 | 41 | } 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | extension UIView { 51 | 52 | 53 | 54 | 55 | func radialAppireanceWithStartFrame(startFrame:CGRect,duration: CGFloat,complitBlock:()->Void ){ 56 | 57 | 58 | let maskLayer = CAShapeLayer() 59 | let maskRect = startFrame 60 | let path = CGPathCreateWithEllipseInRect(maskRect, nil) 61 | maskLayer.path=path 62 | 63 | let d = sqrt(pow(self.frame.size.width, 2)+pow(self.frame.size.height, 2) )*2 64 | 65 | let newRect = CGRectMake(self.frame.size.width/2-d/2, maskRect.origin.y-d/2, d, d) 66 | 67 | let newPath = CGPathCreateWithEllipseInRect(newRect, nil) 68 | 69 | self.layer.mask = maskLayer; 70 | 71 | 72 | let revealAnimation = CABasicAnimation(keyPath: "path") 73 | revealAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 74 | revealAnimation.fromValue = path 75 | revealAnimation.toValue = newPath 76 | 77 | revealAnimation.duration = CFTimeInterval(duration) 78 | 79 | 80 | maskLayer.path=newPath 81 | 82 | let animator:LayerAnimator = LayerAnimator(layer: maskLayer, animation: revealAnimation) 83 | 84 | animator.startAnimationWithBlock { () -> Void in 85 | 86 | 87 | complitBlock() 88 | 89 | } 90 | 91 | 92 | 93 | 94 | } 95 | 96 | func radialDissmisWithStartFrame(startFrame:CGRect,duration: CGFloat,complitBlock:()->Void ){ 97 | 98 | 99 | let maskLayer = CAShapeLayer() 100 | let maskRect = startFrame 101 | let path = CGPathCreateWithEllipseInRect(maskRect, nil) 102 | maskLayer.path=path 103 | 104 | let d = sqrt(pow(self.frame.size.width, 2)+pow(self.frame.size.height, 2) )*2 105 | 106 | let newRect = CGRectMake(self.frame.size.width/2-d/2, maskRect.origin.y-d/2, d, d) 107 | 108 | let newPath = CGPathCreateWithEllipseInRect(newRect, nil) 109 | 110 | self.layer.mask = maskLayer; 111 | 112 | 113 | let revealAnimation = CABasicAnimation(keyPath: "path") 114 | revealAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 115 | revealAnimation.fromValue = path 116 | revealAnimation.toValue = newPath 117 | 118 | revealAnimation.duration = CFTimeInterval(duration) 119 | 120 | 121 | maskLayer.path=newPath 122 | 123 | let animator:LayerAnimator = LayerAnimator(layer: maskLayer, animation: revealAnimation) 124 | 125 | animator.startAnimationWithBlock { () -> Void in 126 | 127 | 128 | complitBlock() 129 | 130 | } 131 | 132 | 133 | 134 | 135 | } 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | } 145 | -------------------------------------------------------------------------------- /radialDemo_short.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apadalko/RadialTransition_swift/1e09963d52e1d8c88835b187766c89d0c6aaa61c/radialDemo_short.gif -------------------------------------------------------------------------------- /radilaDemo_long.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apadalko/RadialTransition_swift/1e09963d52e1d8c88835b187766c89d0c6aaa61c/radilaDemo_long.gif --------------------------------------------------------------------------------