├── LTDataStatus.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcuserdata │ └── Jonny.xcuserdatad │ └── xcschemes │ ├── LTDataStatus.xcscheme │ └── xcschememanagement.plist ├── LTDataStatus ├── AppDelegate.h ├── AppDelegate.m ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Category │ ├── UIImage+Gif.h │ ├── UIImage+Gif.m │ ├── UIViewController+HUD.h │ └── UIViewController+HUD.m ├── Info.plist ├── ViewController.h ├── ViewController.m ├── gif.gif ├── main.m └── no_data.jpg └── README.md /LTDataStatus.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | FBB27F8B1DCC1DD000C15554 /* gif.gif in Resources */ = {isa = PBXBuildFile; fileRef = FBB27F8A1DCC1DD000C15554 /* gif.gif */; }; 11 | FBDFC24B1DB859A800173221 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDFC24A1DB859A800173221 /* main.m */; }; 12 | FBDFC24E1DB859A800173221 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDFC24D1DB859A800173221 /* AppDelegate.m */; }; 13 | FBDFC2511DB859A800173221 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDFC2501DB859A800173221 /* ViewController.m */; }; 14 | FBDFC2541DB859A800173221 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FBDFC2521DB859A800173221 /* Main.storyboard */; }; 15 | FBDFC2561DB859A800173221 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FBDFC2551DB859A800173221 /* Assets.xcassets */; }; 16 | FBDFC2591DB859A800173221 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FBDFC2571DB859A800173221 /* LaunchScreen.storyboard */; }; 17 | FBDFC26B1DB85A2D00173221 /* UIImage+Gif.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDFC2681DB85A2D00173221 /* UIImage+Gif.m */; }; 18 | FBDFC26C1DB85A2D00173221 /* UIViewController+HUD.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDFC26A1DB85A2D00173221 /* UIViewController+HUD.m */; }; 19 | FBDFC2721DB85F1B00173221 /* no_data.jpg in Resources */ = {isa = PBXBuildFile; fileRef = FBDFC2711DB85F1B00173221 /* no_data.jpg */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXFileReference section */ 23 | FBB27F8A1DCC1DD000C15554 /* gif.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = gif.gif; sourceTree = ""; }; 24 | FBDFC2461DB859A800173221 /* LTDataStatus.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LTDataStatus.app; sourceTree = BUILT_PRODUCTS_DIR; }; 25 | FBDFC24A1DB859A800173221 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 26 | FBDFC24C1DB859A800173221 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 27 | FBDFC24D1DB859A800173221 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 28 | FBDFC24F1DB859A800173221 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 29 | FBDFC2501DB859A800173221 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 30 | FBDFC2531DB859A800173221 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 31 | FBDFC2551DB859A800173221 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 32 | FBDFC2581DB859A800173221 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 33 | FBDFC25A1DB859A800173221 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 34 | FBDFC2671DB85A2D00173221 /* UIImage+Gif.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+Gif.h"; sourceTree = ""; }; 35 | FBDFC2681DB85A2D00173221 /* UIImage+Gif.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+Gif.m"; sourceTree = ""; }; 36 | FBDFC2691DB85A2D00173221 /* UIViewController+HUD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+HUD.h"; sourceTree = ""; }; 37 | FBDFC26A1DB85A2D00173221 /* UIViewController+HUD.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+HUD.m"; sourceTree = ""; }; 38 | FBDFC2711DB85F1B00173221 /* no_data.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = no_data.jpg; sourceTree = ""; }; 39 | /* End PBXFileReference section */ 40 | 41 | /* Begin PBXFrameworksBuildPhase section */ 42 | FBDFC2431DB859A800173221 /* Frameworks */ = { 43 | isa = PBXFrameworksBuildPhase; 44 | buildActionMask = 2147483647; 45 | files = ( 46 | ); 47 | runOnlyForDeploymentPostprocessing = 0; 48 | }; 49 | /* End PBXFrameworksBuildPhase section */ 50 | 51 | /* Begin PBXGroup section */ 52 | FBDFC23D1DB859A800173221 = { 53 | isa = PBXGroup; 54 | children = ( 55 | FBDFC2481DB859A800173221 /* LTDataStatus */, 56 | FBDFC2471DB859A800173221 /* Products */, 57 | ); 58 | sourceTree = ""; 59 | }; 60 | FBDFC2471DB859A800173221 /* Products */ = { 61 | isa = PBXGroup; 62 | children = ( 63 | FBDFC2461DB859A800173221 /* LTDataStatus.app */, 64 | ); 65 | name = Products; 66 | sourceTree = ""; 67 | }; 68 | FBDFC2481DB859A800173221 /* LTDataStatus */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | FBDFC2661DB85A2D00173221 /* Category */, 72 | FBDFC24C1DB859A800173221 /* AppDelegate.h */, 73 | FBDFC24D1DB859A800173221 /* AppDelegate.m */, 74 | FBDFC2711DB85F1B00173221 /* no_data.jpg */, 75 | FBB27F8A1DCC1DD000C15554 /* gif.gif */, 76 | FBDFC24F1DB859A800173221 /* ViewController.h */, 77 | FBDFC2501DB859A800173221 /* ViewController.m */, 78 | FBDFC2521DB859A800173221 /* Main.storyboard */, 79 | FBDFC2551DB859A800173221 /* Assets.xcassets */, 80 | FBDFC2571DB859A800173221 /* LaunchScreen.storyboard */, 81 | FBDFC25A1DB859A800173221 /* Info.plist */, 82 | FBDFC2491DB859A800173221 /* Supporting Files */, 83 | ); 84 | path = LTDataStatus; 85 | sourceTree = ""; 86 | }; 87 | FBDFC2491DB859A800173221 /* Supporting Files */ = { 88 | isa = PBXGroup; 89 | children = ( 90 | FBDFC24A1DB859A800173221 /* main.m */, 91 | ); 92 | name = "Supporting Files"; 93 | sourceTree = ""; 94 | }; 95 | FBDFC2661DB85A2D00173221 /* Category */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | FBDFC2671DB85A2D00173221 /* UIImage+Gif.h */, 99 | FBDFC2681DB85A2D00173221 /* UIImage+Gif.m */, 100 | FBDFC2691DB85A2D00173221 /* UIViewController+HUD.h */, 101 | FBDFC26A1DB85A2D00173221 /* UIViewController+HUD.m */, 102 | ); 103 | path = Category; 104 | sourceTree = ""; 105 | }; 106 | /* End PBXGroup section */ 107 | 108 | /* Begin PBXNativeTarget section */ 109 | FBDFC2451DB859A800173221 /* LTDataStatus */ = { 110 | isa = PBXNativeTarget; 111 | buildConfigurationList = FBDFC25D1DB859A800173221 /* Build configuration list for PBXNativeTarget "LTDataStatus" */; 112 | buildPhases = ( 113 | FBDFC2421DB859A800173221 /* Sources */, 114 | FBDFC2431DB859A800173221 /* Frameworks */, 115 | FBDFC2441DB859A800173221 /* Resources */, 116 | ); 117 | buildRules = ( 118 | ); 119 | dependencies = ( 120 | ); 121 | name = LTDataStatus; 122 | productName = LTDataStatus; 123 | productReference = FBDFC2461DB859A800173221 /* LTDataStatus.app */; 124 | productType = "com.apple.product-type.application"; 125 | }; 126 | /* End PBXNativeTarget section */ 127 | 128 | /* Begin PBXProject section */ 129 | FBDFC23E1DB859A800173221 /* Project object */ = { 130 | isa = PBXProject; 131 | attributes = { 132 | LastUpgradeCheck = 0800; 133 | ORGANIZATIONNAME = Jonny; 134 | TargetAttributes = { 135 | FBDFC2451DB859A800173221 = { 136 | CreatedOnToolsVersion = 8.0; 137 | DevelopmentTeam = 5PPD73Z536; 138 | ProvisioningStyle = Automatic; 139 | }; 140 | }; 141 | }; 142 | buildConfigurationList = FBDFC2411DB859A800173221 /* Build configuration list for PBXProject "LTDataStatus" */; 143 | compatibilityVersion = "Xcode 3.2"; 144 | developmentRegion = English; 145 | hasScannedForEncodings = 0; 146 | knownRegions = ( 147 | en, 148 | Base, 149 | ); 150 | mainGroup = FBDFC23D1DB859A800173221; 151 | productRefGroup = FBDFC2471DB859A800173221 /* Products */; 152 | projectDirPath = ""; 153 | projectRoot = ""; 154 | targets = ( 155 | FBDFC2451DB859A800173221 /* LTDataStatus */, 156 | ); 157 | }; 158 | /* End PBXProject section */ 159 | 160 | /* Begin PBXResourcesBuildPhase section */ 161 | FBDFC2441DB859A800173221 /* Resources */ = { 162 | isa = PBXResourcesBuildPhase; 163 | buildActionMask = 2147483647; 164 | files = ( 165 | FBDFC2591DB859A800173221 /* LaunchScreen.storyboard in Resources */, 166 | FBDFC2721DB85F1B00173221 /* no_data.jpg in Resources */, 167 | FBDFC2561DB859A800173221 /* Assets.xcassets in Resources */, 168 | FBDFC2541DB859A800173221 /* Main.storyboard in Resources */, 169 | FBB27F8B1DCC1DD000C15554 /* gif.gif in Resources */, 170 | ); 171 | runOnlyForDeploymentPostprocessing = 0; 172 | }; 173 | /* End PBXResourcesBuildPhase section */ 174 | 175 | /* Begin PBXSourcesBuildPhase section */ 176 | FBDFC2421DB859A800173221 /* Sources */ = { 177 | isa = PBXSourcesBuildPhase; 178 | buildActionMask = 2147483647; 179 | files = ( 180 | FBDFC26B1DB85A2D00173221 /* UIImage+Gif.m in Sources */, 181 | FBDFC2511DB859A800173221 /* ViewController.m in Sources */, 182 | FBDFC24E1DB859A800173221 /* AppDelegate.m in Sources */, 183 | FBDFC26C1DB85A2D00173221 /* UIViewController+HUD.m in Sources */, 184 | FBDFC24B1DB859A800173221 /* main.m in Sources */, 185 | ); 186 | runOnlyForDeploymentPostprocessing = 0; 187 | }; 188 | /* End PBXSourcesBuildPhase section */ 189 | 190 | /* Begin PBXVariantGroup section */ 191 | FBDFC2521DB859A800173221 /* Main.storyboard */ = { 192 | isa = PBXVariantGroup; 193 | children = ( 194 | FBDFC2531DB859A800173221 /* Base */, 195 | ); 196 | name = Main.storyboard; 197 | sourceTree = ""; 198 | }; 199 | FBDFC2571DB859A800173221 /* LaunchScreen.storyboard */ = { 200 | isa = PBXVariantGroup; 201 | children = ( 202 | FBDFC2581DB859A800173221 /* Base */, 203 | ); 204 | name = LaunchScreen.storyboard; 205 | sourceTree = ""; 206 | }; 207 | /* End PBXVariantGroup section */ 208 | 209 | /* Begin XCBuildConfiguration section */ 210 | FBDFC25B1DB859A800173221 /* Debug */ = { 211 | isa = XCBuildConfiguration; 212 | buildSettings = { 213 | ALWAYS_SEARCH_USER_PATHS = NO; 214 | CLANG_ANALYZER_NONNULL = YES; 215 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 216 | CLANG_CXX_LIBRARY = "libc++"; 217 | CLANG_ENABLE_MODULES = YES; 218 | CLANG_ENABLE_OBJC_ARC = YES; 219 | CLANG_WARN_BOOL_CONVERSION = YES; 220 | CLANG_WARN_CONSTANT_CONVERSION = YES; 221 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 222 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 223 | CLANG_WARN_EMPTY_BODY = YES; 224 | CLANG_WARN_ENUM_CONVERSION = YES; 225 | CLANG_WARN_INFINITE_RECURSION = YES; 226 | CLANG_WARN_INT_CONVERSION = YES; 227 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 228 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 229 | CLANG_WARN_UNREACHABLE_CODE = YES; 230 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 231 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 232 | COPY_PHASE_STRIP = NO; 233 | DEBUG_INFORMATION_FORMAT = dwarf; 234 | ENABLE_STRICT_OBJC_MSGSEND = YES; 235 | ENABLE_TESTABILITY = YES; 236 | GCC_C_LANGUAGE_STANDARD = gnu99; 237 | GCC_DYNAMIC_NO_PIC = NO; 238 | GCC_NO_COMMON_BLOCKS = YES; 239 | GCC_OPTIMIZATION_LEVEL = 0; 240 | GCC_PREPROCESSOR_DEFINITIONS = ( 241 | "DEBUG=1", 242 | "$(inherited)", 243 | ); 244 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 245 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 246 | GCC_WARN_UNDECLARED_SELECTOR = YES; 247 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 248 | GCC_WARN_UNUSED_FUNCTION = YES; 249 | GCC_WARN_UNUSED_VARIABLE = YES; 250 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 251 | MTL_ENABLE_DEBUG_INFO = YES; 252 | ONLY_ACTIVE_ARCH = YES; 253 | SDKROOT = iphoneos; 254 | TARGETED_DEVICE_FAMILY = "1,2"; 255 | }; 256 | name = Debug; 257 | }; 258 | FBDFC25C1DB859A800173221 /* Release */ = { 259 | isa = XCBuildConfiguration; 260 | buildSettings = { 261 | ALWAYS_SEARCH_USER_PATHS = NO; 262 | CLANG_ANALYZER_NONNULL = YES; 263 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 264 | CLANG_CXX_LIBRARY = "libc++"; 265 | CLANG_ENABLE_MODULES = YES; 266 | CLANG_ENABLE_OBJC_ARC = YES; 267 | CLANG_WARN_BOOL_CONVERSION = YES; 268 | CLANG_WARN_CONSTANT_CONVERSION = YES; 269 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 270 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 271 | CLANG_WARN_EMPTY_BODY = YES; 272 | CLANG_WARN_ENUM_CONVERSION = YES; 273 | CLANG_WARN_INFINITE_RECURSION = YES; 274 | CLANG_WARN_INT_CONVERSION = YES; 275 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 276 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 277 | CLANG_WARN_UNREACHABLE_CODE = YES; 278 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 279 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 280 | COPY_PHASE_STRIP = NO; 281 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 282 | ENABLE_NS_ASSERTIONS = NO; 283 | ENABLE_STRICT_OBJC_MSGSEND = YES; 284 | GCC_C_LANGUAGE_STANDARD = gnu99; 285 | GCC_NO_COMMON_BLOCKS = YES; 286 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 287 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 288 | GCC_WARN_UNDECLARED_SELECTOR = YES; 289 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 290 | GCC_WARN_UNUSED_FUNCTION = YES; 291 | GCC_WARN_UNUSED_VARIABLE = YES; 292 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 293 | MTL_ENABLE_DEBUG_INFO = NO; 294 | SDKROOT = iphoneos; 295 | TARGETED_DEVICE_FAMILY = "1,2"; 296 | VALIDATE_PRODUCT = YES; 297 | }; 298 | name = Release; 299 | }; 300 | FBDFC25E1DB859A800173221 /* Debug */ = { 301 | isa = XCBuildConfiguration; 302 | buildSettings = { 303 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 304 | DEVELOPMENT_TEAM = 5PPD73Z536; 305 | INFOPLIST_FILE = LTDataStatus/Info.plist; 306 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 307 | PRODUCT_BUNDLE_IDENTIFIER = Jonny.LTDataStatus; 308 | PRODUCT_NAME = "$(TARGET_NAME)"; 309 | }; 310 | name = Debug; 311 | }; 312 | FBDFC25F1DB859A800173221 /* Release */ = { 313 | isa = XCBuildConfiguration; 314 | buildSettings = { 315 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 316 | DEVELOPMENT_TEAM = 5PPD73Z536; 317 | INFOPLIST_FILE = LTDataStatus/Info.plist; 318 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 319 | PRODUCT_BUNDLE_IDENTIFIER = Jonny.LTDataStatus; 320 | PRODUCT_NAME = "$(TARGET_NAME)"; 321 | }; 322 | name = Release; 323 | }; 324 | /* End XCBuildConfiguration section */ 325 | 326 | /* Begin XCConfigurationList section */ 327 | FBDFC2411DB859A800173221 /* Build configuration list for PBXProject "LTDataStatus" */ = { 328 | isa = XCConfigurationList; 329 | buildConfigurations = ( 330 | FBDFC25B1DB859A800173221 /* Debug */, 331 | FBDFC25C1DB859A800173221 /* Release */, 332 | ); 333 | defaultConfigurationIsVisible = 0; 334 | defaultConfigurationName = Release; 335 | }; 336 | FBDFC25D1DB859A800173221 /* Build configuration list for PBXNativeTarget "LTDataStatus" */ = { 337 | isa = XCConfigurationList; 338 | buildConfigurations = ( 339 | FBDFC25E1DB859A800173221 /* Debug */, 340 | FBDFC25F1DB859A800173221 /* Release */, 341 | ); 342 | defaultConfigurationIsVisible = 0; 343 | defaultConfigurationName = Release; 344 | }; 345 | /* End XCConfigurationList section */ 346 | }; 347 | rootObject = FBDFC23E1DB859A800173221 /* Project object */; 348 | } 349 | -------------------------------------------------------------------------------- /LTDataStatus.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /LTDataStatus.xcodeproj/xcuserdata/Jonny.xcuserdatad/xcschemes/LTDataStatus.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 | -------------------------------------------------------------------------------- /LTDataStatus.xcodeproj/xcuserdata/Jonny.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | LTDataStatus.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | FBDFC2451DB859A800173221 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /LTDataStatus/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // LTDataStatus 4 | // 5 | // Created by Jonny on 2016/10/20. 6 | // Copyright © 2016年 Jonny. 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 | -------------------------------------------------------------------------------- /LTDataStatus/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // LTDataStatus 4 | // 5 | // Created by Jonny on 2016/10/20. 6 | // Copyright © 2016年 Jonny. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | // Override point for customization after application launch. 20 | return YES; 21 | } 22 | 23 | - (void)applicationWillResignActive:(UIApplication *)application { 24 | // 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. 25 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 26 | } 27 | 28 | 29 | - (void)applicationDidEnterBackground:(UIApplication *)application { 30 | // 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. 31 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 32 | } 33 | 34 | 35 | - (void)applicationWillEnterForeground:(UIApplication *)application { 36 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 37 | } 38 | 39 | 40 | - (void)applicationDidBecomeActive:(UIApplication *)application { 41 | // 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. 42 | } 43 | 44 | 45 | - (void)applicationWillTerminate:(UIApplication *)application { 46 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 47 | } 48 | 49 | 50 | @end 51 | -------------------------------------------------------------------------------- /LTDataStatus/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 | } -------------------------------------------------------------------------------- /LTDataStatus/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 | -------------------------------------------------------------------------------- /LTDataStatus/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 | -------------------------------------------------------------------------------- /LTDataStatus/Category/UIImage+Gif.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIImage+Gif.h 3 | // LTProject 4 | // 5 | // Created by Jonny on 2016/10/19. 6 | // Copyright © 2016年 ZUBMO. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UIImage (Gif) 12 | 13 | // 加载Gif 14 | + (UIImage *)sd_animatedGIFWithData:(NSData *)data; 15 | 16 | + (UIImage *)sd_animatedGIFNamed:(NSString *)name; 17 | @end 18 | -------------------------------------------------------------------------------- /LTDataStatus/Category/UIImage+Gif.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIImage+Gif.m 3 | // LTProject 4 | // 5 | // Created by Jonny on 2016/10/19. 6 | // Copyright © 2016年 ZUBMO. All rights reserved. 7 | // 8 | 9 | #import "UIImage+Gif.h" 10 | #import 11 | 12 | @implementation UIImage (Gif) 13 | 14 | + (UIImage *)sd_animatedGIFWithData:(NSData *)data { 15 | if (!data) { 16 | return nil; 17 | } 18 | 19 | CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL); 20 | 21 | size_t count = CGImageSourceGetCount(source); 22 | 23 | UIImage *animatedImage; 24 | 25 | if (count <= 1) { 26 | animatedImage = [[UIImage alloc] initWithData:data]; 27 | } 28 | else { 29 | NSMutableArray *images = [NSMutableArray array]; 30 | 31 | NSTimeInterval duration = 0.0f; 32 | 33 | for (size_t i = 0; i < count; i++) { 34 | CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL); 35 | if (!image) { 36 | continue; 37 | } 38 | 39 | duration += [self sd_frameDurationAtIndex:i source:source]; 40 | 41 | [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]]; 42 | 43 | CGImageRelease(image); 44 | } 45 | 46 | if (!duration) { 47 | duration = (1.0f / 10.0f) * count; 48 | } 49 | 50 | animatedImage = [UIImage animatedImageWithImages:images duration:duration]; 51 | } 52 | 53 | CFRelease(source); 54 | 55 | return animatedImage; 56 | } 57 | 58 | + (float)sd_frameDurationAtIndex:(NSUInteger)index source:(CGImageSourceRef)source { 59 | float frameDuration = 0.1f; 60 | CFDictionaryRef cfFrameProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil); 61 | NSDictionary *frameProperties = (__bridge NSDictionary *)cfFrameProperties; 62 | NSDictionary *gifProperties = frameProperties[(NSString *)kCGImagePropertyGIFDictionary]; 63 | 64 | NSNumber *delayTimeUnclampedProp = gifProperties[(NSString *)kCGImagePropertyGIFUnclampedDelayTime]; 65 | if (delayTimeUnclampedProp) { 66 | frameDuration = [delayTimeUnclampedProp floatValue]; 67 | } 68 | else { 69 | 70 | NSNumber *delayTimeProp = gifProperties[(NSString *)kCGImagePropertyGIFDelayTime]; 71 | if (delayTimeProp) { 72 | frameDuration = [delayTimeProp floatValue]; 73 | } 74 | } 75 | 76 | // Many annoying ads specify a 0 duration to make an image flash as quickly as possible. 77 | // We follow Firefox's behavior and use a duration of 100 ms for any frames that specify 78 | // a duration of <= 10 ms. See and 79 | // for more information. 80 | 81 | if (frameDuration < 0.011f) { 82 | frameDuration = 0.100f; 83 | } 84 | 85 | CFRelease(cfFrameProperties); 86 | return frameDuration; 87 | } 88 | 89 | + (UIImage *)sd_animatedGIFNamed:(NSString *)name { 90 | CGFloat scale = [UIScreen mainScreen].scale; 91 | 92 | if (scale > 1.0f) { 93 | NSString *retinaPath = [[NSBundle mainBundle] pathForResource:[name stringByAppendingString:@"@2x"] ofType:@"gif"]; 94 | 95 | NSData *data = [NSData dataWithContentsOfFile:retinaPath]; 96 | 97 | if (data) { 98 | return [UIImage sd_animatedGIFWithData:data]; 99 | } 100 | 101 | NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"gif"]; 102 | 103 | data = [NSData dataWithContentsOfFile:path]; 104 | 105 | if (data) { 106 | return [UIImage sd_animatedGIFWithData:data]; 107 | } 108 | 109 | return [UIImage imageNamed:name]; 110 | } 111 | else { 112 | NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"gif"]; 113 | 114 | NSData *data = [NSData dataWithContentsOfFile:path]; 115 | 116 | if (data) { 117 | return [UIImage sd_animatedGIFWithData:data]; 118 | } 119 | 120 | return [UIImage imageNamed:name]; 121 | } 122 | } 123 | 124 | - (UIImage *)sd_animatedImageByScalingAndCroppingToSize:(CGSize)size { 125 | if (CGSizeEqualToSize(self.size, size) || CGSizeEqualToSize(size, CGSizeZero)) { 126 | return self; 127 | } 128 | 129 | CGSize scaledSize = size; 130 | CGPoint thumbnailPoint = CGPointZero; 131 | 132 | CGFloat widthFactor = size.width / self.size.width; 133 | CGFloat heightFactor = size.height / self.size.height; 134 | CGFloat scaleFactor = (widthFactor > heightFactor) ? widthFactor : heightFactor; 135 | scaledSize.width = self.size.width * scaleFactor; 136 | scaledSize.height = self.size.height * scaleFactor; 137 | 138 | if (widthFactor > heightFactor) { 139 | thumbnailPoint.y = (size.height - scaledSize.height) * 0.5; 140 | } 141 | else if (widthFactor < heightFactor) { 142 | thumbnailPoint.x = (size.width - scaledSize.width) * 0.5; 143 | } 144 | 145 | NSMutableArray *scaledImages = [NSMutableArray array]; 146 | 147 | for (UIImage *image in self.images) { 148 | UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); 149 | 150 | [image drawInRect:CGRectMake(thumbnailPoint.x, thumbnailPoint.y, scaledSize.width, scaledSize.height)]; 151 | UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 152 | 153 | [scaledImages addObject:newImage]; 154 | 155 | UIGraphicsEndImageContext(); 156 | } 157 | 158 | return [UIImage animatedImageWithImages:scaledImages duration:self.duration]; 159 | } 160 | 161 | 162 | @end 163 | -------------------------------------------------------------------------------- /LTDataStatus/Category/UIViewController+HUD.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+HUD.h 3 | // LTProject 4 | // 5 | // Created by Jonny on 2016/9/28. 6 | // Copyright © 2016年 ZUBMO. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | /** 12 | * 无数据时页面提示,支持图片,文字,gif 显示 13 | * 如在使用过程中有问题,请联系我,我会及时解决 14 | * Email :nscode@sina.com 15 | * GitHub:https://github.com/leeCoding 16 | */ 17 | 18 | /// 点击主屏幕回调 19 | typedef void(^tapViewWithBlock)(); 20 | 21 | @interface UIViewController (HUD) 22 | 23 | /// 显示状态,点击屏幕时回调。显示文字 24 | - (void)showStatus:(NSString *)status tapViewWithBlock:(tapViewWithBlock)block; 25 | 26 | /// 显示状态,点击屏幕时回调,如果是gif,type请填gif, 默认加载jpg,png。 27 | - (void)showStatus:(NSString *)status imageName:(NSString *)imageName type:(NSString *)type tapViewWithBlock:(tapViewWithBlock)block; 28 | 29 | /// 隐藏提示 30 | - (void)hide; 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /LTDataStatus/Category/UIViewController+HUD.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+HUD.m 3 | // LTProject 4 | // 5 | // Created by Jonny on 2016/9/28. 6 | // Copyright © 2016年 ZUBMO. All rights reserved. 7 | // 8 | 9 | #import "UIViewController+HUD.h" 10 | #import 11 | #import "UIImage+Gif.h" 12 | 13 | static const void *kHud = @"k_labelHud"; 14 | static const void *kTapG = @"k_TapG"; 15 | static const void *kProTapG = @"k_Pro_TapG"; 16 | 17 | @interface UIViewController () 18 | 19 | @property (nonatomic,strong)UILabel *labelHud; 20 | @property (nonatomic,strong)UITapGestureRecognizer *tapGestureBlock; 21 | 22 | @end 23 | 24 | @implementation UIViewController (HUD) 25 | 26 | 27 | - (void)setTapGestureBlock:(UITapGestureRecognizer *)tapGestureBlock { 28 | objc_setAssociatedObject(self, &kProTapG, tapGestureBlock, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 29 | } 30 | 31 | - (UITapGestureRecognizer *)tapGestureBlock { 32 | return objc_getAssociatedObject(self, &kProTapG); 33 | } 34 | 35 | - (UILabel *)labelHud { 36 | UILabel *subhud = objc_getAssociatedObject(self, &kHud); 37 | if (subhud == nil) { 38 | subhud = [[UILabel alloc]initWithFrame:CGRectMake(20, self.view.center.y, self.view.frame.size.width - 40, 30)]; 39 | subhud.textColor = [UIColor grayColor]; 40 | subhud.font = [UIFont systemFontOfSize:14]; 41 | subhud.textAlignment = NSTextAlignmentCenter; 42 | [self.view addSubview:subhud]; 43 | 44 | objc_setAssociatedObject(self, &kHud, subhud, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 45 | } 46 | 47 | return subhud; 48 | } 49 | 50 | #pragma mark - 显示状态 51 | - (void)showStatus:(NSString *)status tapViewWithBlock:(tapViewWithBlock)block { 52 | [self addStatusAndImage:status imageName:nil type:nil tapViewWithBlock:block]; 53 | } 54 | 55 | #pragma mark - 显示状态以及显示没有数据时的图片 56 | - (void)showStatus:(NSString *)status imageName:(NSString *)imageName type:(NSString *)type tapViewWithBlock:(tapViewWithBlock)block { 57 | [self addStatusAndImage:status imageName:imageName type:type tapViewWithBlock:block]; 58 | } 59 | 60 | /* 添加文字及图片 */ 61 | - (void)addStatusAndImage:(NSString *)status imageName:(NSString *)imageName type:(NSString *)type tapViewWithBlock:(tapViewWithBlock)block{ 62 | 63 | if (status) { 64 | 65 | self.labelHud.text = status; 66 | } 67 | if (imageName) { 68 | 69 | UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake((self.view.frame.size.width - 100) / 2, self.view.center.y - 100, 100, 100)]; 70 | 71 | if ([type isEqualToString:@"gif"]) { 72 | 73 | UIImage *image = [UIImage sd_animatedGIFNamed:imageName]; 74 | [imageView setImage:image]; 75 | 76 | } else [imageView setImage:[UIImage imageNamed:imageName]]; 77 | 78 | imageView.tag = 10086; 79 | [self.view addSubview:imageView]; 80 | } 81 | if (block) { 82 | 83 | objc_setAssociatedObject(self, &kTapG, block, OBJC_ASSOCIATION_COPY_NONATOMIC); 84 | } 85 | // 添加手势 86 | [self addTapGesture]; 87 | } 88 | 89 | /* 添加点击手势 */ 90 | - (void)addTapGesture { 91 | 92 | if (self.tapGestureBlock) { 93 | [self show]; 94 | return; 95 | } 96 | // 添加全屏手势 97 | self.tapGestureBlock = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapBlock)]; 98 | [self.view addGestureRecognizer:self.tapGestureBlock]; 99 | } 100 | 101 | #pragma mark - 回调 Click return 102 | - (void)tapBlock { 103 | tapViewWithBlock block = objc_getAssociatedObject(self, &kTapG); 104 | if (block) { 105 | block(); 106 | } 107 | } 108 | 109 | #pragma mark - 显示 Tips show 110 | - (void)show { 111 | 112 | self.labelHud.hidden = NO; 113 | UIImageView *imageView = [self.view viewWithTag:10086]; 114 | imageView.hidden = NO; 115 | [self.view addGestureRecognizer: self.tapGestureBlock]; 116 | 117 | } 118 | 119 | #pragma mark - 消失 Tips hide 120 | - (void)hide { 121 | 122 | if (self.labelHud) { 123 | /* 动画 124 | __weak typeof(self) __weakSelf = self; 125 | [UIView animateWithDuration:1 animations:^{ 126 | __weakSelf.labelHud.alpha = 0; 127 | } completion:^(BOOL finished) { 128 | [__weakSelf.labelHud removeFromSuperview]; 129 | }]; 130 | */ 131 | 132 | self.labelHud.hidden = YES; 133 | } 134 | 135 | UIImageView *imageView = [self.view viewWithTag:10086]; 136 | imageView.hidden = YES; 137 | [self.view removeGestureRecognizer: self.tapGestureBlock]; 138 | } 139 | 140 | @end 141 | -------------------------------------------------------------------------------- /LTDataStatus/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 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 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 | -------------------------------------------------------------------------------- /LTDataStatus/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // LTDataStatus 4 | // 5 | // Created by Jonny on 2016/10/20. 6 | // Copyright © 2016年 Jonny. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /LTDataStatus/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // LTDataStatus 4 | // 5 | // Created by Jonny on 2016/10/20. 6 | // Copyright © 2016年 Jonny. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import "UIViewController+HUD.h" 11 | 12 | @interface ViewController () 13 | 14 | @end 15 | 16 | @implementation ViewController 17 | 18 | - (void)viewDidLoad { 19 | [super viewDidLoad]; 20 | // Do any additional setup after loading the view, typically from a nib. 21 | 22 | 23 | /* / 1.显示文字 24 | [self showStatus:@"没有数据哦!点击屏幕加载..." tapViewWithBlock:^{ 25 | NSLog(@"点击屏幕了"); 26 | }]; 27 | */ 28 | 29 | /*// 2.显示图片加文字 30 | [self showStatus:@"没有数据哦!点击屏幕加载..." imageName:@"no_data.jpg" type:nil tapViewWithBlock:^{ 31 | NSLog(@"点击屏幕了"); 32 | }]; 33 | */ 34 | 35 | // 3.显示gif加文字 36 | [self showStatus:@"没有数据哦!点击屏幕加载..." imageName:@"gif" type:@"gif" tapViewWithBlock:^{ 37 | NSLog(@"点击屏幕了"); 38 | }]; 39 | 40 | 41 | /*/ 隐藏,三秒后消失 42 | __weak typeof(self) __weakSelf = self; 43 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 44 | [__weakSelf hide]; 45 | }); 46 | */ 47 | } 48 | 49 | 50 | - (void)didReceiveMemoryWarning { 51 | [super didReceiveMemoryWarning]; 52 | // Dispose of any resources that can be recreated. 53 | } 54 | 55 | 56 | @end 57 | -------------------------------------------------------------------------------- /LTDataStatus/gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leeCoding/LTDataStatus/b3d0ae9683b1e2e0af734f160773063b1c820997/LTDataStatus/gif.gif -------------------------------------------------------------------------------- /LTDataStatus/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // LTDataStatus 4 | // 5 | // Created by Jonny on 2016/10/20. 6 | // Copyright © 2016年 Jonny. 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 | -------------------------------------------------------------------------------- /LTDataStatus/no_data.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leeCoding/LTDataStatus/b3d0ae9683b1e2e0af734f160773063b1c820997/LTDataStatus/no_data.jpg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LTDataStatus 2 | 一行代码解决无数据时提示用户,支持文字,图片,Gif动画 3 | 4 | ## 使用方法 5 | ### 一.先拉入Category文件夹中的两个分类文件到项目中 6 | ### 二.然后导入分类头文件 "UIViewController+HUD.h" 7 | #### 1.文字提醒 8 | ``` 9 | [self showStatus:@"没有数据哦!" tapViewWithBlock:^{ 10 | NSLog(@"点击屏幕了"); 11 | }]; 12 | ``` 13 | #### 2.文字加图片 14 | ``` 15 | [self showStatus:@"没有数据哦!" imageName:@"no_data.jpg" type:nil tapViewWithBlock:^{ 16 | NSLog(@"点击屏幕了"); 17 | }]; 18 | ``` 19 | #### 3.文字加Gif 20 | ``` 21 | [self showStatus:@"没有数据哦!" imageName:@"gif" type:@"gif" tapViewWithBlock:^{ 22 | NSLog(@"点击屏幕了"); 23 | }]; 24 | ``` 25 | #### 4.隐藏 26 | ``` 27 | [self hide]; 28 | ``` 29 | ## 关于 30 | 如果在使用的过程有什么问题,或有想要增加的功能,可以提lssues,你也可以这样联系我 ↓: 31 | * Email: 32 | * QQ:740712231 33 | --------------------------------------------------------------------------------