├── LLNavigationController.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── maochao.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ └── maochao.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── LLNavigationController.xcscheme │ └── xcschememanagement.plist ├── LLNavigationController ├── AppDelegate.h ├── AppDelegate.m ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── Base.lproj │ └── LaunchScreen.storyboard ├── Info.plist ├── LLNavigationController │ ├── LLBaseNavigationController.h │ ├── LLBaseNavigationController.m │ ├── LLScreenShotView │ │ ├── LLScreenShotView.h │ │ └── LLScreenShotView.m │ ├── LLTransitionAnimator │ │ ├── LLDismissAnimation.h │ │ ├── LLDismissAnimation.m │ │ ├── LLPresentAnimation.h │ │ ├── LLPresentAnimation.m │ │ └── LLTransistionDelegate │ │ │ ├── LLNavControllerDelegate.h │ │ │ └── LLNavControllerDelegate.m │ ├── UINavigationController+LLAddPart.h │ └── UINavigationController+LLAddPart.m ├── ViewController.h ├── ViewController.m ├── image.PNG └── main.m ├── LLNavigationControllerTests ├── Info.plist └── LLNavigationControllerTests.m ├── LLNavigationControllerUITests ├── Info.plist └── LLNavigationControllerUITests.m └── README.md /LLNavigationController.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | C6339BAF1E0B9CC0009D402E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C6339BAE1E0B9CC0009D402E /* main.m */; }; 11 | C6339BB21E0B9CC0009D402E /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C6339BB11E0B9CC0009D402E /* AppDelegate.m */; }; 12 | C6339BBA1E0B9CC0009D402E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C6339BB91E0B9CC0009D402E /* Assets.xcassets */; }; 13 | C6339BBD1E0B9CC0009D402E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C6339BBB1E0B9CC0009D402E /* LaunchScreen.storyboard */; }; 14 | C6339BC81E0B9CC0009D402E /* LLNavigationControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C6339BC71E0B9CC0009D402E /* LLNavigationControllerTests.m */; }; 15 | C6339BD31E0B9CC0009D402E /* LLNavigationControllerUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = C6339BD21E0B9CC0009D402E /* LLNavigationControllerUITests.m */; }; 16 | C648E7CD1E274F9900A376C5 /* image.PNG in Resources */ = {isa = PBXBuildFile; fileRef = C648E7CC1E274F9900A376C5 /* image.PNG */; }; 17 | C6A75AF81E263379005055BF /* LLDismissAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = C6A75AF21E263379005055BF /* LLDismissAnimation.m */; }; 18 | C6A75AF91E263379005055BF /* LLPresentAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = C6A75AF41E263379005055BF /* LLPresentAnimation.m */; }; 19 | C6A75AFA1E263379005055BF /* LLNavControllerDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C6A75AF71E263379005055BF /* LLNavControllerDelegate.m */; }; 20 | C6F21A4B1E0BA7E000393FE3 /* LLBaseNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = C6F21A431E0BA7E000393FE3 /* LLBaseNavigationController.m */; }; 21 | C6F21A4C1E0BA7E000393FE3 /* LLScreenShotView.m in Sources */ = {isa = PBXBuildFile; fileRef = C6F21A461E0BA7E000393FE3 /* LLScreenShotView.m */; }; 22 | C6F21A4D1E0BA7E000393FE3 /* UINavigationController+LLAddPart.m in Sources */ = {isa = PBXBuildFile; fileRef = C6F21A481E0BA7E000393FE3 /* UINavigationController+LLAddPart.m */; }; 23 | C6F21A8C1E0BA92E00393FE3 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C6F21A891E0BA92E00393FE3 /* ViewController.m */; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXContainerItemProxy section */ 27 | C6339BC41E0B9CC0009D402E /* PBXContainerItemProxy */ = { 28 | isa = PBXContainerItemProxy; 29 | containerPortal = C6339BA21E0B9CC0009D402E /* Project object */; 30 | proxyType = 1; 31 | remoteGlobalIDString = C6339BA91E0B9CC0009D402E; 32 | remoteInfo = LLNavigationController; 33 | }; 34 | C6339BCF1E0B9CC0009D402E /* PBXContainerItemProxy */ = { 35 | isa = PBXContainerItemProxy; 36 | containerPortal = C6339BA21E0B9CC0009D402E /* Project object */; 37 | proxyType = 1; 38 | remoteGlobalIDString = C6339BA91E0B9CC0009D402E; 39 | remoteInfo = LLNavigationController; 40 | }; 41 | /* End PBXContainerItemProxy section */ 42 | 43 | /* Begin PBXFileReference section */ 44 | C6339BAA1E0B9CC0009D402E /* LLNavigationController.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LLNavigationController.app; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | C6339BAE1E0B9CC0009D402E /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 46 | C6339BB01E0B9CC0009D402E /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 47 | C6339BB11E0B9CC0009D402E /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 48 | C6339BB91E0B9CC0009D402E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 49 | C6339BBC1E0B9CC0009D402E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 50 | C6339BBE1E0B9CC0009D402E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 51 | C6339BC31E0B9CC0009D402E /* LLNavigationControllerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LLNavigationControllerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 52 | C6339BC71E0B9CC0009D402E /* LLNavigationControllerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LLNavigationControllerTests.m; sourceTree = ""; }; 53 | C6339BC91E0B9CC0009D402E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54 | C6339BCE1E0B9CC0009D402E /* LLNavigationControllerUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LLNavigationControllerUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 55 | C6339BD21E0B9CC0009D402E /* LLNavigationControllerUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LLNavigationControllerUITests.m; sourceTree = ""; }; 56 | C6339BD41E0B9CC0009D402E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 57 | C648E7CC1E274F9900A376C5 /* image.PNG */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = image.PNG; sourceTree = ""; }; 58 | C6A75AF11E263379005055BF /* LLDismissAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LLDismissAnimation.h; sourceTree = ""; }; 59 | C6A75AF21E263379005055BF /* LLDismissAnimation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LLDismissAnimation.m; sourceTree = ""; }; 60 | C6A75AF31E263379005055BF /* LLPresentAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LLPresentAnimation.h; sourceTree = ""; }; 61 | C6A75AF41E263379005055BF /* LLPresentAnimation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LLPresentAnimation.m; sourceTree = ""; }; 62 | C6A75AF61E263379005055BF /* LLNavControllerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LLNavControllerDelegate.h; sourceTree = ""; }; 63 | C6A75AF71E263379005055BF /* LLNavControllerDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LLNavControllerDelegate.m; sourceTree = ""; }; 64 | C6F21A421E0BA7E000393FE3 /* LLBaseNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LLBaseNavigationController.h; sourceTree = ""; }; 65 | C6F21A431E0BA7E000393FE3 /* LLBaseNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LLBaseNavigationController.m; sourceTree = ""; }; 66 | C6F21A451E0BA7E000393FE3 /* LLScreenShotView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LLScreenShotView.h; sourceTree = ""; }; 67 | C6F21A461E0BA7E000393FE3 /* LLScreenShotView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LLScreenShotView.m; sourceTree = ""; }; 68 | C6F21A471E0BA7E000393FE3 /* UINavigationController+LLAddPart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UINavigationController+LLAddPart.h"; sourceTree = ""; }; 69 | C6F21A481E0BA7E000393FE3 /* UINavigationController+LLAddPart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UINavigationController+LLAddPart.m"; sourceTree = ""; }; 70 | C6F21A881E0BA92E00393FE3 /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 71 | C6F21A891E0BA92E00393FE3 /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 72 | /* End PBXFileReference section */ 73 | 74 | /* Begin PBXFrameworksBuildPhase section */ 75 | C6339BA71E0B9CC0009D402E /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | ); 80 | runOnlyForDeploymentPostprocessing = 0; 81 | }; 82 | C6339BC01E0B9CC0009D402E /* Frameworks */ = { 83 | isa = PBXFrameworksBuildPhase; 84 | buildActionMask = 2147483647; 85 | files = ( 86 | ); 87 | runOnlyForDeploymentPostprocessing = 0; 88 | }; 89 | C6339BCB1E0B9CC0009D402E /* Frameworks */ = { 90 | isa = PBXFrameworksBuildPhase; 91 | buildActionMask = 2147483647; 92 | files = ( 93 | ); 94 | runOnlyForDeploymentPostprocessing = 0; 95 | }; 96 | /* End PBXFrameworksBuildPhase section */ 97 | 98 | /* Begin PBXGroup section */ 99 | C6339BA11E0B9CC0009D402E = { 100 | isa = PBXGroup; 101 | children = ( 102 | C6339BAC1E0B9CC0009D402E /* LLNavigationController */, 103 | C6339BC61E0B9CC0009D402E /* LLNavigationControllerTests */, 104 | C6339BD11E0B9CC0009D402E /* LLNavigationControllerUITests */, 105 | C6339BAB1E0B9CC0009D402E /* Products */, 106 | ); 107 | sourceTree = ""; 108 | }; 109 | C6339BAB1E0B9CC0009D402E /* Products */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | C6339BAA1E0B9CC0009D402E /* LLNavigationController.app */, 113 | C6339BC31E0B9CC0009D402E /* LLNavigationControllerTests.xctest */, 114 | C6339BCE1E0B9CC0009D402E /* LLNavigationControllerUITests.xctest */, 115 | ); 116 | name = Products; 117 | sourceTree = ""; 118 | }; 119 | C6339BAC1E0B9CC0009D402E /* LLNavigationController */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | C6F21A411E0BA7E000393FE3 /* LLNavigationController */, 123 | C648E7CC1E274F9900A376C5 /* image.PNG */, 124 | C6339BB01E0B9CC0009D402E /* AppDelegate.h */, 125 | C6339BB11E0B9CC0009D402E /* AppDelegate.m */, 126 | C6F21A881E0BA92E00393FE3 /* ViewController.h */, 127 | C6F21A891E0BA92E00393FE3 /* ViewController.m */, 128 | C6339BB91E0B9CC0009D402E /* Assets.xcassets */, 129 | C6339BBB1E0B9CC0009D402E /* LaunchScreen.storyboard */, 130 | C6339BBE1E0B9CC0009D402E /* Info.plist */, 131 | C6339BAD1E0B9CC0009D402E /* Supporting Files */, 132 | ); 133 | path = LLNavigationController; 134 | sourceTree = ""; 135 | }; 136 | C6339BAD1E0B9CC0009D402E /* Supporting Files */ = { 137 | isa = PBXGroup; 138 | children = ( 139 | C6339BAE1E0B9CC0009D402E /* main.m */, 140 | ); 141 | name = "Supporting Files"; 142 | sourceTree = ""; 143 | }; 144 | C6339BC61E0B9CC0009D402E /* LLNavigationControllerTests */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | C6339BC71E0B9CC0009D402E /* LLNavigationControllerTests.m */, 148 | C6339BC91E0B9CC0009D402E /* Info.plist */, 149 | ); 150 | path = LLNavigationControllerTests; 151 | sourceTree = ""; 152 | }; 153 | C6339BD11E0B9CC0009D402E /* LLNavigationControllerUITests */ = { 154 | isa = PBXGroup; 155 | children = ( 156 | C6339BD21E0B9CC0009D402E /* LLNavigationControllerUITests.m */, 157 | C6339BD41E0B9CC0009D402E /* Info.plist */, 158 | ); 159 | path = LLNavigationControllerUITests; 160 | sourceTree = ""; 161 | }; 162 | C6A75AF01E263379005055BF /* LLTransitionAnimator */ = { 163 | isa = PBXGroup; 164 | children = ( 165 | C6A75AF51E263379005055BF /* LLTransistionDelegate */, 166 | C6A75AF31E263379005055BF /* LLPresentAnimation.h */, 167 | C6A75AF41E263379005055BF /* LLPresentAnimation.m */, 168 | C6A75AF11E263379005055BF /* LLDismissAnimation.h */, 169 | C6A75AF21E263379005055BF /* LLDismissAnimation.m */, 170 | ); 171 | path = LLTransitionAnimator; 172 | sourceTree = ""; 173 | }; 174 | C6A75AF51E263379005055BF /* LLTransistionDelegate */ = { 175 | isa = PBXGroup; 176 | children = ( 177 | C6A75AF61E263379005055BF /* LLNavControllerDelegate.h */, 178 | C6A75AF71E263379005055BF /* LLNavControllerDelegate.m */, 179 | ); 180 | path = LLTransistionDelegate; 181 | sourceTree = ""; 182 | }; 183 | C6F21A411E0BA7E000393FE3 /* LLNavigationController */ = { 184 | isa = PBXGroup; 185 | children = ( 186 | C6A75AF01E263379005055BF /* LLTransitionAnimator */, 187 | C6F21A441E0BA7E000393FE3 /* LLScreenShotView */, 188 | C6F21A421E0BA7E000393FE3 /* LLBaseNavigationController.h */, 189 | C6F21A431E0BA7E000393FE3 /* LLBaseNavigationController.m */, 190 | C6F21A471E0BA7E000393FE3 /* UINavigationController+LLAddPart.h */, 191 | C6F21A481E0BA7E000393FE3 /* UINavigationController+LLAddPart.m */, 192 | ); 193 | path = LLNavigationController; 194 | sourceTree = ""; 195 | }; 196 | C6F21A441E0BA7E000393FE3 /* LLScreenShotView */ = { 197 | isa = PBXGroup; 198 | children = ( 199 | C6F21A451E0BA7E000393FE3 /* LLScreenShotView.h */, 200 | C6F21A461E0BA7E000393FE3 /* LLScreenShotView.m */, 201 | ); 202 | path = LLScreenShotView; 203 | sourceTree = ""; 204 | }; 205 | /* End PBXGroup section */ 206 | 207 | /* Begin PBXNativeTarget section */ 208 | C6339BA91E0B9CC0009D402E /* LLNavigationController */ = { 209 | isa = PBXNativeTarget; 210 | buildConfigurationList = C6339BD71E0B9CC0009D402E /* Build configuration list for PBXNativeTarget "LLNavigationController" */; 211 | buildPhases = ( 212 | C6339BA61E0B9CC0009D402E /* Sources */, 213 | C6339BA71E0B9CC0009D402E /* Frameworks */, 214 | C6339BA81E0B9CC0009D402E /* Resources */, 215 | ); 216 | buildRules = ( 217 | ); 218 | dependencies = ( 219 | ); 220 | name = LLNavigationController; 221 | productName = LLNavigationController; 222 | productReference = C6339BAA1E0B9CC0009D402E /* LLNavigationController.app */; 223 | productType = "com.apple.product-type.application"; 224 | }; 225 | C6339BC21E0B9CC0009D402E /* LLNavigationControllerTests */ = { 226 | isa = PBXNativeTarget; 227 | buildConfigurationList = C6339BDA1E0B9CC0009D402E /* Build configuration list for PBXNativeTarget "LLNavigationControllerTests" */; 228 | buildPhases = ( 229 | C6339BBF1E0B9CC0009D402E /* Sources */, 230 | C6339BC01E0B9CC0009D402E /* Frameworks */, 231 | C6339BC11E0B9CC0009D402E /* Resources */, 232 | ); 233 | buildRules = ( 234 | ); 235 | dependencies = ( 236 | C6339BC51E0B9CC0009D402E /* PBXTargetDependency */, 237 | ); 238 | name = LLNavigationControllerTests; 239 | productName = LLNavigationControllerTests; 240 | productReference = C6339BC31E0B9CC0009D402E /* LLNavigationControllerTests.xctest */; 241 | productType = "com.apple.product-type.bundle.unit-test"; 242 | }; 243 | C6339BCD1E0B9CC0009D402E /* LLNavigationControllerUITests */ = { 244 | isa = PBXNativeTarget; 245 | buildConfigurationList = C6339BDD1E0B9CC0009D402E /* Build configuration list for PBXNativeTarget "LLNavigationControllerUITests" */; 246 | buildPhases = ( 247 | C6339BCA1E0B9CC0009D402E /* Sources */, 248 | C6339BCB1E0B9CC0009D402E /* Frameworks */, 249 | C6339BCC1E0B9CC0009D402E /* Resources */, 250 | ); 251 | buildRules = ( 252 | ); 253 | dependencies = ( 254 | C6339BD01E0B9CC0009D402E /* PBXTargetDependency */, 255 | ); 256 | name = LLNavigationControllerUITests; 257 | productName = LLNavigationControllerUITests; 258 | productReference = C6339BCE1E0B9CC0009D402E /* LLNavigationControllerUITests.xctest */; 259 | productType = "com.apple.product-type.bundle.ui-testing"; 260 | }; 261 | /* End PBXNativeTarget section */ 262 | 263 | /* Begin PBXProject section */ 264 | C6339BA21E0B9CC0009D402E /* Project object */ = { 265 | isa = PBXProject; 266 | attributes = { 267 | LastUpgradeCheck = 0730; 268 | ORGANIZATIONNAME = "MaoChao Network Co. Ltd"; 269 | TargetAttributes = { 270 | C6339BA91E0B9CC0009D402E = { 271 | CreatedOnToolsVersion = 7.3.1; 272 | DevelopmentTeam = D83H98L7Y7; 273 | }; 274 | C6339BC21E0B9CC0009D402E = { 275 | CreatedOnToolsVersion = 7.3.1; 276 | TestTargetID = C6339BA91E0B9CC0009D402E; 277 | }; 278 | C6339BCD1E0B9CC0009D402E = { 279 | CreatedOnToolsVersion = 7.3.1; 280 | TestTargetID = C6339BA91E0B9CC0009D402E; 281 | }; 282 | }; 283 | }; 284 | buildConfigurationList = C6339BA51E0B9CC0009D402E /* Build configuration list for PBXProject "LLNavigationController" */; 285 | compatibilityVersion = "Xcode 3.2"; 286 | developmentRegion = English; 287 | hasScannedForEncodings = 0; 288 | knownRegions = ( 289 | en, 290 | Base, 291 | ); 292 | mainGroup = C6339BA11E0B9CC0009D402E; 293 | productRefGroup = C6339BAB1E0B9CC0009D402E /* Products */; 294 | projectDirPath = ""; 295 | projectRoot = ""; 296 | targets = ( 297 | C6339BA91E0B9CC0009D402E /* LLNavigationController */, 298 | C6339BC21E0B9CC0009D402E /* LLNavigationControllerTests */, 299 | C6339BCD1E0B9CC0009D402E /* LLNavigationControllerUITests */, 300 | ); 301 | }; 302 | /* End PBXProject section */ 303 | 304 | /* Begin PBXResourcesBuildPhase section */ 305 | C6339BA81E0B9CC0009D402E /* Resources */ = { 306 | isa = PBXResourcesBuildPhase; 307 | buildActionMask = 2147483647; 308 | files = ( 309 | C6339BBD1E0B9CC0009D402E /* LaunchScreen.storyboard in Resources */, 310 | C6339BBA1E0B9CC0009D402E /* Assets.xcassets in Resources */, 311 | C648E7CD1E274F9900A376C5 /* image.PNG in Resources */, 312 | ); 313 | runOnlyForDeploymentPostprocessing = 0; 314 | }; 315 | C6339BC11E0B9CC0009D402E /* Resources */ = { 316 | isa = PBXResourcesBuildPhase; 317 | buildActionMask = 2147483647; 318 | files = ( 319 | ); 320 | runOnlyForDeploymentPostprocessing = 0; 321 | }; 322 | C6339BCC1E0B9CC0009D402E /* Resources */ = { 323 | isa = PBXResourcesBuildPhase; 324 | buildActionMask = 2147483647; 325 | files = ( 326 | ); 327 | runOnlyForDeploymentPostprocessing = 0; 328 | }; 329 | /* End PBXResourcesBuildPhase section */ 330 | 331 | /* Begin PBXSourcesBuildPhase section */ 332 | C6339BA61E0B9CC0009D402E /* Sources */ = { 333 | isa = PBXSourcesBuildPhase; 334 | buildActionMask = 2147483647; 335 | files = ( 336 | C6339BB21E0B9CC0009D402E /* AppDelegate.m in Sources */, 337 | C6F21A4D1E0BA7E000393FE3 /* UINavigationController+LLAddPart.m in Sources */, 338 | C6F21A8C1E0BA92E00393FE3 /* ViewController.m in Sources */, 339 | C6A75AF91E263379005055BF /* LLPresentAnimation.m in Sources */, 340 | C6A75AF81E263379005055BF /* LLDismissAnimation.m in Sources */, 341 | C6F21A4C1E0BA7E000393FE3 /* LLScreenShotView.m in Sources */, 342 | C6A75AFA1E263379005055BF /* LLNavControllerDelegate.m in Sources */, 343 | C6F21A4B1E0BA7E000393FE3 /* LLBaseNavigationController.m in Sources */, 344 | C6339BAF1E0B9CC0009D402E /* main.m in Sources */, 345 | ); 346 | runOnlyForDeploymentPostprocessing = 0; 347 | }; 348 | C6339BBF1E0B9CC0009D402E /* Sources */ = { 349 | isa = PBXSourcesBuildPhase; 350 | buildActionMask = 2147483647; 351 | files = ( 352 | C6339BC81E0B9CC0009D402E /* LLNavigationControllerTests.m in Sources */, 353 | ); 354 | runOnlyForDeploymentPostprocessing = 0; 355 | }; 356 | C6339BCA1E0B9CC0009D402E /* Sources */ = { 357 | isa = PBXSourcesBuildPhase; 358 | buildActionMask = 2147483647; 359 | files = ( 360 | C6339BD31E0B9CC0009D402E /* LLNavigationControllerUITests.m in Sources */, 361 | ); 362 | runOnlyForDeploymentPostprocessing = 0; 363 | }; 364 | /* End PBXSourcesBuildPhase section */ 365 | 366 | /* Begin PBXTargetDependency section */ 367 | C6339BC51E0B9CC0009D402E /* PBXTargetDependency */ = { 368 | isa = PBXTargetDependency; 369 | target = C6339BA91E0B9CC0009D402E /* LLNavigationController */; 370 | targetProxy = C6339BC41E0B9CC0009D402E /* PBXContainerItemProxy */; 371 | }; 372 | C6339BD01E0B9CC0009D402E /* PBXTargetDependency */ = { 373 | isa = PBXTargetDependency; 374 | target = C6339BA91E0B9CC0009D402E /* LLNavigationController */; 375 | targetProxy = C6339BCF1E0B9CC0009D402E /* PBXContainerItemProxy */; 376 | }; 377 | /* End PBXTargetDependency section */ 378 | 379 | /* Begin PBXVariantGroup section */ 380 | C6339BBB1E0B9CC0009D402E /* LaunchScreen.storyboard */ = { 381 | isa = PBXVariantGroup; 382 | children = ( 383 | C6339BBC1E0B9CC0009D402E /* Base */, 384 | ); 385 | name = LaunchScreen.storyboard; 386 | sourceTree = ""; 387 | }; 388 | /* End PBXVariantGroup section */ 389 | 390 | /* Begin XCBuildConfiguration section */ 391 | C6339BD51E0B9CC0009D402E /* Debug */ = { 392 | isa = XCBuildConfiguration; 393 | buildSettings = { 394 | ALWAYS_SEARCH_USER_PATHS = NO; 395 | CLANG_ANALYZER_NONNULL = YES; 396 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 397 | CLANG_CXX_LIBRARY = "libc++"; 398 | CLANG_ENABLE_MODULES = YES; 399 | CLANG_ENABLE_OBJC_ARC = YES; 400 | CLANG_WARN_BOOL_CONVERSION = YES; 401 | CLANG_WARN_CONSTANT_CONVERSION = YES; 402 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 403 | CLANG_WARN_EMPTY_BODY = YES; 404 | CLANG_WARN_ENUM_CONVERSION = YES; 405 | CLANG_WARN_INT_CONVERSION = YES; 406 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 407 | CLANG_WARN_UNREACHABLE_CODE = YES; 408 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 409 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 410 | COPY_PHASE_STRIP = NO; 411 | DEBUG_INFORMATION_FORMAT = dwarf; 412 | ENABLE_STRICT_OBJC_MSGSEND = YES; 413 | ENABLE_TESTABILITY = YES; 414 | GCC_C_LANGUAGE_STANDARD = gnu99; 415 | GCC_DYNAMIC_NO_PIC = NO; 416 | GCC_NO_COMMON_BLOCKS = YES; 417 | GCC_OPTIMIZATION_LEVEL = 0; 418 | GCC_PREPROCESSOR_DEFINITIONS = ( 419 | "DEBUG=1", 420 | "$(inherited)", 421 | ); 422 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 423 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 424 | GCC_WARN_UNDECLARED_SELECTOR = YES; 425 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 426 | GCC_WARN_UNUSED_FUNCTION = YES; 427 | GCC_WARN_UNUSED_VARIABLE = YES; 428 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 429 | MTL_ENABLE_DEBUG_INFO = YES; 430 | ONLY_ACTIVE_ARCH = YES; 431 | SDKROOT = iphoneos; 432 | TARGETED_DEVICE_FAMILY = "1,2"; 433 | }; 434 | name = Debug; 435 | }; 436 | C6339BD61E0B9CC0009D402E /* Release */ = { 437 | isa = XCBuildConfiguration; 438 | buildSettings = { 439 | ALWAYS_SEARCH_USER_PATHS = NO; 440 | CLANG_ANALYZER_NONNULL = YES; 441 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 442 | CLANG_CXX_LIBRARY = "libc++"; 443 | CLANG_ENABLE_MODULES = YES; 444 | CLANG_ENABLE_OBJC_ARC = YES; 445 | CLANG_WARN_BOOL_CONVERSION = YES; 446 | CLANG_WARN_CONSTANT_CONVERSION = YES; 447 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 448 | CLANG_WARN_EMPTY_BODY = YES; 449 | CLANG_WARN_ENUM_CONVERSION = YES; 450 | CLANG_WARN_INT_CONVERSION = YES; 451 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 452 | CLANG_WARN_UNREACHABLE_CODE = YES; 453 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 454 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 455 | COPY_PHASE_STRIP = NO; 456 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 457 | ENABLE_NS_ASSERTIONS = NO; 458 | ENABLE_STRICT_OBJC_MSGSEND = YES; 459 | GCC_C_LANGUAGE_STANDARD = gnu99; 460 | GCC_NO_COMMON_BLOCKS = YES; 461 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 462 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 463 | GCC_WARN_UNDECLARED_SELECTOR = YES; 464 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 465 | GCC_WARN_UNUSED_FUNCTION = YES; 466 | GCC_WARN_UNUSED_VARIABLE = YES; 467 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 468 | MTL_ENABLE_DEBUG_INFO = NO; 469 | SDKROOT = iphoneos; 470 | TARGETED_DEVICE_FAMILY = "1,2"; 471 | VALIDATE_PRODUCT = YES; 472 | }; 473 | name = Release; 474 | }; 475 | C6339BD81E0B9CC0009D402E /* Debug */ = { 476 | isa = XCBuildConfiguration; 477 | buildSettings = { 478 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 479 | DEVELOPMENT_TEAM = D83H98L7Y7; 480 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 481 | GCC_PREFIX_HEADER = ""; 482 | INFOPLIST_FILE = LLNavigationController/Info.plist; 483 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 484 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 485 | PRODUCT_BUNDLE_IDENTIFIER = com.maochao.LLNavigationController; 486 | PRODUCT_NAME = "$(TARGET_NAME)"; 487 | }; 488 | name = Debug; 489 | }; 490 | C6339BD91E0B9CC0009D402E /* Release */ = { 491 | isa = XCBuildConfiguration; 492 | buildSettings = { 493 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 494 | DEVELOPMENT_TEAM = D83H98L7Y7; 495 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 496 | GCC_PREFIX_HEADER = ""; 497 | INFOPLIST_FILE = LLNavigationController/Info.plist; 498 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 499 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 500 | PRODUCT_BUNDLE_IDENTIFIER = com.maochao.LLNavigationController; 501 | PRODUCT_NAME = "$(TARGET_NAME)"; 502 | }; 503 | name = Release; 504 | }; 505 | C6339BDB1E0B9CC0009D402E /* Debug */ = { 506 | isa = XCBuildConfiguration; 507 | buildSettings = { 508 | BUNDLE_LOADER = "$(TEST_HOST)"; 509 | INFOPLIST_FILE = LLNavigationControllerTests/Info.plist; 510 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 511 | PRODUCT_BUNDLE_IDENTIFIER = com.maochao.LLNavigationControllerTests; 512 | PRODUCT_NAME = "$(TARGET_NAME)"; 513 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LLNavigationController.app/LLNavigationController"; 514 | }; 515 | name = Debug; 516 | }; 517 | C6339BDC1E0B9CC0009D402E /* Release */ = { 518 | isa = XCBuildConfiguration; 519 | buildSettings = { 520 | BUNDLE_LOADER = "$(TEST_HOST)"; 521 | INFOPLIST_FILE = LLNavigationControllerTests/Info.plist; 522 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 523 | PRODUCT_BUNDLE_IDENTIFIER = com.maochao.LLNavigationControllerTests; 524 | PRODUCT_NAME = "$(TARGET_NAME)"; 525 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LLNavigationController.app/LLNavigationController"; 526 | }; 527 | name = Release; 528 | }; 529 | C6339BDE1E0B9CC0009D402E /* Debug */ = { 530 | isa = XCBuildConfiguration; 531 | buildSettings = { 532 | INFOPLIST_FILE = LLNavigationControllerUITests/Info.plist; 533 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 534 | PRODUCT_BUNDLE_IDENTIFIER = com.maochao.LLNavigationControllerUITests; 535 | PRODUCT_NAME = "$(TARGET_NAME)"; 536 | TEST_TARGET_NAME = LLNavigationController; 537 | }; 538 | name = Debug; 539 | }; 540 | C6339BDF1E0B9CC0009D402E /* Release */ = { 541 | isa = XCBuildConfiguration; 542 | buildSettings = { 543 | INFOPLIST_FILE = LLNavigationControllerUITests/Info.plist; 544 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 545 | PRODUCT_BUNDLE_IDENTIFIER = com.maochao.LLNavigationControllerUITests; 546 | PRODUCT_NAME = "$(TARGET_NAME)"; 547 | TEST_TARGET_NAME = LLNavigationController; 548 | }; 549 | name = Release; 550 | }; 551 | /* End XCBuildConfiguration section */ 552 | 553 | /* Begin XCConfigurationList section */ 554 | C6339BA51E0B9CC0009D402E /* Build configuration list for PBXProject "LLNavigationController" */ = { 555 | isa = XCConfigurationList; 556 | buildConfigurations = ( 557 | C6339BD51E0B9CC0009D402E /* Debug */, 558 | C6339BD61E0B9CC0009D402E /* Release */, 559 | ); 560 | defaultConfigurationIsVisible = 0; 561 | defaultConfigurationName = Release; 562 | }; 563 | C6339BD71E0B9CC0009D402E /* Build configuration list for PBXNativeTarget "LLNavigationController" */ = { 564 | isa = XCConfigurationList; 565 | buildConfigurations = ( 566 | C6339BD81E0B9CC0009D402E /* Debug */, 567 | C6339BD91E0B9CC0009D402E /* Release */, 568 | ); 569 | defaultConfigurationIsVisible = 0; 570 | defaultConfigurationName = Release; 571 | }; 572 | C6339BDA1E0B9CC0009D402E /* Build configuration list for PBXNativeTarget "LLNavigationControllerTests" */ = { 573 | isa = XCConfigurationList; 574 | buildConfigurations = ( 575 | C6339BDB1E0B9CC0009D402E /* Debug */, 576 | C6339BDC1E0B9CC0009D402E /* Release */, 577 | ); 578 | defaultConfigurationIsVisible = 0; 579 | defaultConfigurationName = Release; 580 | }; 581 | C6339BDD1E0B9CC0009D402E /* Build configuration list for PBXNativeTarget "LLNavigationControllerUITests" */ = { 582 | isa = XCConfigurationList; 583 | buildConfigurations = ( 584 | C6339BDE1E0B9CC0009D402E /* Debug */, 585 | C6339BDF1E0B9CC0009D402E /* Release */, 586 | ); 587 | defaultConfigurationIsVisible = 0; 588 | defaultConfigurationName = Release; 589 | }; 590 | /* End XCConfigurationList section */ 591 | }; 592 | rootObject = C6339BA21E0B9CC0009D402E /* Project object */; 593 | } 594 | -------------------------------------------------------------------------------- /LLNavigationController.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /LLNavigationController.xcodeproj/project.xcworkspace/xcuserdata/maochao.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaoyi3699/LLNavigationController/b9d68efdc58183088e3e84427f534b962bd095cd/LLNavigationController.xcodeproj/project.xcworkspace/xcuserdata/maochao.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /LLNavigationController.xcodeproj/xcuserdata/maochao.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /LLNavigationController.xcodeproj/xcuserdata/maochao.xcuserdatad/xcschemes/LLNavigationController.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 43 | 49 | 50 | 51 | 52 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 74 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 95 | 101 | 102 | 103 | 104 | 106 | 107 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /LLNavigationController.xcodeproj/xcuserdata/maochao.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | LLNavigationController.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | C6339BA91E0B9CC0009D402E 16 | 17 | primary 18 | 19 | 20 | C6339BC21E0B9CC0009D402E 21 | 22 | primary 23 | 24 | 25 | C6339BCD1E0B9CC0009D402E 26 | 27 | primary 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /LLNavigationController/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // LLNavigationController 4 | // 5 | // Created by Mr.Wang on 16/12/22. 6 | // Copyright © 2016年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LLScreenShotView.h" 11 | 12 | @interface AppDelegate : UIResponder 13 | 14 | @property (strong, nonatomic) UIWindow *window; 15 | 16 | @property (nonatomic, strong) LLScreenShotView *screenShotView; 17 | 18 | + (instancetype)shareDelegete; 19 | 20 | @end 21 | 22 | -------------------------------------------------------------------------------- /LLNavigationController/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // LLNavigationController 4 | // 5 | // Created by Mr.Wang on 16/12/22. 6 | // Copyright © 2016年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "LLBaseNavigationController.h" 11 | #import "ViewController.h" 12 | 13 | @interface AppDelegate () 14 | 15 | @end 16 | 17 | @implementation AppDelegate 18 | 19 | 20 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 21 | // Override point for customization after application launch. 22 | 23 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 24 | self.window.backgroundColor = [UIColor whiteColor]; 25 | [self.window makeKeyAndVisible]; 26 | 27 | ViewController *VC = [[ViewController alloc] init]; 28 | LLBaseNavigationController *baseNav = [[LLBaseNavigationController alloc] initWithRootViewController:VC]; 29 | self.window.rootViewController = baseNav; 30 | 31 | return YES; 32 | } 33 | 34 | + (instancetype)shareDelegete{ 35 | return (AppDelegate *)[UIApplication sharedApplication].delegate; 36 | } 37 | 38 | - (LLScreenShotView *)screenShotView{ 39 | if (!_screenShotView) { 40 | _screenShotView = [[LLScreenShotView alloc] init]; 41 | _screenShotView.hidden = YES; 42 | [self.window insertSubview:_screenShotView atIndex:0]; 43 | } 44 | return _screenShotView; 45 | } 46 | 47 | - (void)applicationWillResignActive:(UIApplication *)application { 48 | // 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. 49 | // 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. 50 | } 51 | 52 | - (void)applicationDidEnterBackground:(UIApplication *)application { 53 | // 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. 54 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 55 | } 56 | 57 | - (void)applicationWillEnterForeground:(UIApplication *)application { 58 | // 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. 59 | } 60 | 61 | - (void)applicationDidBecomeActive:(UIApplication *)application { 62 | // 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. 63 | } 64 | 65 | - (void)applicationWillTerminate:(UIApplication *)application { 66 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 67 | } 68 | 69 | @end 70 | -------------------------------------------------------------------------------- /LLNavigationController/Assets.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 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /LLNavigationController/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /LLNavigationController/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(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 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /LLNavigationController/LLNavigationController/LLBaseNavigationController.h: -------------------------------------------------------------------------------- 1 | // 2 | // LLBaseNavigationController.h 3 | // LLFoundation 4 | // 5 | // Created by wangzhaomeng on 16/9/3. 6 | // Copyright © 2016年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "UINavigationController+LLAddPart.h" 11 | 12 | @interface LLBaseNavigationController : UINavigationController 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /LLNavigationController/LLNavigationController/LLBaseNavigationController.m: -------------------------------------------------------------------------------- 1 | // 2 | // LLBaseNavigationController.m 3 | // LLFoundation 4 | // 5 | // Created by wangzhaomeng on 16/9/3. 6 | // Copyright © 2016年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import "LLBaseNavigationController.h" 10 | #import "LLNavControllerDelegate.h" 11 | #import "AppDelegate.h" 12 | 13 | @interface LLBaseNavigationController () 14 | 15 | @property (nonatomic, strong) NSMutableArray *childVCImages; //保存截屏的数组 16 | @property (nonatomic, strong) LLNavControllerDelegate *transitionDelegate; 17 | 18 | @end 19 | 20 | @implementation LLBaseNavigationController 21 | 22 | - (void)loadView{ 23 | [super loadView]; 24 | //self.interactivePopGestureRecognizer.delegate = self; //系统的返回手势代理 25 | self.interactivePopGestureRecognizer.enabled = NO; //屏蔽系统的返回手势 26 | 27 | self.transitionDelegate = [[LLNavControllerDelegate alloc] init]; 28 | self.transitionDelegate.presentTransition = @"LLPresentAnimation"; //自定义push动画 29 | self.transitionDelegate.dismissTransition = @"LLDismissAnimation"; //自定义pop动画 30 | self.delegate = self.transitionDelegate; 31 | } 32 | 33 | - (void)viewDidLoad{ 34 | [super viewDidLoad]; 35 | 36 | UIPanGestureRecognizer *popRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dragging:)]; 37 | popRecognizer.delegate = self; 38 | [self.view addGestureRecognizer:popRecognizer]; //自定义的滑动返回手势 39 | self.popRecognizerEnable = YES; //默认相应自定义的滑动返回手势 40 | } 41 | 42 | #pragma mark - 重写父类方法 43 | - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{ 44 | if (self.childViewControllers.count > 0) { 45 | [self createScreenShot]; 46 | } 47 | [super pushViewController:viewController animated:animated]; 48 | } 49 | 50 | - (UIViewController *)popViewControllerAnimated:(BOOL)animated{ 51 | [self.childVCImages removeLastObject]; 52 | return [super popViewControllerAnimated:animated]; 53 | } 54 | 55 | - (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated{ 56 | NSArray *viewControllers = [super popToViewController:viewController animated:animated]; 57 | if (self.childVCImages.count >= viewControllers.count){ 58 | for (int i = 0; i < viewControllers.count; i++) { 59 | [self.childVCImages removeLastObject]; 60 | } 61 | } 62 | return viewControllers; 63 | } 64 | 65 | - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated{ 66 | [self.childVCImages removeAllObjects]; 67 | return [super popToRootViewControllerAnimated:animated]; 68 | } 69 | 70 | - (void)dragging:(UIPanGestureRecognizer *)recognizer{ 71 | //如果只有1个子控制器,停止拖拽 72 | if (self.viewControllers.count <= 1) return; 73 | //在x方向上移动的距离 74 | CGFloat tx = [recognizer translationInView:self.view].x; 75 | //在x方向上移动的距离除以屏幕的宽度 76 | CGFloat width_scale; 77 | if (recognizer.state == UIGestureRecognizerStateBegan) { 78 | //添加截图到最后面 79 | width_scale = 0; 80 | [AppDelegate shareDelegete].screenShotView.hidden = NO; 81 | [AppDelegate shareDelegete].screenShotView.maskView.alpha = 0.5; 82 | [AppDelegate shareDelegete].screenShotView.imageView.image = [self.childVCImages lastObject]; 83 | } 84 | else if (recognizer.state == UIGestureRecognizerStateChanged){ 85 | //移动view 86 | if (tx>10) { 87 | width_scale = (tx-10)/self.view.bounds.size.width; 88 | self.view.transform = CGAffineTransformMakeTranslation(tx-10, 0); 89 | [AppDelegate shareDelegete].screenShotView.maskView.alpha = 0.5-width_scale*0.5; 90 | } 91 | } 92 | else if (recognizer.state == UIGestureRecognizerStateEnded) { 93 | //决定pop还是还原 94 | CGFloat x = [recognizer translationInView:self.view].x; 95 | if (x >= 100) { 96 | [UIView animateWithDuration:0.25 animations:^{ 97 | [AppDelegate shareDelegete].screenShotView.maskView.alpha = 0; 98 | self.view.transform = CGAffineTransformMakeTranslation(self.view.bounds.size.width, 0); 99 | } completion:^(BOOL finished) { 100 | [self popViewControllerAnimated:NO]; 101 | [AppDelegate shareDelegete].screenShotView.hidden = YES; 102 | self.view.transform = CGAffineTransformIdentity; 103 | }]; 104 | } else { 105 | [UIView animateWithDuration:0.25 animations:^{ 106 | self.view.transform = CGAffineTransformIdentity; 107 | [AppDelegate shareDelegete].screenShotView.maskView.alpha = 0.5; 108 | } completion:^(BOOL finished) { 109 | [AppDelegate shareDelegete].screenShotView.hidden = YES; 110 | }]; 111 | } 112 | } 113 | } 114 | 115 | //保存截屏的数组 116 | - (NSMutableArray *)childVCImages{ 117 | if (!_childVCImages) { 118 | _childVCImages = [[NSMutableArray alloc] initWithCapacity:1]; 119 | } 120 | return _childVCImages; 121 | } 122 | 123 | //截屏 124 | #define WINDOW [UIApplication sharedApplication].delegate.window 125 | - (void)createScreenShot{ 126 | if (self.childViewControllers.count == self.childVCImages.count+1) { 127 | UIGraphicsBeginImageContextWithOptions(WINDOW.bounds.size, YES, 0); 128 | [WINDOW.layer renderInContext:UIGraphicsGetCurrentContext()]; 129 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 130 | UIGraphicsEndImageContext(); 131 | [self.childVCImages addObject:image]; 132 | } 133 | } 134 | #undef WINDOW 135 | 136 | //手势代理 137 | - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ 138 | if (self.popRecognizerEnable == NO) return NO; 139 | if (self.viewControllers.count <= 1) return NO; 140 | if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { 141 | CGPoint point = [touch locationInView:gestureRecognizer.view]; 142 | if (point.x < 80.0) {//设置手势触发区 143 | return YES; 144 | } 145 | } 146 | return NO; 147 | } 148 | 149 | //是否与其他手势共存,一般使用默认值(默认返回NO:不与任何手势共存) 150 | - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ 151 | if (self.recognizeSimultaneouslyEnable) { 152 | if ([otherGestureRecognizer isKindOfClass:NSClassFromString(@"UIScrollViewPanGestureRecognizer")] || [otherGestureRecognizer isKindOfClass:NSClassFromString(@"UIPanGestureRecognizer")] ) { 153 | return YES; 154 | } 155 | } 156 | return NO; 157 | } 158 | #pragma mark 159 | 160 | @end 161 | -------------------------------------------------------------------------------- /LLNavigationController/LLNavigationController/LLScreenShotView/LLScreenShotView.h: -------------------------------------------------------------------------------- 1 | // 2 | // LLScreenShotView.h 3 | // LLFoundation 4 | // 5 | // Created by Mr.Wang on 16/12/9. 6 | // Copyright © 2016年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LLScreenShotView : UIView 12 | 13 | @property (nonatomic, strong) UIImageView *imageView; 14 | @property (nonatomic, strong) UIView *maskView; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /LLNavigationController/LLNavigationController/LLScreenShotView/LLScreenShotView.m: -------------------------------------------------------------------------------- 1 | // 2 | // LLScreenShotView.m 3 | // LLFoundation 4 | // 5 | // Created by Mr.Wang on 16/12/9. 6 | // Copyright © 2016年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import "LLScreenShotView.h" 10 | 11 | #define SCREEN_BOUNDS [UIScreen mainScreen].bounds 12 | @implementation LLScreenShotView 13 | 14 | - (id)init{ 15 | self = [super initWithFrame:SCREEN_BOUNDS]; 16 | if (self) { 17 | _imageView = [[UIImageView alloc] initWithFrame:SCREEN_BOUNDS]; 18 | [self addSubview:_imageView]; 19 | 20 | _maskView = [[UIView alloc] initWithFrame:SCREEN_BOUNDS]; 21 | _maskView.backgroundColor = [UIColor blackColor]; 22 | [self addSubview:_maskView]; 23 | } 24 | return self; 25 | } 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /LLNavigationController/LLNavigationController/LLTransitionAnimator/LLDismissAnimation.h: -------------------------------------------------------------------------------- 1 | // 2 | // LLDismissAnimation.h 3 | // LLFoundation 4 | // 5 | // Created by Mr.Wang on 17/1/10. 6 | // Copyright © 2017年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LLDismissAnimation : NSObject 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /LLNavigationController/LLNavigationController/LLTransitionAnimator/LLDismissAnimation.m: -------------------------------------------------------------------------------- 1 | // 2 | // LLDismissAnimation.m 3 | // LLFoundation 4 | // 5 | // Created by Mr.Wang on 17/1/10. 6 | // Copyright © 2017年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import "LLDismissAnimation.h" 10 | 11 | @interface LLDismissAnimation () 12 | 13 | @end 14 | 15 | @implementation LLDismissAnimation 16 | 17 | - (NSTimeInterval)transitionDuration:(nullable id )transitionContext 18 | { 19 | return 0.35f; 20 | } 21 | 22 | - (void)animateTransition:(id )transitionContext 23 | { 24 | UIView *fromView = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey].view; 25 | UIView *toView = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey].view; 26 | 27 | UIView *containerView = [transitionContext containerView]; 28 | [containerView addSubview:toView]; 29 | 30 | NSTimeInterval duration = [self transitionDuration:transitionContext]; 31 | [UIView transitionFromView:fromView toView:toView duration:duration options:UIViewAnimationOptionTransitionCurlDown completion:^(BOOL finished) { 32 | //动画完成后,系统会自动移除fromView 33 | [transitionContext completeTransition:YES]; 34 | fromView.transform = CGAffineTransformIdentity; 35 | toView.transform = CGAffineTransformIdentity; 36 | }]; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /LLNavigationController/LLNavigationController/LLTransitionAnimator/LLPresentAnimation.h: -------------------------------------------------------------------------------- 1 | // 2 | // LLWindPresentAnimation.h 3 | // LLFoundation 4 | // 5 | // Created by Mr.Wang on 17/1/10. 6 | // Copyright © 2017年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LLPresentAnimation : NSObject 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /LLNavigationController/LLNavigationController/LLTransitionAnimator/LLPresentAnimation.m: -------------------------------------------------------------------------------- 1 | // 2 | // LLWindPresentAnimation.m 3 | // LLFoundation 4 | // 5 | // Created by Mr.Wang on 17/1/10. 6 | // Copyright © 2017年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import "LLPresentAnimation.h" 10 | 11 | @interface LLPresentAnimation () 12 | 13 | @end 14 | 15 | @implementation LLPresentAnimation 16 | 17 | - (NSTimeInterval)transitionDuration:(nullable id )transitionContext{ 18 | return 0.35f; 19 | } 20 | 21 | - (void)animateTransition:(id )transitionContext 22 | { 23 | UIView *fromView = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey].view; 24 | UIView *toView = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey].view; 25 | 26 | UIView *containerView = [transitionContext containerView]; 27 | [containerView addSubview:toView]; 28 | 29 | NSTimeInterval duration = [self transitionDuration:transitionContext]; 30 | [UIView transitionFromView:fromView toView:toView duration:duration options:UIViewAnimationOptionTransitionCurlUp completion:^(BOOL finished) { 31 | //动画完成后,系统会自动移除fromView 32 | [transitionContext completeTransition:YES]; 33 | fromView.transform = CGAffineTransformIdentity; 34 | toView.transform = CGAffineTransformIdentity; 35 | }]; 36 | } 37 | 38 | @end 39 | -------------------------------------------------------------------------------- /LLNavigationController/LLNavigationController/LLTransitionAnimator/LLTransistionDelegate/LLNavControllerDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // LLNavControllerDelegate.h 3 | // LLFoundation 4 | // 5 | // Created by Mr.Wang on 17/1/10. 6 | // Copyright © 2017年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LLNavControllerDelegate : NSObject 12 | 13 | @property (nonatomic, strong) NSString *presentTransition; 14 | @property (nonatomic, strong) NSString *dismissTransition; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /LLNavigationController/LLNavigationController/LLTransitionAnimator/LLTransistionDelegate/LLNavControllerDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // LLNavControllerDelegate.m 3 | // LLFoundation 4 | // 5 | // Created by Mr.Wang on 17/1/10. 6 | // Copyright © 2017年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import "LLNavControllerDelegate.h" 10 | 11 | @implementation LLNavControllerDelegate 12 | 13 | - (nullable id )navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC{ 14 | if (operation == UINavigationControllerOperationPush) { 15 | if(self.presentTransition){ 16 | Class transition = NSClassFromString(self.presentTransition); 17 | return [transition new]; 18 | } 19 | } 20 | else if (operation == UINavigationControllerOperationPop) { 21 | if(self.dismissTransition){ 22 | Class transition = NSClassFromString(self.dismissTransition); 23 | return [transition new]; 24 | } 25 | } 26 | return nil; 27 | } 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /LLNavigationController/LLNavigationController/UINavigationController+LLAddPart.h: -------------------------------------------------------------------------------- 1 | // 2 | // UINavigationController+LLAddPart.h 3 | // LLFoundation 4 | // 5 | // Created by wangzhaomeng on 16/10/13. 6 | // Copyright © 2016年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UINavigationController (LLAddPart) 12 | 13 | #pragma mark - 为系统类扩展属性 14 | //是否响应自定义的滑动返回手势 15 | - (void)setPopRecognizerEnable:(BOOL)popRecognizerEnable; 16 | - (BOOL)popRecognizerEnable; 17 | 18 | //自定义的滑动返回手势是否与其他手势共存,一般使用默认值(默认返回NO:不与任何手势共存) 19 | - (void)setRecognizeSimultaneouslyEnable:(BOOL)recognizeSimultaneouslyEnable; 20 | - (BOOL)recognizeSimultaneouslyEnable; 21 | #pragma mark 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /LLNavigationController/LLNavigationController/UINavigationController+LLAddPart.m: -------------------------------------------------------------------------------- 1 | // 2 | // UINavigationController+LLAddPart.m 3 | // LLFoundation 4 | // 5 | // Created by wangzhaomeng on 16/10/13. 6 | // Copyright © 2016年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import "UINavigationController+LLAddPart.h" 10 | #import 11 | 12 | @implementation UINavigationController (LLAddPart) 13 | 14 | #pragma mark - 为系统类扩展属性 15 | static BOOL _recognizeSimultaneouslyEnable; 16 | static BOOL _popRecognizerEnable; 17 | - (void)setRecognizeSimultaneouslyEnable:(BOOL)recognizeSimultaneouslyEnable { 18 | NSNumber *t = @(recognizeSimultaneouslyEnable); 19 | objc_setAssociatedObject(self, &_recognizeSimultaneouslyEnable, t, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 20 | } 21 | 22 | - (BOOL)recognizeSimultaneouslyEnable { 23 | NSNumber *t = objc_getAssociatedObject(self, &_recognizeSimultaneouslyEnable); 24 | return [t boolValue]; 25 | } 26 | 27 | - (void)setPopRecognizerEnable:(BOOL)popRecognizerEnable { 28 | NSNumber *t = @(popRecognizerEnable); 29 | objc_setAssociatedObject(self, &_popRecognizerEnable, t, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 30 | } 31 | 32 | - (BOOL)popRecognizerEnable { 33 | NSNumber *t = objc_getAssociatedObject(self, &_popRecognizerEnable); 34 | return [t boolValue]; 35 | } 36 | #pragma mark 37 | 38 | @end 39 | -------------------------------------------------------------------------------- /LLNavigationController/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // LLSecondViewController.h 3 | // LLFoundation 4 | // 5 | // Created by wangzhaomeng on 16/11/22. 6 | // Copyright © 2016年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /LLNavigationController/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // LLSecondViewController.m 3 | // LLFoundation 4 | // 5 | // Created by wangzhaomeng on 16/11/22. 6 | // Copyright © 2016年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | 11 | @interface ViewController () 12 | 13 | @end 14 | 15 | @implementation ViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | self.view.backgroundColor = [UIColor whiteColor]; 20 | 21 | self.title = [NSString stringWithFormat:@"第%ld页",self.navigationController.viewControllers.count]; 22 | 23 | [self createViews]; 24 | } 25 | 26 | - (void)createViews{ 27 | UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"继续" style:UIBarButtonItemStylePlain target:self action:@selector(rightBarButtonItemClick:)]; 28 | self.navigationItem.rightBarButtonItem = rightBarButtonItem; 29 | } 30 | 31 | - (void)rightBarButtonItemClick:(UIBarButtonItem *)rightBarButtonItem{ 32 | ViewController *secondVC = [[ViewController alloc] init]; 33 | [self.navigationController pushViewController:secondVC animated:YES]; 34 | } 35 | 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /LLNavigationController/image.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaoyi3699/LLNavigationController/b9d68efdc58183088e3e84427f534b962bd095cd/LLNavigationController/image.PNG -------------------------------------------------------------------------------- /LLNavigationController/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // LLNavigationController 4 | // 5 | // Created by Mr.Wang on 16/12/22. 6 | // Copyright © 2016年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /LLNavigationControllerTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /LLNavigationControllerTests/LLNavigationControllerTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // LLNavigationControllerTests.m 3 | // LLNavigationControllerTests 4 | // 5 | // Created by Mr.Wang on 16/12/22. 6 | // Copyright © 2016年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LLNavigationControllerTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation LLNavigationControllerTests 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 | // Use XCTAssert and related functions to verify your tests produce the correct results. 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 | -------------------------------------------------------------------------------- /LLNavigationControllerUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /LLNavigationControllerUITests/LLNavigationControllerUITests.m: -------------------------------------------------------------------------------- 1 | // 2 | // LLNavigationControllerUITests.m 3 | // LLNavigationControllerUITests 4 | // 5 | // Created by Mr.Wang on 16/12/22. 6 | // Copyright © 2016年 MaoChao Network Co. Ltd. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LLNavigationControllerUITests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation LLNavigationControllerUITests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | 22 | // In UI tests it is usually best to stop immediately when a failure occurs. 23 | self.continueAfterFailure = NO; 24 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 25 | [[[XCUIApplication alloc] init] launch]; 26 | 27 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 28 | } 29 | 30 | - (void)tearDown { 31 | // Put teardown code here. This method is called after the invocation of each test method in the class. 32 | [super tearDown]; 33 | } 34 | 35 | - (void)testExample { 36 | // Use recording to get started writing UI tests. 37 | // Use XCTAssert and related functions to verify your tests produce the correct results. 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [我的博客:iOS使用系统的导航栏,自定义滑动返回手势与转场动画](http://www.jianshu.com/p/2eb6cd11fabd) 2 | 3 | //自定义滑动返回手势与动画 4 | 5 | ![Image text](https://github.com/wangzhaomeng/LLNavigationController/blob/master/LLNavigationController/image.PNG?raw=true) 6 | 7 | 8 | 9 | //自定义转场动画 10 | ``` 11 | - (nullable id )navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC{ 12 | if (operation == UINavigationControllerOperationPush) {//push动画 13 | if(self.presentTransition){ 14 | Class transition = NSClassFromString(self.presentTransition); 15 | return [transition new]; 16 | } 17 | } 18 | else if (operation == UINavigationControllerOperationPop) {//pop动画 19 | if(self.dismissTransition){ 20 | Class transition = NSClassFromString(self.dismissTransition); 21 | return [transition new]; 22 | } 23 | } 24 | return nil; 25 | } 26 | ``` 27 | 28 | 29 | --------------------------------------------------------------------------------