├── PSDrawerController ├── PSDrawerController.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcuserdata │ │ │ └── leiliang.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── xcuserdata │ │ └── leiliang.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ ├── PSDrawerController.xcscheme │ │ └── xcschememanagement.plist └── PSDrawerController │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Contents.json │ ├── header.imageset │ │ ├── Contents.json │ │ └── header@2x.jpg │ ├── sidebar_album.imageset │ │ ├── Contents.json │ │ └── sidebar_album@3x.png │ ├── sidebar_bg.imageset │ │ ├── Contents.json │ │ └── sidebar_bg.jpg │ ├── sidebar_business.imageset │ │ ├── Contents.json │ │ └── sidebar_business@3x.png │ ├── sidebar_decoration.imageset │ │ ├── Contents.json │ │ └── sidebar_decoration@3x.png │ ├── sidebar_favorit.imageset │ │ ├── Contents.json │ │ └── sidebar_favorit@3x.png │ ├── sidebar_file.imageset │ │ ├── Contents.json │ │ └── sidebar_file@3x.png │ ├── sidebar_nightmode_loading.imageset │ │ ├── Contents.json │ │ └── sidebar_nightmode_loading@3x.png │ ├── sidebar_nightmode_on.imageset │ │ ├── Contents.json │ │ └── sidebar_nightmode_on@3x.png │ ├── sidebar_purse.imageset │ │ ├── Contents.json │ │ └── sidebar_purse@3x.png │ ├── sidebar_setting.imageset │ │ ├── Contents.json │ │ └── sidebar_setting@2x.png │ ├── tab_buddy_nor.imageset │ │ ├── Contents.json │ │ └── tab_buddy_nor@3x.png │ ├── tab_qworld_nor.imageset │ │ ├── Contents.json │ │ └── tab_qworld_nor@3x.png │ └── tab_recent_nor.imageset │ │ ├── Contents.json │ │ └── tab_recent_nor@3x.png │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Contacts │ ├── ContactsViewController.h │ └── ContactsViewController.m │ ├── Info.plist │ ├── Left │ ├── View │ │ ├── LeftView.h │ │ └── LeftView.m │ └── ViewController │ │ ├── LeftViewController.h │ │ └── LeftViewController.m │ ├── Message │ ├── MessageViewController.h │ └── MessageViewController.m │ ├── News │ ├── NewsViewController.h │ └── NewsViewController.m │ ├── TabBarVC │ ├── PSTabBarController.h │ └── PSTabBarController.m │ ├── ViewController.h │ ├── ViewController.m │ ├── lib │ ├── PSDrawerManager.h │ ├── PSDrawerManager.m │ ├── UIView+leoAdd.h │ └── UIView+leoAdd.m │ └── main.m ├── PSDrawerManager.gif └── README.md /PSDrawerController/PSDrawerController.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | DDCC6FD01D58374E001AE6C8 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = DDCC6FCF1D58374E001AE6C8 /* main.m */; }; 11 | DDCC6FD31D58374E001AE6C8 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = DDCC6FD21D58374E001AE6C8 /* AppDelegate.m */; }; 12 | DDCC6FD61D58374E001AE6C8 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DDCC6FD51D58374E001AE6C8 /* ViewController.m */; }; 13 | DDCC6FD91D58374E001AE6C8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DDCC6FD71D58374E001AE6C8 /* Main.storyboard */; }; 14 | DDCC6FDB1D58374E001AE6C8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DDCC6FDA1D58374E001AE6C8 /* Assets.xcassets */; }; 15 | DDCC6FDE1D58374E001AE6C8 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DDCC6FDC1D58374E001AE6C8 /* LaunchScreen.storyboard */; }; 16 | DDCC6FFE1D5845D6001AE6C8 /* ContactsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DDCC6FFD1D5845D6001AE6C8 /* ContactsViewController.m */; }; 17 | DDCC70071D584705001AE6C8 /* LeftViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DDCC70061D584705001AE6C8 /* LeftViewController.m */; }; 18 | DDCC700B1D5847B2001AE6C8 /* UIView+leoAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = DDCC700A1D5847B2001AE6C8 /* UIView+leoAdd.m */; }; 19 | DDCC700E1D584B2E001AE6C8 /* MessageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DDCC700D1D584B2E001AE6C8 /* MessageViewController.m */; }; 20 | DDCC70111D584B5C001AE6C8 /* NewsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DDCC70101D584B5C001AE6C8 /* NewsViewController.m */; }; 21 | DDCC70141D5850A4001AE6C8 /* LeftView.m in Sources */ = {isa = PBXBuildFile; fileRef = DDCC70131D5850A4001AE6C8 /* LeftView.m */; }; 22 | DDCC70171D585357001AE6C8 /* PSDrawerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = DDCC70161D585357001AE6C8 /* PSDrawerManager.m */; }; 23 | DDCC701E1D585911001AE6C8 /* PSTabBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = DDCC701D1D585911001AE6C8 /* PSTabBarController.m */; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXFileReference section */ 27 | DDCC6FCB1D58374E001AE6C8 /* PSDrawerController.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PSDrawerController.app; sourceTree = BUILT_PRODUCTS_DIR; }; 28 | DDCC6FCF1D58374E001AE6C8 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 29 | DDCC6FD11D58374E001AE6C8 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 30 | DDCC6FD21D58374E001AE6C8 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 31 | DDCC6FD41D58374E001AE6C8 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 32 | DDCC6FD51D58374E001AE6C8 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 33 | DDCC6FD81D58374E001AE6C8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 34 | DDCC6FDA1D58374E001AE6C8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 35 | DDCC6FDD1D58374E001AE6C8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 36 | DDCC6FDF1D58374E001AE6C8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 37 | DDCC6FFC1D5845D6001AE6C8 /* ContactsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactsViewController.h; sourceTree = ""; }; 38 | DDCC6FFD1D5845D6001AE6C8 /* ContactsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContactsViewController.m; sourceTree = ""; }; 39 | DDCC70051D584705001AE6C8 /* LeftViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LeftViewController.h; sourceTree = ""; }; 40 | DDCC70061D584705001AE6C8 /* LeftViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LeftViewController.m; sourceTree = ""; }; 41 | DDCC70091D5847B2001AE6C8 /* UIView+leoAdd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+leoAdd.h"; sourceTree = ""; }; 42 | DDCC700A1D5847B2001AE6C8 /* UIView+leoAdd.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+leoAdd.m"; sourceTree = ""; }; 43 | DDCC700C1D584B2E001AE6C8 /* MessageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessageViewController.h; sourceTree = ""; }; 44 | DDCC700D1D584B2E001AE6C8 /* MessageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MessageViewController.m; sourceTree = ""; }; 45 | DDCC700F1D584B5C001AE6C8 /* NewsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NewsViewController.h; sourceTree = ""; }; 46 | DDCC70101D584B5C001AE6C8 /* NewsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NewsViewController.m; sourceTree = ""; }; 47 | DDCC70121D5850A4001AE6C8 /* LeftView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LeftView.h; sourceTree = ""; }; 48 | DDCC70131D5850A4001AE6C8 /* LeftView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LeftView.m; sourceTree = ""; }; 49 | DDCC70151D585357001AE6C8 /* PSDrawerManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSDrawerManager.h; sourceTree = ""; }; 50 | DDCC70161D585357001AE6C8 /* PSDrawerManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSDrawerManager.m; sourceTree = ""; }; 51 | DDCC701C1D585911001AE6C8 /* PSTabBarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSTabBarController.h; sourceTree = ""; }; 52 | DDCC701D1D585911001AE6C8 /* PSTabBarController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTabBarController.m; sourceTree = ""; }; 53 | /* End PBXFileReference section */ 54 | 55 | /* Begin PBXFrameworksBuildPhase section */ 56 | DDCC6FC81D58374E001AE6C8 /* Frameworks */ = { 57 | isa = PBXFrameworksBuildPhase; 58 | buildActionMask = 2147483647; 59 | files = ( 60 | ); 61 | runOnlyForDeploymentPostprocessing = 0; 62 | }; 63 | /* End PBXFrameworksBuildPhase section */ 64 | 65 | /* Begin PBXGroup section */ 66 | DDCC6FC21D58374E001AE6C8 = { 67 | isa = PBXGroup; 68 | children = ( 69 | DDCC6FCD1D58374E001AE6C8 /* PSDrawerController */, 70 | DDCC6FCC1D58374E001AE6C8 /* Products */, 71 | ); 72 | sourceTree = ""; 73 | }; 74 | DDCC6FCC1D58374E001AE6C8 /* Products */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | DDCC6FCB1D58374E001AE6C8 /* PSDrawerController.app */, 78 | ); 79 | name = Products; 80 | sourceTree = ""; 81 | }; 82 | DDCC6FCD1D58374E001AE6C8 /* PSDrawerController */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | DDCC70081D5847B2001AE6C8 /* lib */, 86 | DDCC70021D584705001AE6C8 /* Left */, 87 | DDCC6FE81D58380B001AE6C8 /* Message */, 88 | DDCC6FE51D58380B001AE6C8 /* Contacts */, 89 | DDCC6FE91D58380B001AE6C8 /* News */, 90 | DDCC701B1D585911001AE6C8 /* TabBarVC */, 91 | DDCC6FD11D58374E001AE6C8 /* AppDelegate.h */, 92 | DDCC6FD21D58374E001AE6C8 /* AppDelegate.m */, 93 | DDCC6FD41D58374E001AE6C8 /* ViewController.h */, 94 | DDCC6FD51D58374E001AE6C8 /* ViewController.m */, 95 | DDCC6FD71D58374E001AE6C8 /* Main.storyboard */, 96 | DDCC6FDA1D58374E001AE6C8 /* Assets.xcassets */, 97 | DDCC6FDC1D58374E001AE6C8 /* LaunchScreen.storyboard */, 98 | DDCC6FDF1D58374E001AE6C8 /* Info.plist */, 99 | DDCC6FCE1D58374E001AE6C8 /* Supporting Files */, 100 | ); 101 | path = PSDrawerController; 102 | sourceTree = ""; 103 | }; 104 | DDCC6FCE1D58374E001AE6C8 /* Supporting Files */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | DDCC6FCF1D58374E001AE6C8 /* main.m */, 108 | ); 109 | name = "Supporting Files"; 110 | sourceTree = ""; 111 | }; 112 | DDCC6FE51D58380B001AE6C8 /* Contacts */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | DDCC6FFC1D5845D6001AE6C8 /* ContactsViewController.h */, 116 | DDCC6FFD1D5845D6001AE6C8 /* ContactsViewController.m */, 117 | ); 118 | path = Contacts; 119 | sourceTree = ""; 120 | }; 121 | DDCC6FE81D58380B001AE6C8 /* Message */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | DDCC700C1D584B2E001AE6C8 /* MessageViewController.h */, 125 | DDCC700D1D584B2E001AE6C8 /* MessageViewController.m */, 126 | ); 127 | path = Message; 128 | sourceTree = ""; 129 | }; 130 | DDCC6FE91D58380B001AE6C8 /* News */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | DDCC700F1D584B5C001AE6C8 /* NewsViewController.h */, 134 | DDCC70101D584B5C001AE6C8 /* NewsViewController.m */, 135 | ); 136 | path = News; 137 | sourceTree = ""; 138 | }; 139 | DDCC70021D584705001AE6C8 /* Left */ = { 140 | isa = PBXGroup; 141 | children = ( 142 | DDCC70031D584705001AE6C8 /* View */, 143 | DDCC70041D584705001AE6C8 /* ViewController */, 144 | ); 145 | path = Left; 146 | sourceTree = ""; 147 | }; 148 | DDCC70031D584705001AE6C8 /* View */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | DDCC70121D5850A4001AE6C8 /* LeftView.h */, 152 | DDCC70131D5850A4001AE6C8 /* LeftView.m */, 153 | ); 154 | path = View; 155 | sourceTree = ""; 156 | }; 157 | DDCC70041D584705001AE6C8 /* ViewController */ = { 158 | isa = PBXGroup; 159 | children = ( 160 | DDCC70051D584705001AE6C8 /* LeftViewController.h */, 161 | DDCC70061D584705001AE6C8 /* LeftViewController.m */, 162 | ); 163 | path = ViewController; 164 | sourceTree = ""; 165 | }; 166 | DDCC70081D5847B2001AE6C8 /* lib */ = { 167 | isa = PBXGroup; 168 | children = ( 169 | DDCC70091D5847B2001AE6C8 /* UIView+leoAdd.h */, 170 | DDCC700A1D5847B2001AE6C8 /* UIView+leoAdd.m */, 171 | DDCC70151D585357001AE6C8 /* PSDrawerManager.h */, 172 | DDCC70161D585357001AE6C8 /* PSDrawerManager.m */, 173 | ); 174 | path = lib; 175 | sourceTree = ""; 176 | }; 177 | DDCC701B1D585911001AE6C8 /* TabBarVC */ = { 178 | isa = PBXGroup; 179 | children = ( 180 | DDCC701C1D585911001AE6C8 /* PSTabBarController.h */, 181 | DDCC701D1D585911001AE6C8 /* PSTabBarController.m */, 182 | ); 183 | path = TabBarVC; 184 | sourceTree = ""; 185 | }; 186 | /* End PBXGroup section */ 187 | 188 | /* Begin PBXNativeTarget section */ 189 | DDCC6FCA1D58374E001AE6C8 /* PSDrawerController */ = { 190 | isa = PBXNativeTarget; 191 | buildConfigurationList = DDCC6FE21D58374E001AE6C8 /* Build configuration list for PBXNativeTarget "PSDrawerController" */; 192 | buildPhases = ( 193 | DDCC6FC71D58374E001AE6C8 /* Sources */, 194 | DDCC6FC81D58374E001AE6C8 /* Frameworks */, 195 | DDCC6FC91D58374E001AE6C8 /* Resources */, 196 | ); 197 | buildRules = ( 198 | ); 199 | dependencies = ( 200 | ); 201 | name = PSDrawerController; 202 | productName = PSDrawerController; 203 | productReference = DDCC6FCB1D58374E001AE6C8 /* PSDrawerController.app */; 204 | productType = "com.apple.product-type.application"; 205 | }; 206 | /* End PBXNativeTarget section */ 207 | 208 | /* Begin PBXProject section */ 209 | DDCC6FC31D58374E001AE6C8 /* Project object */ = { 210 | isa = PBXProject; 211 | attributes = { 212 | LastUpgradeCheck = 0730; 213 | ORGANIZATIONNAME = Leiliang; 214 | TargetAttributes = { 215 | DDCC6FCA1D58374E001AE6C8 = { 216 | CreatedOnToolsVersion = 7.3.1; 217 | }; 218 | }; 219 | }; 220 | buildConfigurationList = DDCC6FC61D58374E001AE6C8 /* Build configuration list for PBXProject "PSDrawerController" */; 221 | compatibilityVersion = "Xcode 3.2"; 222 | developmentRegion = English; 223 | hasScannedForEncodings = 0; 224 | knownRegions = ( 225 | en, 226 | Base, 227 | ); 228 | mainGroup = DDCC6FC21D58374E001AE6C8; 229 | productRefGroup = DDCC6FCC1D58374E001AE6C8 /* Products */; 230 | projectDirPath = ""; 231 | projectRoot = ""; 232 | targets = ( 233 | DDCC6FCA1D58374E001AE6C8 /* PSDrawerController */, 234 | ); 235 | }; 236 | /* End PBXProject section */ 237 | 238 | /* Begin PBXResourcesBuildPhase section */ 239 | DDCC6FC91D58374E001AE6C8 /* Resources */ = { 240 | isa = PBXResourcesBuildPhase; 241 | buildActionMask = 2147483647; 242 | files = ( 243 | DDCC6FDE1D58374E001AE6C8 /* LaunchScreen.storyboard in Resources */, 244 | DDCC6FDB1D58374E001AE6C8 /* Assets.xcassets in Resources */, 245 | DDCC6FD91D58374E001AE6C8 /* Main.storyboard in Resources */, 246 | ); 247 | runOnlyForDeploymentPostprocessing = 0; 248 | }; 249 | /* End PBXResourcesBuildPhase section */ 250 | 251 | /* Begin PBXSourcesBuildPhase section */ 252 | DDCC6FC71D58374E001AE6C8 /* Sources */ = { 253 | isa = PBXSourcesBuildPhase; 254 | buildActionMask = 2147483647; 255 | files = ( 256 | DDCC70071D584705001AE6C8 /* LeftViewController.m in Sources */, 257 | DDCC6FFE1D5845D6001AE6C8 /* ContactsViewController.m in Sources */, 258 | DDCC700B1D5847B2001AE6C8 /* UIView+leoAdd.m in Sources */, 259 | DDCC70111D584B5C001AE6C8 /* NewsViewController.m in Sources */, 260 | DDCC70141D5850A4001AE6C8 /* LeftView.m in Sources */, 261 | DDCC70171D585357001AE6C8 /* PSDrawerManager.m in Sources */, 262 | DDCC6FD61D58374E001AE6C8 /* ViewController.m in Sources */, 263 | DDCC700E1D584B2E001AE6C8 /* MessageViewController.m in Sources */, 264 | DDCC6FD31D58374E001AE6C8 /* AppDelegate.m in Sources */, 265 | DDCC6FD01D58374E001AE6C8 /* main.m in Sources */, 266 | DDCC701E1D585911001AE6C8 /* PSTabBarController.m in Sources */, 267 | ); 268 | runOnlyForDeploymentPostprocessing = 0; 269 | }; 270 | /* End PBXSourcesBuildPhase section */ 271 | 272 | /* Begin PBXVariantGroup section */ 273 | DDCC6FD71D58374E001AE6C8 /* Main.storyboard */ = { 274 | isa = PBXVariantGroup; 275 | children = ( 276 | DDCC6FD81D58374E001AE6C8 /* Base */, 277 | ); 278 | name = Main.storyboard; 279 | sourceTree = ""; 280 | }; 281 | DDCC6FDC1D58374E001AE6C8 /* LaunchScreen.storyboard */ = { 282 | isa = PBXVariantGroup; 283 | children = ( 284 | DDCC6FDD1D58374E001AE6C8 /* Base */, 285 | ); 286 | name = LaunchScreen.storyboard; 287 | sourceTree = ""; 288 | }; 289 | /* End PBXVariantGroup section */ 290 | 291 | /* Begin XCBuildConfiguration section */ 292 | DDCC6FE01D58374E001AE6C8 /* Debug */ = { 293 | isa = XCBuildConfiguration; 294 | buildSettings = { 295 | ALWAYS_SEARCH_USER_PATHS = NO; 296 | CLANG_ANALYZER_NONNULL = YES; 297 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 298 | CLANG_CXX_LIBRARY = "libc++"; 299 | CLANG_ENABLE_MODULES = YES; 300 | CLANG_ENABLE_OBJC_ARC = YES; 301 | CLANG_WARN_BOOL_CONVERSION = YES; 302 | CLANG_WARN_CONSTANT_CONVERSION = YES; 303 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 304 | CLANG_WARN_EMPTY_BODY = YES; 305 | CLANG_WARN_ENUM_CONVERSION = YES; 306 | CLANG_WARN_INT_CONVERSION = YES; 307 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 308 | CLANG_WARN_UNREACHABLE_CODE = YES; 309 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 310 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 311 | COPY_PHASE_STRIP = NO; 312 | DEBUG_INFORMATION_FORMAT = dwarf; 313 | ENABLE_STRICT_OBJC_MSGSEND = YES; 314 | ENABLE_TESTABILITY = YES; 315 | GCC_C_LANGUAGE_STANDARD = gnu99; 316 | GCC_DYNAMIC_NO_PIC = NO; 317 | GCC_NO_COMMON_BLOCKS = YES; 318 | GCC_OPTIMIZATION_LEVEL = 0; 319 | GCC_PREPROCESSOR_DEFINITIONS = ( 320 | "DEBUG=1", 321 | "$(inherited)", 322 | ); 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 | }; 334 | name = Debug; 335 | }; 336 | DDCC6FE11D58374E001AE6C8 /* Release */ = { 337 | isa = XCBuildConfiguration; 338 | buildSettings = { 339 | ALWAYS_SEARCH_USER_PATHS = NO; 340 | CLANG_ANALYZER_NONNULL = YES; 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 = NO; 356 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 357 | ENABLE_NS_ASSERTIONS = NO; 358 | ENABLE_STRICT_OBJC_MSGSEND = YES; 359 | GCC_C_LANGUAGE_STANDARD = gnu99; 360 | GCC_NO_COMMON_BLOCKS = YES; 361 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 362 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 363 | GCC_WARN_UNDECLARED_SELECTOR = YES; 364 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 365 | GCC_WARN_UNUSED_FUNCTION = YES; 366 | GCC_WARN_UNUSED_VARIABLE = YES; 367 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 368 | MTL_ENABLE_DEBUG_INFO = NO; 369 | SDKROOT = iphoneos; 370 | VALIDATE_PRODUCT = YES; 371 | }; 372 | name = Release; 373 | }; 374 | DDCC6FE31D58374E001AE6C8 /* Debug */ = { 375 | isa = XCBuildConfiguration; 376 | buildSettings = { 377 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 378 | INFOPLIST_FILE = PSDrawerController/Info.plist; 379 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 380 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 381 | PRODUCT_BUNDLE_IDENTIFIER = Leiliang.PSDrawerController; 382 | PRODUCT_NAME = "$(TARGET_NAME)"; 383 | }; 384 | name = Debug; 385 | }; 386 | DDCC6FE41D58374E001AE6C8 /* Release */ = { 387 | isa = XCBuildConfiguration; 388 | buildSettings = { 389 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 390 | INFOPLIST_FILE = PSDrawerController/Info.plist; 391 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 392 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 393 | PRODUCT_BUNDLE_IDENTIFIER = Leiliang.PSDrawerController; 394 | PRODUCT_NAME = "$(TARGET_NAME)"; 395 | }; 396 | name = Release; 397 | }; 398 | /* End XCBuildConfiguration section */ 399 | 400 | /* Begin XCConfigurationList section */ 401 | DDCC6FC61D58374E001AE6C8 /* Build configuration list for PBXProject "PSDrawerController" */ = { 402 | isa = XCConfigurationList; 403 | buildConfigurations = ( 404 | DDCC6FE01D58374E001AE6C8 /* Debug */, 405 | DDCC6FE11D58374E001AE6C8 /* Release */, 406 | ); 407 | defaultConfigurationIsVisible = 0; 408 | defaultConfigurationName = Release; 409 | }; 410 | DDCC6FE21D58374E001AE6C8 /* Build configuration list for PBXNativeTarget "PSDrawerController" */ = { 411 | isa = XCConfigurationList; 412 | buildConfigurations = ( 413 | DDCC6FE31D58374E001AE6C8 /* Debug */, 414 | DDCC6FE41D58374E001AE6C8 /* Release */, 415 | ); 416 | defaultConfigurationIsVisible = 0; 417 | defaultConfigurationName = Release; 418 | }; 419 | /* End XCConfigurationList section */ 420 | }; 421 | rootObject = DDCC6FC31D58374E001AE6C8 /* Project object */; 422 | } 423 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController.xcodeproj/project.xcworkspace/xcuserdata/leiliang.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PipeDog/PSDrawerManager/b58ec3d6ae6a11ce221c766268bcfcb17f7cfdf0/PSDrawerController/PSDrawerController.xcodeproj/project.xcworkspace/xcuserdata/leiliang.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController.xcodeproj/xcuserdata/leiliang.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController.xcodeproj/xcuserdata/leiliang.xcuserdatad/xcschemes/PSDrawerController.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController.xcodeproj/xcuserdata/leiliang.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | PSDrawerController.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | DDCC6FCA1D58374E001AE6C8 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "PSTabBarController.h" 11 | #import "LeftView.h" 12 | #import "UIView+leoAdd.h" 13 | #import "PSDrawerManager.h" 14 | 15 | @interface AppDelegate () 16 | 17 | @end 18 | 19 | @implementation AppDelegate 20 | 21 | 22 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 23 | // Override point for customization after application launch. 24 | self.window.backgroundColor = [UIColor whiteColor]; 25 | 26 | LeftView *leftView = [[LeftView alloc] initWithFrame:CGRectMake(-self.window.width * (1 - kLeftWidthScale), 0, self.window.width, self.window.height)]; 27 | 28 | PSTabBarController *tabBarVC = [[PSTabBarController alloc] init]; 29 | 30 | [[PSDrawerManager instance] installCenterViewController:tabBarVC leftView:leftView]; 31 | 32 | return YES; 33 | } 34 | 35 | - (void)applicationWillResignActive:(UIApplication *)application { 36 | // 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. 37 | // 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. 38 | } 39 | 40 | - (void)applicationDidEnterBackground:(UIApplication *)application { 41 | // 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. 42 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 43 | } 44 | 45 | - (void)applicationWillEnterForeground:(UIApplication *)application { 46 | // 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. 47 | } 48 | 49 | - (void)applicationDidBecomeActive:(UIApplication *)application { 50 | // 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. 51 | } 52 | 53 | - (void)applicationWillTerminate:(UIApplication *)application { 54 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 55 | } 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | ], 4 | "info" : { 5 | "version" : 1, 6 | "author" : "xcode" 7 | } 8 | } -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/header.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "header@2x.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/header.imageset/header@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PipeDog/PSDrawerManager/b58ec3d6ae6a11ce221c766268bcfcb17f7cfdf0/PSDrawerController/PSDrawerController/Assets.xcassets/header.imageset/header@2x.jpg -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_album.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "sidebar_album@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_album.imageset/sidebar_album@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PipeDog/PSDrawerManager/b58ec3d6ae6a11ce221c766268bcfcb17f7cfdf0/PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_album.imageset/sidebar_album@3x.png -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_bg.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "sidebar_bg.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_bg.imageset/sidebar_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PipeDog/PSDrawerManager/b58ec3d6ae6a11ce221c766268bcfcb17f7cfdf0/PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_bg.imageset/sidebar_bg.jpg -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_business.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "sidebar_business@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_business.imageset/sidebar_business@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PipeDog/PSDrawerManager/b58ec3d6ae6a11ce221c766268bcfcb17f7cfdf0/PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_business.imageset/sidebar_business@3x.png -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_decoration.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "sidebar_decoration@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_decoration.imageset/sidebar_decoration@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PipeDog/PSDrawerManager/b58ec3d6ae6a11ce221c766268bcfcb17f7cfdf0/PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_decoration.imageset/sidebar_decoration@3x.png -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_favorit.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "sidebar_favorit@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_favorit.imageset/sidebar_favorit@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PipeDog/PSDrawerManager/b58ec3d6ae6a11ce221c766268bcfcb17f7cfdf0/PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_favorit.imageset/sidebar_favorit@3x.png -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_file.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "sidebar_file@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_file.imageset/sidebar_file@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PipeDog/PSDrawerManager/b58ec3d6ae6a11ce221c766268bcfcb17f7cfdf0/PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_file.imageset/sidebar_file@3x.png -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_nightmode_loading.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "sidebar_nightmode_loading@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_nightmode_loading.imageset/sidebar_nightmode_loading@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PipeDog/PSDrawerManager/b58ec3d6ae6a11ce221c766268bcfcb17f7cfdf0/PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_nightmode_loading.imageset/sidebar_nightmode_loading@3x.png -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_nightmode_on.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "sidebar_nightmode_on@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_nightmode_on.imageset/sidebar_nightmode_on@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PipeDog/PSDrawerManager/b58ec3d6ae6a11ce221c766268bcfcb17f7cfdf0/PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_nightmode_on.imageset/sidebar_nightmode_on@3x.png -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_purse.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "sidebar_purse@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_purse.imageset/sidebar_purse@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PipeDog/PSDrawerManager/b58ec3d6ae6a11ce221c766268bcfcb17f7cfdf0/PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_purse.imageset/sidebar_purse@3x.png -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_setting.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "sidebar_setting@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_setting.imageset/sidebar_setting@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PipeDog/PSDrawerManager/b58ec3d6ae6a11ce221c766268bcfcb17f7cfdf0/PSDrawerController/PSDrawerController/Assets.xcassets/sidebar_setting.imageset/sidebar_setting@2x.png -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/tab_buddy_nor.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "tab_buddy_nor@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/tab_buddy_nor.imageset/tab_buddy_nor@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PipeDog/PSDrawerManager/b58ec3d6ae6a11ce221c766268bcfcb17f7cfdf0/PSDrawerController/PSDrawerController/Assets.xcassets/tab_buddy_nor.imageset/tab_buddy_nor@3x.png -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/tab_qworld_nor.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "tab_qworld_nor@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/tab_qworld_nor.imageset/tab_qworld_nor@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PipeDog/PSDrawerManager/b58ec3d6ae6a11ce221c766268bcfcb17f7cfdf0/PSDrawerController/PSDrawerController/Assets.xcassets/tab_qworld_nor.imageset/tab_qworld_nor@3x.png -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/tab_recent_nor.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "tab_recent_nor@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Assets.xcassets/tab_recent_nor.imageset/tab_recent_nor@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PipeDog/PSDrawerManager/b58ec3d6ae6a11ce221c766268bcfcb17f7cfdf0/PSDrawerController/PSDrawerController/Assets.xcassets/tab_recent_nor.imageset/tab_recent_nor@3x.png -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/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 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Base.lproj/Main.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 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Contacts/ContactsViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ContactsViewController.h 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ContactsViewController : UITableViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Contacts/ContactsViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ContactsViewController.m 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import "ContactsViewController.h" 10 | 11 | #define kScreenWidth [UIScreen mainScreen].bounds.size.width 12 | 13 | @interface ContactsViewController () 14 | 15 | @property (nonatomic, strong) UISearchBar *searchBar; 16 | 17 | @end 18 | 19 | @implementation ContactsViewController 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | 24 | self.title = @"联系人"; 25 | 26 | self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 44)]; 27 | self.searchBar.placeholder = @"搜索"; 28 | [self.tableView addSubview:self.searchBar]; 29 | } 30 | 31 | - (void)scrollViewDidScroll:(UIScrollView *)scrollView { 32 | [self.searchBar resignFirstResponder]; 33 | } 34 | 35 | - (void)didReceiveMemoryWarning { 36 | [super didReceiveMemoryWarning]; 37 | // Dispose of any resources that can be recreated. 38 | } 39 | 40 | #pragma mark - Table view data source 41 | 42 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 43 | return 0; 44 | } 45 | 46 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 47 | return 0; 48 | } 49 | 50 | /* 51 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 52 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:<#@"reuseIdentifier"#> forIndexPath:indexPath]; 53 | 54 | // Configure the cell... 55 | 56 | return cell; 57 | } 58 | */ 59 | 60 | /* 61 | // Override to support conditional editing of the table view. 62 | - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 63 | // Return NO if you do not want the specified item to be editable. 64 | return YES; 65 | } 66 | */ 67 | 68 | /* 69 | // Override to support editing the table view. 70 | - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 71 | if (editingStyle == UITableViewCellEditingStyleDelete) { 72 | // Delete the row from the data source 73 | [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 74 | } else if (editingStyle == UITableViewCellEditingStyleInsert) { 75 | // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 76 | } 77 | } 78 | */ 79 | 80 | /* 81 | // Override to support rearranging the table view. 82 | - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 83 | } 84 | */ 85 | 86 | /* 87 | // Override to support conditional rearranging of the table view. 88 | - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 89 | // Return NO if you do not want the item to be re-orderable. 90 | return YES; 91 | } 92 | */ 93 | 94 | /* 95 | #pragma mark - Navigation 96 | 97 | // In a storyboard-based application, you will often want to do a little preparation before navigation 98 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 99 | // Get the new view controller using [segue destinationViewController]. 100 | // Pass the selected object to the new view controller. 101 | } 102 | */ 103 | 104 | @end 105 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/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 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Left/View/LeftView.h: -------------------------------------------------------------------------------- 1 | // 2 | // LeftView.h 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LeftView : UIView 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Left/View/LeftView.m: -------------------------------------------------------------------------------- 1 | // 2 | // LeftView.m 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import "LeftView.h" 10 | #import "PSDrawerManager.h" 11 | #import "UIView+leoAdd.h" 12 | 13 | static NSString *const reUse = @"reUse"; 14 | 15 | #define kBackgroundColor [UIColor colorWithRed:13.f / 255.f green:184.f / 255.f blue:246.f / 255.f alpha:1] 16 | 17 | @interface LeftView () 18 | 19 | @property (nonatomic, strong) UITableView *tableView; 20 | @property (nonatomic, strong) NSArray *dataArray; 21 | @property (nonatomic, strong) UIImageView *imageView; 22 | 23 | @end 24 | 25 | @implementation LeftView 26 | 27 | - (instancetype)initWithFrame:(CGRect)frame { 28 | self = [super initWithFrame:frame]; 29 | if (self) { 30 | self.backgroundColor = kBackgroundColor; 31 | 32 | self.dataArray = @[@[[UIImage imageNamed:@"sidebar_business"], @"我的商城"], 33 | @[[UIImage imageNamed:@"sidebar_purse"], @"QQ钱包"], 34 | @[[UIImage imageNamed:@"sidebar_decoration"], @"个性装扮"], 35 | @[[UIImage imageNamed:@"sidebar_favorit"], @"我的收藏"], 36 | @[[UIImage imageNamed:@"sidebar_album"], @"我的相册"], 37 | @[[UIImage imageNamed:@"sidebar_file"], @"我的文件"]]; 38 | 39 | self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.width, self.height) style:UITableViewStylePlain]; 40 | _tableView.backgroundColor = [UIColor clearColor]; 41 | _tableView.dataSource = self; 42 | _tableView.delegate = self; 43 | [self addSubview:_tableView]; 44 | 45 | _tableView.tableHeaderView = self.imageView; 46 | _tableView.tableFooterView = [[UIView alloc] init]; 47 | } 48 | return self; 49 | } 50 | 51 | #pragma mark - 52 | #pragma mark - tableView procotol methods 53 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 54 | return self.dataArray.count; 55 | } 56 | 57 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 58 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reUse]; 59 | if (!cell) { 60 | cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reUse]; 61 | cell.backgroundColor = [UIColor clearColor]; 62 | cell.textLabel.textColor = [UIColor whiteColor]; 63 | 64 | UIView *selectedBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.width, 44)]; 65 | selectedBackgroundView.backgroundColor = [UIColor whiteColor]; 66 | cell.selectedBackgroundView = selectedBackgroundView; 67 | } 68 | cell.imageView.image = self.dataArray[indexPath.row][0]; 69 | cell.textLabel.text = self.dataArray[indexPath.row][1]; 70 | return cell; 71 | } 72 | 73 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 74 | [tableView deselectRowAtIndexPath:indexPath animated:YES]; 75 | 76 | // 显示中间控制器 77 | [[PSDrawerManager instance] resetShowType:PSDrawerManagerShowCenter]; 78 | } 79 | 80 | #pragma mark - 81 | #pragma mark - headerView 82 | - (UIImageView *)imageView { 83 | if (!_imageView) { 84 | _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.width, 280)]; 85 | _imageView.contentMode = UIViewContentModeScaleAspectFill; 86 | _imageView.image = [UIImage imageNamed:@"sidebar_bg"]; 87 | _imageView.clipsToBounds = YES; 88 | 89 | UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"header"]]; 90 | imageView.size = CGSizeMake(60, 60); 91 | imageView.left = 25; 92 | imageView.top = 64; 93 | imageView.clipsToBounds = YES; 94 | imageView.layer.cornerRadius = imageView.width / 2; 95 | imageView.layer.borderColor = [UIColor whiteColor].CGColor; 96 | imageView.layer.borderWidth = 2.f; 97 | [_imageView addSubview:imageView]; 98 | 99 | UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(imageView.right + 30, imageView.top + 10, 100, 20)]; 100 | label.textColor = [UIColor darkGrayColor]; 101 | label.font = [UIFont boldSystemFontOfSize:20]; 102 | label.text = @"leiliang"; 103 | [_imageView addSubview:label]; 104 | } 105 | return _imageView; 106 | } 107 | 108 | /* 109 | // Only override drawRect: if you perform custom drawing. 110 | // An empty implementation adversely affects performance during animation. 111 | - (void)drawRect:(CGRect)rect { 112 | // Drawing code 113 | } 114 | */ 115 | 116 | @end 117 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Left/ViewController/LeftViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // LeftViewController.h 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LeftViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Left/ViewController/LeftViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // LeftViewController.m 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import "LeftViewController.h" 10 | 11 | @interface LeftViewController () 12 | 13 | @end 14 | 15 | @implementation LeftViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | // Do any additional setup after loading the view. 20 | } 21 | 22 | - (void)didReceiveMemoryWarning { 23 | [super didReceiveMemoryWarning]; 24 | // Dispose of any resources that can be recreated. 25 | } 26 | 27 | /* 28 | #pragma mark - Navigation 29 | 30 | // In a storyboard-based application, you will often want to do a little preparation before navigation 31 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 32 | // Get the new view controller using [segue destinationViewController]. 33 | // Pass the selected object to the new view controller. 34 | } 35 | */ 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Message/MessageViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // MessageViewController.h 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface MessageViewController : UITableViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/Message/MessageViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // MessageViewController.m 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import "MessageViewController.h" 10 | #import "UIView+leoAdd.h" 11 | 12 | #define kScreenWidth [UIScreen mainScreen].bounds.size.width 13 | 14 | @interface MessageViewController () 15 | 16 | @property (nonatomic, strong) UISegmentedControl *segmentedControl; 17 | @property (nonatomic, strong) UISearchBar *searchBar; 18 | 19 | @end 20 | 21 | @implementation MessageViewController 22 | 23 | - (void)viewDidLoad { 24 | [super viewDidLoad]; 25 | 26 | self.segmentedControl = [[UISegmentedControl alloc] initWithItems:@[@"消息", @"电话"]]; 27 | self.segmentedControl.width = 120; 28 | self.segmentedControl.selectedSegmentIndex = 0; 29 | self.navigationItem.titleView = self.segmentedControl; 30 | 31 | self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 44)]; 32 | self.searchBar.placeholder = @"搜索"; 33 | [self.tableView addSubview:self.searchBar]; 34 | } 35 | 36 | - (void)scrollViewDidScroll:(UIScrollView *)scrollView { 37 | [self.searchBar resignFirstResponder]; 38 | } 39 | 40 | - (void)didReceiveMemoryWarning { 41 | [super didReceiveMemoryWarning]; 42 | // Dispose of any resources that can be recreated. 43 | } 44 | 45 | #pragma mark - Table view data source 46 | 47 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 48 | return 0; 49 | } 50 | 51 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 52 | return 0; 53 | } 54 | 55 | /* 56 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 57 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:<#@"reuseIdentifier"#> forIndexPath:indexPath]; 58 | 59 | // Configure the cell... 60 | 61 | return cell; 62 | } 63 | */ 64 | 65 | /* 66 | // Override to support conditional editing of the table view. 67 | - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 68 | // Return NO if you do not want the specified item to be editable. 69 | return YES; 70 | } 71 | */ 72 | 73 | /* 74 | // Override to support editing the table view. 75 | - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 76 | if (editingStyle == UITableViewCellEditingStyleDelete) { 77 | // Delete the row from the data source 78 | [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 79 | } else if (editingStyle == UITableViewCellEditingStyleInsert) { 80 | // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 81 | } 82 | } 83 | */ 84 | 85 | /* 86 | // Override to support rearranging the table view. 87 | - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 88 | } 89 | */ 90 | 91 | /* 92 | // Override to support conditional rearranging of the table view. 93 | - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 94 | // Return NO if you do not want the item to be re-orderable. 95 | return YES; 96 | } 97 | */ 98 | 99 | /* 100 | #pragma mark - Navigation 101 | 102 | // In a storyboard-based application, you will often want to do a little preparation before navigation 103 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 104 | // Get the new view controller using [segue destinationViewController]. 105 | // Pass the selected object to the new view controller. 106 | } 107 | */ 108 | 109 | @end 110 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/News/NewsViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // NewsViewController.h 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface NewsViewController : UITableViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/News/NewsViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // NewsViewController.m 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import "NewsViewController.h" 10 | 11 | #define kScreenWidth [UIScreen mainScreen].bounds.size.width 12 | 13 | @interface NewsViewController () 14 | 15 | @property (nonatomic, strong) UISearchBar *searchBar; 16 | 17 | @end 18 | 19 | @implementation NewsViewController 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | 24 | self.title = @"动态"; 25 | 26 | self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 44)]; 27 | self.searchBar.placeholder = @"搜索电影/音乐/商品..."; 28 | [self.tableView addSubview:self.searchBar]; 29 | } 30 | 31 | - (void)scrollViewDidScroll:(UIScrollView *)scrollView { 32 | [self.searchBar resignFirstResponder]; 33 | } 34 | 35 | - (void)didReceiveMemoryWarning { 36 | [super didReceiveMemoryWarning]; 37 | // Dispose of any resources that can be recreated. 38 | } 39 | 40 | #pragma mark - Table view data source 41 | 42 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 43 | return 0; 44 | } 45 | 46 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 47 | return 0; 48 | } 49 | 50 | /* 51 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 52 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:<#@"reuseIdentifier"#> forIndexPath:indexPath]; 53 | 54 | // Configure the cell... 55 | 56 | return cell; 57 | } 58 | */ 59 | 60 | /* 61 | // Override to support conditional editing of the table view. 62 | - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 63 | // Return NO if you do not want the specified item to be editable. 64 | return YES; 65 | } 66 | */ 67 | 68 | /* 69 | // Override to support editing the table view. 70 | - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 71 | if (editingStyle == UITableViewCellEditingStyleDelete) { 72 | // Delete the row from the data source 73 | [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 74 | } else if (editingStyle == UITableViewCellEditingStyleInsert) { 75 | // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 76 | } 77 | } 78 | */ 79 | 80 | /* 81 | // Override to support rearranging the table view. 82 | - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 83 | } 84 | */ 85 | 86 | /* 87 | // Override to support conditional rearranging of the table view. 88 | - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 89 | // Return NO if you do not want the item to be re-orderable. 90 | return YES; 91 | } 92 | */ 93 | 94 | /* 95 | #pragma mark - Navigation 96 | 97 | // In a storyboard-based application, you will often want to do a little preparation before navigation 98 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 99 | // Get the new view controller using [segue destinationViewController]. 100 | // Pass the selected object to the new view controller. 101 | } 102 | */ 103 | 104 | @end 105 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/TabBarVC/PSTabBarController.h: -------------------------------------------------------------------------------- 1 | // 2 | // PSTabBarController.h 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface PSTabBarController : UITabBarController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/TabBarVC/PSTabBarController.m: -------------------------------------------------------------------------------- 1 | // 2 | // PSTabBarController.m 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import "PSTabBarController.h" 10 | #import "MessageViewController.h" 11 | #import "ContactsViewController.h" 12 | #import "NewsViewController.h" 13 | #import "PSDrawerManager.h" 14 | 15 | #define Class(className) NSClassFromString(@#className) 16 | 17 | @interface PSTabBarController () 18 | 19 | @end 20 | 21 | @implementation PSTabBarController 22 | 23 | - (void)viewDidLoad { 24 | [super viewDidLoad]; 25 | // Do any additional setup after loading the view. 26 | 27 | self.view.backgroundColor = [UIColor whiteColor]; 28 | 29 | self.delegate = self; 30 | 31 | [self addChildVCWithClass:Class(MessageViewController) title:@"消息" imageName:@"tab_recent_nor"]; 32 | [self addChildVCWithClass:Class(ContactsViewController) title:@"联系人" imageName:@"tab_buddy_nor"]; 33 | [self addChildVCWithClass:Class(NewsViewController) title:@"动态" imageName:@"tab_qworld_nor"]; 34 | } 35 | 36 | /** 添加自控制器 37 | * @param class: 控制器类 38 | * @param title: tabBarItem.title 39 | * @param imageName: tabBarItem.image 40 | */ 41 | - (void)addChildVCWithClass:(Class)class title:(NSString *)title imageName:(NSString *)imageName { 42 | UIViewController *viewController = [[class alloc] init]; 43 | 44 | UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; 45 | navigationController.tabBarItem.title = title; 46 | navigationController.tabBarItem.image = [UIImage imageNamed:imageName]; 47 | [self addChildViewController:navigationController]; 48 | } 49 | 50 | #pragma mark - 51 | #pragma mark - UITabBarController protocol methods 52 | - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { 53 | if ([viewController isKindOfClass:[UINavigationController class]]) { 54 | 55 | UINavigationController *navigationController = (UINavigationController *)viewController; 56 | UIViewController *_viewController = navigationController.viewControllers.firstObject; 57 | 58 | // 如果选中消息页,响应拖拽手势,可以显示侧边栏 59 | // 否则取消手势响应,不能显示侧边栏 60 | if ([_viewController isKindOfClass:[MessageViewController class]]) { 61 | [[PSDrawerManager instance] beginDragResponse]; 62 | } else { 63 | [[PSDrawerManager instance] cancelDragResponse]; 64 | } 65 | } 66 | } 67 | 68 | 69 | @end 70 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. 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 | // Do any additional setup after loading the view, typically from a nib. 20 | } 21 | 22 | - (void)didReceiveMemoryWarning { 23 | [super didReceiveMemoryWarning]; 24 | // Dispose of any resources that can be recreated. 25 | } 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/lib/PSDrawerManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // PSDrawerManager.h 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | typedef NS_ENUM(NSUInteger, PSDrawerManagerShowType) { 13 | PSDrawerManagerShowLeft = 0, // 动画显示 14 | PSDrawerManagerShowCenter = 1, 15 | PSDrawerManagerShowLeftWithoutAnimation = 2, // 不带有动画显示 16 | PSDrawerManagerShowCenterWithoutAnimation = 3, 17 | }; 18 | 19 | // 侧边栏显示整个屏幕的宽度比 20 | static CGFloat const kLeftWidthScale = 0.75; 21 | 22 | @interface PSDrawerManager : NSObject 23 | 24 | /// 单例 25 | + (instancetype)instance; 26 | 27 | /** 设置中心控制器及左侧视图 28 | * @param centerViewController: 中心控制器 29 | * @param leftView: 左侧视图 30 | */ 31 | - (void)installCenterViewController:(UIViewController *)centerViewController leftView:(UIView *)leftView; 32 | 33 | // 隐藏侧边阴影 34 | - (void)hiddenShadow; 35 | 36 | // 显示侧边阴影 37 | - (void)showShadow; 38 | 39 | // 开启拖拽响应 40 | - (void)beginDragResponse; 41 | 42 | // 取消拖拽响应 43 | - (void)cancelDragResponse; 44 | 45 | /** 设置显示状态 46 | * @param showType: 枚举类型 PSDrawerManagerShowType 47 | */ 48 | - (void)resetShowType:(PSDrawerManagerShowType)showType; 49 | 50 | @property (nonatomic, weak, readonly) UIViewController *centerViewController; 51 | 52 | @property (nonatomic, weak, readonly) UIView *leftView; 53 | 54 | 55 | @end 56 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/lib/PSDrawerManager.m: -------------------------------------------------------------------------------- 1 | // 2 | // PSDrawerManager.m 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import "PSDrawerManager.h" 10 | #import "UIView+leoAdd.h" 11 | 12 | #define kAppDelegate [[UIApplication sharedApplication] delegate] 13 | #define kScreenWidth [UIScreen mainScreen].bounds.size.width 14 | 15 | @interface PSDrawerManager () 16 | 17 | @property (nonatomic, weak, readwrite) UIViewController *centerViewController; 18 | @property (nonatomic, weak, readwrite) UIView *leftView; 19 | @property (nonatomic, strong) UIPanGestureRecognizer *pan; 20 | 21 | @end 22 | 23 | @implementation PSDrawerManager 24 | 25 | + (instancetype)instance { 26 | static PSDrawerManager *manager = nil; 27 | static dispatch_once_t onceToken; 28 | dispatch_once(&onceToken, ^{ 29 | manager = [[PSDrawerManager alloc] init]; 30 | }); 31 | return manager; 32 | } 33 | 34 | #pragma mark - 35 | #pragma mark - external methods 36 | - (void)installCenterViewController:(UIViewController *)centerViewController leftView:(UIView *)leftView { 37 | self.centerViewController = centerViewController; 38 | self.leftView = leftView; 39 | 40 | [kAppDelegate window].rootViewController = self.centerViewController; 41 | [[kAppDelegate window] addSubview:leftView]; 42 | 43 | [self showShadow]; 44 | 45 | [self.centerViewController.view addGestureRecognizer:self.pan]; 46 | } 47 | 48 | - (void)hiddenShadow { 49 | if (!self.centerViewController.view) { return; } 50 | self.centerViewController.view.layer.shadowColor = [UIColor whiteColor].CGColor; 51 | self.centerViewController.view.layer.shadowOffset = CGSizeMake(0, 0); 52 | self.centerViewController.view.layer.shadowOpacity = 0; 53 | self.centerViewController.view.layer.shadowRadius = 0; 54 | } 55 | 56 | - (void)showShadow { 57 | if (!self.centerViewController.view) { return; } 58 | self.centerViewController.view.layer.shadowColor = [UIColor blackColor].CGColor; 59 | self.centerViewController.view.layer.shadowOffset = CGSizeMake(6, 6); 60 | self.centerViewController.view.layer.shadowOpacity = 0.7; 61 | self.centerViewController.view.layer.shadowRadius = 6.f; 62 | } 63 | 64 | - (void)beginDragResponse { 65 | if (!self.centerViewController.view) { return; } 66 | [self.centerViewController.view addGestureRecognizer:self.pan]; 67 | } 68 | 69 | - (void)cancelDragResponse { 70 | if (!self.centerViewController.view) { return; } 71 | [self.centerViewController.view removeGestureRecognizer:self.pan]; 72 | } 73 | 74 | - (void)resetShowType:(PSDrawerManagerShowType)showType { 75 | if (!self.centerViewController.view) { return; } 76 | 77 | CGAffineTransform rightScopeTransform = CGAffineTransformTranslate([kAppDelegate window].transform, kScreenWidth * kLeftWidthScale, 0); 78 | 79 | switch (showType) { 80 | case PSDrawerManagerShowLeft: { 81 | [UIView animateWithDuration:0.2f animations:^{ 82 | self.centerViewController.view.transform = rightScopeTransform; 83 | [kAppDelegate window].subviews.firstObject.tx = self.centerViewController.view.tx / 3; 84 | }]; 85 | break; 86 | } 87 | case PSDrawerManagerShowCenter: { 88 | [UIView animateWithDuration:0.2f animations:^{ 89 | self.centerViewController.view.transform = CGAffineTransformIdentity; 90 | [kAppDelegate window].subviews.firstObject.tx = self.centerViewController.view.tx / 3; 91 | }]; 92 | break; 93 | } 94 | case PSDrawerManagerShowLeftWithoutAnimation: { 95 | self.centerViewController.view.transform = rightScopeTransform; 96 | [kAppDelegate window].subviews.firstObject.tx = self.centerViewController.view.tx / 3; 97 | break; 98 | } 99 | case PSDrawerManagerShowCenterWithoutAnimation: { 100 | self.centerViewController.view.transform = CGAffineTransformIdentity; 101 | [kAppDelegate window].subviews.firstObject.tx = self.centerViewController.view.tx / 3; 102 | break; 103 | } 104 | } 105 | } 106 | 107 | #pragma mark - 108 | #pragma mark - getter methods 109 | - (UIPanGestureRecognizer *)pan { 110 | if (!_pan) { 111 | _pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanAction:)]; 112 | } 113 | return _pan; 114 | } 115 | 116 | #pragma mark - 117 | #pragma mark - privite methods 118 | //- (void)handlePanAction:(UIScreenEdgePanGestureRecognizer *)sender { 119 | - (void)handlePanAction:(UIPanGestureRecognizer *)sender { 120 | /** 注: 121 | * [kAppDelegate window].subviews.firstObject.tx = sender.view.tx / 3; 122 | * sender.view.tx / 3 的原因是要让中心控制器每向右移动一像素,左侧视图就向右移动 1/3 像素 123 | * 另外在初始化左侧视图的时候将其 frame.origin.x 设置为 -kScreenWidth * (1 - kLeftWidthScale), 这样将 tx / 3 就会刚好在左侧视图刚好展示完成时保证左侧视图的 origin.x与屏幕左侧边缘重合 124 | */ 125 | // 1. 获取手指拖拽的时候,平移的值 126 | CGPoint translation = [sender translationInView:sender.view]; 127 | // 2. 让当前视图进行平移 128 | sender.view.transform = CGAffineTransformTranslate(sender.view.transform, translation.x, 0); 129 | [kAppDelegate window].subviews.firstObject.tx = sender.view.tx / 3; 130 | // 3. 让平移的值不要累加 131 | [sender setTranslation:CGPointZero inView:sender.view]; 132 | // 4. 获取最右边的范围 133 | CGAffineTransform rightScopeTransform = CGAffineTransformTranslate([kAppDelegate window].transform, kScreenWidth * kLeftWidthScale, 0); 134 | 135 | if (sender.view.tx > rightScopeTransform.tx) { 136 | // 当移动到右边极限时 137 | // 限制最右边的范围 138 | sender.view.transform = rightScopeTransform; 139 | [kAppDelegate window].subviews.firstObject.tx = sender.view.tx / 3; 140 | } else if (sender.view.tx < 0.0) { 141 | // 限制最左边的范围 142 | sender.view.transform = CGAffineTransformTranslate([kAppDelegate window].transform, 0, 0); 143 | [kAppDelegate window].subviews.firstObject.tx = sender.view.tx / 3; 144 | } 145 | 146 | // 拖拽结束时 147 | if (sender.state == UIGestureRecognizerStateEnded) { 148 | [UIView animateWithDuration:0.2f animations:^{ 149 | if (sender.view.left > kScreenWidth * 0.5) { 150 | sender.view.transform = rightScopeTransform; 151 | [kAppDelegate window].subviews.firstObject.tx = sender.view.tx / 3; 152 | } else { 153 | sender.view.transform = CGAffineTransformIdentity; 154 | [kAppDelegate window].subviews.firstObject.tx = sender.view.tx / 3; 155 | } 156 | }]; 157 | } 158 | } 159 | 160 | @end 161 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/lib/UIView+leoAdd.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+PSFrame.h 3 | // PSRefresh 4 | // 5 | // Created by 雷亮 on 16/7/9. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UIView (leoAdd) 12 | 13 | @property (nonatomic, assign) CGFloat top; 14 | 15 | @property (nonatomic, assign) CGFloat bottom; 16 | 17 | @property (nonatomic, assign) CGFloat left; 18 | 19 | @property (nonatomic, assign) CGFloat right; 20 | 21 | @property (nonatomic, assign) CGFloat width; 22 | 23 | @property (nonatomic, assign) CGFloat height; 24 | 25 | @property (nonatomic, assign) CGFloat centerX; 26 | 27 | @property (nonatomic, assign) CGFloat centerY; 28 | 29 | @property (nonatomic, assign) CGSize size; 30 | 31 | @property (nonatomic, assign) CGPoint origin; 32 | 33 | @property (nonatomic, assign) CGFloat tx; 34 | 35 | @property (nonatomic, assign) CGFloat ty; 36 | 37 | @end 38 | 39 | @interface UIView (FindViewController) 40 | 41 | - (nullable UIViewController *)viewController; 42 | 43 | @end -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/lib/UIView+leoAdd.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+PSFrame.m 3 | // PSRefresh 4 | // 5 | // Created by 雷亮 on 16/7/9. 6 | // Copyright © 2016年 Leiliang. All rights reserved. 7 | // 8 | 9 | #import "UIView+leoAdd.h" 10 | 11 | @implementation UIView (leoAdd) 12 | 13 | - (void)setTop:(CGFloat)t { 14 | self.frame = CGRectMake(self.left, t, self.width, self.height); 15 | } 16 | 17 | - (CGFloat)top { 18 | return self.frame.origin.y; 19 | } 20 | 21 | - (void)setBottom:(CGFloat)b { 22 | self.frame = CGRectMake(self.left, b - self.height, self.width, self.height); 23 | } 24 | 25 | - (CGFloat)bottom { 26 | return self.frame.origin.y + self.frame.size.height; 27 | } 28 | 29 | - (void)setLeft:(CGFloat)l { 30 | self.frame = CGRectMake(l, self.top, self.width, self.height); 31 | } 32 | 33 | - (CGFloat)left { 34 | return self.frame.origin.x; 35 | } 36 | 37 | - (void)setRight:(CGFloat)r { 38 | self.frame = CGRectMake(r - self.width, self.top, self.width, self.height); 39 | } 40 | 41 | - (CGFloat)right { 42 | return self.frame.origin.x + self.frame.size.width; 43 | } 44 | 45 | - (void)setWidth:(CGFloat)w { 46 | self.frame = CGRectMake(self.left, self.top, w, self.height); 47 | } 48 | 49 | - (CGFloat)width { 50 | return self.frame.size.width; 51 | } 52 | 53 | - (void)setHeight:(CGFloat)h { 54 | self.frame = CGRectMake(self.left, self.top, self.width, h); 55 | } 56 | 57 | - (CGFloat)height { 58 | return self.frame.size.height; 59 | } 60 | 61 | - (CGFloat)centerX { 62 | return self.center.x; 63 | } 64 | 65 | - (void)setCenterX:(CGFloat)centerX { 66 | self.center = CGPointMake(centerX, self.center.y); 67 | } 68 | 69 | - (CGFloat)centerY { 70 | return self.center.y; 71 | } 72 | 73 | - (void)setCenterY:(CGFloat)centerY { 74 | self.center = CGPointMake(self.center.x, centerY); 75 | } 76 | 77 | - (CGSize)size { 78 | return self.frame.size; 79 | } 80 | 81 | - (void)setSize:(CGSize)size { 82 | self.frame = CGRectMake(self.left, self.top, size.width, size.height); 83 | } 84 | 85 | - (CGPoint)origin { 86 | return self.frame.origin; 87 | } 88 | 89 | - (void)setOrigin:(CGPoint)origin { 90 | self.frame = CGRectMake(origin.x, origin.y, self.width, self.height); 91 | } 92 | 93 | - (CGFloat)tx { 94 | return self.transform.tx; 95 | } 96 | 97 | - (void)setTx:(CGFloat)tx { 98 | CGAffineTransform transform = self.transform; 99 | transform.tx = tx; 100 | self.transform = transform; 101 | } 102 | 103 | - (CGFloat)ty { 104 | return self.transform.ty; 105 | } 106 | 107 | - (void)setTy:(CGFloat)ty { 108 | CGAffineTransform transform = self.transform; 109 | transform.ty = ty; 110 | self.transform = transform; 111 | } 112 | 113 | @end 114 | 115 | @implementation UIView (FindViewController) 116 | 117 | - (nullable UIViewController *)viewController { 118 | UIResponder *responder = self; 119 | while ((responder = [responder nextResponder])) 120 | if ([responder isKindOfClass: [UIViewController class]]) { 121 | return (UIViewController *)responder; 122 | } 123 | return nil; 124 | } 125 | 126 | @end 127 | -------------------------------------------------------------------------------- /PSDrawerController/PSDrawerController/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // PSDrawerController 4 | // 5 | // Created by 雷亮 on 16/8/8. 6 | // Copyright © 2016年 Leiliang. 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 | -------------------------------------------------------------------------------- /PSDrawerManager.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PipeDog/PSDrawerManager/b58ec3d6ae6a11ce221c766268bcfcb17f7cfdf0/PSDrawerManager.gif -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PSDrawerManager 2 | 3 | 请大家移步到PipeDog,目前这里已经放弃维护,之前代码风格不够统一,且没有考虑到可扩展性及可维护性, 4 | PipeDog地址(所有PD开头的库都是之后长期进行维护的):[https://github.com/PipeDog](https://github.com/PipeDog) 5 | 6 | 另附上PSDrawerManager的替代库,**PDDrawerViewController**,[https://github.com/PipeDog/PDDrawerViewController](https://github.com/PipeDog/PDDrawerViewController) 7 | 8 | 9 | 效果展示: 10 | 11 | ![PSDrawerManager.gif](PSDrawerManager.gif) 12 | 13 | --------------------------------------------------------------------------------