From 81851db6a61e952d773ea62d65bfec82a348539a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fjo=CC=88lnir=20A=CC=81sgeirsson?= Date: Tue, 31 Mar 2015 11:04:49 +0900 Subject: [PATCH 001/117] Added framework target --- Framework-Info.plist | 26 +++ MBProgressHUD.xcodeproj/project.pbxproj | 159 +++++++++++++++++- .../xcschemes/MBProgressHUD.xcscheme | 6 +- 3 files changed, 180 insertions(+), 11 deletions(-) create mode 100644 Framework-Info.plist diff --git a/Framework-Info.plist b/Framework-Info.plist new file mode 100644 index 000000000..10090c084 --- /dev/null +++ b/Framework-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.matej.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index c2a0f8df5..ea9f10e25 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -8,6 +8,8 @@ /* Begin PBXBuildFile section */ 1315DD7617804CBC0032507D /* MBProgressHUD.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = D286A7511518C70F00E13FB8 /* MBProgressHUD.h */; }; + 1D104D931ACA371400973364 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D286A7521518C70F00E13FB8 /* MBProgressHUD.m */; }; + 1D104D941ACA373100973364 /* MBProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = D286A7511518C70F00E13FB8 /* MBProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; }; D286A74D1518C70F00E13FB8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D286A74C1518C70F00E13FB8 /* Foundation.framework */; }; D286A7531518C70F00E13FB8 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D286A7521518C70F00E13FB8 /* MBProgressHUD.m */; }; D286A75E1518C89600E13FB8 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D286A75D1518C89600E13FB8 /* UIKit.framework */; }; @@ -29,6 +31,8 @@ /* Begin PBXFileReference section */ 1315DD73178045000032507D /* MBProgressHUD-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MBProgressHUD-Prefix.pch"; sourceTree = SOURCE_ROOT; }; + 1D104D7A1ACA36CC00973364 /* MBProgressHUD.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MBProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1D104D951ACA376200973364 /* Framework-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Framework-Info.plist"; sourceTree = SOURCE_ROOT; }; D286A7491518C70F00E13FB8 /* libMBProgressHUD.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMBProgressHUD.a; sourceTree = BUILT_PRODUCTS_DIR; }; D286A74C1518C70F00E13FB8 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; D286A7511518C70F00E13FB8 /* MBProgressHUD.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MBProgressHUD.h; sourceTree = SOURCE_ROOT; }; @@ -38,6 +42,13 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 1D104D761ACA36CC00973364 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; D286A7461518C70F00E13FB8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -54,6 +65,7 @@ 1315DD72178044770032507D /* Supporting Files */ = { isa = PBXGroup; children = ( + 1D104D951ACA376200973364 /* Framework-Info.plist */, 1315DD73178045000032507D /* MBProgressHUD-Prefix.pch */, ); name = "Supporting Files"; @@ -72,6 +84,7 @@ isa = PBXGroup; children = ( D286A7491518C70F00E13FB8 /* libMBProgressHUD.a */, + 1D104D7A1ACA36CC00973364 /* MBProgressHUD.framework */, ); name = Products; sourceTree = ""; @@ -98,10 +111,39 @@ }; /* End PBXGroup section */ +/* Begin PBXHeadersBuildPhase section */ + 1D104D771ACA36CC00973364 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 1D104D941ACA373100973364 /* MBProgressHUD.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + /* Begin PBXNativeTarget section */ - D286A7481518C70F00E13FB8 /* MBProgressHUD */ = { + 1D104D791ACA36CC00973364 /* MBProgressHUD Framework */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1D104D8D1ACA36CC00973364 /* Build configuration list for PBXNativeTarget "MBProgressHUD Framework" */; + buildPhases = ( + 1D104D751ACA36CC00973364 /* Sources */, + 1D104D761ACA36CC00973364 /* Frameworks */, + 1D104D771ACA36CC00973364 /* Headers */, + 1D104D781ACA36CC00973364 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "MBProgressHUD Framework"; + productName = "MBProgressHUD Framework"; + productReference = 1D104D7A1ACA36CC00973364 /* MBProgressHUD.framework */; + productType = "com.apple.product-type.framework"; + }; + D286A7481518C70F00E13FB8 /* MBProgressHUD Static Library */ = { isa = PBXNativeTarget; - buildConfigurationList = D286A7561518C70F00E13FB8 /* Build configuration list for PBXNativeTarget "MBProgressHUD" */; + buildConfigurationList = D286A7561518C70F00E13FB8 /* Build configuration list for PBXNativeTarget "MBProgressHUD Static Library" */; buildPhases = ( D286A7451518C70F00E13FB8 /* Sources */, D286A7461518C70F00E13FB8 /* Frameworks */, @@ -111,7 +153,7 @@ ); dependencies = ( ); - name = MBProgressHUD; + name = "MBProgressHUD Static Library"; productName = MBProgressHUD; productReference = D286A7491518C70F00E13FB8 /* libMBProgressHUD.a */; productType = "com.apple.product-type.library.static"; @@ -123,8 +165,13 @@ isa = PBXProject; attributes = { CLASSPREFIX = MB; - LastUpgradeCheck = 0460; + LastUpgradeCheck = 0620; ORGANIZATIONNAME = "Matej Bukovinski"; + TargetAttributes = { + 1D104D791ACA36CC00973364 = { + CreatedOnToolsVersion = 6.2; + }; + }; }; buildConfigurationList = D286A7431518C70E00E13FB8 /* Build configuration list for PBXProject "MBProgressHUD" */; compatibilityVersion = "Xcode 3.2"; @@ -138,12 +185,31 @@ projectDirPath = ""; projectRoot = ""; targets = ( - D286A7481518C70F00E13FB8 /* MBProgressHUD */, + D286A7481518C70F00E13FB8 /* MBProgressHUD Static Library */, + 1D104D791ACA36CC00973364 /* MBProgressHUD Framework */, ); }; /* End PBXProject section */ +/* Begin PBXResourcesBuildPhase section */ + 1D104D781ACA36CC00973364 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ + 1D104D751ACA36CC00973364 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1D104D931ACA371400973364 /* MBProgressHUD.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; D286A7451518C70F00E13FB8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -155,6 +221,70 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ + 1D104D8E1ACA36CC00973364 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = "Framework-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = MBProgressHUD; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 1D104D8F1ACA36CC00973364 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_NS_ASSERTIONS = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = "Framework-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = MBProgressHUD; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; D286A7541518C70F00E13FB8 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -166,8 +296,10 @@ CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -200,8 +332,10 @@ CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -223,7 +357,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "MBProgressHUD-Prefix.pch"; OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = MBProgressHUD; SKIP_INSTALL = YES; }; name = Debug; @@ -235,7 +369,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "MBProgressHUD-Prefix.pch"; OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = MBProgressHUD; SKIP_INSTALL = YES; }; name = Release; @@ -243,6 +377,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 1D104D8D1ACA36CC00973364 /* Build configuration list for PBXNativeTarget "MBProgressHUD Framework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1D104D8E1ACA36CC00973364 /* Debug */, + 1D104D8F1ACA36CC00973364 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; D286A7431518C70E00E13FB8 /* Build configuration list for PBXProject "MBProgressHUD" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -252,7 +395,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - D286A7561518C70F00E13FB8 /* Build configuration list for PBXNativeTarget "MBProgressHUD" */ = { + D286A7561518C70F00E13FB8 /* Build configuration list for PBXNativeTarget "MBProgressHUD Static Library" */ = { isa = XCConfigurationList; buildConfigurations = ( D286A7571518C70F00E13FB8 /* Debug */, diff --git a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme index be10b8859..b0f94a659 100644 --- a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme +++ b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme @@ -1,6 +1,6 @@ @@ -44,7 +44,7 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "D286A7481518C70F00E13FB8" BuildableName = "libMBProgressHUD.a" - BlueprintName = "MBProgressHUD" + BlueprintName = "MBProgressHUD Static Library" ReferencedContainer = "container:MBProgressHUD.xcodeproj"> From 1f70b49ff6a8e8e6e16ef05cee86061331ba74ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fjo=CC=88lnir=20A=CC=81sgeirsson?= Date: Mon, 13 Apr 2015 11:24:08 +0900 Subject: [PATCH 002/117] Enabled "no common blocks" warning --- MBProgressHUD.xcodeproj/project.pbxproj | 4 +++- .../xcshareddata/xcschemes/MBProgressHUD.xcscheme | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index ea9f10e25..de6ce7448 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -165,7 +165,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = MB; - LastUpgradeCheck = 0620; + LastUpgradeCheck = 0630; ORGANIZATIONNAME = "Matej Bukovinski"; TargetAttributes = { 1D104D791ACA36CC00973364 = { @@ -302,6 +302,7 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -337,6 +338,7 @@ COPY_PHASE_STRIP = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; diff --git a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme index b0f94a659..a30d07686 100644 --- a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme +++ b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme @@ -1,6 +1,6 @@ Date: Fri, 3 Jul 2015 08:09:01 +0200 Subject: [PATCH 003/117] Dropped support for manual memory management, bumped deployment target to iOS 5.0 to support weak references. --- Demo/Classes/HudDemoAppDelegate.m | 6 -- Demo/Classes/HudDemoViewController.m | 16 ++--- Demo/HudDemo.xcodeproj/project.pbxproj | 6 +- Demo/main.m | 8 +-- MBProgressHUD.h | 65 +++++-------------- MBProgressHUD.m | 84 ++++--------------------- MBProgressHUD.xcodeproj/project.pbxproj | 6 +- 7 files changed, 43 insertions(+), 148 deletions(-) diff --git a/Demo/Classes/HudDemoAppDelegate.m b/Demo/Classes/HudDemoAppDelegate.m index e4488fe77..fc20ed35e 100644 --- a/Demo/Classes/HudDemoAppDelegate.m +++ b/Demo/Classes/HudDemoAppDelegate.m @@ -20,10 +20,4 @@ - (void)applicationDidFinishLaunching:(UIApplication *)application { [window makeKeyAndVisible]; } -- (void)dealloc { - [navController release]; - [window release]; - [super dealloc]; -} - @end diff --git a/Demo/Classes/HudDemoViewController.m b/Demo/Classes/HudDemoViewController.m index e87580a90..1e70c9028 100644 --- a/Demo/Classes/HudDemoViewController.m +++ b/Demo/Classes/HudDemoViewController.m @@ -55,11 +55,6 @@ - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceO ((UIScrollView *)self.view).contentSize = content.bounds.size; } -- (void)dealloc { - [_buttons release]; - [super dealloc]; -} - #pragma mark - Actions - (IBAction)showSimple:(id)sender { @@ -148,7 +143,7 @@ - (IBAction)showWithCustomView:(id)sender { // The sample image is based on the work by http://www.pixelpressicons.com, http://creativecommons.org/licenses/by/2.5/ca/ // Make the customViews 37 by 37 pixels for best results (those are the bounds of the build-in progress indicators) - HUD.customView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]] autorelease]; + HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]]; // Set custom view mode HUD.mode = MBProgressHUDModeCustomView; @@ -182,7 +177,6 @@ - (IBAction)showUsingBlocks:(id)sender { [self myTask]; } completionBlock:^{ [hud removeFromSuperview]; - [hud release]; }]; #endif } @@ -204,9 +198,8 @@ - (IBAction)showURL:(id)sender { NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; [connection start]; - [connection release]; - HUD = [[MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES] retain]; + HUD = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; HUD.delegate = self; } @@ -289,7 +282,7 @@ - (void)myMixedTask { UIImage *image = [UIImage imageNamed:@"37x-Checkmark.png"]; imageView = [[UIImageView alloc] initWithImage:image]; }); - HUD.customView = [imageView autorelease]; + HUD.customView = imageView; HUD.mode = MBProgressHUDModeCustomView; HUD.labelText = @"Completed"; sleep(2); @@ -309,7 +302,7 @@ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { - HUD.customView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]] autorelease]; + HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]]; HUD.mode = MBProgressHUDModeCustomView; [HUD hide:YES afterDelay:2]; } @@ -323,7 +316,6 @@ - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)err - (void)hudWasHidden:(MBProgressHUD *)hud { // Remove HUD from screen when the HUD was hidded [HUD removeFromSuperview]; - [HUD release]; HUD = nil; } diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index 2fdf39504..4a513aeb9 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -404,6 +404,7 @@ C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -422,7 +423,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -431,6 +432,7 @@ C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -449,7 +451,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; SDKROOT = iphoneos; }; name = Release; diff --git a/Demo/main.m b/Demo/main.m index 3e4915ce8..26f40e483 100644 --- a/Demo/main.m +++ b/Demo/main.m @@ -9,9 +9,7 @@ #import int main(int argc, char *argv[]) { - - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - int retVal = UIApplicationMain(argc, argv, nil, nil); - [pool release]; - return retVal; + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, nil); + } } diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 3ff015ef2..6b686b2a5 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -32,7 +32,6 @@ @protocol MBProgressHUDDelegate; - typedef NS_ENUM(NSInteger, MBProgressHUDMode) { /** Progress is shown using an UIActivityIndicatorView. This is the default. */ MBProgressHUDModeIndeterminate, @@ -57,37 +56,7 @@ typedef NS_ENUM(NSInteger, MBProgressHUDAnimation) { MBProgressHUDAnimationZoomIn }; - -#ifndef MB_INSTANCETYPE -#if __has_feature(objc_instancetype) - #define MB_INSTANCETYPE instancetype -#else - #define MB_INSTANCETYPE id -#endif -#endif - -#ifndef MB_STRONG -#if __has_feature(objc_arc) - #define MB_STRONG strong -#else - #define MB_STRONG retain -#endif -#endif - -#ifndef MB_WEAK -#if __has_feature(objc_arc_weak) - #define MB_WEAK weak -#elif __has_feature(objc_arc) - #define MB_WEAK unsafe_unretained -#else - #define MB_WEAK assign -#endif -#endif - -#if NS_BLOCKS_AVAILABLE typedef void (^MBProgressHUDCompletionBlock)(); -#endif - /** * Displays a simple HUD window containing a progress indicator and two optional labels for short messages. @@ -123,7 +92,7 @@ typedef void (^MBProgressHUDCompletionBlock)(); * @see hideHUDForView:animated: * @see animationType */ -+ (MB_INSTANCETYPE)showHUDAddedTo:(UIView *)view animated:(BOOL)animated; ++ (instancetype)showHUDAddedTo:(UIView *)view animated:(BOOL)animated; /** * Finds the top-most HUD subview and hides it. The counterpart to this method is showHUDAddedTo:animated:. @@ -161,7 +130,7 @@ typedef void (^MBProgressHUDCompletionBlock)(); * @param view The view that is going to be searched. * @return A reference to the last HUD subview discovered. */ -+ (MB_INSTANCETYPE)HUDForView:(UIView *)view; ++ (instancetype)HUDForView:(UIView *)view; /** * Finds all HUD subviews and returns them. @@ -238,8 +207,6 @@ typedef void (^MBProgressHUDCompletionBlock)(); */ - (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated; -#if NS_BLOCKS_AVAILABLE - /** * Shows the HUD while a block is executing on a background queue, then hides the HUD. * @@ -280,8 +247,6 @@ typedef void (^MBProgressHUDCompletionBlock)(); */ @property (copy) MBProgressHUDCompletionBlock completionBlock; -#endif - /** * MBProgressHUD operation mode. The default is MBProgressHUDModeIndeterminate. * @@ -300,14 +265,14 @@ typedef void (^MBProgressHUDCompletionBlock)(); * The UIView (e.g., a UIImageView) to be shown when the HUD is in MBProgressHUDModeCustomView. * For best results use a 37 by 37 pixel view (so the bounds match the built in indicator bounds). */ -@property (MB_STRONG) UIView *customView; +@property (strong) UIView *customView; /** * The HUD delegate object. * * @see MBProgressHUDDelegate */ -@property (MB_WEAK) id delegate; +@property (weak) id delegate; /** * An optional short message to be displayed below the activity indicator. The HUD is automatically resized to fit @@ -332,7 +297,7 @@ typedef void (^MBProgressHUDCompletionBlock)(); * this UIColor and the opacity property is not used. using retain because performing copy on * UIColor base colors (like [UIColor greenColor]) cause problems with the copyZone. */ -@property (MB_STRONG) UIColor *color; +@property (strong) UIColor *color; /** * The x-axis offset of the HUD relative to the centre of the superview. @@ -398,28 +363,28 @@ typedef void (^MBProgressHUDCompletionBlock)(); /** * Font to be used for the main label. Set this property if the default is not adequate. */ -@property (MB_STRONG) UIFont* labelFont; +@property (strong) UIFont* labelFont; /** * Color to be used for the main label. Set this property if the default is not adequate. */ -@property (MB_STRONG) UIColor* labelColor; +@property (strong) UIColor* labelColor; /** * Font to be used for the details label. Set this property if the default is not adequate. */ -@property (MB_STRONG) UIFont* detailsLabelFont; +@property (strong) UIFont* detailsLabelFont; /** * Color to be used for the details label. Set this property if the default is not adequate. */ -@property (MB_STRONG) UIColor* detailsLabelColor; +@property (strong) UIColor* detailsLabelColor; /** * The color of the activity indicator. Defaults to [UIColor whiteColor] * Does nothing on pre iOS 5. */ -@property (MB_STRONG) UIColor *activityIndicatorColor; +@property (strong) UIColor *activityIndicatorColor; /** * The progress of the progress indicator, from 0.0 to 1.0. Defaults to 0.0. @@ -474,13 +439,13 @@ typedef void (^MBProgressHUDCompletionBlock)(); * Indicator progress color. * Defaults to white [UIColor whiteColor] */ -@property (nonatomic, MB_STRONG) UIColor *progressTintColor; +@property (nonatomic, strong) UIColor *progressTintColor; /** * Indicator background (non-progress) color. * Defaults to translucent white (alpha 0.1) */ -@property (nonatomic, MB_STRONG) UIColor *backgroundTintColor; +@property (nonatomic, strong) UIColor *backgroundTintColor; /* * Display mode - NO = round or YES = annular. Defaults to round. @@ -504,18 +469,18 @@ typedef void (^MBProgressHUDCompletionBlock)(); * Bar border line color. * Defaults to white [UIColor whiteColor]. */ -@property (nonatomic, MB_STRONG) UIColor *lineColor; +@property (nonatomic, strong) UIColor *lineColor; /** * Bar background color. * Defaults to clear [UIColor clearColor]; */ -@property (nonatomic, MB_STRONG) UIColor *progressRemainingColor; +@property (nonatomic, strong) UIColor *progressRemainingColor; /** * Bar progress color. * Defaults to white [UIColor whiteColor]. */ -@property (nonatomic, MB_STRONG) UIColor *progressColor; +@property (nonatomic, strong) UIColor *progressColor; @end diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 9fecbb532..8f9c8d747 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -7,17 +7,6 @@ #import "MBProgressHUD.h" #import - -#if __has_feature(objc_arc) - #define MB_AUTORELEASE(exp) exp - #define MB_RELEASE(exp) exp - #define MB_RETAIN(exp) exp -#else - #define MB_AUTORELEASE(exp) [exp autorelease] - #define MB_RELEASE(exp) [exp release] - #define MB_RETAIN(exp) [exp retain] -#endif - #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 60000 #define MBLabelAlignmentCenter NSTextAlignmentCenter #else @@ -48,12 +37,10 @@ #define kCFCoreFoundationVersionNumber_iOS_8_0 1129.15 #endif - static const CGFloat kPadding = 4.f; static const CGFloat kLabelFontSize = 16.f; static const CGFloat kDetailsLabelFontSize = 12.f; - @interface MBProgressHUD () { BOOL useAnimation; SEL methodForExecution; @@ -65,14 +52,13 @@ @interface MBProgressHUD () { CGAffineTransform rotationTransform; } -@property (atomic, MB_STRONG) UIView *indicator; -@property (atomic, MB_STRONG) NSTimer *graceTimer; -@property (atomic, MB_STRONG) NSTimer *minShowTimer; -@property (atomic, MB_STRONG) NSDate *showStarted; +@property (atomic, strong) UIView *indicator; +@property (atomic, strong) NSTimer *graceTimer; +@property (atomic, strong) NSTimer *minShowTimer; +@property (atomic, strong) NSDate *showStarted; @end - @implementation MBProgressHUD #pragma mark - Properties @@ -106,18 +92,16 @@ @implementation MBProgressHUD @synthesize progress; @synthesize size; @synthesize activityIndicatorColor; -#if NS_BLOCKS_AVAILABLE @synthesize completionBlock; -#endif #pragma mark - Class methods -+ (MB_INSTANCETYPE)showHUDAddedTo:(UIView *)view animated:(BOOL)animated { ++ (instancetype)showHUDAddedTo:(UIView *)view animated:(BOOL)animated { MBProgressHUD *hud = [[self alloc] initWithView:view]; hud.removeFromSuperViewOnHide = YES; [view addSubview:hud]; [hud show:animated]; - return MB_AUTORELEASE(hud); + return hud; } + (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated { @@ -139,7 +123,7 @@ + (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated { return [huds count]; } -+ (MB_INSTANCETYPE)HUDForView:(UIView *)view { ++ (instancetype)HUDForView:(UIView *)view { NSEnumerator *subviewsEnum = [view.subviews reverseObjectEnumerator]; for (UIView *subview in subviewsEnum) { if ([subview isKindOfClass:self]) { @@ -220,26 +204,6 @@ - (id)initWithWindow:(UIWindow *)window { - (void)dealloc { [self unregisterFromNotifications]; [self unregisterFromKVO]; -#if !__has_feature(objc_arc) - [color release]; - [indicator release]; - [label release]; - [detailsLabel release]; - [labelText release]; - [detailsLabelText release]; - [graceTimer release]; - [minShowTimer release]; - [showStarted release]; - [customView release]; - [labelFont release]; - [labelColor release]; - [detailsLabelFont release]; - [detailsLabelColor release]; -#if NS_BLOCKS_AVAILABLE - [completionBlock release]; -#endif - [super dealloc]; -#endif } #pragma mark - Show & hide @@ -367,12 +331,10 @@ - (void)done { if (removeFromSuperViewOnHide) { [self removeFromSuperview]; } -#if NS_BLOCKS_AVAILABLE if (self.completionBlock) { self.completionBlock(); self.completionBlock = NULL; } -#endif if ([delegate respondsToSelector:@selector(hudWasHidden:)]) { [delegate performSelector:@selector(hudWasHidden:) withObject:self]; } @@ -382,8 +344,8 @@ - (void)done { - (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated { methodForExecution = method; - targetForExecution = MB_RETAIN(target); - objectForExecution = MB_RETAIN(object); + targetForExecution = target; + objectForExecution = object; // Launch execution in new thread self.taskInProgress = YES; [NSThread detachNewThreadSelector:@selector(launchExecution) toTarget:self withObject:nil]; @@ -391,8 +353,6 @@ - (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object [self show:animated]; } -#if NS_BLOCKS_AVAILABLE - - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block { dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:NULL]; @@ -420,8 +380,6 @@ - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block [self show:animated]; } -#endif - - (void)launchExecution { @autoreleasepool { #pragma clang diagnostic push @@ -437,13 +395,8 @@ - (void)launchExecution { - (void)cleanUp { taskInProgress = NO; -#if !__has_feature(objc_arc) - [targetForExecution release]; - [objectForExecution release]; -#else targetForExecution = nil; objectForExecution = nil; -#endif [self hide:useAnimation]; } @@ -482,8 +435,8 @@ - (void)updateIndicators { if (!isActivityIndicator) { // Update to indeterminate indicator [indicator removeFromSuperview]; - self.indicator = MB_AUTORELEASE([[UIActivityIndicatorView alloc] - initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]); + self.indicator = [[UIActivityIndicatorView alloc] + initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; [(UIActivityIndicatorView *)indicator startAnimating]; [self addSubview:indicator]; } @@ -494,14 +447,14 @@ - (void)updateIndicators { else if (mode == MBProgressHUDModeDeterminateHorizontalBar) { // Update to bar determinate indicator [indicator removeFromSuperview]; - self.indicator = MB_AUTORELEASE([[MBBarProgressView alloc] init]); + self.indicator = [[MBBarProgressView alloc] init]; [self addSubview:indicator]; } else if (mode == MBProgressHUDModeDeterminate || mode == MBProgressHUDModeAnnularDeterminate) { if (!isRoundIndicator) { // Update to determinante indicator [indicator removeFromSuperview]; - self.indicator = MB_AUTORELEASE([[MBRoundProgressView alloc] init]); + self.indicator = [[MBRoundProgressView alloc] init]; [self addSubview:indicator]; } if (mode == MBProgressHUDModeAnnularDeterminate) { @@ -800,11 +753,6 @@ - (id)initWithFrame:(CGRect)frame { - (void)dealloc { [self unregisterFromKVO]; -#if !__has_feature(objc_arc) - [_progressTintColor release]; - [_backgroundTintColor release]; - [super dealloc]; -#endif } #pragma mark - Drawing @@ -906,12 +854,6 @@ - (id)initWithFrame:(CGRect)frame { - (void)dealloc { [self unregisterFromKVO]; -#if !__has_feature(objc_arc) - [_lineColor release]; - [_progressColor release]; - [_progressRemainingColor release]; - [super dealloc]; -#endif } #pragma mark - Drawing diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index c2a0f8df5..40ac54d92 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -161,6 +161,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -183,7 +184,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -195,6 +196,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -210,7 +212,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; From b926ea64d84c8d55f2eaa210caedd60f79ddfd6b Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 6 Jul 2015 19:55:38 +0200 Subject: [PATCH 004/117] Removed @synthesize, migrated to using properties and modern instance var conventions. --- MBProgressHUD.m | 214 +++++++++++++++++++++--------------------------- 1 file changed, 93 insertions(+), 121 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 8f9c8d747..54b318c48 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -38,20 +38,20 @@ #endif static const CGFloat kPadding = 4.f; -static const CGFloat kLabelFontSize = 16.f; -static const CGFloat kDetailsLabelFontSize = 12.f; - -@interface MBProgressHUD () { - BOOL useAnimation; - SEL methodForExecution; - id targetForExecution; - id objectForExecution; - UILabel *label; - UILabel *detailsLabel; - BOOL isFinished; - CGAffineTransform rotationTransform; -} - +static const CGFloat MBDefaultLabelFontSize = 16.f; +static const CGFloat MBDefaultDetailsLabelFontSize = 12.f; + +@interface MBProgressHUD () + +@property (nonatomic, assign) BOOL useAnimation; +@property (nonatomic, assign) SEL methodForExecution; +@property (nonatomic, strong) id targetForExecution; +@property (nonatomic, strong) id objectForExecution; +@property (nonatomic, assign) BOOL isFinished; +@property (nonatomic, assign) CGAffineTransform rotationTransform; +@property (nonatomic, assign, readwrite) CGSize size; +@property (nonatomic, strong) UILabel *label; +@property (nonatomic, strong) UILabel *detailsLabel; @property (atomic, strong) UIView *indicator; @property (atomic, strong) NSTimer *graceTimer; @property (atomic, strong) NSTimer *minShowTimer; @@ -61,39 +61,6 @@ @interface MBProgressHUD () { @implementation MBProgressHUD -#pragma mark - Properties - -@synthesize animationType; -@synthesize delegate; -@synthesize opacity; -@synthesize color; -@synthesize labelFont; -@synthesize labelColor; -@synthesize detailsLabelFont; -@synthesize detailsLabelColor; -@synthesize indicator; -@synthesize xOffset; -@synthesize yOffset; -@synthesize minSize; -@synthesize square; -@synthesize margin; -@synthesize dimBackground; -@synthesize graceTime; -@synthesize minShowTime; -@synthesize graceTimer; -@synthesize minShowTimer; -@synthesize taskInProgress; -@synthesize removeFromSuperViewOnHide; -@synthesize customView; -@synthesize showStarted; -@synthesize mode; -@synthesize labelText; -@synthesize detailsLabelText; -@synthesize progress; -@synthesize size; -@synthesize activityIndicatorColor; -@synthesize completionBlock; - #pragma mark - Class methods + (instancetype)showHUDAddedTo:(UIView *)view animated:(BOOL)animated { @@ -150,40 +117,28 @@ - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Set default values for properties - self.animationType = MBProgressHUDAnimationFade; - self.mode = MBProgressHUDModeIndeterminate; - self.labelText = nil; - self.detailsLabelText = nil; - self.opacity = 0.8f; - self.color = nil; - self.labelFont = [UIFont boldSystemFontOfSize:kLabelFontSize]; - self.labelColor = [UIColor whiteColor]; - self.detailsLabelFont = [UIFont boldSystemFontOfSize:kDetailsLabelFontSize]; - self.detailsLabelColor = [UIColor whiteColor]; - self.activityIndicatorColor = [UIColor whiteColor]; - self.xOffset = 0.0f; - self.yOffset = 0.0f; - self.dimBackground = NO; - self.margin = 20.0f; - self.cornerRadius = 10.0f; - self.graceTime = 0.0f; - self.minShowTime = 0.0f; - self.removeFromSuperViewOnHide = NO; - self.minSize = CGSizeZero; - self.square = NO; - self.contentMode = UIViewContentModeCenter; - self.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin - | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; + _animationType = MBProgressHUDAnimationFade; + _mode = MBProgressHUDModeIndeterminate; + _opacity = 0.8f; + _labelFont = [UIFont boldSystemFontOfSize:MBDefaultLabelFontSize]; + _labelColor = [UIColor whiteColor]; + _detailsLabelFont = [UIFont boldSystemFontOfSize:MBDefaultDetailsLabelFontSize]; + _detailsLabelColor = [UIColor whiteColor]; + _activityIndicatorColor = [UIColor whiteColor]; + _margin = 20.0f; + _cornerRadius = 10.0f; + _taskInProgress = NO; + _rotationTransform = CGAffineTransformIdentity; // Transparent background self.opaque = NO; self.backgroundColor = [UIColor clearColor]; // Make it invisible for now self.alpha = 0.0f; - - taskInProgress = NO; - rotationTransform = CGAffineTransformIdentity; - + self.contentMode = UIViewContentModeCenter; + self.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin + | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; + [self setupLabels]; [self updateIndicators]; [self registerForKVO]; @@ -210,7 +165,7 @@ - (void)dealloc { - (void)show:(BOOL)animated { NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); - useAnimation = animated; + self.useAnimation = animated; // If the grace time is set postpone the HUD display if (self.graceTime > 0.0) { NSTimer *newGraceTimer = [NSTimer timerWithTimeInterval:self.graceTime target:self selector:@selector(handleGraceTimer:) userInfo:nil repeats:NO]; @@ -219,17 +174,17 @@ - (void)show:(BOOL)animated { } // ... otherwise show the HUD imediately else { - [self showUsingAnimation:useAnimation]; + [self showUsingAnimation:self.useAnimation]; } } - (void)hide:(BOOL)animated { NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); - useAnimation = animated; + self.useAnimation = animated; // If the minShow time is set, calculate how long the hud was shown, // and pospone the hiding operation if necessary - if (self.minShowTime > 0.0 && showStarted) { - NSTimeInterval interv = [[NSDate date] timeIntervalSinceDate:showStarted]; + if (self.minShowTime > 0.0 && self.showStarted) { + NSTimeInterval interv = [[NSDate date] timeIntervalSinceDate:self.showStarted]; if (interv < self.minShowTime) { self.minShowTimer = [NSTimer scheduledTimerWithTimeInterval:(self.minShowTime - interv) target:self selector:@selector(handleMinShowTimer:) userInfo:nil repeats:NO]; @@ -237,7 +192,7 @@ - (void)hide:(BOOL)animated { } } // ... otherwise hide the HUD immediately - [self hideUsingAnimation:useAnimation]; + [self hideUsingAnimation:self.useAnimation]; } - (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay { @@ -252,13 +207,13 @@ - (void)hideDelayed:(NSNumber *)animated { - (void)handleGraceTimer:(NSTimer *)theTimer { // Show the HUD only if the task is still running - if (taskInProgress) { - [self showUsingAnimation:useAnimation]; + if (self.taskInProgress) { + [self showUsingAnimation:self.useAnimation]; } } - (void)handleMinShowTimer:(NSTimer *)theTimer { - [self hideUsingAnimation:useAnimation]; + [self hideUsingAnimation:self.useAnimation]; } #pragma mark - View Hierrarchy @@ -274,10 +229,11 @@ - (void)showUsingAnimation:(BOOL)animated { [NSObject cancelPreviousPerformRequestsWithTarget:self]; [self setNeedsDisplay]; + MBProgressHUDAnimation animationType = self.animationType; if (animated && animationType == MBProgressHUDAnimationZoomIn) { - self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); + self.transform = CGAffineTransformConcat(self.rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); } else if (animated && animationType == MBProgressHUDAnimationZoomOut) { - self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); + self.transform = CGAffineTransformConcat(self.rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); } self.showStarted = [NSDate date]; // Fade in @@ -286,7 +242,7 @@ - (void)showUsingAnimation:(BOOL)animated { [UIView setAnimationDuration:0.30]; self.alpha = 1.0f; if (animationType == MBProgressHUDAnimationZoomIn || animationType == MBProgressHUDAnimationZoomOut) { - self.transform = rotationTransform; + self.transform = self.rotationTransform; } [UIView commitAnimations]; } @@ -297,17 +253,18 @@ - (void)showUsingAnimation:(BOOL)animated { - (void)hideUsingAnimation:(BOOL)animated { // Fade out - if (animated && showStarted) { + if (animated && self.showStarted) { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.30]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)]; // 0.02 prevents the hud from passing through touches during the animation the hud will get completely hidden // in the done method + MBProgressHUDAnimation animationType = self.animationType; if (animationType == MBProgressHUDAnimationZoomIn) { - self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); + self.transform = CGAffineTransformConcat(self.rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); } else if (animationType == MBProgressHUDAnimationZoomOut) { - self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); + self.transform = CGAffineTransformConcat(self.rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); } self.alpha = 0.02f; @@ -326,15 +283,17 @@ - (void)animationFinished:(NSString *)animationID finished:(BOOL)finished contex - (void)done { [NSObject cancelPreviousPerformRequestsWithTarget:self]; - isFinished = YES; + self.isFinished = YES; self.alpha = 0.0f; - if (removeFromSuperViewOnHide) { + if (self.removeFromSuperViewOnHide) { [self removeFromSuperview]; } if (self.completionBlock) { self.completionBlock(); self.completionBlock = NULL; } + + id delegate = self.delegate; if ([delegate respondsToSelector:@selector(hudWasHidden:)]) { [delegate performSelector:@selector(hudWasHidden:) withObject:self]; } @@ -343,9 +302,9 @@ - (void)done { #pragma mark - Threading - (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated { - methodForExecution = method; - targetForExecution = target; - objectForExecution = object; + self.methodForExecution = method; + self.targetForExecution = target; + self.objectForExecution = object; // Launch execution in new thread self.taskInProgress = YES; [NSThread detachNewThreadSelector:@selector(launchExecution) toTarget:self withObject:nil]; @@ -385,7 +344,7 @@ - (void)launchExecution { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks" // Start executing the requested task - [targetForExecution performSelector:methodForExecution withObject:objectForExecution]; + [self.targetForExecution performSelector:self.methodForExecution withObject:self.objectForExecution]; #pragma clang diagnostic pop // Task completed, update view in main thread (note: view operations should // be done only in the main thread) @@ -394,16 +353,16 @@ - (void)launchExecution { } - (void)cleanUp { - taskInProgress = NO; - targetForExecution = nil; - objectForExecution = nil; - [self hide:useAnimation]; + self.taskInProgress = NO; + self.targetForExecution = nil; + self.objectForExecution = nil; + [self hide:self.useAnimation]; } #pragma mark - UI - (void)setupLabels { - label = [[UILabel alloc] initWithFrame:self.bounds]; + UILabel *label = [[UILabel alloc] initWithFrame:self.bounds]; label.adjustsFontSizeToFitWidth = NO; label.textAlignment = MBLabelAlignmentCenter; label.opaque = NO; @@ -412,8 +371,9 @@ - (void)setupLabels { label.font = self.labelFont; label.text = self.labelText; [self addSubview:label]; + self.label = label; - detailsLabel = [[UILabel alloc] initWithFrame:self.bounds]; + UILabel *detailsLabel = [[UILabel alloc] initWithFrame:self.bounds]; detailsLabel.font = self.detailsLabelFont; detailsLabel.adjustsFontSizeToFitWidth = NO; detailsLabel.textAlignment = MBLabelAlignmentCenter; @@ -423,20 +383,22 @@ - (void)setupLabels { detailsLabel.numberOfLines = 0; detailsLabel.font = self.detailsLabelFont; detailsLabel.text = self.detailsLabelText; + self.detailsLabel = detailsLabel; [self addSubview:detailsLabel]; } - (void)updateIndicators { - + + UIView *indicator = self.indicator; BOOL isActivityIndicator = [indicator isKindOfClass:[UIActivityIndicatorView class]]; BOOL isRoundIndicator = [indicator isKindOfClass:[MBRoundProgressView class]]; - + + MBProgressHUDMode mode = self.mode; if (mode == MBProgressHUDModeIndeterminate) { if (!isActivityIndicator) { // Update to indeterminate indicator [indicator removeFromSuperview]; - self.indicator = [[UIActivityIndicatorView alloc] - initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; + indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; [(UIActivityIndicatorView *)indicator startAnimating]; [self addSubview:indicator]; } @@ -447,29 +409,30 @@ - (void)updateIndicators { else if (mode == MBProgressHUDModeDeterminateHorizontalBar) { // Update to bar determinate indicator [indicator removeFromSuperview]; - self.indicator = [[MBBarProgressView alloc] init]; + indicator = [[MBBarProgressView alloc] init]; [self addSubview:indicator]; } else if (mode == MBProgressHUDModeDeterminate || mode == MBProgressHUDModeAnnularDeterminate) { if (!isRoundIndicator) { // Update to determinante indicator [indicator removeFromSuperview]; - self.indicator = [[MBRoundProgressView alloc] init]; + indicator = [[MBRoundProgressView alloc] init]; [self addSubview:indicator]; } if (mode == MBProgressHUDModeAnnularDeterminate) { [(MBRoundProgressView *)indicator setAnnular:YES]; } } - else if (mode == MBProgressHUDModeCustomView && customView != indicator) { + else if (mode == MBProgressHUDModeCustomView && self.customView != indicator) { // Update custom view indicator [indicator removeFromSuperview]; - self.indicator = customView; + indicator = self.customView; [self addSubview:indicator]; } else if (mode == MBProgressHUDModeText) { [indicator removeFromSuperview]; - self.indicator = nil; + indicator = nil; } + self.indicator = indicator; } #pragma mark - Layout @@ -483,16 +446,19 @@ - (void)layoutSubviews { self.frame = parent.bounds; } CGRect bounds = self.bounds; - + CGFloat margin = self.margin; + // Determine the total widt and height needed CGFloat maxWidth = bounds.size.width - 4 * margin; CGSize totalSize = CGSizeZero; - + + UIView *indicator = self.indicator; CGRect indicatorF = indicator.bounds; indicatorF.size.width = MIN(indicatorF.size.width, maxWidth); totalSize.width = MAX(totalSize.width, indicatorF.size.width); totalSize.height += indicatorF.size.height; - + + UILabel *label = self.label; CGSize labelSize = MB_TEXTSIZE(label.text, label.font); labelSize.width = MIN(labelSize.width, maxWidth); totalSize.width = MAX(totalSize.width, labelSize.width); @@ -501,6 +467,7 @@ - (void)layoutSubviews { totalSize.height += kPadding; } + UILabel *detailsLabel = self.detailsLabel; CGFloat remainingHeight = bounds.size.height - totalSize.height - kPadding - 4 * margin; CGSize maxSize = CGSizeMake(maxWidth, remainingHeight); CGSize detailsLabelSize = MB_MULTILINE_TEXTSIZE(detailsLabel.text, detailsLabel.font, maxSize, detailsLabel.lineBreakMode); @@ -514,8 +481,8 @@ - (void)layoutSubviews { totalSize.height += 2 * margin; // Position elements - CGFloat yPos = round(((bounds.size.height - totalSize.height) / 2)) + margin + yOffset; - CGFloat xPos = xOffset; + CGFloat yPos = round(((bounds.size.height - totalSize.height) / 2)) + margin + self.yOffset; + CGFloat xPos = self.xOffset; indicatorF.origin.y = yPos; indicatorF.origin.x = round((bounds.size.width - indicatorF.size.width) / 2) + xPos; indicator.frame = indicatorF; @@ -541,7 +508,7 @@ - (void)layoutSubviews { detailsLabel.frame = detailsLabelF; // Enforce minsize and quare rules - if (square) { + if (self.square) { CGFloat max = MAX(totalSize.width, totalSize.height); if (max <= bounds.size.width - 2 * margin) { totalSize.width = max; @@ -550,6 +517,7 @@ - (void)layoutSubviews { totalSize.height = max; } } + CGSize minSize = self.minSize; if (totalSize.width < minSize.width) { totalSize.width = minSize.width; } @@ -557,7 +525,7 @@ - (void)layoutSubviews { totalSize.height = minSize.height; } - size = totalSize; + self.size = totalSize; } #pragma mark BG Drawing @@ -597,6 +565,7 @@ - (void)drawRect:(CGRect)rect { // Center HUD CGRect allRect = self.bounds; // Draw rounded HUD backgroud rect + CGSize size = self.size; CGRect boxRect = CGRectMake(round((allRect.size.width - size.width) / 2) + self.xOffset, round((allRect.size.height - size.height) / 2) + self.yOffset, size.width, size.height); float radius = self.cornerRadius; @@ -640,6 +609,9 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N } - (void)updateUIForKeypath:(NSString *)keyPath { + UILabel *label = self.label; + UILabel *detailsLabel = self.detailsLabel; + UIView *indicator = self.indicator; if ([keyPath isEqualToString:@"mode"] || [keyPath isEqualToString:@"customView"] || [keyPath isEqualToString:@"activityIndicatorColor"]) { [self updateIndicators]; @@ -657,7 +629,7 @@ - (void)updateUIForKeypath:(NSString *)keyPath { detailsLabel.textColor = self.detailsLabelColor; } else if ([keyPath isEqualToString:@"progress"]) { if ([indicator respondsToSelector:@selector(setProgress:)]) { - [(id)indicator setValue:@(progress) forKey:@"progress"]; + [(id)indicator setValue:@(self.progress) forKey:@"progress"]; } return; } @@ -713,13 +685,13 @@ - (void)updateForCurrentOrientationAnimated:(BOOL)animated { if (orientation == UIInterfaceOrientationPortraitUpsideDown) { radians = (CGFloat)M_PI; } else { radians = 0; } } - rotationTransform = CGAffineTransformMakeRotation(radians); + self.rotationTransform = CGAffineTransformMakeRotation(radians); if (animated) { [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.3]; } - [self setTransform:rotationTransform]; + [self setTransform:self.rotationTransform]; if (animated) { [UIView commitAnimations]; } From 701f0b3ba573d80e7f0e2f5d62c84d63522de633 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Tue, 7 Jul 2015 07:48:51 +0200 Subject: [PATCH 005/117] Simplified showWhileExecuting: implementation. Now leverages blocks. --- MBProgressHUD.m | 33 +++++++-------------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 54b318c48..dfd9e717c 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -44,9 +44,6 @@ @interface MBProgressHUD () @property (nonatomic, assign) BOOL useAnimation; -@property (nonatomic, assign) SEL methodForExecution; -@property (nonatomic, strong) id targetForExecution; -@property (nonatomic, strong) id objectForExecution; @property (nonatomic, assign) BOOL isFinished; @property (nonatomic, assign) CGAffineTransform rotationTransform; @property (nonatomic, assign, readwrite) CGSize size; @@ -302,14 +299,13 @@ - (void)done { #pragma mark - Threading - (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated { - self.methodForExecution = method; - self.targetForExecution = target; - self.objectForExecution = object; - // Launch execution in new thread - self.taskInProgress = YES; - [NSThread detachNewThreadSelector:@selector(launchExecution) toTarget:self withObject:nil]; - // Show HUD view - [self show:animated]; + [self showAnimated:animated whileExecutingBlock:^{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + // Start executing the requested task + [target performSelector:method withObject:object]; +#pragma clang diagnostic pop + }]; } - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block { @@ -339,23 +335,8 @@ - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block [self show:animated]; } -- (void)launchExecution { - @autoreleasepool { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - // Start executing the requested task - [self.targetForExecution performSelector:self.methodForExecution withObject:self.objectForExecution]; -#pragma clang diagnostic pop - // Task completed, update view in main thread (note: view operations should - // be done only in the main thread) - [self performSelectorOnMainThread:@selector(cleanUp) withObject:nil waitUntilDone:NO]; - } -} - - (void)cleanUp { self.taskInProgress = NO; - self.targetForExecution = nil; - self.objectForExecution = nil; [self hide:self.useAnimation]; } From 78de340a1acf8b01fc3eaf45413dae9c74a8fba9 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Tue, 7 Jul 2015 08:17:13 +0200 Subject: [PATCH 006/117] Started depreciating label-related properties and exposed label and detailsLabel. --- MBProgressHUD.h | 52 ++++++++++++---------------- MBProgressHUD.m | 90 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 80 insertions(+), 62 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 6b686b2a5..7e0b519c9 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -32,6 +32,7 @@ @protocol MBProgressHUDDelegate; + typedef NS_ENUM(NSInteger, MBProgressHUDMode) { /** Progress is shown using an UIActivityIndicatorView. This is the default. */ MBProgressHUDModeIndeterminate, @@ -58,6 +59,7 @@ typedef NS_ENUM(NSInteger, MBProgressHUDAnimation) { typedef void (^MBProgressHUDCompletionBlock)(); + /** * Displays a simple HUD window containing a progress indicator and two optional labels for short messages. * @@ -72,10 +74,7 @@ typedef void (^MBProgressHUDCompletionBlock)(); * - MBProgressHUDModeAnnularDeterminate - shows a custom annular progress indicator * - MBProgressHUDModeCustomView - shows an arbitrary, user specified view (see `customView`) * - * All three modes can have optional labels assigned: - * - If the labelText property is set and non-empty then a label containing the provided content is placed below the - * indicator view. - * - If also the detailsLabelText property is set then another label is placed below the first label. + * All three modes can have optional labels assigned. */ @interface MBProgressHUD : UIView @@ -274,18 +273,17 @@ typedef void (^MBProgressHUDCompletionBlock)(); */ @property (weak) id delegate; -/** - * An optional short message to be displayed below the activity indicator. The HUD is automatically resized to fit +/** + * A label that holds an optional short message to be displayed below the activity indicator. The HUD is automatically resized to fit * the entire text. If the text is too long it will get clipped by displaying "..." at the end. If left unchanged or * set to @"", then no message is displayed. */ -@property (copy) NSString *labelText; +@property (strong, readonly) UILabel *label; -/** - * An optional details message displayed below the labelText message. This message is displayed only if the labelText - * property is also set and is different from an empty string (@""). The details text can span multiple lines. +/** + * A label that holds an optional details message displayed below the labelText message. The details text can span multiple lines. */ -@property (copy) NSString *detailsLabelText; +@property (strong, readonly) UILabel *detailsLabel; /** * The opacity of the HUD window. Defaults to 0.8 (80% opacity). @@ -360,26 +358,6 @@ typedef void (^MBProgressHUDCompletionBlock)(); */ @property (assign) BOOL removeFromSuperViewOnHide; -/** - * Font to be used for the main label. Set this property if the default is not adequate. - */ -@property (strong) UIFont* labelFont; - -/** - * Color to be used for the main label. Set this property if the default is not adequate. - */ -@property (strong) UIColor* labelColor; - -/** - * Font to be used for the details label. Set this property if the default is not adequate. - */ -@property (strong) UIFont* detailsLabelFont; - -/** - * Color to be used for the details label. Set this property if the default is not adequate. - */ -@property (strong) UIColor* detailsLabelColor; - /** * The color of the activity indicator. Defaults to [UIColor whiteColor] * Does nothing on pre iOS 5. @@ -484,3 +462,15 @@ typedef void (^MBProgressHUDCompletionBlock)(); @property (nonatomic, strong) UIColor *progressColor; @end + + +@interface MBProgressHUD (Deprecated) + +@property (nonatomic, copy) NSString *labelText __attribute__((deprecated("use label.text instead"))); +@property (nonatomic, strong) UIFont *labelFont __attribute__((deprecated("use label.font instead"))); +@property (nonatomic, strong) UIColor *labelColor __attribute__((deprecated("use label.textColor instead"))); +@property (nonatomic, copy) NSString *detailsLabelText __attribute__((deprecated("use detailsLabel.text instead"))); +@property (nonatomic, strong) UIFont *detailsLabelFont __attribute__((deprecated("use detailsLabel.font instead"))); +@property (nonatomic, strong) UIColor *detailsLabelColor __attribute__((deprecated("use detailsLabel.textColor instead"))); + +@end diff --git a/MBProgressHUD.m b/MBProgressHUD.m index dfd9e717c..b73746a51 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -47,8 +47,6 @@ @interface MBProgressHUD () @property (nonatomic, assign) BOOL isFinished; @property (nonatomic, assign) CGAffineTransform rotationTransform; @property (nonatomic, assign, readwrite) CGSize size; -@property (nonatomic, strong) UILabel *label; -@property (nonatomic, strong) UILabel *detailsLabel; @property (atomic, strong) UIView *indicator; @property (atomic, strong) NSTimer *graceTimer; @property (atomic, strong) NSTimer *minShowTimer; @@ -117,10 +115,6 @@ - (id)initWithFrame:(CGRect)frame { _animationType = MBProgressHUDAnimationFade; _mode = MBProgressHUDModeIndeterminate; _opacity = 0.8f; - _labelFont = [UIFont boldSystemFontOfSize:MBDefaultLabelFontSize]; - _labelColor = [UIColor whiteColor]; - _detailsLabelFont = [UIFont boldSystemFontOfSize:MBDefaultDetailsLabelFontSize]; - _detailsLabelColor = [UIColor whiteColor]; _activityIndicatorColor = [UIColor whiteColor]; _margin = 20.0f; _cornerRadius = 10.0f; @@ -348,23 +342,20 @@ - (void)setupLabels { label.textAlignment = MBLabelAlignmentCenter; label.opaque = NO; label.backgroundColor = [UIColor clearColor]; - label.textColor = self.labelColor; - label.font = self.labelFont; - label.text = self.labelText; + label.textColor = [UIColor whiteColor]; + label.font = [UIFont boldSystemFontOfSize:MBDefaultLabelFontSize];; [self addSubview:label]; - self.label = label; + _label = label; UILabel *detailsLabel = [[UILabel alloc] initWithFrame:self.bounds]; - detailsLabel.font = self.detailsLabelFont; detailsLabel.adjustsFontSizeToFitWidth = NO; detailsLabel.textAlignment = MBLabelAlignmentCenter; detailsLabel.opaque = NO; detailsLabel.backgroundColor = [UIColor clearColor]; - detailsLabel.textColor = self.detailsLabelColor; + detailsLabel.textColor = [UIColor whiteColor]; detailsLabel.numberOfLines = 0; - detailsLabel.font = self.detailsLabelFont; - detailsLabel.text = self.detailsLabelText; - self.detailsLabel = detailsLabel; + detailsLabel.font = [UIFont boldSystemFontOfSize:MBDefaultDetailsLabelFontSize]; + _detailsLabel = detailsLabel; [self addSubview:detailsLabel]; } @@ -577,8 +568,7 @@ - (void)unregisterFromKVO { } - (NSArray *)observableKeypaths { - return [NSArray arrayWithObjects:@"mode", @"customView", @"labelText", @"labelFont", @"labelColor", - @"detailsLabelText", @"detailsLabelFont", @"detailsLabelColor", @"progress", @"activityIndicatorColor", nil]; + return [NSArray arrayWithObjects:@"mode", @"customView", @"progress", @"activityIndicatorColor", nil]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { @@ -590,24 +580,10 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N } - (void)updateUIForKeypath:(NSString *)keyPath { - UILabel *label = self.label; - UILabel *detailsLabel = self.detailsLabel; UIView *indicator = self.indicator; if ([keyPath isEqualToString:@"mode"] || [keyPath isEqualToString:@"customView"] || [keyPath isEqualToString:@"activityIndicatorColor"]) { [self updateIndicators]; - } else if ([keyPath isEqualToString:@"labelText"]) { - label.text = self.labelText; - } else if ([keyPath isEqualToString:@"labelFont"]) { - label.font = self.labelFont; - } else if ([keyPath isEqualToString:@"labelColor"]) { - label.textColor = self.labelColor; - } else if ([keyPath isEqualToString:@"detailsLabelText"]) { - detailsLabel.text = self.detailsLabelText; - } else if ([keyPath isEqualToString:@"detailsLabelFont"]) { - detailsLabel.font = self.detailsLabelFont; - } else if ([keyPath isEqualToString:@"detailsLabelColor"]) { - detailsLabel.textColor = self.detailsLabelColor; } else if ([keyPath isEqualToString:@"progress"]) { if ([indicator respondsToSelector:@selector(setProgress:)]) { [(id)indicator setValue:@(self.progress) forKey:@"progress"]; @@ -918,3 +894,55 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N } @end + +@implementation MBProgressHUD (Deprecated) + +- (NSString *)labelText { + return self.label.text; +} + +- (void)setLabelText:(NSString *)labelText { + self.label.text = labelText; +} + +- (UIFont *)labelFont { + return self.label.font; +} + +- (void)setLabelFont:(UIFont *)labelFont { + self.label.font = labelFont; +} + +- (UIColor *)labelColor { + return self.label.textColor; +} + +- (void)setLabelColor:(UIColor *)labelColor { + self.label.textColor = labelColor; +} + +- (NSString *)detailsLabelText { + return self.detailsLabel.text; +} + +- (void)setDetailsLabelText:(NSString *)detailsLabelText { + self.detailsLabel.text = detailsLabelText; +} + +- (UIFont *)detailsLabelFont { + return self.detailsLabel.font; +} + +- (void)setDetailsLabelFont:(UIFont *)detailsLabelFont { + self.detailsLabel.font = detailsLabelFont; +} + +- (UIColor *)detailsLabelColor { + return self.detailsLabel.textColor; +} + +- (void)setDetailsLabelColor:(UIColor *)detailsLabelColor { + self.detailsLabel.textColor = detailsLabelColor; +} + +@end From 7c165f0740d5e010d052aac9e0e38875db00531c Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 11 Jul 2015 13:57:40 +0200 Subject: [PATCH 007/117] Deprecated initWithWindow. --- MBProgressHUD.h | 23 ++++++++--------------- MBProgressHUD.m | 12 ++++++++---- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 7e0b519c9..4c373f98d 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -139,15 +139,6 @@ typedef void (^MBProgressHUDCompletionBlock)(); */ + (NSArray *)allHUDsForView:(UIView *)view; -/** - * A convenience constructor that initializes the HUD with the window's bounds. Calls the designated constructor with - * window.bounds as the parameter. - * - * @param window The window instance that will provide the bounds for the HUD. Should be the same instance as - * the HUD's superview (i.e., the window that the HUD will be added to). - */ -- (id)initWithWindow:(UIWindow *)window; - /** * A convenience constructor that initializes the HUD with the view's bounds. Calls the designated constructor with * view.bounds as the parameter @@ -466,11 +457,13 @@ typedef void (^MBProgressHUDCompletionBlock)(); @interface MBProgressHUD (Deprecated) -@property (nonatomic, copy) NSString *labelText __attribute__((deprecated("use label.text instead"))); -@property (nonatomic, strong) UIFont *labelFont __attribute__((deprecated("use label.font instead"))); -@property (nonatomic, strong) UIColor *labelColor __attribute__((deprecated("use label.textColor instead"))); -@property (nonatomic, copy) NSString *detailsLabelText __attribute__((deprecated("use detailsLabel.text instead"))); -@property (nonatomic, strong) UIFont *detailsLabelFont __attribute__((deprecated("use detailsLabel.font instead"))); -@property (nonatomic, strong) UIColor *detailsLabelColor __attribute__((deprecated("use detailsLabel.textColor instead"))); +- (id)initWithWindow:(UIWindow *)window; __attribute__((deprecated("Use initWithView: instead."))); + +@property (nonatomic, copy) NSString *labelText __attribute__((deprecated("Use label.text instead."))); +@property (nonatomic, strong) UIFont *labelFont __attribute__((deprecated("Use label.font instead."))); +@property (nonatomic, strong) UIColor *labelColor __attribute__((deprecated("Use label.textColor instead."))); +@property (nonatomic, copy) NSString *detailsLabelText __attribute__((deprecated("Use detailsLabel.text instead."))); +@property (nonatomic, strong) UIFont *detailsLabelFont __attribute__((deprecated("Use detailsLabel.font instead."))); +@property (nonatomic, strong) UIColor *detailsLabelColor __attribute__((deprecated("Use detailsLabel.textColor instead."))); @end diff --git a/MBProgressHUD.m b/MBProgressHUD.m index b73746a51..be43235c7 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -143,10 +143,6 @@ - (id)initWithView:(UIView *)view { return [self initWithFrame:view.bounds]; } -- (id)initWithWindow:(UIWindow *)window { - return [self initWithView:window]; -} - - (void)dealloc { [self unregisterFromNotifications]; [self unregisterFromKVO]; @@ -897,6 +893,14 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N @implementation MBProgressHUD (Deprecated) +#pragma mark - Lifecycle + +- (id)initWithWindow:(UIWindow *)window { + return [self initWithView:window]; +} + +#pragma mark - Labels + - (NSString *)labelText { return self.label.text; } From c7c95f4015262885a3302d40ab77944c3db357bf Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 12 Jul 2015 17:27:37 +0200 Subject: [PATCH 008/117] Deprecated multi-hide helpers. --- MBProgressHUD.h | 26 +++----------------------- MBProgressHUD.m | 42 ++++++++++++++++++++++-------------------- 2 files changed, 25 insertions(+), 43 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 4c373f98d..0403a4984 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -108,21 +108,6 @@ typedef void (^MBProgressHUDCompletionBlock)(); */ + (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated; -/** - * Finds all the HUD subviews and hides them. - * - * @note This method sets `removeFromSuperViewOnHide`. The HUDs will automatically be removed from the view hierarchy when hidden. - * - * @param view The view that is going to be searched for HUD subviews. - * @param animated If set to YES the HUDs will disappear using the current animationType. If set to NO the HUDs will not use - * animations while disappearing. - * @return the number of HUDs found and removed. - * - * @see hideHUDForView:animated: - * @see animationType - */ -+ (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated; - /** * Finds the top-most HUD subview and returns it. * @@ -131,14 +116,6 @@ typedef void (^MBProgressHUDCompletionBlock)(); */ + (instancetype)HUDForView:(UIView *)view; -/** - * Finds all HUD subviews and returns them. - * - * @param view The view that is going to be searched. - * @return All found HUD views (array of MBProgressHUD objects). - */ -+ (NSArray *)allHUDsForView:(UIView *)view; - /** * A convenience constructor that initializes the HUD with the view's bounds. Calls the designated constructor with * view.bounds as the parameter @@ -457,6 +434,9 @@ typedef void (^MBProgressHUDCompletionBlock)(); @interface MBProgressHUD (Deprecated) ++ (NSArray *)allHUDsForView:(UIView *)view; __attribute__((deprecated("Store references when using more than one HUD per view."))); ++ (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated; __attribute__((deprecated("Store references when using more than one HUD per view."))); + - (id)initWithWindow:(UIWindow *)window; __attribute__((deprecated("Use initWithView: instead."))); @property (nonatomic, copy) NSString *labelText __attribute__((deprecated("Use label.text instead."))); diff --git a/MBProgressHUD.m b/MBProgressHUD.m index be43235c7..c3e03a2ef 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -76,15 +76,6 @@ + (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated { return NO; } -+ (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated { - NSArray *huds = [MBProgressHUD allHUDsForView:view]; - for (MBProgressHUD *hud in huds) { - hud.removeFromSuperViewOnHide = YES; - [hud hide:animated]; - } - return [huds count]; -} - + (instancetype)HUDForView:(UIView *)view { NSEnumerator *subviewsEnum = [view.subviews reverseObjectEnumerator]; for (UIView *subview in subviewsEnum) { @@ -95,17 +86,6 @@ + (instancetype)HUDForView:(UIView *)view { return nil; } -+ (NSArray *)allHUDsForView:(UIView *)view { - NSMutableArray *huds = [NSMutableArray array]; - NSArray *subviews = view.subviews; - for (UIView *aView in subviews) { - if ([aView isKindOfClass:self]) { - [huds addObject:aView]; - } - } - return [NSArray arrayWithArray:huds]; -} - #pragma mark - Lifecycle - (id)initWithFrame:(CGRect)frame { @@ -893,6 +873,28 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N @implementation MBProgressHUD (Deprecated) +#pragma mark - Class + ++ (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated { + NSArray *huds = [MBProgressHUD allHUDsForView:view]; + for (MBProgressHUD *hud in huds) { + hud.removeFromSuperViewOnHide = YES; + [hud hide:animated]; + } + return [huds count]; +} + ++ (NSArray *)allHUDsForView:(UIView *)view { + NSMutableArray *huds = [NSMutableArray array]; + NSArray *subviews = view.subviews; + for (UIView *aView in subviews) { + if ([aView isKindOfClass:self]) { + [huds addObject:aView]; + } + } + return [NSArray arrayWithArray:huds]; +} + #pragma mark - Lifecycle - (id)initWithWindow:(UIWindow *)window { From 5f9fbd6540d97f9f9edd31d358be0ecf131c6f72 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 12 Jul 2015 17:38:55 +0200 Subject: [PATCH 009/117] Renamed show / hide methods. --- MBProgressHUD.h | 16 ++++++++++------ MBProgressHUD.m | 32 +++++++++++++++++++++++--------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 0403a4984..d1a4ef4dd 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -135,7 +135,7 @@ typedef void (^MBProgressHUDCompletionBlock)(); * * @see animationType */ -- (void)show:(BOOL)animated; +- (void)showAnimated:(BOOL)animated; /** * Hide the HUD. This still calls the hudWasHidden: delegate. This is the counterpart of the show: method. Use it to @@ -146,7 +146,7 @@ typedef void (^MBProgressHUDCompletionBlock)(); * * @see animationType */ -- (void)hide:(BOOL)animated; +- (void)hideAnimated:(BOOL)animated; /** * Hide the HUD after a delay. This still calls the hudWasHidden: delegate. This is the counterpart of the show: method. Use it to @@ -158,7 +158,7 @@ typedef void (^MBProgressHUDCompletionBlock)(); * * @see animationType */ -- (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay; +- (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay; /** * Shows the HUD while a background task is executing in a new thread, then hides the HUD. @@ -434,10 +434,14 @@ typedef void (^MBProgressHUDCompletionBlock)(); @interface MBProgressHUD (Deprecated) -+ (NSArray *)allHUDsForView:(UIView *)view; __attribute__((deprecated("Store references when using more than one HUD per view."))); -+ (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated; __attribute__((deprecated("Store references when using more than one HUD per view."))); ++ (NSArray *)allHUDsForView:(UIView *)view __attribute__((deprecated("Store references when using more than one HUD per view."))); ++ (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated __attribute__((deprecated("Store references when using more than one HUD per view."))); -- (id)initWithWindow:(UIWindow *)window; __attribute__((deprecated("Use initWithView: instead."))); +- (id)initWithWindow:(UIWindow *)window __attribute__((deprecated("Use initWithView: instead."))); + +- (void)show:(BOOL)animated __attribute__((deprecated("Use showAnimated: instead."))); +- (void)hide:(BOOL)animated __attribute__((deprecated("Use hideAnimated: instead."))); +- (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay __attribute__((deprecated("Use hideAnimated:afterDelay: instead."))); @property (nonatomic, copy) NSString *labelText __attribute__((deprecated("Use label.text instead."))); @property (nonatomic, strong) UIFont *labelFont __attribute__((deprecated("Use label.font instead."))); diff --git a/MBProgressHUD.m b/MBProgressHUD.m index c3e03a2ef..45f8a33af 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -62,7 +62,7 @@ + (instancetype)showHUDAddedTo:(UIView *)view animated:(BOOL)animated { MBProgressHUD *hud = [[self alloc] initWithView:view]; hud.removeFromSuperViewOnHide = YES; [view addSubview:hud]; - [hud show:animated]; + [hud showAnimated:animated]; return hud; } @@ -70,7 +70,7 @@ + (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated { MBProgressHUD *hud = [self HUDForView:view]; if (hud != nil) { hud.removeFromSuperViewOnHide = YES; - [hud hide:animated]; + [hud hideAnimated:animated]; return YES; } return NO; @@ -130,7 +130,7 @@ - (void)dealloc { #pragma mark - Show & hide -- (void)show:(BOOL)animated { +- (void)showAnimated:(BOOL)animated { NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); self.useAnimation = animated; // If the grace time is set postpone the HUD display @@ -145,7 +145,7 @@ - (void)show:(BOOL)animated { } } -- (void)hide:(BOOL)animated { +- (void)hideAnimated:(BOOL)animated { NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); self.useAnimation = animated; // If the minShow time is set, calculate how long the hud was shown, @@ -162,12 +162,12 @@ - (void)hide:(BOOL)animated { [self hideUsingAnimation:self.useAnimation]; } -- (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay { +- (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay { [self performSelector:@selector(hideDelayed:) withObject:[NSNumber numberWithBool:animated] afterDelay:delay]; } - (void)hideDelayed:(NSNumber *)animated { - [self hide:[animated boolValue]]; + [self hideAnimated:[animated boolValue]]; } #pragma mark - Timer callbacks @@ -302,12 +302,12 @@ - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block [self cleanUp]; }); }); - [self show:animated]; + [self showAnimated:animated]; } - (void)cleanUp { self.taskInProgress = NO; - [self hide:self.useAnimation]; + [self hideAnimated:self.useAnimation]; } #pragma mark - UI @@ -879,7 +879,7 @@ + (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated { NSArray *huds = [MBProgressHUD allHUDsForView:view]; for (MBProgressHUD *hud in huds) { hud.removeFromSuperViewOnHide = YES; - [hud hide:animated]; + [hud hideAnimated:animated]; } return [huds count]; } @@ -901,6 +901,20 @@ - (id)initWithWindow:(UIWindow *)window { return [self initWithView:window]; } +#pragma mark - Show & hide + +- (void)show:(BOOL)animated { + [self showAnimated:animated]; +} + +- (void)hide:(BOOL)animated { + [self hideAnimated:animated]; +} + +- (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay { + [self hideAnimated:animated afterDelay:delay]; +} + #pragma mark - Labels - (NSString *)labelText { From 96df2843df86aece49f0eb254f5781b3652ad7ff Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Tue, 14 Jul 2015 07:34:27 +0200 Subject: [PATCH 010/117] Deprecated threading helpers. --- MBProgressHUD.h | 73 +++++------------------------------- MBProgressHUD.m | 99 +++++++++++++++++++++++++------------------------ 2 files changed, 60 insertions(+), 112 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index d1a4ef4dd..393bbeb13 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -160,59 +160,7 @@ typedef void (^MBProgressHUDCompletionBlock)(); */ - (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay; -/** - * Shows the HUD while a background task is executing in a new thread, then hides the HUD. - * - * This method also takes care of autorelease pools so your method does not have to be concerned with setting up a - * pool. - * - * @param method The method to be executed while the HUD is shown. This method will be executed in a new thread. - * @param target The object that the target method belongs to. - * @param object An optional object to be passed to the method. - * @param animated If set to YES the HUD will (dis)appear using the current animationType. If set to NO the HUD will not use - * animations while (dis)appearing. - */ -- (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated; - -/** - * Shows the HUD while a block is executing on a background queue, then hides the HUD. - * - * @see showAnimated:whileExecutingBlock:onQueue:completionBlock: - */ -- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block; -/** - * Shows the HUD while a block is executing on a background queue, then hides the HUD. - * - * @see showAnimated:whileExecutingBlock:onQueue:completionBlock: - */ -- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(MBProgressHUDCompletionBlock)completion; - -/** - * Shows the HUD while a block is executing on the specified dispatch queue, then hides the HUD. - * - * @see showAnimated:whileExecutingBlock:onQueue:completionBlock: - */ -- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue; - -/** - * Shows the HUD while a block is executing on the specified dispatch queue, executes completion block on the main queue, and then hides the HUD. - * - * @param animated If set to YES the HUD will (dis)appear using the current animationType. If set to NO the HUD will - * not use animations while (dis)appearing. - * @param block The block to be executed while the HUD is shown. - * @param queue The dispatch queue on which the block should be executed. - * @param completion The block to be executed on completion. - * - * @see completionBlock - */ -- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue - completionBlock:(MBProgressHUDCompletionBlock)completion; - -/** - * A block that gets called after the HUD was completely hidden. - */ -@property (copy) MBProgressHUDCompletionBlock completionBlock; /** * MBProgressHUD operation mode. The default is MBProgressHUDModeIndeterminate. @@ -298,8 +246,6 @@ typedef void (^MBProgressHUDCompletionBlock)(); * not be shown at all. * This may be used to prevent HUD display for very short tasks. * Defaults to 0 (no grace time). - * Grace time functionality is only supported when the task status is known! - * @see taskInProgress */ @property (assign) float graceTime; @@ -310,16 +256,6 @@ typedef void (^MBProgressHUDCompletionBlock)(); */ @property (assign) float minShowTime; -/** - * Indicates that the executed operation is in progress. Needed for correct graceTime operation. - * If you don't set a graceTime (different than 0.0) this does nothing. - * This property is automatically set when using showWhileExecuting:onTarget:withObject:animated:. - * When threading is done outside of the HUD (i.e., when the show: and hide: methods are used directly), - * you need to set this property when your task starts and completes in order to have normal graceTime - * functionality. - */ -@property (assign) BOOL taskInProgress; - /** * Removes the HUD from its parent view when hidden. * Defaults to NO. @@ -443,6 +379,15 @@ typedef void (^MBProgressHUDCompletionBlock)(); - (void)hide:(BOOL)animated __attribute__((deprecated("Use hideAnimated: instead."))); - (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay __attribute__((deprecated("Use hideAnimated:afterDelay: instead."))); +- (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated __attribute__((deprecated("Use GCD directly."))); +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block __attribute__((deprecated("Use GCD directly."))); +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(MBProgressHUDCompletionBlock)completion __attribute__((deprecated("Use GCD directly."))); +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue __attribute__((deprecated("Use GCD directly."))); +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue + completionBlock:(MBProgressHUDCompletionBlock)completion __attribute__((deprecated("Use GCD directly."))); +@property (copy) MBProgressHUDCompletionBlock completionBlock __attribute__((deprecated("Use GCD directly."))); +@property (assign) BOOL taskInProgress __attribute__((deprecated("No longer needed for ."))); + @property (nonatomic, copy) NSString *labelText __attribute__((deprecated("Use label.text instead."))); @property (nonatomic, strong) UIFont *labelFont __attribute__((deprecated("Use label.font instead."))); @property (nonatomic, strong) UIColor *labelColor __attribute__((deprecated("Use label.textColor instead."))); diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 45f8a33af..e810ec5ed 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -44,13 +44,16 @@ @interface MBProgressHUD () @property (nonatomic, assign) BOOL useAnimation; -@property (nonatomic, assign) BOOL isFinished; +@property (nonatomic, assign, getter=hasFinished) BOOL finished; @property (nonatomic, assign) CGAffineTransform rotationTransform; @property (nonatomic, assign, readwrite) CGSize size; @property (atomic, strong) UIView *indicator; @property (atomic, strong) NSTimer *graceTimer; @property (atomic, strong) NSTimer *minShowTimer; @property (atomic, strong) NSDate *showStarted; +// Deprecated +@property (copy) MBProgressHUDCompletionBlock completionBlock; +@property (assign) BOOL taskInProgress; @end @@ -98,7 +101,6 @@ - (id)initWithFrame:(CGRect)frame { _activityIndicatorColor = [UIColor whiteColor]; _margin = 20.0f; _cornerRadius = 10.0f; - _taskInProgress = NO; _rotationTransform = CGAffineTransformIdentity; // Transparent background @@ -133,6 +135,7 @@ - (void)dealloc { - (void)showAnimated:(BOOL)animated { NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); self.useAnimation = animated; + self.finished = NO; // If the grace time is set postpone the HUD display if (self.graceTime > 0.0) { NSTimer *newGraceTimer = [NSTimer timerWithTimeInterval:self.graceTime target:self selector:@selector(handleGraceTimer:) userInfo:nil repeats:NO]; @@ -148,6 +151,7 @@ - (void)showAnimated:(BOOL)animated { - (void)hideAnimated:(BOOL)animated { NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); self.useAnimation = animated; + self.finished = YES; // If the minShow time is set, calculate how long the hud was shown, // and pospone the hiding operation if necessary if (self.minShowTime > 0.0 && self.showStarted) { @@ -174,7 +178,7 @@ - (void)hideDelayed:(NSNumber *)animated { - (void)handleGraceTimer:(NSTimer *)theTimer { // Show the HUD only if the task is still running - if (self.taskInProgress) { + if (self.hasFinished) { [self showUsingAnimation:self.useAnimation]; } } @@ -250,7 +254,6 @@ - (void)animationFinished:(NSString *)animationID finished:(BOOL)finished contex - (void)done { [NSObject cancelPreviousPerformRequestsWithTarget:self]; - self.isFinished = YES; self.alpha = 0.0f; if (self.removeFromSuperViewOnHide) { [self removeFromSuperview]; @@ -266,50 +269,6 @@ - (void)done { } } -#pragma mark - Threading - -- (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated { - [self showAnimated:animated whileExecutingBlock:^{ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - // Start executing the requested task - [target performSelector:method withObject:object]; -#pragma clang diagnostic pop - }]; -} - -- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block { - dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); - [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:NULL]; -} - -- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(void (^)())completion { - dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); - [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:completion]; -} - -- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue { - [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:NULL]; -} - -- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue - completionBlock:(MBProgressHUDCompletionBlock)completion { - self.taskInProgress = YES; - self.completionBlock = completion; - dispatch_async(queue, ^(void) { - block(); - dispatch_async(dispatch_get_main_queue(), ^(void) { - [self cleanUp]; - }); - }); - [self showAnimated:animated]; -} - -- (void)cleanUp { - self.taskInProgress = NO; - [self hideAnimated:self.useAnimation]; -} - #pragma mark - UI - (void)setupLabels { @@ -915,6 +874,50 @@ - (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay { [self hideAnimated:animated afterDelay:delay]; } +#pragma mark - Threading + +- (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated { + [self showAnimated:animated whileExecutingBlock:^{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + // Start executing the requested task + [target performSelector:method withObject:object]; +#pragma clang diagnostic pop + }]; +} + +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block { + dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:NULL]; +} + +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(void (^)())completion { + dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:completion]; +} + +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue { + [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:NULL]; +} + +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue + completionBlock:(MBProgressHUDCompletionBlock)completion { + self.taskInProgress = YES; + self.completionBlock = completion; + dispatch_async(queue, ^(void) { + block(); + dispatch_async(dispatch_get_main_queue(), ^(void) { + [self cleanUp]; + }); + }); + [self showAnimated:animated]; +} + +- (void)cleanUp { + self.taskInProgress = NO; + [self hideAnimated:self.useAnimation]; +} + #pragma mark - Labels - (NSString *)labelText { From e10a8efdfb0edbe8cd51316e9ce4d31607bee07e Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Tue, 14 Jul 2015 07:37:35 +0200 Subject: [PATCH 011/117] Adjusted data types. --- MBProgressHUD.h | 16 +++++++--------- MBProgressHUD.m | 20 ++++++++++---------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 393bbeb13..d2b4f9907 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -160,8 +160,6 @@ typedef void (^MBProgressHUDCompletionBlock)(); */ - (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay; - - /** * MBProgressHUD operation mode. The default is MBProgressHUDModeIndeterminate. * @@ -204,7 +202,7 @@ typedef void (^MBProgressHUDCompletionBlock)(); /** * The opacity of the HUD window. Defaults to 0.8 (80% opacity). */ -@property (assign) float opacity; +@property (assign) CGFloat opacity; /** * The color of the HUD window. Defaults to black. If this property is set, color is set using @@ -216,24 +214,24 @@ typedef void (^MBProgressHUDCompletionBlock)(); /** * The x-axis offset of the HUD relative to the centre of the superview. */ -@property (assign) float xOffset; +@property (assign) CGFloat xOffset; /** * The y-axis offset of the HUD relative to the centre of the superview. */ -@property (assign) float yOffset; +@property (assign) CGFloat yOffset; /** * The amount of space between the HUD edge and the HUD elements (labels, indicators or custom views). * Defaults to 20.0 */ -@property (assign) float margin; +@property (assign) CGFloat margin; /** * The corner radius for the HUD * Defaults to 10.0 */ -@property (assign) float cornerRadius; +@property (assign) CGFloat cornerRadius; /** * Cover the HUD background view with a radial gradient. @@ -247,14 +245,14 @@ typedef void (^MBProgressHUDCompletionBlock)(); * This may be used to prevent HUD display for very short tasks. * Defaults to 0 (no grace time). */ -@property (assign) float graceTime; +@property (assign) NSTimeInterval graceTime; /** * The minimum time (in seconds) that the HUD is shown. * This avoids the problem of the HUD being shown and than instantly hidden. * Defaults to 0 (no minimum show time). */ -@property (assign) float minShowTime; +@property (assign) NSTimeInterval minShowTime; /** * Removes the HUD from its parent view when hidden. diff --git a/MBProgressHUD.m b/MBProgressHUD.m index e810ec5ed..fb3d1fa3c 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -453,7 +453,7 @@ - (void)drawRect:(CGRect)rect { //Gradient center CGPoint gradCenter= CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2); //Gradient radius - float gradRadius = MIN(self.bounds.size.width , self.bounds.size.height) ; + CGFloat gradRadius = MIN(self.bounds.size.width , self.bounds.size.height) ; //Gradient draw CGContextDrawRadialGradient (context, gradient, gradCenter, 0, gradCenter, gradRadius, @@ -475,13 +475,13 @@ - (void)drawRect:(CGRect)rect { CGSize size = self.size; CGRect boxRect = CGRectMake(round((allRect.size.width - size.width) / 2) + self.xOffset, round((allRect.size.height - size.height) / 2) + self.yOffset, size.width, size.height); - float radius = self.cornerRadius; + CGFloat radius = self.cornerRadius; CGContextBeginPath(context); CGContextMoveToPoint(context, CGRectGetMinX(boxRect) + radius, CGRectGetMinY(boxRect)); - CGContextAddArc(context, CGRectGetMaxX(boxRect) - radius, CGRectGetMinY(boxRect) + radius, radius, 3 * (float)M_PI / 2, 0, 0); - CGContextAddArc(context, CGRectGetMaxX(boxRect) - radius, CGRectGetMaxY(boxRect) - radius, radius, 0, (float)M_PI / 2, 0); - CGContextAddArc(context, CGRectGetMinX(boxRect) + radius, CGRectGetMaxY(boxRect) - radius, radius, (float)M_PI / 2, (float)M_PI, 0); - CGContextAddArc(context, CGRectGetMinX(boxRect) + radius, CGRectGetMinY(boxRect) + radius, radius, (float)M_PI, 3 * (float)M_PI / 2, 0); + CGContextAddArc(context, CGRectGetMaxX(boxRect) - radius, CGRectGetMinY(boxRect) + radius, radius, 3 * (CGFloat)M_PI / 2, 0, 0); + CGContextAddArc(context, CGRectGetMaxX(boxRect) - radius, CGRectGetMaxY(boxRect) - radius, radius, 0, (CGFloat)M_PI / 2, 0); + CGContextAddArc(context, CGRectGetMinX(boxRect) + radius, CGRectGetMaxY(boxRect) - radius, radius, (CGFloat)M_PI / 2, (CGFloat)M_PI, 0); + CGContextAddArc(context, CGRectGetMinX(boxRect) + radius, CGRectGetMinY(boxRect) + radius, radius, (CGFloat)M_PI, 3 * (CGFloat)M_PI / 2, 0); CGContextClosePath(context); CGContextFillPath(context); @@ -730,7 +730,7 @@ - (void)drawRect:(CGRect)rect { CGContextSetFillColorWithColor(context, [_progressRemainingColor CGColor]); // Draw background - float radius = (rect.size.height / 2) - 2; + CGFloat radius = (rect.size.height / 2) - 2; CGContextMoveToPoint(context, 2, rect.size.height/2); CGContextAddArcToPoint(context, 2, 2, radius + 2, 2, radius); CGContextAddLineToPoint(context, rect.size.width - radius - 2, 2); @@ -752,7 +752,7 @@ - (void)drawRect:(CGRect)rect { CGContextSetFillColorWithColor(context, [_progressColor CGColor]); radius = radius - 2; - float amount = self.progress * rect.size.width; + CGFloat amount = self.progress * rect.size.width; // Progress in the middle area if (amount >= radius + 4 && amount <= (rect.size.width - radius - 4)) { @@ -771,12 +771,12 @@ - (void)drawRect:(CGRect)rect { // Progress in the right arc else if (amount > radius + 4) { - float x = amount - (rect.size.width - radius - 4); + CGFloat x = amount - (rect.size.width - radius - 4); CGContextMoveToPoint(context, 4, rect.size.height/2); CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius); CGContextAddLineToPoint(context, rect.size.width - radius - 4, 4); - float angle = -acos(x/radius); + CGFloat angle = -acos(x/radius); if (isnan(angle)) angle = 0; CGContextAddArc(context, rect.size.width - radius - 4, rect.size.height/2, radius, M_PI, angle, 0); CGContextAddLineToPoint(context, amount, rect.size.height/2); From 4b5966376f1df4c17f93baf784b603c1f4683458 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Tue, 14 Jul 2015 07:38:11 +0200 Subject: [PATCH 012/117] Spacing. --- MBProgressHUD.h | 1 - 1 file changed, 1 deletion(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index d2b4f9907..6fc3679ac 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -276,7 +276,6 @@ typedef void (^MBProgressHUDCompletionBlock)(); */ @property (assign) CGSize minSize; - /** * The actual size of the HUD bezel. * You can use this to limit touch handling on the bezel aria only. From 6afd859c27a1722976440fad3245739a601c7a2e Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Tue, 14 Jul 2015 07:54:53 +0200 Subject: [PATCH 013/117] Updated intro documentation. --- MBProgressHUD.h | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 6fc3679ac..7654927bb 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -65,16 +65,11 @@ typedef void (^MBProgressHUDCompletionBlock)(); * * This is a simple drop-in class for displaying a progress HUD view similar to Apple's private UIProgressHUD class. * The MBProgressHUD window spans over the entire space given to it by the initWithFrame constructor and catches all - * user input on this region, thereby preventing the user operations on components below the view. The HUD itself is + * user input on this region, thereby preventing the user operations on components below the view. To allow touches + * to pass through the HUD you can set hud.userInteractionEnabled = NO. The HUD itself is * drawn centered as a rounded semi-transparent view which resizes depending on the user specified content. * - * This view supports four modes of operation: - * - MBProgressHUDModeIndeterminate - shows a UIActivityIndicatorView - * - MBProgressHUDModeDeterminate - shows a custom round progress indicator - * - MBProgressHUDModeAnnularDeterminate - shows a custom annular progress indicator - * - MBProgressHUDModeCustomView - shows an arbitrary, user specified view (see `customView`) - * - * All three modes can have optional labels assigned. + * @attention MBProgressHUD is a UI class and should therefore only be accessed on the main thread. */ @interface MBProgressHUD : UIView From 5e99b1b7ba4d2fde09f813ebe01df48806c8668a Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Tue, 14 Jul 2015 07:55:07 +0200 Subject: [PATCH 014/117] Added main thread assertions. --- MBProgressHUD.m | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index fb3d1fa3c..59250317a 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -37,6 +37,8 @@ #define kCFCoreFoundationVersionNumber_iOS_8_0 1129.15 #endif +#define MBMainThreadAssert() NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); + static const CGFloat kPadding = 4.f; static const CGFloat MBDefaultLabelFontSize = 16.f; static const CGFloat MBDefaultDetailsLabelFontSize = 12.f; @@ -47,10 +49,10 @@ @interface MBProgressHUD () @property (nonatomic, assign, getter=hasFinished) BOOL finished; @property (nonatomic, assign) CGAffineTransform rotationTransform; @property (nonatomic, assign, readwrite) CGSize size; -@property (atomic, strong) UIView *indicator; -@property (atomic, strong) NSTimer *graceTimer; -@property (atomic, strong) NSTimer *minShowTimer; -@property (atomic, strong) NSDate *showStarted; +@property (nonatomic, strong) UIView *indicator; +@property (nonatomic, strong) NSTimer *graceTimer; +@property (nonatomic, strong) NSTimer *minShowTimer; +@property (nonatomic, strong) NSDate *showStarted; // Deprecated @property (copy) MBProgressHUDCompletionBlock completionBlock; @property (assign) BOOL taskInProgress; @@ -133,7 +135,7 @@ - (void)dealloc { #pragma mark - Show & hide - (void)showAnimated:(BOOL)animated { - NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); + MBMainThreadAssert(); self.useAnimation = animated; self.finished = NO; // If the grace time is set postpone the HUD display @@ -149,7 +151,7 @@ - (void)showAnimated:(BOOL)animated { } - (void)hideAnimated:(BOOL)animated { - NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); + MBMainThreadAssert(); self.useAnimation = animated; self.finished = YES; // If the minShow time is set, calculate how long the hud was shown, @@ -295,7 +297,6 @@ - (void)setupLabels { } - (void)updateIndicators { - UIView *indicator = self.indicator; BOOL isActivityIndicator = [indicator isKindOfClass:[UIActivityIndicatorView class]]; BOOL isRoundIndicator = [indicator isKindOfClass:[MBRoundProgressView class]]; @@ -507,11 +508,8 @@ - (NSArray *)observableKeypaths { } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { - if (![NSThread isMainThread]) { - [self performSelectorOnMainThread:@selector(updateUIForKeypath:) withObject:keyPath waitUntilDone:NO]; - } else { - [self updateUIForKeypath:keyPath]; - } + MBMainThreadAssert(); + [self updateUIForKeypath:keyPath]; } - (void)updateUIForKeypath:(NSString *)keyPath { @@ -921,50 +919,62 @@ - (void)cleanUp { #pragma mark - Labels - (NSString *)labelText { + MBMainThreadAssert() return self.label.text; } - (void)setLabelText:(NSString *)labelText { + MBMainThreadAssert() self.label.text = labelText; } - (UIFont *)labelFont { + MBMainThreadAssert() return self.label.font; } - (void)setLabelFont:(UIFont *)labelFont { + MBMainThreadAssert() self.label.font = labelFont; } - (UIColor *)labelColor { + MBMainThreadAssert() return self.label.textColor; } - (void)setLabelColor:(UIColor *)labelColor { + MBMainThreadAssert() self.label.textColor = labelColor; } - (NSString *)detailsLabelText { + MBMainThreadAssert() return self.detailsLabel.text; } - (void)setDetailsLabelText:(NSString *)detailsLabelText { + MBMainThreadAssert() self.detailsLabel.text = detailsLabelText; } - (UIFont *)detailsLabelFont { + MBMainThreadAssert() return self.detailsLabel.font; } - (void)setDetailsLabelFont:(UIFont *)detailsLabelFont { + MBMainThreadAssert() self.detailsLabel.font = detailsLabelFont; } - (UIColor *)detailsLabelColor { + MBMainThreadAssert() return self.detailsLabel.textColor; } - (void)setDetailsLabelColor:(UIColor *)detailsLabelColor { + MBMainThreadAssert() self.detailsLabel.textColor = detailsLabelColor; } From 3c7c146ebfc9bf48731db58a591e2ffeb0e7700a Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Tue, 14 Jul 2015 20:48:01 +0200 Subject: [PATCH 015/117] Using a launch storyboard for the demo app. --- Demo/HudDemo.xcodeproj/project.pbxproj | 20 ++++++++- .../xcshareddata/xcschemes/HudDemo.xcscheme | 13 +++--- Demo/HudTests/Info.plist | 2 +- Demo/Info.plist | 4 +- Demo/en.lproj/Launch.storyboard | 44 +++++++++++++++++++ .../xcschemes/MBProgressHUD.xcscheme | 13 +++--- 6 files changed, 82 insertions(+), 14 deletions(-) create mode 100644 Demo/en.lproj/Launch.storyboard diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index 4a513aeb9..c832b8322 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -29,6 +29,7 @@ D28CBB321A87A45A0052DCEC /* HudTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D28CBB311A87A45A0052DCEC /* HudTests.m */; }; D28CBB381A87A4A10052DCEC /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D22F7D800F85241C00550BB3 /* MBProgressHUD.m */; }; D2A6FD1D13ABC5A200BFE4C9 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D2A6FD1C13ABC5A200BFE4C9 /* Default@2x.png */; }; + D2EEB37B1B558F0900F59EC1 /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D2EEB3791B558F0900F59EC1 /* Launch.storyboard */; }; D2F88CD6115E9F7F00E6DB82 /* 37x-Checkmark.png in Resources */ = {isa = PBXBuildFile; fileRef = D2F88CD5115E9F7F00E6DB82 /* 37x-Checkmark.png */; }; /* End PBXBuildFile section */ @@ -72,6 +73,7 @@ D28CBB301A87A45A0052DCEC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; D28CBB311A87A45A0052DCEC /* HudTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HudTests.m; sourceTree = ""; }; D2A6FD1C13ABC5A200BFE4C9 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "Images/Default@2x.png"; sourceTree = ""; }; + D2EEB37A1B558F0900F59EC1 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/Launch.storyboard; sourceTree = ""; }; D2F88CD5115E9F7F00E6DB82 /* 37x-Checkmark.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "37x-Checkmark.png"; path = "Images/37x-Checkmark.png"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -184,6 +186,7 @@ D277FDBF11FC880100304321 /* UI */ = { isa = PBXGroup; children = ( + D2EEB3791B558F0900F59EC1 /* Launch.storyboard */, D286A7341518C53500E13FB8 /* HudDemoViewController.xib */, D286A7381518C53C00E13FB8 /* MainWindow.xib */, ); @@ -261,7 +264,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = MB; - LastUpgradeCheck = 0630; + LastUpgradeCheck = 0700; ORGANIZATIONNAME = "Matej Bukovinski"; TargetAttributes = { D28CBB2C1A87A45A0052DCEC = { @@ -279,6 +282,7 @@ Japanese, French, German, + en, ); mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; projectDirPath = ""; @@ -308,6 +312,7 @@ D24A23071780ADDA0020310A /* Icon-iOS7@2x.png in Resources */, D21D40801611CF6C005FCE55 /* Default-568h@2x.png in Resources */, D24A23061780ADD10020310A /* Icon-Small@2x.png in Resources */, + D2EEB37B1B558F0900F59EC1 /* Launch.storyboard in Resources */, D24A23091780ADE90020310A /* Default-iOS7@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -369,6 +374,14 @@ name = MainWindow.xib; sourceTree = ""; }; + D2EEB3791B558F0900F59EC1 /* Launch.storyboard */ = { + isa = PBXVariantGroup; + children = ( + D2EEB37A1B558F0900F59EC1 /* en */, + ); + name = Launch.storyboard; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ @@ -382,6 +395,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = HudDemo_Prefix.pch; INFOPLIST_FILE = Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = HudDemo; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -395,6 +409,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = HudDemo_Prefix.pch; INFOPLIST_FILE = Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = HudDemo; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -414,6 +429,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; @@ -486,6 +502,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HudDemo.app/HudDemo"; }; @@ -515,6 +532,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HudDemo.app/HudDemo"; VALIDATE_PRODUCT = YES; diff --git a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme index 3e25c0eea..b96c43807 100644 --- a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme +++ b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme @@ -1,6 +1,6 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> @@ -62,17 +62,20 @@ ReferencedContainer = "container:HudDemo.xcodeproj"> + + @@ -90,10 +93,10 @@ diff --git a/Demo/HudTests/Info.plist b/Demo/HudTests/Info.plist index fc755afa6..ba72822e8 100644 --- a/Demo/HudTests/Info.plist +++ b/Demo/HudTests/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.bukovinski.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/Demo/Info.plist b/Demo/Info.plist index bbbffe1fc..5c95018a4 100644 --- a/Demo/Info.plist +++ b/Demo/Info.plist @@ -18,7 +18,7 @@ Icon@2x.png CFBundleIdentifier - com.bukovinski.${PRODUCT_NAME:identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -59,7 +59,7 @@ UILaunchStoryboardName - MainWindow + Launch UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/Demo/en.lproj/Launch.storyboard b/Demo/en.lproj/Launch.storyboard new file mode 100644 index 000000000..13ffa5a5c --- /dev/null +++ b/Demo/en.lproj/Launch.storyboard @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme index 6033e19d9..67fc5f46e 100644 --- a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme +++ b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme @@ -1,6 +1,6 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> + + Date: Tue, 14 Jul 2015 20:48:36 +0200 Subject: [PATCH 016/117] Removed default images. --- Demo/HudDemo.xcodeproj/project.pbxproj | 20 -------------------- Demo/Images/Default-568h@2x.png | Bin 29486 -> 0 bytes Demo/Images/Default-iOS7-568h@2x.png | Bin 11868 -> 0 bytes Demo/Images/Default-iOS7@2x.png | Bin 11318 -> 0 bytes Demo/Images/Default.png | Bin 11580 -> 0 bytes Demo/Images/Default@2x.png | Bin 28032 -> 0 bytes 6 files changed, 20 deletions(-) delete mode 100644 Demo/Images/Default-568h@2x.png delete mode 100644 Demo/Images/Default-iOS7-568h@2x.png delete mode 100644 Demo/Images/Default-iOS7@2x.png delete mode 100644 Demo/Images/Default.png delete mode 100644 Demo/Images/Default@2x.png diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index c832b8322..31861a119 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -12,14 +12,10 @@ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 28D7ACF80DDB3853001CB0EB /* HudDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* HudDemoViewController.m */; }; - D21D40801611CF6C005FCE55 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D21D407F1611CF6C005FCE55 /* Default-568h@2x.png */; }; D22F7D810F85241C00550BB3 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D22F7D800F85241C00550BB3 /* MBProgressHUD.m */; }; D24A23051780ADCD0020310A /* Icon-Small.png in Resources */ = {isa = PBXBuildFile; fileRef = D22568E61780AA77008D5939 /* Icon-Small.png */; }; D24A23061780ADD10020310A /* Icon-Small@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D22568E71780AA77008D5939 /* Icon-Small@2x.png */; }; D24A23071780ADDA0020310A /* Icon-iOS7@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D22568E51780A9C6008D5939 /* Icon-iOS7@2x.png */; }; - D24A23081780ADE60020310A /* Default-iOS7-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D22568E31780A913008D5939 /* Default-iOS7-568h@2x.png */; }; - D24A23091780ADE90020310A /* Default-iOS7@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D22568E41780A913008D5939 /* Default-iOS7@2x.png */; }; - D277FDB311FC834200304321 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = D277FDB211FC834200304321 /* Default.png */; }; D277FDB911FC877E00304321 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = D277FDB711FC877E00304321 /* Icon.png */; }; D277FDBA11FC877E00304321 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D277FDB811FC877E00304321 /* Icon@2x.png */; }; D286A6801518736B00E13FB8 /* 37x-Checkmark@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D286A67F1518736B00E13FB8 /* 37x-Checkmark@2x.png */; }; @@ -28,7 +24,6 @@ D286A76D1518CA9F00E13FB8 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D286A76C1518CA9F00E13FB8 /* CoreGraphics.framework */; }; D28CBB321A87A45A0052DCEC /* HudTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D28CBB311A87A45A0052DCEC /* HudTests.m */; }; D28CBB381A87A4A10052DCEC /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D22F7D800F85241C00550BB3 /* MBProgressHUD.m */; }; - D2A6FD1D13ABC5A200BFE4C9 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D2A6FD1C13ABC5A200BFE4C9 /* Default@2x.png */; }; D2EEB37B1B558F0900F59EC1 /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D2EEB3791B558F0900F59EC1 /* Launch.storyboard */; }; D2F88CD6115E9F7F00E6DB82 /* 37x-Checkmark.png in Resources */ = {isa = PBXBuildFile; fileRef = D2F88CD5115E9F7F00E6DB82 /* 37x-Checkmark.png */; }; /* End PBXBuildFile section */ @@ -54,15 +49,11 @@ 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* HudDemo_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HudDemo_Prefix.pch; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - D21D407F1611CF6C005FCE55 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "Images/Default-568h@2x.png"; sourceTree = ""; }; - D22568E31780A913008D5939 /* Default-iOS7-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-iOS7-568h@2x.png"; path = "Images/Default-iOS7-568h@2x.png"; sourceTree = ""; }; - D22568E41780A913008D5939 /* Default-iOS7@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-iOS7@2x.png"; path = "Images/Default-iOS7@2x.png"; sourceTree = ""; }; D22568E51780A9C6008D5939 /* Icon-iOS7@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-iOS7@2x.png"; path = "Images/Icon-iOS7@2x.png"; sourceTree = ""; }; D22568E61780AA77008D5939 /* Icon-Small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-Small.png"; path = "Images/Icon-Small.png"; sourceTree = ""; }; D22568E71780AA77008D5939 /* Icon-Small@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-Small@2x.png"; path = "Images/Icon-Small@2x.png"; sourceTree = ""; }; D22F7D7F0F85241C00550BB3 /* MBProgressHUD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MBProgressHUD.h; path = ../MBProgressHUD.h; sourceTree = SOURCE_ROOT; }; D22F7D800F85241C00550BB3 /* MBProgressHUD.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MBProgressHUD.m; path = ../MBProgressHUD.m; sourceTree = ""; }; - D277FDB211FC834200304321 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = Images/Default.png; sourceTree = ""; }; D277FDB711FC877E00304321 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = Images/Icon.png; sourceTree = ""; }; D277FDB811FC877E00304321 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "Images/Icon@2x.png"; sourceTree = ""; }; D286A67F1518736B00E13FB8 /* 37x-Checkmark@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "37x-Checkmark@2x.png"; path = "Images/37x-Checkmark@2x.png"; sourceTree = ""; }; @@ -72,7 +63,6 @@ D28CBB2D1A87A45A0052DCEC /* HudTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HudTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; D28CBB301A87A45A0052DCEC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; D28CBB311A87A45A0052DCEC /* HudTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HudTests.m; sourceTree = ""; }; - D2A6FD1C13ABC5A200BFE4C9 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "Images/Default@2x.png"; sourceTree = ""; }; D2EEB37A1B558F0900F59EC1 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/Launch.storyboard; sourceTree = ""; }; D2F88CD5115E9F7F00E6DB82 /* 37x-Checkmark.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "37x-Checkmark.png"; path = "Images/37x-Checkmark.png"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -172,11 +162,6 @@ D22568E61780AA77008D5939 /* Icon-Small.png */, D22568E71780AA77008D5939 /* Icon-Small@2x.png */, D22568E51780A9C6008D5939 /* Icon-iOS7@2x.png */, - D277FDB211FC834200304321 /* Default.png */, - D2A6FD1C13ABC5A200BFE4C9 /* Default@2x.png */, - D21D407F1611CF6C005FCE55 /* Default-568h@2x.png */, - D22568E31780A913008D5939 /* Default-iOS7-568h@2x.png */, - D22568E41780A913008D5939 /* Default-iOS7@2x.png */, D2F88CD5115E9F7F00E6DB82 /* 37x-Checkmark.png */, D286A67F1518736B00E13FB8 /* 37x-Checkmark@2x.png */, ); @@ -302,18 +287,13 @@ D286A7361518C53C00E13FB8 /* MainWindow.xib in Resources */, D286A7321518C53500E13FB8 /* HudDemoViewController.xib in Resources */, D2F88CD6115E9F7F00E6DB82 /* 37x-Checkmark.png in Resources */, - D277FDB311FC834200304321 /* Default.png in Resources */, D277FDB911FC877E00304321 /* Icon.png in Resources */, D277FDBA11FC877E00304321 /* Icon@2x.png in Resources */, - D2A6FD1D13ABC5A200BFE4C9 /* Default@2x.png in Resources */, D286A6801518736B00E13FB8 /* 37x-Checkmark@2x.png in Resources */, - D24A23081780ADE60020310A /* Default-iOS7-568h@2x.png in Resources */, D24A23051780ADCD0020310A /* Icon-Small.png in Resources */, D24A23071780ADDA0020310A /* Icon-iOS7@2x.png in Resources */, - D21D40801611CF6C005FCE55 /* Default-568h@2x.png in Resources */, D24A23061780ADD10020310A /* Icon-Small@2x.png in Resources */, D2EEB37B1B558F0900F59EC1 /* Launch.storyboard in Resources */, - D24A23091780ADE90020310A /* Default-iOS7@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Demo/Images/Default-568h@2x.png b/Demo/Images/Default-568h@2x.png deleted file mode 100644 index d2d6399aad90ef804ca8d85ff00ee336fdec690c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29486 zcmZ^LbzGBQ__hLyh+v=~jUpf|ATd%!2`ME;gLE@t^nigVNOzY=NerY0qY`InR0SxUTzI=m&L0s@n{=uU)%FrL6Q;^V&6%fNR&t zKHnm_`sHNTRrlJpSJ#x^zSj1-zB5Pe%dDHZ;c_xx>Ri$=;|g*KWiFgl*SN)ffkIe)feczXEBO#hQ7#q~G0o;;x_@_2xy#R~LnHF+9u7B>=Y^API;%*NbF zyB582Pcjf9HUq>yEXy1*K?F=n8j;=Fhv+R_M{^adE4=NZ8eC!}yZ7qab+UVP86;(8 zr)$$AX>lTnH@Zkjf=M{=1BOjjgf0GLkz4Lh0JxnTQe z%j`XpxPYEk-GfY)fd)8 z;zf+A?~R3oXdQQu#`;@=!kahk@^9KNCU&;=4oume@_3Yz_?4BlwY}DtjD2OzQCT}N zH7x=B_8LRO^t44Y=UApj59Fz63W}Cgy#2OAU29!$bWb*UR^O~Cfnu{sh=O~Iso;K{ z0$H%!S3Fu{g{Ru)Y;^97=IF?qMflL;xB>qRdgmD1+k%O;yf{G;+gHI{zRQV5^Km12 z*FDSiZEW8rRIg)Da;ei1q$bJ@mwuOiO_w9xZGs0%=9%uQtZ{2*oEF)@umNYaqG)?(%)5Ha!DXvFBO=Xz* zjh#&FOgwm$TZ>snC!zv&x{(C*;wxgJ>|TQWbLHrzj}>OILTzmpYg4Taa@fI@EhPaL zclYB{w>zf|9QhH?KH*5k9(?|KvB@CR==rk?c2xN=COR~0fVQgmY*kg+I5~e>8Tgdd zS7FZ`dy1&X<9)2reR^qfo`-)BOJ;o>B?rNaFRlWERrsRsLP2K%k8=xk}-(Mbm8Y^M97n0r}ND&UE7gVH3y@>2i3 z#Ji;=sHdA--bMGLXIsY8*lG3%1duE?NixKatn7Z^@mWmBeiJ{B@G?(zVMEtRulRiV zul<<2M-_h}p;UTNQxHi*<4l+c*m~94#&SSuuumyE;`=X0iI@`w{U* zW@cu*$^3B(dwW^CQg?mbFkhG!LcS@IhXlJmchqeTE7#>Wd`Lqh>fAbzB`?Zf;~&=X z_G?*--M4>-0!slQNotYpnSC8p)&QS1-wTUm?7nSggnlfw)YZ}1y+1qU%{T!ge8RRd zH{1;ge&reuv?p4xDL#;@vCrraWkU zhUR2EJ<2phR!P^leE;I!THm~KZp$kXD*RC5ZuYl#ZyO+xXKgrse{M?ja+DD&7CZ;V z<#RpDxZpp-fgju41A;tlrmHtJE>ZD^E)~>Lt?m82J;<{^RngFGyxg9Pdy#IOK>jW( zn0ZRGM5l5Jb=+0DhIyDgI&kSH(9>L7X6S=2sL|ZCoQ}W8iv4E8GFP$PN{-if4DdR0 zJ4V|*ukmHN4!C>~iyhty>qO@d%a}|#RSE;`HNOB_T3U$a@0u)VN*`IR>guWl`AS-< zYBU|S@l&o3!fAWHitg%#ijD#?8=HR$mSnVh&}L>&dMGNuu7x4N5qHvKa*x;xZ=*?- zf#R~l3gT_WPIiQgcANRwk`5FTw}=R@sKg|})5drHtkfCSK}N!Gqc4k_h}7^@4BuHa zIqm!!{O&3Wq(8}Xb@(F`)1oz`px{yiT>}p)7;=3K3ASgPDc(wh82OEAJ+QVaOt&fi z)7~zNKh9mi4GV?@OUnbEWdW4l%POu84LxS!&Q@s4fv*613?A6jxdg5uT&IL$Q!9aQ z-M(ZDo>Wzr)*oJ8a`jVfZ@5kow)$5->Kju(`|{<@7t0hErC%q3wqB0 zA`PaVknjv~F-A^OQg(|6mIm{F^iZ3D(qboHbW{6?nPo;mUu;!#^PHoz$y#toEpqRu znoQ%5h%Recf7-FQ86NyRVNZ9ope*Jw>(SUHW8b#fNH98leOE@``Qc|t-^AFUVYAm; zlaJ_)Q{+I+205ZmlurFNB!LdEU!50T5LR?sK7V64I@u>qpVP$jz7&?pxOn5M_#P)k zk~DWP12VC)GSw}|Cxcjj{c@^g;0K&lG)yQeJhlk8{Mudltx6*?;!akA1|7nYulD(! zW5lydWMSmRHx>5PMWY9w->QDOa6qkWIc~eV_f#|S{pGN#t2f{%^KI?10eV?x5cA)4 z`}4xIMD^#O^o414Bxj~v)g0Wrt4 zP*=Tr<7WGLsQc6R=C;^Qi>#l!6 zRQ0*%Yw>1|+U5eXq4(=<-ryuCy4gkQZYQre0=D8?80d=~_o7PN&l$xY(b2meP3r(R z=@w>njpc+_Co}X%htAK*6Qm1G_Kf<4-(%!;VJowzSuh++_v#c2y1ok1_%pMJvHWGWUEc ze=NJ1q3f-{sPYt6hAnT0yy@a|IJ-^cT}A(D%I@83l_k~AC$4s(&$4uDS)J{~Pucpj z6&7QZwyns51brGFMo<`eT*{FJ(maB^9jPcZWXwShYY9>~~)W ze?4P-A@{&;gh>AxEBexFk1eiOwOJ=AL3iD1@Wr~IY2)G|H@yp>GAJcEm5El&m9*l{ zTz33=W7nb~7x-SC3mM@AMAQ?5H_V)jFiI60&cdm%o@9-m)uWga)9{rXk3?Pf#^9BW zd^{yG?m5yg$LiuNcW#j1MB0Q!T#vfNa+WK1?&}(NIna$(!R)sj!PiZFYYO@~LUJon zao@lwKGSD3na0M2gO?jB*-&9{r<*soT;S`jWWEfv&E`&Hsgzim7$tFW9V7~;=Q>8W zzL8y|9qjcx3v95gh9lg7&ZpBlz33Mw9j2FSlT$y>68Mgcs)-x&m$}??r5y_`fr8W-}#SV_%xJ*(QvrHT$Qb@E(2J<8xAj2&#!o@8lYnSF?U0IZ0Q-pw3SJqb+ zD8Gy_jDFLOW#X4G);sKRau`+6Ffe&umViVvT_>j{%mFTlyEd3@K^u3wm!}v?C|Rhk7476y7stM* zMB1m%U=0{w3UXQL6O6X=xdKFc?aW`EbyxZ$=Evt`G3H*;A3AjlIs2;&W~PT_G^;Lb z+-P`;x2=A=Egvv{*tFw5jBQ&>WKo{Sf$8)*)ajB22bh&xQ9votFz;I%4_`n^hub2v zdB-1AdDQp=vV1?y6zn(uo}(RE5M6wTHrhA@=i9s6^OrY4-}-Tn=De0~AxdS(wHSi^ zZE8yjnmGhGh54ttC6|_#24!&vazwnwRXp6;DDrr|7)uT}n3~Y@R6=C8*%kRzs%{CD zY;D>vG&*<889EEu9}r?ML%Ud;1kIWzCn)*F2#DYaepW)xv z#Q8DnTCVBPZtQN=SzIE2DXpM{y$6tiEAO%dUd}#5Oqz)*dtmzVi$d9JCy_r3S^U_Z z{RR8TBUjOuerQj*qYFWQ+Ev7NZ>Y zXMsU5v&Oft$^(uEd8glvpA*;8Y^Kl%^G9!cHJj+Y?;P|sGo4y?I%hDy;pB_wB>7)$^R0zYc*!TZDoeo*&N zG}RY~rLyb3521`exYa3J)93!0`ZIYD0IPL+kxQ3=^8I|^ree6hlW`Rm26|MJ`EO79 zYzOBS3Or9=X(23esvc**QckKZ+nv4~2GmNsXx_|0)IazspXG&FqTeh+!Owt6NpZ)m z#2f_sHq<*-OR2 z#OI>XUt<940zfCDrcZU2t(6><9<2N^fe-aJ58HEVBg|dTq%I2WVdh_7^d1S4Or!)1 zi{wM8J%@S6RmRU1iL?sK(=Xp#T;%6*K&U6CrzJai>>_v=j5+B<(M$%~+N!UWBV*mj z$vyU@o@yk;9P>sG@$lUdruqHyDfg4IY7dF)ythb$=2U!sfm#ceZC70c29;wpt`lQ*Ih5dRqOg7mLk~ zMUOlH>}H6wA8sn{Q)vloL^at5Jlm8zo23~fE=P`}0ljJSXPkgmM%?S`2KP2RPaK=P z6TP>iE^hRWUk*p@+szG{F4#~h#;tdz-muOq)aQ_u_VU;trd(5*V)yl$Q5*i)dEMF3 z@wjtbh1&F2)q5Y#1QUDhU(Lr4F{u~FK+pZe z_Fv6nZ8}z011InFPbOhB%L8VEt31Yqt2}#*W%^+#ZYGTeA0NE5phDp)Jsn1e5mQ{= z(o!}o(O^N)9((D$;E5s3D0T|Oy+ubc;XQU%K`NeXUrYeuL!R5Q17hj&)}i=aK%E3+iTi^0SQ1j?=6A5xuj~s4z7& zC}{Qbf zh|Erf>(s(b9mQOymT~L1!!0Zn;BQ>3K=A^wZ@>?n_v%JSbgRRQ6QL{nguk=2I8yEP zbdgKu>*CdJ13io`DXB6|J44>v)MP4(&Zn2{gR*9k{O4<6kcZm|*{LV-a9>8m=bK$# z>8ysn&J3Hz;}@ps_*=rTz2ItibW}SN)r)z}L0YQ)qPrat{sIxe#S2s1^UynYlY<@+ zPo&DF+Yo_)E&jysvxR0+;d{H_mP5jl$U7YcDRKp8`K^6QNiA&`_%C6oM`u$lEUD}I z`#IsQ_rQd?RNlG}u{O0IDNorg^7qew2Z8zD+0d-nA7 z+)lIP*$=pnV3NIx>v$S{S~z=7$&hA)&@qjS_56+~Ck=*-UK zV8xO0P-wa5+9syhhkjMC9DTjSbD^TgU}9rrUM+6iDp)6gf~-vR`exSE_W2NBKQKTjyx7R(u405ACg|;fvW@H}z>M=Tgm@W2YZb zYHga+@Y^yg*&2Dj!by&c`va(Q?N7B4F!Dubl4{OBjzaHIG5gk!_n*5SzwW~2(K zInY%;=Es_(`j%u%X~FTN_s@& z@RZc#lpyvYLbxE>$XrQ7ZQgIuR?%?fGf9$}&m0ysXFLAE7-S?+F9u!ZJBCO0u9h1* zWm#ICaE#t!JE$PL;P^Bp549N#Eo6NRn5%XhzDU{l)kGdmo2=8_YE54WS;)NGhwK$w z=~-H7)1tF7Kz1uV1zS5fq)R_giAw1wYqYF#xf_RDfxM8dx2z<}m}*uzryi=Z;%?7x zN?~=zUUp|baYgB}&|(x#eLH=hF2;^tRekQhm9d=g<~zFrxU0VK>qj1v}&*svPrw{tfX-X0`bq(3r=O%50p$zGY*|tKGUFZ9LGtNB&Ox|&Q zZMlUDGM`_o6T4p(e*bI{q7ghNbJFc6<*_RVX?`v(?Y7PDAP!@t59EN}FTBlD>Qh!j z0SMC3{K%`pSIfXjl~n53WJwaZ{jT+b`X)fE$(1T=aYFh`rFEokr1&Nvq|xzp+0+N+ zT3~05=;fRYSKsR#S6TySa74t5z0#O{O@0A>K>=9Iwt@x-< zXzF4r)kWx|YYKtf^z1lxr4Sw7g?=JSx!#|YNm^v=JT%889%FQpoo9Dwe=547B7BA1 z@h^B2#GQ<(b8X6f7%4XR*dQ^kgHR3Kl3z=HxQX0Z|ECk7g86pB?av zsgooqojMD6wM~K1l72*q^-Nt{Q)bAK+HGu>i$HxhGqi40M0C zrKhtW-)yK_gch9~_!PaK8>rk0-oLzPil;-4iz(52JMIsfEU=6F>)pSc06l8pqj3#F z3C>G?_^=!*FpgA7H4F2 z10)&A#P`QBamhisFd99~gtNd2}AGP=D(-vh+Kp_FrNBi_2b7mAo@@&!JKrKi4iqN}8qGcLD zCVjGC0l)W8c9G#B+jY|*&~3Fh|Hh`AU&$5`S*pJMCp+=u8pRodua@nD|H!~Gx?7HR z>v+`y!p#5bb|86@FUmh*kZybTpU9PZ6SlnkAofLWqCi#P|0v0L^<6qT<^M5{NRlTQ zwG~~!v!(x`0AI0Le!ox={EwD=wOCB4M8ZjG>h4bRpYgK?R|YXQQ(pVG61E@m0pu%Yy!TTiF{^J!l?ky_o{eQ3BqF=qbI{SY|22p;dI=i`l%~AH>`~fW2)n9MB zaPj<)F#@khn%ktVrAPl~sA2$FX;-|_+iZeCYzW%&8v!9SsEfs961%bi_h4(M0>Z-wlw+_o}%x=-wN74aQk zM4|$h9~7Vm()R0=GN;Bq80wh(9H=PJ8WkB4se~o_o9kQkh5lGv{Qmvd_wMfR-5Ykw zJ#B4I;3TNt&*|uuCboKBz=0hXu+A`UG|`HV*&)V#)Y?)%{NisV z@=RR`)t3qo2Mv5lne(OCRnJu>8YTiQ}s$c=De{QHq(@*mhsk^zmPom=T!*xq_dL_j4_!p&^AJL?z z$~c^U>9~JCwpk@r z&rxK4bGW6tmZIqg?Xa3|4Ze~H!0`GW$jQOM&dI^fj+aMZcN@#|MH!1Qy)!kl0i4e!K!Ttb|4NlfxYZh(cjtw$HxO`O#D@WOb)gY_C3 z)Hcfo_4{hF*}49r3KP*f@|#km1^PFbxXvNdn&vwy1~(f$SeY3eO}W^94DLER?AtnQ zKYz|s26KoZX?yYnOv@MBL`KBZHtPtjpFg_gyH^u50ot}hum*nrgw6E?edc4M-*zBg zWTG9!00N>mDD9-VMrlyH!Fs$a>yC`U@GJG`v&YWva{KR?x6Re^9HO~PBO zJQx#B{!rLE-muaxBjPEC!b-ky zvUk4hpC?galWimh!nR?_!o$N;CrI*vWXDqTk5BeO_A7~MQ&DD2jE>`r5+4_as0Q;N33h`>~!N-_wnDyo-H$j9FynMVTrwa zSZ$kZ2F(`5UJX9H4{|#tWdpxI?>Y#dA?|H2NPD{x>kap`X>S_6$-IAm2|MeJM?O+% zK4B$-F&lwnoBFPm#<2L!ZS~d)Mx_O?Y^{Y;)~IVai$kI|=NJjnaWGE{b{$^B)azCJ zIqkig^7&uCnZ0?B?UM4Aqvi7X$(HRos@nN}m)|tw+UZ@Qi$$kV1~V%}5&O9`bVGDv zUpKM_Swa&O6l51F6gN1Qx>fCaQFKx=YF`nmN={CGIhEXUkW4%P!QVRya%m>&bIORK zS&3U3#0BUD7NMo+G_lTULcvjf|LO^46S?I2RG2@{3($FC0=q7ck;`VCF@Pt_c64Rj zXQ4fv`YMx-k( zSN$bQr(C~TDbpf5Df(%7^b2Uk&h~j@R8*MHRs}gWvn(_WSpM7CC)4%#AhnPcKUeMx zgZ8|aQ^d(qnRSXjUmT*!+XwXN%gym@H zemUWAq0-f+t1}v`HVxI`YdXE*MSEOBWHC0UyxIiVWBU79u?&J1KbXkx^zJH_WY_l& zp2tDQ3%^TsPWvxr_~fVyOnnO`Q&jx6ZuN|#Lve;DTSf%C+qAwq|IC3<=l=fN6~K1i z>h1z?m${!7!IN@#eb_f8J}w!`%D18I3sDbkN?wY|2mVRUYSj)rbu&Iaq|iNO0< zt)AAkcl+h0fY0$)mC{v9!kp_AK909SN4D+sF7=%{qq!ylT_s!Fx0YiZMh-6-_P6%7 zcM};Qma7L{u%(r=&u<`ys#7@A&#G-b5j|7@odpB4ZckIpR7Yj_4a%%DdxrN;QCCZsH0R%{FrDz@%W zQZ;*yF6WVzi}k*%DTl7Fqs;zp=92sP)R+F)6sfGjM0_+b&fI;suA!4?%CsRKoY-&L z=sG}xpWN>}PfJ5;B0TeRo8HA$Ka6ji5fXCI^nPRhes2dy0K*?um(?3NKTD*!vzGLp zkaF zzKg=dQs_5TG#l(G$DgLBgA!vZ8n}x_Le~n^2bs3#XM13KSBL6N2m+YCdj4J5NzDhg zs{N-Vpe9Xn=^@I7KcskJ8a#bk%O;gOy8Kgko=`ii7KXE?hqgAGMmh$qP5`q#9oY(h?5{%L;+@+34f1N4T=7_ z)IqME$d{5zyL>qmvAJ0!8p*u1g{l@60%n#q6U03-{kP`F+mJ`}mXbWullF#w#yU2T z5*?kl+HRdgJ85Af79k!;mz-zOV+pGp8%ls;I575)v*!YWCZso9P>+|Bi>vdkqOQ&a zytbwrq~qTG?rh=#+gAa-Q}B2G}srai)Rfd`Ji+-|r6-T6yG8)YRVPb^@QoAch&ApOEg&I$lK$x2g&@CLg$yE3)yD*Y=S11FuS z>8||`>v!(lL4M$Nk8-)8w+m3OXzWymz?eSh=mS5dW+tzACxr0rZ!>17X3CT`V~}Z$ zj^+4J8&wU5O?taok!ZPxblZTe=S7Zn9}HZNTgf-=iZEuixV4(4rB3~}+IcxWlr7T= zQbXSOB(%MO;~Ss;OVhn>WPcB`ANf5>jOTuQaoThxh6fRSB);F+LJSfITlbsRjo~QN z;`F1LXZ3ZBE3C&y@OzCGo6Fx^Sw>3p>Z*|O|yQp^>{d!R?XYmW-B+-P7=bOJ( z1#&Jm)!r$$rP730-nH1?O&2ROt@6rYDuv7=>(4vydhSDQy2>u47ECH#VrSq0>eA<;ba*}X(QUxmPz^_KmNBiw(tSPmC77{a45z(DvR#vq_8 z8NCCQ<9oS!^@v)}?4CjjI3lfV24WT>w{;h4PEerBE@-wSM1W7){`3n6@Rq~R#ht_R zX{3e>VJP?RoI`&CMUmw|sS&Qp;;3Kvw5GhoYK~!WG%c_7FfKD`xyz}g)WlTF`yy9H znD3&ug*f$&a;-S0f3teblHMDFh0hR{Oq)4uNPHm1uEIwA9_MF)LyG|*;`YLtrT6ZX zo|R?!yUNN7F|iuo-F@Q8&^&YP{E4!|<}=-7AEt)3DVmV;;Bq>>Kt~!gmG!B$$>K`S z{-wsv$0{(Jr(OL~iD#R&nk^YEfR7)zC#=TwD#Mdfvo`e74I(zT4FVimCr)P8YY%0! zgS7k^Q@d+&|~x#t`P(dC#kOB!fV zdVgqqnA7llTo5{p4ORgsj&@NC7`#~TZNcgTj2%l*r<$1a3F2vqE7L_gE7APQXG-gT z;2+xFDk|Z_^~&LcL@lI&s<%}b;x7YCTX0$RKUGy!m}+%tBWL^(d4A^`gex-c{Gv*u zJ4MQ{f2(&gWdnLqA{WnC>#>VhI_(^D(UHF_E5GWXvgvzFtT69U9wl26B%GS&QR^czqCw!lkaI$|LC68i;nQ}lYsx8Q*R<@iBi z`eFN|;v$~Q9rkP%xu1F!FJ>t_iDDY;0_AGM`bC`DOu? z30A_x4RMi;6hA&J>00E#6;e!95H{er@P^(gU))u z*pfDp_wS(WVGKVWnXaR=fRcL=BhAlgW#D*lfN-nwedD`hdWmDbIP&yo5b-7cb12(x zvloIFr}3n+ewuUA0Fj(#rlR+o0QhKU`;Er>>isR@E}_V2$rOvA%f@JHHr;HzquCVZ zV#I6q|0>x$G93HbW#tY*q#3cr0It z0(!KbPx~J~t<}GN-O1X~0p@BsOXYH!s?Bf0yM1)m z@hdR`WyQwDNU__QWKFc@U(xZ<^{gP68r9)w94yIAY+?>N!KyFV9~w4ITT~3s;eRUa z=JWny#5+}(6XgkdC0mzRx}+0AJnc2}bi#GC5L$>o%2xJR&o)%`)#MGe9CY0*y{rxX zOy`SOT|?-sZFb2XBIGU%2KsPokl`s*z3q~BRgrC{^;d^=#=YfQs1|OHbw08(# z>Tz`f?r04Wg75rq_kHp3dH8Uc#34m_afX7O_oL6n6Nml3uc9oV@{vVLG%({-Jz3OA zy&HC&^s@8d)r_x+I{o#ifWkgQyM=o*!-afF(U>d~PdoR~Qocd#^HM$dMvIA;lLB05 zQu8K-py`hLVQEQWZ6h4Ok0RWEkpY!atZlB?fzhwH>%SW(5*mo?3;i*1CRb@4;-l+t zi%ezZ(bajY5@A3U10$mdbgy&i+D+8kaeH2jf&*+f83@yb$0CXuxs1R7O{GW@y^`$aPRc2atP^zkoZ|FrA@E ze^E)po*TpBzo-uOO4gad#npRaGex5_rt6K|`_tx7L5qQ?nv z)LIuS!Zgdp_QtNqi87w!Bn@0|Fm!=jwN$S}TSv3MV3h4p7c2W?RY5_C9c_8TnIrlb!|LQ;ifpVednH)$}S=rk_5V z#Wo+JAgqK%M0W4xiz8ZC^?OMat{nuO<5`6Mgns(Gu6VA`OrM?4*12O1$X8%|C&iXBc)5$O9I zotN*B(PI|_%~cu;ka*$2lms6p=2G*hUGXI9I$4)}v62+k#`86D2sM+|ddjF>Mc|AW zWLeg09}YdoW~YACir>*NpLU(;7hXgx_I<=93PKa4QfMB;n?~JI(!gd=Z0zhc@s*_a zAGP3`(?w8Bo9#U4I^*eztk6>Q5_sBoF~QZ8xQsj zXs^>H>O||z^nCe81Q_%j4m0P{%Se1`^)SEK*j$!H*Ug5F42^v>(aFwS>Oog3#rW;O zL|1>zA}%$b3JGX74Y5H!%0UnF=a&?}d!bmfe0EO+t~7nG^7f|BY~L++a;$okCB?fB zC9Dt|&pR6wqq6JuGzCbf(X|IVheJaL#}OHgh;a5?>A^Rtt6S_jToY7drx2`Oh)>h) zUk(PN)V$urCrUj+$TM%&{;h@vNtndiSEKc$hB-$OZ$KiM#0{Cmd9`vUdbR6WshIn0 z+3S9nr0*V4QCj5e#y73uSQ-;&&o~wqoO12S^ZsqGW8-u zu?co2E8}R|8k=mNxBgNM^@FC*B_TN*lRYBq0!9g3PC7}C`uk07LTzXcl7YtW9E z<=J^$Qdjx9?7o53Sg2o@;Cz$I@E?5>Y}jnWF1)F$8RWNoMe+leCHUF%{HwOLx4pWW z*XnPePk<6N@V+~P^PzwiM9o}99%8I6ICBSq;1!oTdSjf5uE?q{tr}1+6G)Ws2-01U69Y~NudF=_ zk?~lt22Y>s`jN}GH=PpmB6hyj;qkE8>nMY*x1jQNz@wV!B_F2qMk4kjD$e1RvdHqd zo-jZA3&+Hn+XomQx3sU_gv1DDLD-7N6Q@>^Q{qgC%$kZl<&~R3hzw!edxH28DzymI=sx0e} zg(_uPEbh4=uKKA}iW$(~)#k|d?aFoL_WTzd>aB5o^d^v-!c~ZT_vb@k*YSqw0PB4+ zKJ4xts>C#_Rb)Nv_iTp9LuWY&k>2X+Nt)kmyumb1En`XOs=HGpba8u^Io%85C%{6_O48n?MS8vSL#fq~47oDqR|kH-ULIzM(Koih zcQY;AjUFymxPA6F4)>tfQ-=4e5jj71iC*K-_Mz%#QI8rrmwv2hAiK$>m6#K)L#(6e z=XbJTHa<7`$-J>me_J%`)h3?3z4T`z2)ebgRbjv9Iwe<0Ix9okMvYDCUSSa_gm{GZ zz4E_vS#65i-KvPDJ95J5fq%09DLqw5O@i-D%*$2q!aq4X`3d&2o=ZywG`-s>YAEk&7>%+{K>uDDs9=l(j;v5=B*8^=l1xjcY@KsEvWEk5Y=uqKVs{o=y7tj|)9lp8>}eZj|dvrS!nN&JmkJjUyR8LSG@v z8?G1t)WIt)QI$+pI;a*` zaIyjHeuqJU>aYD=VZ*Fe$qxoz1*IE(x-Azs777y+wW9z=uV7y{w{-)wh9>qQ;wHVB zWi19>c~;|UyO}aBLRliMaE+1CZ#qD;kZ6&fo~>CS^P+d9Yo{mm_PpULx7DGWc6gnh z*2NbZHLQi|C9Y5!_#NvRGAlK}d95Gu@2oze#n+*n-vPG=+8rS&y~0{wO%NFJS>F3})558bAP1@a}!W z3LSg9yf|NWleJ6Pw6|v51GMfypStTwY+dpgm9Hm#zSuY6S7{TIvjXktQdoQ_f4ca^ zB7$yRP(NN+Muj<_!y=YL5tx)gtQwTdOG@7CL^;xl|LK%%mF09HrJORb`RmwT1$R z$e@@;6usY*yDIkD0tM4@=6O7Tw$fv!1wGBtoJ7aak#yU;~#d16yd8+fC0PW?6eJFu@~q4%60#srSy9r~erZj%^^T=Ec(y2?S4QResLt zY$$2V<#9WFeA{q!!`_m2_4ct1cyTE2RD#axcq2lB&`%N6nPC&=65vYsv_?w{e? z<#5bLym4dG7ohS-?~FS#%0O_|zk`{n?v{fMV7l@sMn9$R&*rAX;=oPl0;bFEbqKVSBCj*l$8R|C?Llg-wklf)M;7ms6`Ff#oZwI0{!e2P6XbD42` z`J+ggq2}D9_a*60reS|`iOBj@ z@VRy7110ZrZfOsR@g0Ml)~Y`OMkWRfK8*CWxJap)p=M3Ahv}@k&|YO233xrr>VZQ4 z?I$O{dyG`dR3Qc%+JzO@v-p3%F<$Hq|${cmFA#Mp_R?2fj%R8-@M>tMGoDumnEY6vYII(E1Wfb?RRG%-De@JHL#jI=SdoC_%y#G z=(`p=B?2B3UaPJ^Sb)m2t!g574>)m6N?5dfGd&nj#^?4yp@&f{R<64hx?;G<4+O z_dw(aE0@V?7LJ~(pw+7qffD?1n3f(;PEgQTpX*g{oF8_9u*bMSSSo7@k&-e%PZ(XX zzo$ioEZ!GOknuml{I%JS5>V5{qNiX#e@i+=zc1<1KB~^XgZ({5h?fheznsA1BgLFJ z#^a)3dM&jp$VzLMxdv`?{J1a8EMidGa}XWH4CqT#+=9HnqoFL+({HcrKF#OIbe)&= zWphQ|B$$Y!nz4zuoUNO*?U8|hUsLf`u#Uv6l6Ohwzv;q7J&Kajnj>$i|^c$PDR68wUR+-~yAgU*5YL4WfgcZ~??e4HT>GqG^7N9@jQz);aXc++fm z*enGiW)4c5S(&DKFIt9<``h6Pbh5}Ygk*MW_tc@T&`dP6@YAjBkNsFA2i+dJ;=ZnP?9XhSO$uI) zanvSvS8r}V_+Tv>Z$gkM>mg1_I);aXX|#(V>?EM=N@iY3l{ z+30ZOh6&w`uj3l*mwa)rTvLf>xG*$Q4~wWeTD?`?lv`C?ug)OYWdbjmz-;W0a)ra} z(H~51(!b-bEs;6dAawxpdE0dD6{i`{w>^6_Uv&aJVX+N`RQ{+0dC^(Ml|&l=-1zO5 zB<5P}D)uGI_asgs(F;6MPjf322)q)mBDELOYbApDU3;$ns3Q5G@kf^$z3rXZ(3Jq+ z-4LQVUnavph>2l8w;d>9^a|5_lW#kt?!#t!0J=okY5SbT9l4%vppfZdi}b2m)m)A? zotYTlb#I%jPzRJ@{OVC&*fn$K%n4ZwXAQx%_QYi*sk{V&_&uUxOy z;(pUv&g!R=jNb+@Uu)>+gNu%EIwy+B$55Hmn^K*cC4P`WI{-#q1>?hzEWIq}oVDIP z&m%a6MVRhy1NTfB?mRv}EXT?ng;L!&%X-M6tm_Y}aiobmx$5deI!<1dDh?jAoi107 zHp}taHQ~*F{{;}JML5~2utsB&nriUJq_zB2P91fE=r=)nfcb6opM#L^H0&|v0On(cITc^PExt{X zm5;hWh9t%n*jw=i^utr|~6e8rr8+D>t=35-T zn(rhsp1*c11sUwty35+=hw#_~ZSHkrNyi}UA@7u_E#qBtVVjfH{jL+fc=w$153vMv#_EX%h9#AlBlc5=j zU~Q_@Eqm`}O{LKjuVG0L$<||Cx->q7o3E*GU(A+c(?eQN89k)}iT|g)GYx9$3d3*` zg9N8yP=gB;f-JJhQcGMCB*Cblf+AHQBE%{vf+2zeN`Rmh#G!09iCPjIMZ}H7up10< ziO5o{qM!r}h~UZ=5R_EtNn$(w(dqxroPW7TesH}}5hd*6BHCYZMD#8#={<0$XI zghK0xX4fgsp0vgS8Q)}HJ#WL6k-D?o%7llH7FCxB8AY^bH*W7k)u28dm8H|@UhqY+Xp2ES*iKq?G-NNTAmS}fPMRpv2u-#I$RCv2(F?~9n@MQf_x#wZ?o4N0X^rMjm!%h!v~CGB9;bA(QB2KEZC z+DDWK6S`|Bm7}9`uja-apFFNi2xCMV&B5SZ^fbYW-U}+B`>b(JVh-WDYT>@gPnP3f zhU#jIg?9dmFQdB(HkS$=+mj0EvtKKo-aNAwks9g8rUbUVlz9GHl*cCdQ3Qk54?{$R zch47_bDe`%G6SVv<40M!%BGHMiItu9**nEE9#APk{7l#m8Mr=zFg6! zoa)*?Hb`SeiCHt%DYt4QHEDN4*O`Scayf+lw5sd!NQl_FO)P6(J#U{$J0r+Fda~*5 zuFf2X_}%@)DOT8r>k%zbMH36WYu_lQ#UTaUGvydYcP7JT{@!_BhgZsCf{BpZh zz4|J$b@j3d&xq?C-!#O|zaL+SM)|KH`%*S>e0CDCRc7c{xq*Y`q!jnEUkHoXG7b(z z1DuZ+<1{cE5^bvICChSb((-xau7(*PHf@;LLe$W62viohFQV9Gjt+ctZ~!o!So$PO z!_u+Y7Z3)|a*vW62_^{S?`hpB%mgR%UzK=Dsc$cHMdM?5UV??dWo`F zjqJd%v%|3W}M{yS(mTQvQkrzpQD=; zOg{}y4~qkyjejDl@X0~J*9zzh)EuC;P%*&{0l0N23Q!a@Z50#+C<R?n&^G_S zZL@4D`r&}z!V`B~GCdy~?sk7?sORSxg|2s+i+;3r_!9Tv?PkY2_arAt@_bxP>@0JV z9E-Mfs6@f^_-bkI3MR4;bDIpup6VL?056LF~O-B;TSzcWJCXJOjNF2Nevw{3r*~l#FpTn#bK_yk7=KgCGWuU8+AYP3RA&)?pd_bmMtgN1(_lcmJ^7}C8-s7Tc zYn*_m63d`94@BjH46brJlfqy;%pCpC=^oz{GP_`w^pvO7E0O+5kN|l8pbrH47JUm? z?E&7ipSq~OUnsJY+Jt+v=?d|_x%m=dWgy?_DG0RS=08N>f|TD06u%N^Px$c=ed(1k z#kaTE2;Uih_8~G;+WFxp|E)=glRJ8_to>l0F?g z$-Eyf^Yu~3!(pQ3B8m%lQ4%ExDtRqQ;uFoCV`OphSegBru3PgW76jU_b8Pv|arI*0 ztKfwJ4Jgqv_)DlkMGqbB{ zEgbbhWS6A7uF{y@oBBXv{!y1T@+w_o$jQAH#Y;CL9^CEza8u*Ha7O+Hc8&E){nq zJ_&ta8_a(No{Ex`MesJS-zMd6f5Xeu*(Ose!bKKi(OY`IfHJ@HPRYxHi*?~g76YXo zmu>{fHIoTl@{qY}#w@Ltmp_p@*@qxhgDKcTQi|;jB+3&~XC|9u6UO#QWZT^HW zOjnVMb?inI4dj~72ibPv2RFiHpRm__x$wO7r}prTVfkSPP1X&r+++d8JFGF?QiqLWYmq~<=d}|3%C!}Nl`B>WPo#A+k~C*? zzH46>jMA4W{9dV9tPz$&Bk(p!6d6qWTsgDwN8HGrS9Gtiw#Dmiwby6knAPBeu;Jbf zg?0G)#X}EDs?b}(hz~X#^vSnLZ`;s&+%8T~$)X>Lphsx)3iE9xtR;dI9d&d$D>;2{ zMfZ@$DaEnHF>pe(bMvzD=JF_X4s?38qjHV4{EFmt__daD$$rP@>*S@r*wSLqvdI92yRAZlrZ61yS0f=yKa<;BdwdC<+RF$c|r#@F@PGz;#^Ri|AEIo8( zy+eq;s9vV7j=oX3d|_(g!?C);y6o%OHEJE+oozIk0{vC+0?iOAAE=iSAN&a1DE7UX6T&lYFJisJ90K!@E$%&O)gJv z-N~6QMhl^B(P1;`eFEu^()9RU2iv-2=QUP_q$twkc%RtNB7%O zhrIA#9~&e!TQ!Sl^QUAF2@8RRN<}(-(7iLn2N(1hnvr!yJv)0A|7Gr3l3-m~X^saK&=nN1c;qfK(ZYyU(-tbs51YxEaqnY??dF_ku( zHmla|y#-bwWrPlgh$;wk9BH>*`ImyrdfeodGFj`|`W)k&q-8c%FzY5{c#mj&e%fQ? zPG5P?^cUe2OgeGrM(d4*ua%jh$}nyw-PMMI*P>-mXRm4UrCXODhrYa00ImL5$!R~T zp1%Ww7x_1^d8^t58MpMjYxzZDw?&~tz7pcMH8Z|rq^=9mL;W&43r%H^ycPbj=;kyX z{8qpO$BgF+LzrVvQ{qf)MQ(n3jpcy#u=U339Cw-lb$lLt6;ACyH91v5g?d@Bb95{> z4S^#$rt5+$Wot5;pw;zO+1>p}aVhPe+K1X_+Cu2z*y){Gi^ zyrn>mU}+?zVm!F1gs5~rr*tl|Iz97R-oTQfu*_6qQ|_O93KmF5SlpRxm>{oZlJ=A2 zleLm?2IdB}>V1+!W1Dl{=L*v-;1mIrcDL=+#=DUioBe@Lsd1@({ye8Mrqe$v zeby}cQLn*{nA&S@3&V26h&Azg@qWYoYPbEe=@lASH7u!E%*1}vZ4*j}8Bs^nrPL)A z)fn2JnZV2hyl(dRb}%%ffV~nDJV1y(iUP}Cj!KN`4W$a*N)wS3 z6u-{Jf4m?nGQO#Ei^7Jcz_XKN>O zW49+ipYh>K+)j(fj0Y1Y0|i!J_PraxL40*udZaa&jffVIwbIzDO#O`Iiy3>K{Pp%!gQj%S9$-8zYPCvY`b<}FjX~E8vd@JbMl|l7p?@NZjf97{WUJ#1_9%m z>7Vg5kOUb2FaT!2;1ApPx+-EE9v+S=G@uh*t#?`BgcbSzruW#M*y|Y1jJ7bhu*e_J zxjr*fVY{@clkaM*NVsshC!U*ujt(vrK-kU_-E`Ss8DOEI(faW$e6b?}7m`N1HCCvs zq(TWsw737x(c=#b_t=^Gq&Y|(dajxD!_$qI9OLeKm*`b%1i^^>6k+uK+hK3EJ znB}gPx&*ywmRxT<4Z9k(gIcmsAubrq*ekY-OvVl?=VN`>zi$;c-Q(n3!pgGXT=I1C z$G*!V&=TIOy=#sOv3EpW+9~j9U@-fG2lc{M`qVVVdgZlmx9ozGr#-g0bW2PxQTGKk)8f}u3)3{Gs8Kv zD6O~$+80--F<$Zd^tYBevzS}g#djdrGvNr=G}F;MoyV{OkqxYP0HGd-X~MLlo(klc zIJSiz`A0Ek93CFRjeQr+#>NS|ZD3|97lebbT4bpO0(#zM;*wx`?(9H#ne)QzcTN?5 z6sppG`iC5aiO6-h6Yz2m)EpIq&?iPd-_^dv1wL{2ZO@Gk zIurjDlz*J1|J3$$69&N~#a5_(X1Ur&&o8N>s!A1=F6wH%BoE^@-tVBdNm-DV4HT7V zB%E#Cdi=5-fv^#7dA~&I)bj2!q|jKRmqpNitU&KzmFzPE6V#IzYJIwIHF;U2Zsm6| z>YD{ZO~S{Gg?Cx5Ch zOX>l&Bf*_}WfVy?E`-xH(l(3EPyG&ME4}fBdgW|TUoM0)i_Xpz+{kUOqXk*qc*g0` zyMdcIXsJ|w{d%)Cgu*qAFy9hPO3f&;DNtjOXgJ{cY3q1IU24U=G&eVQV`HP~kgMq) z{AID^+JV=&v5yh&Y9^ftWo5W@pr~Aukp0X0XW_fMC(cV{K9irJ=XtJc$!a}D@bC$3 zZo`}xXj+#}dK>MU`FHcyPUd|X0bW0CqR_x911u&=+6;DSI)xp6mpt1u=UYpWa9(`h z6~ZXy_UdrGie+;$L+-#jQ#p>q-(forX6Qd4;X%bHVmgo}AzIuF_#i!?$g!?cI35D4 z)b3s^EOHpi9vA__kOF1l$>e>!PBXodQlWC^eVE%&Gq_)T(=9xZ(OEqOo}TXiavUd&!iY@dAwmu_ydLN^xQV~qYWF+*z^~V% zMZOjMf>9cpn&!NW0o@O40{A5I6?s$YeLOr(yS}veV9`_|GUFxzZQMq+Zgs!5em3c@X(w`{dGx#lNVGo&Hb@jNE1y^f7QPSAUUBzYWyG%J%QBk3j|FTg3*XzM% z630f-A6^l(iNYByp7V`nvSIR(P^bB)=6_y`IE;F}W@b-p?nqB;xOlXlKdDk2=WLN* zSQYBdt;W-11IJlsM0)*QQ;GzwJgv3URqjX^8n3M}ZeWuWDy}$1N4X8oJ+{VZ5?8R_4XPZjH?3ppZ~mERp*2!pCr_I!pk3T{xE)R)L{X0C+>vrH zEUB3(GQt7T%+hNFs^CicHQ{Pbc*B;)8txwsxvq{j7cnhf+nTn67Zr zOQjn(nc;uuYPGiA;?&MDZs`0j8}{**xbRJKdsHJntqwzO-6SGOD3U_?o!)}o`5+xX zZ6XZJ=d>wcdn-OAP&Gi#W{#Q5^+6 zf03)1=}=#4?^%XS7FJDzK7ukbFyN}1j_jujHbmFjeGic16m&ekMVRshEr+o}1MH?< zG2y52xB!KGc9?Pwyw^nL1iGiA*VbOT>erSl^~^W_xhMuU`h2r|k5Zj_Q{g z#|llF)|!YYVryG)7$udYM^t2FWK@)6%9p_c+nC+!2KX}xR2K5{!Y!QX8EMOnS`W<7 z(U?K7hp3?4SnbJTgn@t~Ei=FE;(I4mS3c!N{aRvB#%xO*)00SsubMOMw5YvP_AI|bWv^BOCRWJ4c ze|sfN6N74M0_eRaVa4O10`lV9Qxz4JUA8y)vj-&dfuf_p`F~MtjCaz`QcJy21K|-l z-z+Ha{|I$m%GqD;*5b&wNY>KQ3U&e(dbDwHxa`5!ghR)gcYL&}N%6xSbL+ds#zgF| zBB%4mX$lQY(pS_S>vq8Oyi*{gZoAC% z9e`qS@kwXR!Qhw0#;hl+!GJih(pBTJK9vaf1;a|_6OGBQnW_b=rHY4LO!@lt2|x#c zY9J4hk-{Hp?UF3K9sea+q~66-J^!vlxv>i>DIww48;=Aw$Nx_}4T!+~PFGSr=J?E7 zf6f$o85&NSIo4nI(jZWZp<+9{v;Y()4^0-ZPnxY)O%fstg%P2>o1+S=g|H_7c>dLa zbYd$71o}F#+^}kXx8emyh3!Zd8BM266$u?0F_sRF$}?_|2XrAVR{~3;sQ-EO-V&mt zvvVvT)&$@?+{9T9Fh22ZPLI%gVmDE;kWjkhnqb=f_2D0#W#`k6nJj1D2fZV|#p%iP zG*FZZ0E(S9@R5qLGDV1t1tOA+^khU`lB_7!r|eh?@Os=M8jk@9Y$w8Gcyp6>fj=s{ ziAd;)dt5$4qWe=ZTK@ALn|^~gZ{F-Jb`;ld=A9ieET8Kr#&KHhX&i2T0Kp+J$vUsz z*zjIB#Ke>3&ETx#xG#gKwEICka`Vf!gfW&eejBSA~^x0lxV3@A=irBS7BUtE=9e`?_DKv1}J>Z+Fakb&~Mc1tLr-}zGwv)AmQYVUg zID{(O?aVd!tPkE}RfxPT;r%8ep4(NT_xVjdbZl&FhC{jh95jDdkKJYb@k_2K-z28D zvMiSpOq8w#U1p%~DRa2w>bHF}5 z(#iW>WK>68b!y2%WTZX4zR`%ssjUPYzsu7JUMOzVPyB*B#=}esKP9Z}_WIShD7bg> z=vVXh+J)`R)bQ_<-$P{XpT@BYU5gki^3y}dYvsK74$z>m!;FaG;6fY9_bivaEqVOW zqeqw~sU1KxOYP~Y4a(6mP44gk$N=ozT8S{O4IGsspaU=^jpzehM5Z!;`rluy1KfQ? z9td)sy2+)x8!BWU+H`8oaWhHS(ZR`R{ZB@fqj&HVH4AJj9Yo9}G5h318JN1z{=`yC zF}QXu%_n%tpOxy42(Nj38?s0*-<{W`IgkW9=Mk_9{;m+oSn6oPgVKCvyzRQ$7X>6x z30_Id%gb;RGz)>L1Azzw51>c4_DmV}P{obztBDHKTih?cHSbiRoYx1xqrsBbn9D8q z7H5zyE;@DVT~(%l&Q(hj$WKAiJ!Lyz`#Z18n|pp zGd4vfRg6iJLs&vWqWY=DNnk;Y-FT6a2mZ9b3nSBXIIOI`Lagw|Uuo$`1U?t{+}%pd zP84=Ti(^!%!F1gE6|y+$g$2OVuwo5XXub1NXqrT=f^oCxO>%BsUSdt-z^eCbl7Ov# znPqNU5OKhch{FW%tB+(TVAswhap$gnf8_h_OWUn@?hJ({CIWVYJ>4>G>->ZL)->Vv!+i~zKTu;{{%#uvDeB98`)nVymx-2gf_ptdOzW6HNg`kMMAo0D&bSlLX5P z+08+FnQEHmP1G8FA$WXxVUgsy)fI_ascPYe4=3VP)ztyS>9L=6plZCjUW)LE`*6Z_ z9IZfb(OPT6C|?2l`z>XC2H3qwD;s@wv?Z0!Ul%|O*a3i5Jq=3V>idbDj%Ox&fZt=z zOM&C&RJo0M4BKavx831GsV3>?YHG}U=AOIU7al6d*P?63!caN_udexKFZ*F<#h+Mf z12+!l#sLA?aMBuW7y96VKsVr-+4&Y(2BG>VzLy9=7fBr&b6u+(s*F60ww^dUhfvU+ znN5RxfpWzkfwaZfnpE{FdN$N0UcJc=hs8`ZO4#}hr%aafGj@+w+Sg?vlTN1<0!3$i zwD*@c21}QuhyiAG|Tb%C4xW$U#E~ z-=Ywh^X=sZw)84HJ0D-Ebg*~aV_4(i@FozthV`BrPPTa$E|XK<=H;CrnQQb5Bi0{p zZjR>5ejfznRMGC)U@_L-vde_40@oM&=!RLs!j zNgJH?Y4@HE%t+9B`-ES8zDG$zLj$9lI7L`Xoda@dAWfqecGx~YJ$QGv+6%`Z7g&=7 z9hv)XF)>Lv4~qks;lOJR1l&lLDwC*ryG^Ai|PXhV~ z;gSizBlub^K_s_*D3Vet&lMo%S!~wv`srY9z*-ncc5HEJ2@)9v7Al#lsM&kK1Lfq* zv+UM9+8o8qoMs_>Bud|$_7EUVnze3;BS-1Tbg2L!4emc*9ua%HNz3u#Zd-pKfO3(y zMPIL%2m_^_@)UdvT0%1QNH1M-z%T$$W!0PZN0kH9kVIiZ$Y|K{>o#s9nFV9Od8)18}WPab`!Uu4n5=Evx#4} zuJ|w(MoD|?gLtAfY|kP(B?YJkegsY;Esu7Nd8QJb;R``FHnugrV+@M8lO)I>1PF06 z*&v`C7|WwoigED4=`@2tZLs^qN8Co5@Ohpsv!<0|WTjHv~9PZri^_*C3o%{6`F$fwFS;y=Hgm zi_NzGw+hSbT&M(R8VPcc(?>b`iQ3r=5GXsrXz(9}>;L{0?Z5o+UocPR3;(JV{vT`P z|G7;5ce4G}ANW5lg8#VozlZIgdLzK{|83vof3WTN+Q094{S}h`x*zuUu>GSE_@8=# z{{&V4(`|n>LH~Cj^q`-?FVqytNp6z>06_lynY<{-+nOfG`T3fVI$i)*`<;dVq%FdcJ*Y0S_#spI*uye5zUssA`{W?RV z(Q!jTfq6xI0a4=b+Ec1<}(4L>&%WHg3LP+kp0N1Zoy=HaCu;Bscfs&HkciV|t0X*+9 z(rZAwYI^%a#t0ncwrr{~Uhq4-c8`R|%GZLafhWFkvU$Lhr+C4cDePLn7XsiV)Z*1D z@PZe3$q}?M1_WoGr~2UmMxR(|@V+Dfcc?5QD3=fe0PrP&23#!y<2^)CHZ&v> zS4&~WyWK{JyZh?ZDt3Li*yRZTEPDiwV0rkfZU;*c20LPN?(Y-Wn38_+M8;TEQa-5x zzHH6vAzc3WM&av+hMAf5wY6!bpRz{g{dxgd>rS(FJ&eOepd=c3y41RIFXWL)h$6xH zQs=;lN-pE@N8)#{<~QOM(RHLaG}GAKpU+=4=yOr8YTR^(wKH2>oX~Y?C+Rsraw^ zMaumYy>~N8?h!}Bhbzx3zH5)(9DO?Kq{+6$Q^56s-|TDqN+PjOJa@Qz!`3p_ zy4D2O7}i*ijYu+IJ#qbhuC?+&v)@jMe*OBo&^n=I$|D(_Z)utf1z)vq2*(@BmVT|( zEZ2xApc3*-6B`VreXg8an)7+=whf&P(zbllqw&VVXJ)nJ-+H6aEyc~`P5cutGV*Ym z(4I)^2lVN;h;CWad)+EeQOTnpi=pq)ekdxilLAkrOm)`L=c?uMr%C81`K zzjk3!UeRI^sSZL1svTcwsufW7R7X&2wUBr`saU5d^Tm!9gO+unL_tK6b%C=sn)#Gt{LVT?AJCsg&B$&I27>OtyL#o8G}cETq}iVz+QUi$)#cPftZU$G{1*HPdZkl8>TMBD3n>!9jg&RJ$*Fu5Q$+-saKZUo2=zK>^(9~B}KVsr&{ z?(5Im76%cZvplPu*^_zyr9p;9CjM>d+x3o8R-4}452dU~c*;=1kS#^ni@?pv-$dpc z<}qD?WE^1;VS3?^IG0HM+am(W!d@fua_%tsOZg=E#dK={b+K|@C1EbPMHt-)rLH^L426BrKn{knbjs zc+wMV(%Mqbs%!WMA94FL^_w0$bR9 zRqaDeJNn;t)Zp3gkm``EhXw4+Pwkng>+>7HYRoUgGa005qN2;F=jf7Yf~FtLd#^J@ zIQO@u&VQ;dEdJT>de~~zYHMSWH_M13sVI3PnZk*DX11Cfrdz#tdZsYPpFH?rt|_!u zuHjpoWPP(`e&5ib1VsD0_KEhTw#feILXG*Ldv3ww$77KjwYpQj;?z>_@nq3A~uTJsfO_hrco(v&G<>~9Yu;BmR4-$ zffp~i2)RydM)wMvi@eX;7Lpi-WF{A%ee>S0WSMA;+M*g_3`lg%+HwtfqWP9FXwV<{oocuFgr@; zgU0I~%cBao7`Q~U#E|iEy~lCo+&YzByd_A!yT#7sq~SvwE}H$&)>q z8M%ds35XGPe)?cO$gbV%3u0tm5lI*pI*d&?ji;2m8lM^u4JQxZ$$Bg;Cbj}`!)&4R z<%VAmvuDv^bFk1dI$Hj~^NF3Qp^=o4ugS;BiEWPlxtQ(t9s2UQ?#^!J);@1R0n-y* z)Lw_zycg5KHyEY*n*W`k2RNIHic_uM`KUzt#6%ncehLC@A;>!i>diYA&oos5!1q1? z1cw5^1rEG!0f6U20N8#B0OBbCKdmynS(BiIAj4<$D)u_y;=6u)9S8>S!2w($`!lXR z{4?&f{~3Q7{$XtGkOJ}xRMs!*fK%Ef(Wl6Pma3>wJl zgIMP_s&xQAi_Jb&X&WifzC=-H4-b#1oA;yX`1k32pE}If3ka~XN-{DrnN;bPIz zL&ap$EPr(KzS71}=A83&ybZFH$L8o@JazfFLcMbAJS9YY<9$~Ic>wyT=Wb7R^W`?D zR^C-n>!FO9CcWWRgNXSCcQaqx*j6MgsEgb&CucMWa&p9DH0{wdCx8}XO*n%1q?KYj;-tJ)u z+C5zEV!lq0BG_h-fg!M;Dl@6_J>_hJ{fePm@Pf5);0SZfLod@sosa$29_Qxfwj83} zMXOu)Q3q{En-79-nq2KvQXXPMh;SbV2@=&@5OuO)Bo;lbsjlcaCW$0oqsxA7{)5>X zZb_@%l#v$S(=y%C*&}{<4+i1{Zt=jThC6(SJbng*1nDpYx1x+YE55fnW`zsEKz1)# zUA0ysz<)?Zm?|kLd80v}rwg^(UF2tHdQKWJ3xV@qh4Qx%lp!Sp(t8?f(3U*#e?Ep$r_Q+0x?4Anvj$t66u=j+rDIzn+&%!0lr1rf}F z^&VS~0@GigRyQDqnsfuPKFEC&QHSa4%!olz*n7r{%WSMi1W_!NC7lq*`dd=IYvDcd zEXfnEi*?J4+X4f;&%NW4rSrr+`HBONesv7;x1Qg%hSHy(2zJyeD=GDl<|;N;}AwY6rFK@d|jj5eCnutc{Wh z7E?_Vwl{5-k2*a39z|8ccTSL-uLj+)ly)&KHjh}Lb=z*?u_uye`E<<)>( zkk1e2?8N}oNnpUwNH(LxL=Iuw`2zW)oDq1Ygk}F)Zy2MrzxRB-=)u8UzGcituJY#x zraT+{+#p9*u5j{UNvR(JO$^XvZlj{tN4ithj1QNhVi`ok4+NSi zz&Buzq5Po+YBmd+nws5l^b3eqKmN96nUNGkba#eclWr^sG#*swhHkm(LL2Ve>GmWi zgVAO4-7t%s7-M5h&e@(*hBPL#Wbyvm%OqGCh#-vp?=MU8^^SA3af}y@diZLeOnzs~ zQ$0}6qS%vYMjyAyef^!pn@-1vUOR@C_dYiGfopiPC;mC!GjGFHNk!#a_$pt+Jve_J zoSGy&@ob-*l8iy*1e^w0n5^jh?>zfDCn={bY0vFXy(@%W#KgpPu(KY87}}?N?qCGz zm7EJvleCkn*za2=taEisk0e* zG~E-3-l_FLBVX-klZx(Q><9!Zdv;K11-mNyHD}u7zu;x*{!9LoJKHujs z1jR;5x3yOXD>6H%^f-Hn&$=)*ucBpTHC( z-7{Un%c+a-lx>FrglS;_ilOTu8sKT8l=3}^JXZ)> z%>}@jI@Q=slxgNFowF?#YUMW{B7?p+J)Hmn96GpuwkN@({}AU*o1T`|=r}j&!8SHJ zTI)C`;&-;2Y|2PIk796cOfpvaz>?DOseA zt8FS?Jg5daqUoSfFa@(xUoV04pIX;5*7)%-6FO0y!e+L_pwzG? z^cSB|?Fmaz5NrKRg+)FElf-1PUJ$C*F(#QOaN9X(q1Ms98;3nAH`3G`Wx;vxP(skx zv0J4<=Uu9z3&y2}r@ThB%@Tf-?IG$+lHP}4R8va31QlxLIyG0Acvph3RZABUmSm)& zLe#a9J4`mu_`nr{PA8I;llcOCm$a6(oJ5@F&yTtJai`@$&>0^3fYXUt2u`eNu;;)F zeOvvM)2!A1AsVFM`y3o}Jo>*$uUr|hoha0Tw_#8FToMtGBrFTUI@>RqtqiA8( zTSsP>u3)U{aG8C;2rV>vu?TJEW@O@3f>Ep&K^A!2hu4u(uguq1Uw)1lmL?681u33I z1bqtTrCt_t@0Ft^?SiMVw__O~6)wx2%jrzw9u8Aw0p(dpat0A0^qrHf1yoo3##OpK z-%Wl+^_j+l)+}`h!r}K1@TpPp&b|vZrExx{ZX!EpyH&&f$TnP9L<9u`v;V&7_h$+9 z_4VvWM}z6YmfWPhkoXs`a)-x2EnZ!wuV?jlUh$Ft3@1V!)3pM zJiu$({9xLR38eY0{R$B37#6?XvpKByE@Ww7(h-_8SdMOXZct6HrH}V5Hfb6Pkn#)j zdS7nP;yYQAT54#*KoUlg$0!wf857yn+F4e=(ht6sAVQPnvCEwxELtpO-3w7YoXl?q zYM?`Qhp{|)yr;op3tZX-FWLe_U9|s%LjynGWAt{0`%sjm`)Z2YdcV${DvNY2P0hD1 z?Ck6mw+??+*X6Zf&Q5X^Vyqf7FeoIy(VO>)F>dgog>u-pQX|-hEp_LXQ_3w8I+8GH zl!Jmx{n((W*Wk(Gx15~)rt&E%ykZT z<;Sf?UgP?Q-jS7;zgz65oH{thKroUMomWEnNZGv+u@!}!oKk+LMH=6%4hM<$W^2^z zG8hMr{cc_`^95n6TByMt#rwl-M32S9d@fJC#67neNx}jzxAK?pJ9o;R17x#5n0POT zK_M8P)${7=>b9@i6}8r<qD=H75J@_hhLN zhkDkh2}0v~78uswTN|XCor&VM*L^F8gU=J$)zX9nKnw+92tk5xMMraQPZVeG<6}X* zYJ7Vd+pV7RX^dzwRD~X<_EcF98dh1U=1BmgG+g8Lu8Hq`Vxpor zO`Fd@>zPb^k?GoPBLN9WMLOD)?#9ybdcU=>bLyiCpW`*+gHZBD)ahk88%M9*Vr44R z#{kKlGo7DhODNQt*oN#IoPUXKmZT3j=jp~%&thF>sYm|sp-e$56-t&poq`u%DVW5i z50^sWxMnA@l>1{+*TH4pCoV{?f`*VHWV8?hGRxGcmLW?*o$|gP_$(y(^WWX@F;(wOH6) zXl6!+|A6CUZ#tY>68?JM_jFq)LA}btX)_c+C~wW@DnD*7ECf@R+SVc_$!jrC0{sot zALyGfbJO)sE}7s^tyuNa5{im4%?71&o^OXHdPUltV|{P-W@$X?+}7Fj?ufPRUUU$o zi#SHd4*ElFcP2~4jOwC4bAf#P_VDnWm`XW`$7djuWXq`*#1SYIAlUQOkN1_6_>CHE zj&iOd;6y&k&!2Bi?rns{BoWZv9qi!A?^mERp(Z1WKv~{DHeLfov0mTd(FL*3`g(Hc za?y=qyek7+lSLCXVWf0wN=hVQvQ*vi{5nPBSyFy+)fd_lsY`s8r=dr)gB%0nb zbI{^-^1V>$GgsyS>r8g3{*7iRahR+Z%rjmO0L45zNO_L4wM@cpuOCo@*fDo8*(}m2 zo-EPX`2<@4pOMTj;hUOYU$3kN4-z?^Uj16$;)`5B67*o6`g-<$h%|^3YSP^k@96Ca zC4#vh1kgj?F@u|q#fbSU-|(pzZg7X#j2CEh+kX7`(bV7d#km(X9UYytWRqE&;#YVy)-Ak2Eq6uuA-Cz75nIRWV(IJSMY@>Hx|g}%zpJE+*BBx9Q`J(_ z(!|A9WM>lAr8T&9{byT@rk1S0I;TqPI%VaG=BEs$ObHgT2co>Zy!B5k&Vx&|?1!_Y zys#H>y$7;wC!@;ha9p)aXn4o3RIu83=&@-}pKnlYvuxz7N=iw`XIyU)5x2YyI(odo zKv1&T61veE;HzlbE=EnlYfyO(vfsM*LYj!9ZsqGjwh-JfHx6|WB&ar)uYQnEBz-zC zhM(=@`|?nCYi@6@C)Q68eejJEGVpln>W#Tccrtf#m4R9*Vwj)qLiH0UOBsxrct%0r zHF@k;`%a9gI~vsv^bw7MLBQW~@@njyotRjWUjf_8hC%OHkfsRk_H&o>Xt9eN-;UPM z(8zSF#`%EEkw9lp#`xG}DgE6$%EfF1sA8_Nft6UoR@}VVAwS5gbXe@L?iAz2qfqG< zKTJvnqXRTAH+L{a05i#4M_@*9a>#~JlJ}=YErkX(6hae__vIp5Yb|$@hBBMROO2ez z@>H{VQXn?J+s^jplDYNDJj|ulu9DJ%bxEJZe!Ubm378zpZO7Q1n+5hiX2ZVRyMI5H zS&HkNHUx|*z4R5_Qb(vLY&;iCeC2Jeo~hH*Z?BU2x2>W+bL&z3(MPAZ%y|uK2khj;#`0lU ze4;md^QrZmt{v!$t++KiP)LE*C}xkXJ!4CXtHI54cYG@wckZ{A^s0f;5$TUy@WP-V zzLHu=d?r@lOH)mUR_G=QG`@i|QcZa%Z9E@{VWxk4Sm=AYL&x*NWh5so!3aK4tk(t> zt9Rj!3zy-1q6>`LhYK@RuuLflx3{3IdsI;&*7{_1(4>ii{?X%%jCb$eg_G~-l^I`* zD%*p}-16esvLmNK&9YgatOW*!m}e+6f7kSdnp2i_NxU zU=Em9qoz_g52JF@7Ri#O@vs)bog=e70_`UY$ z)g=YKcxAU@5Bru$^CE(^xECnkTBoOqsr~7q2aa_M(g&;YRgGkm{Cg8q;nLvdci=7d z_4T`7X;~B!C27WY#8=%qJ=}dNA_2c#_QbD0eg$ zno)@R)7e5HgBL2lMyr@Go5i)nG!=g2aQC)I$I2Mj-^sEr(P>sVJ2%YEz}^87{mn( zYylpn$AXvhuKk5|XmYv!AL&hFVF9(8uzE~vdxflxepxHHvkSbr;gm9{_wk@Q1f#u| zQ?%SQqx6aAVo)@SS@b;f>a>i$OCt@RvG>ZmBL)$NYhkht?rcj`bq;X?AX)M2us&)6No!$17SrBFk9|<{0ChDT12J4Vi z>uf}1$3eWwZx_Pd*_xg1TF1L>1&_J7ion7ZTtPyQX_)NSAgulGKTRb?vcOWeR?=D8 zhZ%SyBO`)VLnLLvH%P)pM@PXlb$7=oSLw58PpqEVkE;%(x71p|&I?EjRwJG2wP0~) z(Gv&is-$x8$rmJ^JCl3k4a#R`+GOawy5Os~fT1VBdv6JY1^;T({>M)3-?ni7Yc@5* ztRt#?Z)#vkC}tMDrxt$&$gp}N^QWEt57V{&Z<&kVwZGR2|9^Mz|JhsruWigf_I>|) zKJafx1b^$7e-hi@o{jux=O+J)ZPRk#Ps9E%XI}qm_`By}|0K4*4g&wfS>V5O*#CCh zUx%Rob`JXQ*8b08W4`j|SoQC-z+Z-cX50TS9rKT!F8{NX|352T2II^yFrdE8VU?|k Tn-=_G2Jl=#O}$?3pts|J*pNUE^hAlVvw}aMvpA#471*kkDR~2 zpU(3fHxz_U^)Nbr)?w?g_XGc1#>mS!@RlJ9FQ5m5i`h8%PMrM&RF+p!u`YCQ6jV0N z0A5#+%Qk=5)QO$6%{MJ`y1)^)6y)oOQdb0m1$c#oa>|qDyC8fi8%uK+)9%d`rp(Mt zew0%&jo@Q7)LMxiZKjy2(xm9UnQ0|%nLT>?C+W(+c{tgXB;`yoNV74?>)n4=x8%c` zh51=A(gIy>A#fMDKRx=h!?WMiP(^omn0rJ|4cBT5wafo^+iP_ooL_vqB|c238^ZQjBXzDX zOUbJ%TOU2+v2`kNR*$CNJ@+ERWVR#SB>xy>neS>kS@+m(TVk_z&lDTQ48*Md7OE5Y zJuD<5qTxhoV6~qe9UFs`2#Pkq%3jWhiJ*Nv)gzmG7ANq_Go3usA9(^ISnD+yU=&XJ z=!53yYEvElL4?gZEF#(KJapFbRERU^k$T%gjkTx$YS2!n$F3 zN?sBGz%|6icIY(khG1Y1!T2J9roKfJA9RQ>coRqN^sq1Um6n4B2EX+U<_&U1XYpa| z!Ksf865`LUufK>cS(*cxlzwAOLyQc~#%_(Nh936L(d_nfmZC>EdwV2bJh>`=|GkR~ zIK=(QlW!x~A#+d9uH|!_C+W5i$EuYEbUEN28i&t#HCo z^#OK;*?C*vGZi}{Qqt{XmEkRE;;itz4<3lgv;7!r|N;d|kNB*{s*!pR{V6}bq@cTZM zC=SPds*-7>z4YnnIVrg`)bBv;1~fXerm_nVYdc_@D+(%0f}aghZf*7}VHz}v!iX#4QY9_Yi1pLgTB5iYuXdBze~$cHxH8gD&b0_x z4Z?aQEc0gABza{U!)CD+G$S1Usgv*P{2lZ$ByXV=Sc99b=}VxhbfqWQ9btMnAcfNW2KO6Q znwvw5P4nUN$(afKe1r12Hlt56^W5B#Z|Y&qW78X zsCy`mtr30Z;p_zUi*u`t5drIPJ+kMkZ*Yf{gG-CtSD$&6#$N)%t3vb}8Vk3R7VE(^ z?zA@$(vevg$Mha4FzPX)Ai%A-wl<2@vGkU@-4sBO!VLDBjjuHy9op;__8AO2J!*Wq ze)_bkV?DYl`f1;sla=FlADG5;5u)C2?}7u~P~h;msCFkQLPy)nuu#=6u&g(ld2Cl- zQSsz4!p9?eCnvcFCPE*&Tc_Ni2q`AzPTmNJ;k^JkpHP8&bCX~Gb-YpJR-BZ)#k>GY z7IqJ@mtQ}vyg*+$_-Ies_Oow--VG$fFwtRk_*8e5MlG^Po;B6YW82urv!76K4GXi4T{Ss*Q{xEV*b6Wrn-v$)4`#;1B+J3Faao2KX}IDuio z+I-L=C#`(k{zVjOa` zM@Ppt(jxR|EGNGuS+amoWJ-xRs`}Q9%2oC|8%`?SL8qsuQ#7CIsf5#wZ^}De>Am;l z$&Ne7(Bd&ODwK3lOpKyz?qkf||L8ucQL$}xxHSl5V1ei)_}{nuHtwK$T~cyY>xYux z=H}+Vevq&6s$?DDte6G@+eq=RFYdzFw>VmNre)n^=R{Rik(s<@Ld!$9h$})6Zxu8jujZ zOPt_z4T`%DCXfW7L6m0KB4MhJ*Lr4X;|O2%C(Yl`e|}BLO1nvZv<0WZGN0P7-d{3N zYAB=BJ}wczZC6;3do`}cp@O$_0jl`<6iqx zS;YH@>b;r8#9OZ2&)|7KW$;7B6aB=QjffdWad9)80MLb>Mvimu-&0z-_n$i{k`Pm6 z|7Gm=)1NA#-qLNXhb=0kF>?0zx%~~>`_0;G1x`ZLUmtC)zK`9$q0yr4F`OOh>|FcR zF(j7EY>+q{$>`2JE$i+`w!v$-)!G+EZMfY>-)2-jX!O(6+by6{7`{d?0poK!K*xd& zU&3-;WSytaw|E`HJKYSfg2#+NI8g@g$@3hH^IX;Hg#L3)FZpaz5-MZZ-K~`}|Ar@= zH*JtPl0wl4!tW4klzuq*W4J(w;zT7yxy2-3z&#uz_a#i!EX?6@>&?y|qXSB9Pc}b@ zA=U%FhPbDD9nMbq&6`Y~o}LIG+|>714;SwB9>x(}1eN58)mZ3V3vkcWBYYv8*15%> z+pTP!mEEcka>!h2k5oIP` z%F#?mdXj!c-dgK%Pk}bktRNiX`F*#q(>c3m34h0&?9XwvkcqeNk0f}20xU5&8Olec znV_gq>7!)amh0qdN=wuJ7+gs?Jh1UlDx1>E=olp0v~2Hov`@Z{thj#7PsKF~L|j`| zY278qo7p}6NxB|bZf`GvCQXvd3@bt(ca002OY9P=fkL5fXyQab#GDolCgKWx!Pq^F zWByAy4kg`K)C&9byIYl^!(WuxtWAVHm66l{%}%UedQ%#<(MsgcgzdAg<6Sb;3_NyufPlivOMuo zK^4K@HQqTrs_&u8+WVPqKbJv+S1-(4gLfkQ;uhU?HP+I#sR`h$Q33hyKORRh3YojJ zz36L@a<7Dix~QGgqwf8W4whWq!@Y0tr4{Q2EP%M;V_iI_EC#m(SQ$XNRmwAH@iwT( zalnMa`kAk^63tk7ksuh!flSrEPDojJiY*c=mELF4t4w(JscdFKU1+{{?E)Yd+{AR- zTXbLT2R075>+NjL4_|IcDV#rbX~u5jO5lG|PsLAg{>g19vsk+;?}W@-0loiQXh?Hx zmkm$-A%0ki)SVLtmNAi;ueksCllkv0ofYe`7&YS!av3^je86glS;vN=PS#k(ILz1` zwg=Wqy*u+T=D;R--|Ahv@Bf)E=g)+LT&m73jI*}1Y}U2cRXN=2*(mJ8YrRMxonDT8 z(XeEl6JdKE^)cY1^pct*#M4zN1xb#E^IDQ(A>>7AT^E0mE~vV1oGC3*2b#(&#GiR1 zTF|WNYra;|@!5)j6-SVF?)2Em)TjK&heA1T-@2I^nJG#|JA#`UoZ>==+d6g`8Ey)t zx#N~oebQkcYH5kn8V61Gfb;mG_0kB>?_|u(nHQ6|u9+AT&?P(G3TCgDrKI2Vwb0Ls zbxw4Hhed-}wG^&S!#{^LUGaLX}bcw^(~w=Oa7 ztp=yx&)=b>ZK5td*K6r`mo_~1JZ7z#_Xbbnk(mlAMfv(CQgdgq3=MV*UT;h+OPC3-Pqo8r8*$etiTwD84ith{Pkmt96O%9Wq z3KH`f=FDF7K)j{`ZwP%OSf#LLmjF92AY<36H#B!U5I_A#l8xbC{T|Yi8+zRqzIAhl zi4%)tOi-G=O@}Qo;i#Xl*4j*p!h+YuUzx#&rfXeuP;$n3Vp=0)!trP!E1YmBvg8aM zFcxfs_r6>>F%=Z-*V(4C=iQBy%?@jYRL%&5%*Hxo)@b$FMHV1dA8s4EUw`FKXtek( ztY$qrR)h+X9u|%u)zvC(j-)Q}FF)L#Ir6v7OnJws9W8SPzAN~+>7!bi+NLM0rI){p zOm1zRC++c!e{yVFWjM@#Lp28T*&pBETAI6At}LOUI~&1yA9UpjLtci9Xma$Lkr-5x;UGM62OP`lVy+nbws zn}D=ZI{01rT81%ShK$msG@2G8hJ+2CuT;{{@&kgDUDmhY)AXU~wA2=tK*)B)!^Vkf zLnl93ZH$Iue@cPWymkK|ZV*IyZTLd)bl;^NB|nU@29;TdzPsTWLwKc8XK3gHtj z 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 N&^3Kfb}D!m1%5oywUuZq$_=n#4j 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 From d8037ba621bfd527ada88794e53f4f617ba04fb3 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Tue, 14 Jul 2015 21:26:41 +0200 Subject: [PATCH 017/117] New icon and checkmark image. --- Demo/Classes/HudDemoViewController.m | 6 +- Demo/HudDemo.xcodeproj/project.pbxproj | 42 +------ .../AppIcon.appiconset/Contents.json | 110 ++++++++++++++++++ .../AppIcon.appiconset/Icon-60@2x.png | Bin 0 -> 32993 bytes .../AppIcon.appiconset/Icon-60@3x.png | Bin 0 -> 34094 bytes .../AppIcon.appiconset/Icon-72.png | Bin 0 -> 31144 bytes .../AppIcon.appiconset/Icon-72@2x.png | Bin 0 -> 33947 bytes .../AppIcon.appiconset/Icon-76.png | Bin 0 -> 31320 bytes .../AppIcon.appiconset/Icon-76@2x.png | Bin 0 -> 33786 bytes .../AppIcon.appiconset/Icon-Small-1.png | Bin 0 -> 28991 bytes .../AppIcon.appiconset/Icon-Small-40.png | Bin 0 -> 29459 bytes .../AppIcon.appiconset/Icon-Small-40@2x-1.png | Bin 0 -> 31464 bytes .../AppIcon.appiconset/Icon-Small-40@2x.png | Bin 0 -> 31464 bytes .../AppIcon.appiconset/Icon-Small-50.png | Bin 0 -> 29998 bytes .../AppIcon.appiconset/Icon-Small-50@2x.png | Bin 0 -> 32293 bytes .../AppIcon.appiconset/Icon-Small.png | Bin 0 -> 28991 bytes .../AppIcon.appiconset/Icon-Small@2x-1.png | Bin 0 -> 30331 bytes .../AppIcon.appiconset/Icon-Small@2x.png | Bin 0 -> 30331 bytes .../AppIcon.appiconset/Icon.png | Bin 0 -> 30404 bytes .../AppIcon.appiconset/Icon@2x.png | Bin 0 -> 33003 bytes .../Checkmark.imageset/Checkmark.png | Bin 0 -> 1231 bytes .../Checkmark.imageset/Checkmark@2x.png | Bin 0 -> 1386 bytes .../Checkmark.imageset/Checkmark@3x.png | Bin 0 -> 1540 bytes .../Checkmark.imageset/Contents.json | 23 ++++ Demo/HudDemo/Images.xcassets/Contents.json | 6 + Demo/Images/37x-Checkmark.png | Bin 1211 -> 0 bytes Demo/Images/37x-Checkmark@2x.png | Bin 1497 -> 0 bytes Demo/Images/Icon-Small.png | Bin 2075 -> 0 bytes Demo/Images/Icon-Small@2x.png | Bin 3211 -> 0 bytes Demo/Images/Icon-iOS7@2x.png | Bin 6493 -> 0 bytes Demo/Images/Icon.png | Bin 2982 -> 0 bytes Demo/Images/Icon@2x.png | Bin 5470 -> 0 bytes Demo/Info.plist | 13 +-- Demo/en.lproj/HudDemoViewController.xib | 9 +- 34 files changed, 157 insertions(+), 52 deletions(-) create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-72.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-76.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-1.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-40.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon@2x.png create mode 100644 Demo/HudDemo/Images.xcassets/Checkmark.imageset/Checkmark.png create mode 100644 Demo/HudDemo/Images.xcassets/Checkmark.imageset/Checkmark@2x.png create mode 100644 Demo/HudDemo/Images.xcassets/Checkmark.imageset/Checkmark@3x.png create mode 100644 Demo/HudDemo/Images.xcassets/Checkmark.imageset/Contents.json create mode 100644 Demo/HudDemo/Images.xcassets/Contents.json delete mode 100644 Demo/Images/37x-Checkmark.png delete mode 100644 Demo/Images/37x-Checkmark@2x.png delete mode 100644 Demo/Images/Icon-Small.png delete mode 100644 Demo/Images/Icon-Small@2x.png delete mode 100644 Demo/Images/Icon-iOS7@2x.png delete mode 100644 Demo/Images/Icon.png delete mode 100644 Demo/Images/Icon@2x.png diff --git a/Demo/Classes/HudDemoViewController.m b/Demo/Classes/HudDemoViewController.m index 1e70c9028..8e88842e7 100644 --- a/Demo/Classes/HudDemoViewController.m +++ b/Demo/Classes/HudDemoViewController.m @@ -143,7 +143,7 @@ - (IBAction)showWithCustomView:(id)sender { // The sample image is based on the work by http://www.pixelpressicons.com, http://creativecommons.org/licenses/by/2.5/ca/ // Make the customViews 37 by 37 pixels for best results (those are the bounds of the build-in progress indicators) - HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]]; + HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Checkmark"]]; // Set custom view mode HUD.mode = MBProgressHUDModeCustomView; @@ -279,7 +279,7 @@ - (void)myMixedTask { // UIImageView is a UIKit class, we have to initialize it on the main thread __block UIImageView *imageView; dispatch_sync(dispatch_get_main_queue(), ^{ - UIImage *image = [UIImage imageNamed:@"37x-Checkmark.png"]; + UIImage *image = [UIImage imageNamed:@"Checkmark"]; imageView = [[UIImageView alloc] initWithImage:image]; }); HUD.customView = imageView; @@ -302,7 +302,7 @@ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { - HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]]; + HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Checkmark"]]; HUD.mode = MBProgressHUDModeCustomView; [HUD hide:YES afterDelay:2]; } diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index 31861a119..ce67e27eb 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -13,19 +13,13 @@ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 28D7ACF80DDB3853001CB0EB /* HudDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* HudDemoViewController.m */; }; D22F7D810F85241C00550BB3 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D22F7D800F85241C00550BB3 /* MBProgressHUD.m */; }; - D24A23051780ADCD0020310A /* Icon-Small.png in Resources */ = {isa = PBXBuildFile; fileRef = D22568E61780AA77008D5939 /* Icon-Small.png */; }; - D24A23061780ADD10020310A /* Icon-Small@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D22568E71780AA77008D5939 /* Icon-Small@2x.png */; }; - D24A23071780ADDA0020310A /* Icon-iOS7@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D22568E51780A9C6008D5939 /* Icon-iOS7@2x.png */; }; - D277FDB911FC877E00304321 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = D277FDB711FC877E00304321 /* Icon.png */; }; - D277FDBA11FC877E00304321 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D277FDB811FC877E00304321 /* Icon@2x.png */; }; - D286A6801518736B00E13FB8 /* 37x-Checkmark@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D286A67F1518736B00E13FB8 /* 37x-Checkmark@2x.png */; }; D286A7321518C53500E13FB8 /* HudDemoViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = D286A7341518C53500E13FB8 /* HudDemoViewController.xib */; }; D286A7361518C53C00E13FB8 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = D286A7381518C53C00E13FB8 /* MainWindow.xib */; }; D286A76D1518CA9F00E13FB8 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D286A76C1518CA9F00E13FB8 /* CoreGraphics.framework */; }; D28CBB321A87A45A0052DCEC /* HudTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D28CBB311A87A45A0052DCEC /* HudTests.m */; }; D28CBB381A87A4A10052DCEC /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D22F7D800F85241C00550BB3 /* MBProgressHUD.m */; }; D2EEB37B1B558F0900F59EC1 /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D2EEB3791B558F0900F59EC1 /* Launch.storyboard */; }; - D2F88CD6115E9F7F00E6DB82 /* 37x-Checkmark.png in Resources */ = {isa = PBXBuildFile; fileRef = D2F88CD5115E9F7F00E6DB82 /* 37x-Checkmark.png */; }; + D2EEB3811B55967200F59EC1 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D2EEB3801B55967200F59EC1 /* Images.xcassets */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -49,14 +43,8 @@ 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* HudDemo_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HudDemo_Prefix.pch; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - D22568E51780A9C6008D5939 /* Icon-iOS7@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-iOS7@2x.png"; path = "Images/Icon-iOS7@2x.png"; sourceTree = ""; }; - D22568E61780AA77008D5939 /* Icon-Small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-Small.png"; path = "Images/Icon-Small.png"; sourceTree = ""; }; - D22568E71780AA77008D5939 /* Icon-Small@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-Small@2x.png"; path = "Images/Icon-Small@2x.png"; sourceTree = ""; }; D22F7D7F0F85241C00550BB3 /* MBProgressHUD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MBProgressHUD.h; path = ../MBProgressHUD.h; sourceTree = SOURCE_ROOT; }; D22F7D800F85241C00550BB3 /* MBProgressHUD.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MBProgressHUD.m; path = ../MBProgressHUD.m; sourceTree = ""; }; - D277FDB711FC877E00304321 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = Images/Icon.png; sourceTree = ""; }; - D277FDB811FC877E00304321 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "Images/Icon@2x.png"; sourceTree = ""; }; - D286A67F1518736B00E13FB8 /* 37x-Checkmark@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "37x-Checkmark@2x.png"; path = "Images/37x-Checkmark@2x.png"; sourceTree = ""; }; D286A7331518C53500E13FB8 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/HudDemoViewController.xib; sourceTree = ""; }; D286A7371518C53C00E13FB8 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainWindow.xib; sourceTree = ""; }; D286A76C1518CA9F00E13FB8 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; @@ -64,7 +52,7 @@ D28CBB301A87A45A0052DCEC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; D28CBB311A87A45A0052DCEC /* HudTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HudTests.m; sourceTree = ""; }; D2EEB37A1B558F0900F59EC1 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/Launch.storyboard; sourceTree = ""; }; - D2F88CD5115E9F7F00E6DB82 /* 37x-Checkmark.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "37x-Checkmark.png"; path = "Images/37x-Checkmark.png"; sourceTree = ""; }; + D2EEB3801B55967200F59EC1 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = HudDemo/Images.xcassets; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -137,7 +125,7 @@ isa = PBXGroup; children = ( D277FDBF11FC880100304321 /* UI */, - D277FDBD11FC879500304321 /* Images */, + D2EEB3801B55967200F59EC1 /* Images.xcassets */, 8D1107310486CEB800E47090 /* Info.plist */, ); name = Resources; @@ -154,20 +142,6 @@ name = Frameworks; sourceTree = ""; }; - D277FDBD11FC879500304321 /* Images */ = { - isa = PBXGroup; - children = ( - D277FDB711FC877E00304321 /* Icon.png */, - D277FDB811FC877E00304321 /* Icon@2x.png */, - D22568E61780AA77008D5939 /* Icon-Small.png */, - D22568E71780AA77008D5939 /* Icon-Small@2x.png */, - D22568E51780A9C6008D5939 /* Icon-iOS7@2x.png */, - D2F88CD5115E9F7F00E6DB82 /* 37x-Checkmark.png */, - D286A67F1518736B00E13FB8 /* 37x-Checkmark@2x.png */, - ); - name = Images; - sourceTree = ""; - }; D277FDBF11FC880100304321 /* UI */ = { isa = PBXGroup; children = ( @@ -285,14 +259,8 @@ buildActionMask = 2147483647; files = ( D286A7361518C53C00E13FB8 /* MainWindow.xib in Resources */, + D2EEB3811B55967200F59EC1 /* Images.xcassets in Resources */, D286A7321518C53500E13FB8 /* HudDemoViewController.xib in Resources */, - D2F88CD6115E9F7F00E6DB82 /* 37x-Checkmark.png in Resources */, - D277FDB911FC877E00304321 /* Icon.png in Resources */, - D277FDBA11FC877E00304321 /* Icon@2x.png in Resources */, - D286A6801518736B00E13FB8 /* 37x-Checkmark@2x.png in Resources */, - D24A23051780ADCD0020310A /* Icon-Small.png in Resources */, - D24A23071780ADDA0020310A /* Icon-iOS7@2x.png in Resources */, - D24A23061780ADD10020310A /* Icon-Small@2x.png in Resources */, D2EEB37B1B558F0900F59EC1 /* Launch.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -369,6 +337,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -385,6 +354,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = HudDemo_Prefix.pch; diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Contents.json b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..da7af1236 --- /dev/null +++ b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,110 @@ +{ + "images" : [ + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-Small.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-Small@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-Small-40@2x.png", + "scale" : "2x" + }, + { + "size" : "57x57", + "idiom" : "iphone", + "filename" : "Icon.png", + "scale" : "1x" + }, + { + "size" : "57x57", + "idiom" : "iphone", + "filename" : "Icon@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small-1.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small@2x-1.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-Small-40.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-Small-40@2x-1.png", + "scale" : "2x" + }, + { + "size" : "50x50", + "idiom" : "ipad", + "filename" : "Icon-Small-50.png", + "scale" : "1x" + }, + { + "size" : "50x50", + "idiom" : "ipad", + "filename" : "Icon-Small-50@2x.png", + "scale" : "2x" + }, + { + "size" : "72x72", + "idiom" : "ipad", + "filename" : "Icon-72.png", + "scale" : "1x" + }, + { + "size" : "72x72", + "idiom" : "ipad", + "filename" : "Icon-72@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2190fcf5dda79b117686db60c8e4935888ef2d90 GIT binary patch literal 32993 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 literal 0 HcmV?d00001 diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f45eb2876cbf72919bdfca4115a67a8d53ab9ed3 GIT binary patch literal 34094 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 literal 0 HcmV?d00001 diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-72.png b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-72.png new file mode 100644 index 0000000000000000000000000000000000000000..ef7c3d72a907923396b0272300ba2ba8f67b7ff5 GIT binary patch literal 31144 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 YPOw8t^es{Ep&kBdr?pqt$i2S#KObp|wg3PC literal 0 HcmV?d00001 diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-76.png b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-76.png new file mode 100644 index 0000000000000000000000000000000000000000..a6486b7655873cb81b7c9da504f786f225716dda GIT binary patch literal 31320 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 DAtavo literal 0 HcmV?d00001 diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f415127d678854edabb17490e24211af2a91f424 GIT binary patch literal 33786 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 literal 0 HcmV?d00001 diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-1.png b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9fa1531850b285e56c0a38e7dedb4feb5e4544f3 GIT binary patch literal 28991 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 literal 0 HcmV?d00001 diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-40.png b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-40.png new file mode 100644 index 0000000000000000000000000000000000000000..76d2ac5d153a4800803aa36b49b5feddb549a02c GIT binary patch literal 29459 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 literal 0 HcmV?d00001 diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0e27276f1b4f88d07f79c33d01cc381c1aa8190e GIT binary patch literal 31464 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 literal 0 HcmV?d00001 diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..835ec95b4b377e1b5b04056e50774551876ec83f GIT binary patch literal 32293 zcmchA1$%Di_O_FJH-4E!9r=zt#9# zG(Z0PW_bPr_+OAKv$X0P5@G9P3$YG}KWuA~FJE6ds&n_G z?rqxygvIvt3o)MYOX(X2>U{Z{G)svK3F~7^vV__qqGFnQKiIk3+Y)7M>fMcPOSFws zY>`nd2PW8p2Da-QHn2~aX!ULuXlarXfCl>7l0qygeWPO%15%oL+uIGm&&J38-WK~K zNqw4nrw^)o+YS~bHo<0L{W#w+f@Cbb=tr^~FY-PX3cvdkfreZ|CPes?qA2cey_efws0 zk(i|Q!!$A$#PsRJ&I96X{+(=zvB?QxHmx6qSu1lkiAkMo+3V>BIUctY#|0<}wveRQ zgwCW>DGGkR)4EZ|pnai+>5BGsy-}Tma2A zBB%g@NPo0#tTifpK-QzIFTwkgOlMLIAn5>_ed|#$oi!vW#O1@*uz>K`guWqIvMA%6 z_{YUW*n4Z+HlS5ZVp2#h7XQ|&j-2OuYONXcwTXX_A$~$+f#t{DJRuhu^aP%y7 zL;A)wwn%YtQDLz$nPW7*@%DEytEl!t2A!o92rZp6XUF)F4#w;Fc~?D=1jSf7*^;n< z**${A?7sxzeApax=?0;zzJqK@=r;me78^IfK{uJtxLmTJxY(rVsEEiUr>$i^z~C)l3D#MPoT0aMczo*xO=#9StnU1FqVlL>F!4c)(R#kSytq`E!m| zEXNbBT4P+TSdIr=wZ*y`SdIr=wM8-0atD1&3-{=cG<4+ zjH?z~#`d*Yg5U?)VjQ%W^9fh21;gz&ya5MIWqs|co!XS2C^~2){X17Jv=0x5YiMZ| z<7=#Q2cQ9wA&Is`i-SfTKJKa?`;?T}zHuQjj@**B9&xL^{|77B(iRe(6zO2L8DIYY z8jF3$oS9|WTk3DXRq39*f3^?*mam`vaVCf$0mw*%`)P&*1Oj&v7>ZYUT47X1RX9T8 z2~|;KO;6kvI7a0W+_tB@t7cT3Q35xM#>^92$ZM^GGju4)=8d{6k65^ zQWGVa*ECU48CI2amgL^0ASs!rgn}hiT2V1{%tqEl znP6B_7bt}n30~sN`cPz&WkgvbG*)LMjg&-@)HQ~pM2@B;%A^k+^JREaS7@3gWlG>A znG`gTaG0Dfze_<81P#=PpmmAVbzUPW4&ziw8Y?9UqGCqD(VR|^G8)8&h?>aqJYXkT z6=jvzbQ20v<#k?AMU7!pk>D7aKsUN3P&6wkW@|;s_)-)Jh39BpRcMW2u?V~@(X2uX zn#s&*LgXl!r7#ngV^vNUFc^tc7)4e{ku}*5n$T5DLZt*vmUu;@1fJn#LZ&%^5m?S- zt!Q*WD2yy{lrD;brt*|1NVEj3P2ln8-I>z@i{+tJiWI;bgh)v&0Y0P%mM3^cHCZcK zqzuqZ6~KwKPHB=Z@f5@JBq?y%coS}CFm)B%P0$K0f{8_zHE=&!5mlK2@4P!IhGtko z;&eh&c$!wRF%rv=oXBxJ&(OTd`M{?Z%wLvG){0>K^{E^9I>o{%|#gFNFoN+BeMWhG8! zWN;YIYLa3`!AS~%9p`mc6=_z}z=Sl-(^x7(kvWs|!SlKx$v}g_8#)Fg(hMo8U}v2I zE6U`%GZz?1;uM-w64V%J>f*~F#K_+NTGoz4s8eGNGD#5CntSS^Qssg9W9M(!O zSzUppB!XoaNC6xnY_}$Yh!RL1laU3J^MNe`vaAZM#ONYRu&hRttisSDqB8}>Ks8S*i)JzC=&`12O7K0a0IWDl%P^L_c{g1WoI(oL{f{KAn2k% z5Ts1-8gzz8DLOV$C3Mmd@9&OE?};fU`Q-QD9B_&{UiSiQ=IJb(w~%AP5r9JPsvIuK!5E=Pj*~?SY7l2cQb_1330l{r4~Z3^C=^ZSAT+VgIKPsD5DN|^uP`RkM}<8h zgF7hbFpVK8Qs>i!x}p&bIOp9yR2(&t5@1>gEYETf?i}nVLWZrSYqDapR;mWA3ArFB z&{Gn4M1W9-UZ%k&Bq^EfhemUQHq^KtGk_f(*!MG&!w=7T+ zE$W;qBi_MjX7i9~Sc)>w!YUC&9eWQ82oslR8ls*tSu5xaS>p=oMhNA#+M8Y7kx?68tNMo&U3y36HbM* zp|p(@O}N29TU0p5F`<;N)fOI>-j-;!hWUoTz6uQ&z?^3K*}N^5w^?lvExzFdV>8+k zd_(C_);HWHhA=c|wX!yom3PpVl@)DPk@RJ)bZB~8qA^i1EKHz6AcbksL^_za1xteu zW%&?aj^Z-LC5DrvuhkkFVzmhjM5Ei|3KI|w4`Z#y91%1BpXO){4G#^a#c*FHJj}k2 zf-las)ffI!s5OMN(tMc7xRR5>312$oi8}s} z9BuRl8PCe9t~0a(StdIq!?}a8&M=UT8iXihqNd^(XhU?&nTVA1-eBb`F!*2tjZ+De9z&inNo_Jd86=g63i&{LvePB`iGHh8hKP*F?Xhli?YeBNztQ z1I$op95_#+pb#1bgWAlkNhgB?OR8|qAlRT?;0^MyWFSc)q**M^yK*X>Os5#A57<2t zVJr!ZTpgSSTmzmSMVXjX%XU^~U~Q5T zd_4{>oSAoTA0*2HWualp0oJgSX(F$}SBBffGNy1yIvGdu3Y>2^O!i|c$eOINs=yO4 zR%tV&CY=n-kG+P$pQpJ2{()l%_Rkv`$EdLCVb|o5Owz%%lmh29FXs(eHzM+U;4x~n z3SJg84&JlQ(iEXUvztIT_9fvU5i~+2;Gn|cQB}Y#no7WpmY{Q?h8^%EECiq+aChK1 z8~X+y5z+UDk7nBKwDJIPA0I;0{n0I zR&Y2R4HAllVR;=4ohQkql7M>wsR9us4dybG90a;yKx+W999aq~&=!RgXcccYL z4cb7UQ~){1w{vhzRk(~GVSt<4)uM<4fqXz3`btMKo+H%(Cy`X()5A4|S&OFOW;5%_z^!LY zb}yR}z#pOzG?CG#LNW&Otk}^NGn+e$63GZ}jTZhIa3iz@b3&j@w%!>fq!?g44)~>J zg336i)O5hm94j(_7R;21LrScW2A~Px0s&jv#DI24>G=xj9NbKmhh2tKOy*&Q;Ae}f zqyaIL!NX>_m7~!blsZkY9D{{r&FmeAlt6%B|HFTUDFit3-J|S`5%Iv9G{E(4B0Koh{HgKsFak4J|#$E0p2(;I74!os8L6wm4WvF?ggq$ zBd1t2vC17%0zVO8l^d2bN1I^>4k-c4s0R1|e}q%bWLFj?kW~VkPC*J7`OX3mU)W%P zUJwg|XmPTi_6+SDatJ3I3I*0MMlI1M@-n;6+%m!K^O?I(oKJfgl4IblIX&6ADKSqC z;2%o@vjt9^hk5F70vQe3MdJ{3%ELU3QzmN!q2agy4RXe}xkd|9M1)D9z>tH2*G+t6 zM{6s?qJt=+d4M)RR88!GY)ToJDVz|vLUv9tv;$yk0uGzPYR));&b6P=NQiwx=Bg5c zekN9UR-d^k-PaE9P`b@Sxhb(cu+9w|3W9+%QP_?~YwRZgK@m_N$BDetc}l3gK!g_R z#|~b=RzQFPs34L8fUY{>K7=yf)}Lngx7#XQwPTrTg6X4yD_>l8e#^ zD?$kZ9ETl@*r$_S$xUhGk0=Hx1zJLLCKEVFNfCgulIN4naf(ra1FV#>SHo~3f;KXs zLgWLOMq;w|lgqs;$ObTAEe(E`;#Aw`ro^tmmjweciq1NfG2-r|IBg>P_Igq}Q?L`W#NK=R?Bdx>Pt|%&xFgBw4*;c9uWE}AT zz<6dEUYUGL0{QZg5~|s={Y1V6;4NOJ^o-GBKSd5lOqUVMl$@Lu)ERO#Z{&$(P(t=e zhDRpT!1WX-G9IqEPVjJ3k#&O94@v@ptsyc>!~O!==7et{>5wl70h@^@2v}%j9cUb~ z6_FX`nBxuI4)X_wP4+z9<6D6A$fRQ>WQWn1y zAn1^7-x@WY$m_x>bE0_>BnF&>l>~rfw~XDECM1j>&o}{i13)F@Dggn{w8jy0rwK%s zVb?f0WfY|&4oD+BlTImt^N{C=1O%2vwuv)J$SqYyl2MNH36Gi64Do=njx_j?UzG$XoZkWpEiH zMaYCR+y!K!0oFu5631&mco6h=VqqX-L_~^?;iG490`g6eiNYe)z%0uuQ}zL^L-Gsu zCQ}X>9srGG3XK3nO*xT6GzG{RiB?${qubg6SuP$^LgpY!2n02Ko`x>d5&ls)o)QEn zSPdd#8iK<>W-=(@*CP>%0Gi7o#OZ8p8IMN`smTC6&6LzgfVZWScUK~SD zSBN7Sq(igN@Aeh4`=5wxBV9yAUau2miRL`+llPbs*()CM5E4mw$ay50q;rDX=aU9z z>S3Rf$CR?il#0icxDEm888SJ2g=Anfh{W@{k$TFR=NI5Vpur z_W;d8#s*@H2oz=7V30$|&)|))8gdJrXa~U3kkd%W$XFrwcZI>M5Mt8vj=eDgg_;mS z&AX&#M9(Q9rNIiBwh5BLIOGKa-iF|l7$?>n@GehB3)9WRc_KU4V@l*VA7l@8h z6eIB-tBp)6CzvsU3!e6=3W$2@C>hC?eK6yV#3SS}IkWo^i1)Nlq#k*=LP(^L0U1-7 zma!2pLluSw?;a@`PHatJ(H`~*hZvO$3hrV_Um+th10N4rzR2W6JkqiC#-aj=M;?ZP z%r?7C4ZULE5Wrnf3T0M>l_@nLY&aB)Ab~TzPxntY(xXrsfxnsFmD`pSD~SL^v7RkNH z*UpYgyFX9G(HSk?wC~C}-$0_x&;iUpyVH4(t}?D-=99gX4`@ zq{^aH4oRDEL`-sJvp61@fQR!0yP#YJ=Q~4!8R#UBQbT-*NT?J2iR^C==ZOhy$YqM{R4b%q49NHRsClN(d#CWQPu>T+CEQv!~(f;f{|axF;4PokV?mLnj#q0W`@)>AXtT#P-SCO-*Hax z1Z40Mr~}02XHdG0y&1W`@ZXHWiu8HHFGFGs3b|y8kyR&}7jUnqeNrA%vT%ox*$&h= zi-%Btge+d($dPm+O?VVl!be3-LVA=0!C?v}hk~jrqe#ffuE3XL0kR-?fHsUoasuTI zC_h9RDT$I(C-x9Zk5Gxq1M@Sog!5uaAw~kc75-eNed{)oFBo99QIVaAh`LY7c-$w7 z9X%Ya=rJYiTLsm`DELGHGtP<;=fJr`?i#8}2q)TJP;rb|q|xNG6LciM!SiMXXAujd z2AkD&RApyypWC>mNFh3c3Js)>rJrnFP=Lpx*bIQEU{+|6X%C4=Ud7D-m~A?xp+8Zj zh{S3MUIgJJN&;yGaR8ed*^YJ_%`2$1k=#C&;Y^Mva0aGt2x>mLVsyBB1Hm%njVn%cHntJb z1BCN3<&fKJia8CBRle zMVcYOoY)DtP!`$~&QNAN8~ceo8%QMv(MYqb{Y*Iom5YlDjB4i$JHgmbx3csgqj9qf za;Y+rUr@phQUSxz#yumBR|wgE2+Bf#X6_0`iwb-OS{I;z*}WuLqlHPya1v^{GWHYF z#62|2knJq)2*`@Gxvf8OJq=<$KvOe!1(fbZr4?i>B9#G&XW660O$*2vVG$QKyWJ*p zo~UEMRwAnt1(SJ`@n8UtDUpB=g$Anz{GJ!92Dcm-lm@btS4u>ZIf=q`E!issX6F#j zq*%sTMyrab1I?jg6XpE&^XWGBrs7Z;cL-%=89?Z}m$Rfw9ExBJODtowIG?zT0MQSK zQ|z;2jt3>cFI+c}gA?3~5UZL|lZGnb49i$VF(R&c;*gJzS}D?r=0&v&itzzWW>^@= z;b(N*gM)N@ggYoFG9JJ$Dw=S&Ql_>y>>;-@Jzd>)?RbSSO-Ni0m(HZGtvwdWNGR$; zh7T(8oKWIgDi0}9lMC=2QAhYdwEjGq4Bg&lo;Z^2xMm(MMyZG zNP9yfKZ=sTdq|LXvO>5E0eCd-!OGxUV?W)B+iRM^WiXEO+$T7Xz`YzQQk2teFi1`J z;({og#61m0Ay;1K2~~}>H`J$RdH`)ic5ptaJCrcZAt@Nt!O>2TrFSTy?M2*ZBqO~HK#!C2 zX+|kwn6T+!*HcdHJ~K)US1G~MLz1(z`~*`<79JKZ@G-7fb9`2EQ;NKVa501GM_h$~ zDziLL!lT2bFhH+yWKHkz$<+4m^a*p$$lpfL7`JV6P9jjbDd8j==o0J>ln9{|)BVxP zaP3f3Z!f+?>@F{q!2d<#>MaI!_^^@l&?kH?WSS#X4Qq&SR*wW63q`iLLkX7`+3g{u zc#1|gBK}LjId#&fkc;CX69BsDxLXJbRL)|q2p+tBRt%|$TL$5Y;9?|a*-l_?_&B&p zE<=|I7`Ds;Dr9hH7O6N}TZjY?B^W|#Z^;DA6SoH##kFuSH79lgZpwO_64Jy?nUIST zrQx{O2ZDh{fjVxhbFwQCRBw&e=o1%6AnO#W%2~|}LO*X)qB}QbLT*azC$5U)kk^Qa zq1inlS?5!df$?}!tqPkD30$~UFHFMTz;-4$$xm)Eq!rOL4h12S%G4YI{&-Q8-jzal6gB+PjAQB&`X*SmOUd>m!+ z(i>N1cqVQCNE;e-@)n=;o)a_PPbEd*1vw_K3JPK^S#Jr-c{lUh<4z3eXTv)c(mymC zHDEhjXr=+TNH-bZc~wpZ?YpDq0w}z7NX&epkO!mAXd3q^$3)oh_ALMZVIFiif}<4A z`x2qJ2#T@UL|=iz1yy1QPla(d)*3?4nd^`>m&}(VQDgwY1dw^0i`mPX(pMqZjO<*Q z&RqVv`7Zr;)s_&2jnWhF{vP|wr2@?M%H28QZBqfbSS;(+O6FH*g>tNwqrwPZ-o~)F z?h0!sgo%W&jSI8dLPHGThOlplefT+E1cozW{|IjvGk#3Te61ON$$BxGEe89UfY+W? zO>6UEzI>$zv{I$cDVOf{jEb%jG4S^i5iLuNn_cRojn;)*lfRs`cK_Dsdf(oy{b%)d zXYT$|KpR&6RY#v<P>~dBYK~H{d4HHl9!g=^Va4aKUgL9{F8u4Qgs4;t6d+MXC#;>DAs zD(jTRqn2m?ar)cCbA?-<-pc&fyUmWhR-%K?nxPF_jlWe;>lo1egNtRq7=1c2N%*90 z*Fr64%oskbPW8!WnOASh`;_f9|M|#A&5zuVyRwTsb@}WldSQ_d&i{0-NP+i;&#C)g zXr~F~OYbf9Y-6R3$J+d{XG@i4|D`s2@Ziq=8;iDXt?}ko`^xkGYFho;?>%m8S#^O8 zm^pgm#d{a;m)O>L|Lvq{-}NZoeAC5a)WHv~4*O>J1G?v=Vc(8Y7X0wd`SrEucl^aG zy1}GV<;mjZZ>~Mxfk^rNr&g^hG!A$YVcYrY^@qb-J{xoTQ0S3qe-xj5DE{;5qbKwk zoxl0C+AY2cx%;Te_kUxK z;C1t?~y-$ zzeuUH&AT5p-}8WPvY~TYTGQQu@gr{?(+@uLnp$|;j2)*(G`Ccpbc)%;72%RMeSJ(> zR=b-7YQr{AH#+4~Ku0OwR*Xu3cj2l_ARoVE1@9hpuxi!1S(BY?htXr_Q z_RTMzz36d+2x(bb_;2VipSn}>{ZKP<%I!SyzzRi5yN{G zKiK8txyLIUzZlbIcJrWDt*UI>_f6fWlgf`Qe(uUQfiE8R8usL5#epa5ls~tnTtM$R zUWo$+9Ow}{Z1&P~Lnc%`g1d2E-zit4(8!LBl(aL+)EGN^$RyJ@1z;{NLUK2MU!g zUGe(h`c?h>{NDR?{;hwH7D*+k&(l)V{y6bvP{%#JEr%nTHBG$rV$ab}T1?vY;^X*^ z4GI_U@Xw=d!yddG#tgo5e&4?Qdyf40Frk4-tWY4fgKB^p@0{tQfQ)NSzh$0qnhw<>t_ z+5X-Cty%VYz`DA^{U;AkJ-=GLdA^sUI?djcKuj%gVSR~Tyb7`j|0I0kSFvBQ)bYQF z+vUzb&+7HC$gpRJdNq5Z%aab(et(B=(fmh=Dc-v}+=-Lw*IzujS|_gNm;dalCav4p zX~wKs6(S-cb_IU9BHpLWmV$F4JM>&%qET$y(DlovZP{Gq*5<|w0>6B^aQB?}Vy?c$kBrRqdXoN(>I-pvu=@3DV&8a>oP*1mbZ(dLH#lpmAI zPGEkcyz&Ru_^wikLVsV?Yi*iUP+IeyPsH|3tv@e4bqOvwg|-;aFQPuxD>a`EC*-<$S%XKL@hLxrkND}VIx;XZx)_%^y+X_CGo zVnwZ~#Hw41so}@&d@|{M`Oww0DTCj9lyAqAeh*6Q+KYkXrcLk<718Us}2>99OFAg>yp({(dYrFfcITsb8_mR$@Zx ziW2d`=jwiZuT963(Uw-V+T5F6_j=EcgX*TtKYs7T;bX_by&`v)zc#XNw`nhfn>T0g zOs&84*pbUuQy#7R{TJV_+Yd>2@oTFeiIG3t*wDZF;KR3%Oi;Z~_MElLq{-9R>-9IsQ*QhifuVcpB+E?>c&Hx%0ApwV*bpzwr!V7d|bH0^-yKGI(w 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 literal 0 HcmV?d00001 diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small.png b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small.png new file mode 100644 index 0000000000000000000000000000000000000000..9fa1531850b285e56c0a38e7dedb4feb5e4544f3 GIT binary patch literal 28991 zcmchg3zTI=dGALBW%&pufPx{(p(S1=bobu1t7=!Z46>gxhJj&b5YQMs-RJa7hv|pi zJB}Tny)NA5IC%-z6?w;;_ z_Ia2Up3{BmtLInW^Z(U($ELGi{etJd3C}E1&bGKJZo%Xc6y}h z+KlX;o`ZVby3<~@d#*ZhQGKy8Uf(t~vwrC5&)h#$nX0WHI$v${HqIsW?Neu7GGE_v z$=O>cF1cvJ)`nhndgZj;V{|ZGU#wPkPw$vn7~8#msL}5je|Enf9jY{%EMByJs5z+% zHg2jUv-9M>p3OW_Qj{)U%73=1beFSy(#~C`K`0FJKCqbslDDx zk~B`W^74()VnxHd61IXgdHWy_}AJsF*w+140s@?P7|-`J75SbQ*-)p(OLEWTZQ68pVy8R*Hf?R0HtR-v z&ioX2uezhCk4z__jC1M5!qdk0<19_G#22w2W}XtcUDbukgge)Itunr+vTZKhar0)>^An6 z`Xb|Q0+%dIn`(kNt?M7X@^OdN$T@6P~hncNx(QT#1>(beZ z2HpBnrqP!g?liF#4Z8IuY?r=PH0ahBlBL<%sP435D_V5xO?KO{6%D%erMgXQMT2gA z`BHXU<%$;FdJA=+ljh|bM;q<-r_l|Y|(8czUU^mR<`KYn+dy!hZPOF^|eAP z6fbi{gKmAT&&%?aTEkz_qFZkbyS&oLNbM>Hbho>+qCvN*sOHt_ysi}uy7lGc za>Ep^oIka&y>iyn!eR%3Q`EBe-l6W=uWQq-$1`WA>y<6|LG_sq{jF@#t+xwtyPY@C zp{u2jyY+Lj7_qiPC(X~g^>EJQB(7m)!_2VT=S@TdwpSPG3zZI?c5L2loW_!p+3C6J zOeeSGuqHkA_usICXV$Ab7Pog;ZR^ATskt;xtjsK1KGIPau4;Pnqsu=0VZQ$IuiHU{ zh(N{y?q^XX;B?|HMv5>EgG8n>O|%zn-EX-qNk}xyM z6T*x6txUtTfI|6ckfcnV)x^1tJ*oWMh$OUL80n%hlGs<$#*vq)Tt=B6S?lMS6vFC2 zM517fob}4k&yyffek_cRV&7ztXcm{pYbk{11yXA-$Rj_`!^{_&d8U5APDREhMHD*F zx$t8;e6B5rK-5qP-F^A6n}rp$_si z2{NhJgfNZ*l>{a$Sb5-CEn+2DiP9?7xnVMqpU5Ome5(r1Bk=N+MWn)HaTF$*Frf@% zFAlVkM(KjR3K+mkWNfs^tu8c$gHu#4|Sf3FbgscP=*ofkK=;9l8PxA8wr~v zp_gQ#&OGbc1XhWp$)bW;pry+pX*Cj}>{{49wb3uQ{fONp;d znrf3rnKm)ATRVm_fwsbvCJjAf1DZ#1CUU9yqq~O%6bby~=@cnoh-HSH8aK>_VWxZ= z+JZBO1O14zv(jiS*q=maVW2~uce*1`+7k(98c0tR zP*^TBr!BP?=Dsk*(_@tjBv*sU@&ZY1wK2Ihp6AD2n4vSQNOBG_^>W{d_qDUKIu4zb zLHKBy#}PMO=FE+o8T%qDI1d}=MD$e_MtNux<>kg*dM>!iVMn71#>i6cLL@@8U>*m! z3dTg-c`juTa81@yL|(|{@X|E!V?Wn^lqt43h;kjvPIS~e!!*y*0^Us!R9;}vunHZ9F6RUjFP4eU17~;?j3H%!j;%lqaz~=XM^{B?-GVV9Wl$7JmTQD2`^^1~ z5>hN&$}o`y(kI29h~W-_4$Gu3{5)(5^(6BooU?X}l&fZi!L%?cR2t!~v7fvcTPx4v zq+qYo46TV=FbR4pf=3KO9ladDCcYmPoJSVuI2VaEVW#~wlAf2w(!@cA^o~VZAmK6- zNKQJ0_dJViQ!q_HRtpyJF$)SfF++TCp|CHUo#$~Qa)D~Ld8#9o7fI193L^_&$1tvs z{*H}^0-NhJCf}j6qIJXpmSP+#tP*2$&K?Vhg-1bvsFwwMh0cgm9awh{Gc;{1vM_29LT0^>_g2YVsTBU7La zFkO5sP{Dd(J`v62bbg1r)xA+Os~^ za3D=$1Zu6!(Rt5ss^{I;@3m&C5>u{&1}} zUai%QL^Sq1uL(mod_vXS8p)aeQfsV@PmYfVc5+xwPBhNZ40Eq*!}v?%wW?nW!ij=; z?c517c(9zZ_yjUCX^xlpt<0>!)5E3ttGFodT|D zknt(jLE@#THoPrFuhUCLBJKms{Q^^|NhagW=KSsJz>S8CS8GDwhRaYr)l9mcwp z$i@sIicHK>en1;Cur3fO&C#&(6AV6VfPU7-HOC~yEx;pb?4*=_VsS#_$S*e08lws6 zVE|j_C$J>eW+lUiDPj}VTqKj4WC$YMQH4>{+(}$ABa_TWY1-T`P>~I?AjCM+5t>UO z{22{liG_!4mf!z~%Zc8w7b2yE-2A-Y}1twpEOybq$p)`FSw?u0YXuvG% zi%TR<9^7S&4dVtYORP;l!q?Nda7EsIW0Fb{WeG6l2x~ORG8?A&%D7ER7KTHbWZDlC zoNpYa#x*r@7H29op@*>=6h&&9WH3Kxjltj7+6e#P7{dPjk!hJ?)nnK6NfzaBtw?ZQ z`?+tRZY($-JjN_Y;boI)yysj6!b{NX1tFZqmS`kG=A|AEDh^MY5^l*-4>vkO=c0x? z@FW%jQ4ri69A|fK_=rdsyxRmp5!g<$B$O6GLnx!aErF#1%rx6CS&l5ny^FoRgo2S+ zL-+_dKi2JJl%#%6#11c(NRsKalf;7}O|+xWNph_-jP0yXGHYY}U9eur(mv!Qq9)K1 zcvyc25JiG;pH*lkq+%N5+GYukH^v>NqUt1GV<*T3W*7#b6L=99A}1V_C6OR-QegHr zcrr$!Mkx+Uf0Il&XF@B408t%In-XnFV~kpyKm{PK11l$)R*CgeO|&Itb+N}W8~ks4 zD;$nalSHvd73MH>Uy>{J3HK6GB_ilM=5k67f$j|Gj6hZ=OCcrNl4uj8=ry-C?DPz6 zU_?qF2fST}wWYX>kVxX@4Yg>w5a0m=^i>WRuaoM)N%RwZdR$W+XU;9>@DZGTA_!%O zg3w3f+*lI3ZX=XHV>F^r3VDFX9!7Yfoyk&Sut|ysl{qC$yfR6^*@jMl25F~B5-!1k zlzp(WLr6N5qvttfBt(^|EmIQsBMT9D ztuYf{y2x|Vh^`db+)I>z5e}Oz{u*&3`of$rqTuMuD3M}>@ig(vtRO1WnKH`>Lu+Nh zl_o{Xq$4Felo4nmxZq(+7Z}hTDF@%7T;pb@A$A$J*zaS9@Uv|iWkk$kc(^ET)oHel zG7mhZB^#@X?46F3M1ZjW@n1282uH5H%4L-BY(%~$B9~Gi;5t$wy6`}eC!XNKm2vzk z?sKv`ipj$?AjVN2V@60~gEvkL&PlEUHQH&mG4US4y+oA*FvYgOD(^^1{KR0DJIh%I zMX`g9l!Rqc7kt1U(P@$FTB0Pf>T&1-Dd6zVhKMgV7@-$(VThKJ^K2lrSI8l5HVOr6 zm{~_bfxKKEbG1z9`F^e*ll$37Lu!e)R(i8nQ?kyC;Ggn|*%Bx2W1Trppv=%NnI`Gf z$2#3Di!;y5xGqG4%J_EGY%xVFCPjiFhl0-weB@4h8)MNSih_`!4H4A>dtjL|CT5Bg zf-BVE1g9McTYETciOR}2Ay{>uXe4r<$lNp{=~rNdFO9jHvUlyUhO%cKT20CJV4XV~ z3c;WY6n3ZCy7MF;XbJUcZNt)aM$}%Ap+)^Pf*05dBq)dq0tz6yTEcy#G7i_DJ+E^$ zrQ`UJ#dAp|0=JJbd*7keV?r657z2@9d!awJw707$$(!O2lE8?R%>q$2Ta2E=c8H9J zv(yt{7WnXGw`?_K@7%YBvgcD-Md{LtC_#eb*umsJOHO4qrNfUTE+_@9mzBu`jg+(m zl#{-1w$_QOz#&#D8`Ut{lC+5l6@mvS%)~66r(S(3paEQ1E5q+fO11rJN=^k|76y_@ zu1c+%HIzM{%4$mZmPBl1$jcI@D&rw^Cy67h`M&oS#d{dvik@e?nzDCEy_yo40QY&u z4+z^7<*Jv?a}}k_{E;X{=K^g4-crK1X4N{;4&<4UdoD+pmg&#cl)dlJYRZNL1Bk+D zxfoOLv*p?(Hdi>gu`#5;N+^l_al@o`|GLVt-tP*A)?u8$4kcvnx!(+3svTBSa-QgH zhe(KQo|H+=Xw{g#@9io|rv-_pI6wmOR+rfc1SXIiz&Dn?NTX~Z$S4ErC_9xT4M}5@ z)nB$!Es=5Z0fh025MFJ*^@)59NQr75>^#9+5Z(%7k+){cd0NdC%VTnxQORAQ&QJ%T z!-=&hk$sW#$l`#wUQ#0Cam{lt#7zZt0`x;fM6fe5qXG68(Y6x4Mbd#6M8LM=35JaZ zb&zS$iXfvpbG*~-m_Hac%j@ioZwb-u!h$`6i`RRZ9I>lOB$BQ1Q=}4y~V_f z$+3`hShjCnO((c6Zdr-uB}q&;iJc^X)Ub?umL@*N&tRNDyn&z+SS2FhZEKvId*G2- z#;z&3WkTfS0Rz%AP09$)1Lp_;K`GECWt7ORGzMg};(p>W>&!(zh^%+!1YA^%=aBqS zzdOW%3`z;$bigs4)eaJH$>-&k0ZBq)Y8jG5E?Fnp9U|pAXmdRBwl{AXE+bO}63)2` zAkheGf=AL}Mudl?e~EL=FXlkTXE5r5Iz++5wcyz?8@wvV=rXo9lGCEGPYw=uj9_600F2mXRDLGSi~O zuLlU_5zW=4ILr1{4m?|=rX+gWmehdYz*Z7|1Lehem1thB;h;ODeF+>|q2C)j)bKya zYy%fb!S$9zmI6KSnBl;bpjQUuA%LVIavqRLlM{Nrp8+w`0mqC6ri=%sOa`XpIRw-* zGP$`!F)XcmYKa*QO3+BO(+2z*B9(rRD} zOSA)FY2-A3jMfhIekzhxkz&gGkG)AFs0lG?|B_nT!6}i_utM850Tiae1rpvy@I|u3 zdL!O7=xj0F23#lT+<_^^4ZNl9(}hra{L{4O!2el96TEhZ*mH zN8p&s>^>6lgN_OGXuur;ND&h<7H!Me<;$qT$nfrgWR%#N#G(fr6Ni|}g@m_Qnmgn& zGx&I*d_i)OkL+x{DJqaca2N^5wuViOUU6{<;x3dz6;)xir6$5gQ!E02vpHt(Hyd~q zr4jtw_O5!iq*P=Hegfpc0(W5kSYchje-?;0z@ZZBO}X&~8D7SQ3?|vD{mqBNn z6T78+Mc~0Xj(54pR8cAiXcI@I04ux1@x%lMTqo>8xeE8YCBa;DGNjayUy=ze(Vw8d z2V5r$8gRDS8+c3?7awSEH30I#_ErP&AB=CIq@ok6x+TFHaZQ6f1on?AE792);e*Z= zfc=28#d#ZWhk}8}bV;#+Bp5KsJU1L_(9|m~Hg0*l3{THKJp~@^~ zUjZzZNH9$iVMtjMHg#j2jf@3YIpgqkT9)8yfYK?QCB{{oIjQMFut^Y6W#g*vbV)n` z1g}ROAcx^b)4u)p|kuCSuHPW&=}F%)veLdI!{<|W)a=$K+)N`*TFvYn{$5)V;+ z1d2Cw7|9Z85>ix&k4jBKGfP5pSYUD_R9(3up^{U-|)PZDa%;68f=y4RAslgujja? z6=X-K&;UNxyxF-)h{sZFMnKdQ6b z2JP6e!FtXMy0SC_h$ag#Zyete48;Qo0fV{Xz7m-Lj)lVN6ve)LKXKF&93-wlQgT<& z0N{p0CfuTAbwERbjR@-U%5ne*=$z=e4k=G2zV5KWR4ik2DC$Lcm!h*?q3i`zlZtr` zqA5*!wir2hBE*#2wAR_Xj0e>nOJq9b?Ts;e&u2$en)5s;a%Y*6HwXayx}0xVwoX*f zfa|21ms%@a>(&mr935|OkSqf?o|Ncpj*;vE>Abca>UnR01Zv7P34OKJX#kkR3Y17& zs%%Sq`-K-pVXIsvf=lmXz` z@@#o&0mO(RFIx1vO?#cxF>sWiIw_d!PsYOl15*OPN1MIOUu>b3Bv;zj$t71t;{DAx<+_lSUPA%QChUBl66X29HmzlwYEGsdk|l zpU`B>!T`fBbKb!Lj!(Knl*o7jzf?5wwo+T$JA0@nq-VF+t~>7#%S7U89-V3KZ6g;c zBZ|5}_)w8oLdmmK15#3xOYoiYtA1~pd)O*2Ym~fuQyBsMH<)#gW)a)%U zNZ};!G`K>pe%Fbr2KGjMdfNl&S;q5bi6MjwYPRn&sd^@j;u2VWN@_rWXh16R`X7^r ziw?v0A^U*9N*q``{xaKyhfmf}VwxiNn~jaCEDKdqEQUIj6hGx{Vbx4m?kzI zcD*RE`-&(to>Ico1LRzWPbj2Rcvw8(26i!NbzP$EPrX796&aqTFoZxmmWyX%LN z_`h{eZ%OL#v61^26JHCYIjL%_A+M|+i8vNTw!ERl<3$a72#BY3Xhi<&;hdI?X;yJO zGJ&95&f7u&sLFD#Bo7Y1D^6Q6{XSq%@p&eGm)*1?s$3S8^%{s>5dM z#^eDBP^YM>vYHuEKZjE?T#qtgH6`cCQ*jzxBN@Y@cS4r#XA~3T8Khbjn-2gNuj;im zQqM@w9Ngq#JJdVh#siOuO9#>bm$Ppzn5>$u(@5^UP3q1F$(3mb;zvBaHi#BZl&UY#_e_1qZ!gf4pmJzpTnv83{DyK!ecGh}K@U26( z{e?mU%(~Sz?H53!Nu4+{;Xz#<) zTH0TZB>XW?j`@AArRd9=n!B)SMGdZOGS}#8zH9!R*5{`z?)Q4QaG>_hbKf-s`s?bK&tH47QDY z;pCg-byHWock4yxZMyp0TOPmnvAh4`=tp1s&VTy;gRh-F@2_sTdg$s${@}PDMzt?K z=etk-?Ooq{^tHSGVe=c~Y}32;en|VTTbN28f8FRt@%_)=^ymra?ET3}8zz4B$e+CR z__r_o$1k2fc_n*G=#`-;P|JfT4{?j}5@8AE>9oLQQ`p%agyZ37!yXyP;;PXHB-c8p( zcI+pbIKW)-+IORqwl(S@uL@h;*tYTtbbtNpYHnV`zP+abM}ebZeM(f z*m2;#g9i@Y{3mxzo_yBbzjF7f2mkZ4*I$3=r@v+X{<4GnkNVOd{@$mq{qf%W4;>f( z-N-xl-tn?`@4IK=sq@Y||CJ}6z4_Cp{qxc+W)%#x6c0UEvIb$^wW>s z_wjr7Y(MI{uRQhh6F&Il2mgO|#ott3u>FIhd-s0i7wms~me!Vipm z`YoqC@|VY5`_vtkXZ_zVo_p=i9sm1f4}I#=OF!}5i;jQxoA)36mGgf0MF-#V(l37X z$@|xD{M;k2`S6=g)BC@^_@Wno_}vd2`u%%Oyyn5zyyo|2Zn)}`BVRju&(9uu@o{gv z{99l6!tje9ANl;v_y6_GCyq$gpLoE2;K5TL&Tl>E`1kzqJqP}B&yOCu{Z)sKzr_D* z@x9wF&2KvP-1E=9@ScgM_TT*0z3VUg_V*rm(+|FR%S*rZnP-0XZP)zb7vKHTM{j!K z&c|PO$|>KzGG71n&%f))b(bFT-uIvJPBHznA3yNw8!kNZ+mBuM`aeG7Lm&D0hTr_N z#|};1{094$@BG{Q4m~z{@ISA)><{0%XOI2T){S4DfAfzvp7f!sue$A%CttVy4R3hH z4G(X*fBbE?{Q9Yn{_ES%J^%Hue)h*cbMQq&-$;-8Za(raN9;WQ&#(LVNjF?8CO9(n8$?|S_2KlzTU&p*~ao&NJrFMQ7j_I>Y|t6uTkp{KvI^)<(4H{STd z1AqFwTmI^-=l$EyH(hk)LzlhacOO0Ngl~O)(|JGn#>^jo=B#fW_{CL^e(v78hpxEc vZ!UY}t;bwCap*rj_ROE&x$ar(uHSs$@%w-B<%iu@8g9tWPVb7}boqY)Lf{+t literal 0 HcmV?d00001 diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d5fda56415bea30710fd4dfbaed8ecd5c7ec4760 GIT binary patch literal 30331 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 literal 0 HcmV?d00001 diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d5fda56415bea30710fd4dfbaed8ecd5c7ec4760 GIT binary patch literal 30331 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 literal 0 HcmV?d00001 diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon.png b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ddb24a93b965a26855afc526a69ed74f908abe87 GIT binary patch literal 30404 zcmchg34B%6wTBTWv^dlOp;8-z;s7CM9>O4J6f6ibC@2m$$qfX_U=kn!6^mG;Dq0oi z`UI=R=mQ*(suhd+u!>sIDpjgzwOAah)&a-&?VH>rBV`yPQFZ-*bPs;AzO1gYwxP17xml zhHRxu`iX|*@IuaAD&l{VHA&V>6r)5n21!bZB(*dhTT@BZ%fKS*5rq#kJMbQ=^R?TQa)3z9CUvmK^O5FJ!7iDl5xN zJY8{2+fx+9l4Lp19a)kb+cbPj@?gn#ERznRRTDZKal!rLztVvh}4~slN20 zOcU$SAX{IGou#i14YKuxWNGQF*vPbF9a?1TP0O}p9U5foOV2j34h^#PC2Lx?Rd#5R ztvAz1b(WdQIyA`IR|~`H8MohTZ;-98%JGTv42PKdRW|xI*%foM(`~X|#gR&5+@0pv z*}IVAyO6VYQHgO-oku03em|-sB zH(9AU!srR)c(|FUb2wMIgXoQ(L&p}`Rw66eLRhv<3R&vB+eRkexgOm4|8 zO>*k*|6m74B@?q6W@K1x>o5Pm=8`(GIJ2z%NQ(tr)#Aw)xBKwB`1iNmC%&UFbo4Tbal%!151|_ zMRNJ6=9_*5g)aN5=QDLy6NF-FLGHB$~fRn=uzu?)wRtpE~(#f5HH3PqAs%`hZ2bmTBJ16eVcr!TAQlw;Xm z6osK0p(49<$br~_t(&HyhpunCz8QoO6tZuIrsdm#runvHXs*OCVPGk$?s!pqrMUdk zwk6Lr)X?|TK-1X-({)tcQ>`Fk<*H;GimNNEL^pKb2rVY#$e!l8o^0z8=b=iW&mw%q z3S7tZ0>v^l)0JG+ury0IBKAsU0Ljx_%TPkwwgTT&Y|Bv{ur|x&zg<_ZS~}aK`igA9 z8x1@Ti4HMhC zE^t5Bvwc^Ace>6>Q#D<3j8FPXx>D#_zT@kz?b^QN zDdOi|#0lzh;JJc@0^NX@JlU{(->^a_Ff5nZbsa;uRKr#z&GJpjvQ?TpZlHvk!5_sv zjG*w~C&}=U0v1@N$*FO}Y|{*M**5KnGlv6ZhqJRa%P68R_ia@V0+>)$O_i;ZJlBZ0AEp^vjtd$L zZ-h+9RyEo7VdqeR6IzTuBXrC<@n9;VM)0CEX8P z-&0K6w~Wv=*efeycP$WWN!K)_09T0P4s3`NOEy`IYen1-jtpekw{%AfZC%p!K$Ue* zQ*EL%791ZjtI!H%6)~+?q3QUNZR(*RDIRC4YLXH`VRNB5ZOxF(P*yBo;ogS|k}Jhz zVT7c%4a*8`OOj+)G6Qsmt#~1a=u4q2#Cz9S*@kNhDTDAaw9s|9=~~F#xS6i31QF+9 zyCI0a9+*xD$gfMGB`!S|Tn}MKOOF^M@VN_)Vxk2@SH)GZEQdSKrBqd}NmmL-GPxX* z@2j#ahlcC~I@_!|q2X$#Aw|r}<#up@3O7~p;flbrkawY^7@FYUh}}g)YO-#lVbxG| z30JTbt{)c}y(UH7bJvE?Lnh`R&0Qpm=voe4&d~7;MeVu{c*qC>k6(tqj~)mehpVf~ zc4+!x;79PThoF*F3k|EI!_eiNpeMPSXN0OSJR-)>G!@AaN)buW-KIH&6vK3C0FEKCbaH+2KyZeTx2F1A(}xL(9w`2kuJxnOzd zDF+_05bEe<6*iG&C*nK;)o??_vn?|)WZ%&w$#*r&RRg5AtN0NTF0fRMlQ!W!$ws#6 zFpWx73l@+u3nDl%KzwkaurGw2CvhV}1=VbazTxO$loSmd)3M=e7si#*->#)NsvR1> zOT5DfqSoQ6Scw1D*=|I8)!lmS=v+*33=j#r(9@dgHvGW=FD%b5~xh)sz$NYF89#6=kV&w2HXbW%ficUkh0v;e{dtg)`(KZUS5OCD&DC zMZwvL;F=T}zr{N6Bp=m=w}t2xddbod_bTRogsId*rn!L~@?Y6d#c0TQ-SxvzQ$1vv zn~{urhq10{$i@I6icAcA{(?4SU?W1Lw2X$8?_uy^19WF?TysoP+yXq3)J|%e?AbV> zt|LdAXsOW@O~L@Sg`dEZSevaeyy+u0QO!{@sf7$dggdHZ)U@m*E}5lyfsE3$Lpef4 zrpQzi!2(urW~+FiY%~A zA72@_N!KFbkQOpSHa(ng9H!JYwcNlBbl);1j8!!Xsc9jD`8jJ0{%)-e_y@-j_U|5< zq4`+#*frfGb3(XQ@o-+dbKl6ivB~qnV+>RuUbX@Q?>W>}Me@+>5fDylOAI7JAo&sw zDh`kD1Gfaegd6Rkb5X+?coGW%6a;q%$61^kJ|fZu@76<5sCFhSh~k09_I|S0tATa5ZV;9#dk4kaRPNW%4ANB z<^_iC*^+O7w)m{hl{jV#{~O;5ha=M@Q7oEnhA?!uB$qD(_X4Sc2+D%Fgpxy`3j;a; z$jW3X_@FJGVW~cPO{@(&JwO{+iVu)OzFmfE>f?1~KcWz-)HLa?NSXf*g$8b>Z(^5m zi{);H6ZZ+(?YP8Y&>_C!bYn~hNo?VbgTV>O6`@8m&DI6) z0qzA=R>>*0Bdqd_l;9^8R=Kd84K)fo$Vdq+;|uTsf5h;kWLFy{$g0GllW>i`LI8sJ zVuJy_5DP=J#GGd;L%V|<;%1{zu!fnnqejTf_Axulgq-hZ=P|jTsW7CW;jP8q?9P;| zGXVV4WiVTC;%=-n#0k^_v`b(Rbn3=B#VvCKNeZ|wph0nb+iA9#A~q(4harc84P1F*G(!{+Hh94Dxq&J&G9>=T*mI|ThA ztnjumJ5%Pa9lB8F%tM_i*&eKOVM8Gpj0lCDX}01#0R(NJKEtrh*mXM8UJ#*0{iMJP zYy|=opn@a?fUd@HAEAt0^=HoO>`W;*-emDyQVoIIjWKiIq0VDM=~^xZBC+;Jf2?h9 zJ5drh#UCVq;plciMMunRF?x2{AtD~aQuj!+z=w~!Wt}N==e{nKIiE@=N)c8>2?CB| z2NV0ueVv3|$O{ml6tq$hCld^$qz$0#b^B%;h9@d;z)H1LHH={sv~ht7$p?sx#I&8K z(fL%!1`x1TfZyfCYWvQVoC>}y45WFX9&6Qfq0ISII#a^81Y#YFxGXSL91o#82^?X~ zcYAM9yu0wNlJjgkQ|2zIJ5wSP;6BNcRbZQ_SasWZcA^xKKLVxbTvD4zZ;9bstJ6Bs z4#b&}dm={X$LY_`l)3LvXUdcWBN2tu5*SnNv*p@&cBtdzx|T%=sF4$?Q;y+}*9RfUK$X&rH=;`t_FY@+(@R;mp$PCNh@FDk<;&9^ehSDuup=KRi+ zd<)<$(^bOO*>aw?!4(T#Vwq0NU7^mfm8=s| zKNJT9J0LQuVt;|Q#qceXj(kA`Y#L9n*l4m20)uQtGNUqcywL5KKNvRc>&%UB0qM!4 z(;c$IQeForpy7bqND`onZ^p<37%bnt#l&-ou@H1g` zO%fcrmB4Rgd2wDbnwM*s?+zKVMmn^PeoyUC%Ks#?O}dCrUT+Mtq#AjTY35By_DY^S zL?Wq)oF~bog%fhVpDLJXo?|+BQ@VLmdU;dw90KYYncT8NE*K4wcrz5Kr$$sRbDK;6 zP9#8xVbHp_*d`+R*zqhf`{J}cxzi-0Sw47Kn;gmwAHqhrdbL#A(r2LNv+xWQzE5dg|ux#QkX$rAn-PV&(UJ6H}I}}XN&2U=Q_#G&6|?^ zCZY`Kw?INlQAFZByG^E53}#GlA>T25i>PNv$w<5G!;BY+N8~ZZ*?k1!^Bt4aqda$r zL<$$kSV>#PB3?!nMu2xuN=A&W2^O8_m^j2#F7QrF>kf&?3_c!NzGQL|kIZbn=~N(@ z6Qg4CPi`mb+g@@Fm~bhG4gpuPAtMg5yOj($^`K zBWV*yBqCR~jpM-t@?0nELb(d}yMvuzQfkN#iG;@JPqM%BTqg_4bGC+*_m~0~&uecD z63Fx0TZ0t;{P-41Dmt;MTP0Wu*R+s_r2V7HVsth}c)qhG!9LH~;=JX#Lu%e*ilA6t z5{xv-Ftj*SwMDN8Y~1GUGO{`aiW3u2q#`EY9U_d9=WNL|rdoHzGI5oQVLoMD?8!gC~%|D^Ul?;kQ!ejJ=86 zU;H;wSkbah{4x?_DCBY#&Gln6FK}bOH>wu2hC@et)lWbv9JM>0m5m=smw zqf(R55+xxxtYC6@R9%T8p_o&_m(u}R2p-UfNF#$!~bxx)m3(5H;9(7*dtp%6&QGnzll8gbEGP$69W7 zXnEkV6q^BvT2X}-X?w^fd6ky|SZxcX(4SN(l34BFMMyDG5~LO40Gpa@$CM40b6ilA zrCB7=1S;l@;9I~@JOGnqFj3qWBNNDDp|ILVvA5q(95oLIi7Vj6+!ZtcdBY|XZlz>( zq=u33LNOsBj(HD>PdY==s7o(Dzlv{Uj10SUh%=4-~S6V;RFI;rNR z)(Y3Ub%#WZj<+`mmXSB^#prB~k>~;8ytEw3d2dMxG$_{u`f6RLMS?l3K#8Ayi&Hqw2?z1D_R5shWU0H9M3N0h z;klOf9fH{n!kLP$#bvbmL>*LvicQM-Q};7x?9Jy=i8qAWvJ4RVx#cYRjzJNOu*6zt z%l+gr0-_&?Q_eXv$3qGD#d8B4I3c$Pu^)(Z|oVUWYGg}j49IzHhJB}T>r{8G`x+e&F|FYKY5GCi}scAa^LSSAwJ;L(|uy-md; zHHV@uGJL4Wi=pIMsyr#F$pw6;{HnXROgwDm3)m&CKiQ$&@}$V2$#+aj40$ht>`YOF z#Qh}gjYNKmlHffOInUGn>oeWbu@IIwv9akdE$pLC(bG)Gcs)WNAS$Wj+dw7t!XMlR`P06j7HGm6q- zn%H#M^-7H07eyKHloFmENzQTk36YdK9u^Pyh$q%E-<8gkw&@Tq)~J5uDFmv_x5~$*0t^^Nuy(>a$^2#8d2oEF0Wjn##_&B^I*Q(1brtRuLg&J>W z$zI&vA`W7V<+%Z)~=LDlN@D2CrV1gdDjQQpi-dDYjrWF zf}q-Ewqi^kkRa<6RTWn=gCoByCBx+?6FO6Jo;($2kk?4WFzTI%`=FZEv?0q&^W;k|-0OJ{n%w`gxba)*n|!eDo%p8J?z{J0nSlF<%8j|bCP^hq2-5Bvj(=~L9+ndqQzwF@~NCw+OD%U zN)*02WT!tUl*g=FyXHOR>gh?oo>lxGtV69JII5UtkyOeSIkUyU=MxDXwf`uHw#o*YbBiSy#zHg>`(tC-rfu zlBl!Fb&Y&&s)UEd+CHrm{d88Tp_dy;AzAh&I*qHvT8GmW}Fj}&j^Q_~uXM5aQ(%hrRK7B{~&ZNfIKA8GV%^_R* zz5bAT|NZJWPgZ>QxN+9ypB%pWOzD8bFFtagrmL=6G4Qu1UD$m5(I>2JzUu1}CpG`` z%AnG}eZ-}g9(>dBvyW&#ebYtz9rf2W8{h1)*AuUud-DaazJI~9^XFAuf7_%LYxcT% z;XA+n!x69l<~R12kGwl{+s=>1A3QPfs}+OCeV6FFSJS|Y{@&x{(xy2}54~s5l+)I% zI_HAx)+n1!Ip?FhzMOc)p(87A8mMj7&wS~DJ1+TVN`Gn0tY0qQw%>18y}#%M92oRxa#5MFZHf^d)7@WmR!BZJN>68`+iY=_O>@~oVfMDIdkTGIB9a>)B6tF z`^cjX`+R=yrn)I(w|FytDNPtScE&3+*Pe9sJD>c%dfeZJeYqZ>~%yr{QNB?Z`hG%cTWssO{PCFWyN4I|s9&;{*+g4I%(kKGrw#cc5St$zx?3||0=tFlX}<{w|@2e z>0dn_T>e?l>2;TtH64EaNt-_Vtp2LgFRGtEtyfWX>Dq;dU%T%Wx2+5|+_7NxKesdm z+WcFF4*lw>1HPBed%NP4Pu_buxWu^Wi#~^4x%8}lj~;Tvjr;6u-tySDFTT-OdgMV% z)?fJMF|Ysm(F6BCv10o4Pv&30^~`D09zU=DZ-*=!Gj8#nA1|8TYwTyn8*b5g)%{K# zbj;8HzU0;`fB5%Xn>TLU{_D%0`18jXoHuvw^{ZEW`{XyxDy8v*)+oY^>cg4E5J1Oq@7qP>-h`n)cw6 z3ww?H<8H49$F2F~g)1J~ao5v3FZun7nZ1tw)A+ManR@!E;nbDGHl1Yw}ml_wT2c({;+G~*n{eOE$-9j_w`oga;DR4tb?DPO>ehe#+V@{?+`f9={Kvlk^sC9Vx{*yg=-*?WfWs7b&_`nb5tlsj-YiB(9*_^Qx4?FsS zopn7npJ(-N?7Qip5koiBEFQA|Ek}$z^z|1v?=yPY*t;HktofY&9Q?%&%Ca2@czf$u}{;R zC+~6Zipx*w)9J1~#KVYv7yVY)4SAC}Q*35U_f4lU# zRUZ1tY^ z48ME#f8P1Qom=jo_VBPTo?G|srjuTI;DNPAE?++5%L9r|>Q{DOz0!A&s^gD8{+U6? zOY-PL-Wt^Bj@_Gf3>taSH=j&-HZk|Fjo&}>`8f*~Y`g3G_4jTXuyXR^UtMmyFzU^s}}0AB<=2 z89ZqEUVDGP^YiOZTYcrxiQiAE|9s5+T(sg(554^ChG5x!TYt0vFZMri z$~D(K{L7x#^`3Uat+zI>K6m9kQ+_^u=o?3`+VjmGja$F@^3U_;EgfA^x?|3U&42mB zCu_f3UGr~q+fBV5A8_q;%bIU`{Dr}v7GE>E?6`u-Z`IzA_~(81=@YNH=7}fX^}HdhzbRdw&00W^Q|J^LO9==-wGT8@pu9Z$A3CxM;|6gO8te->bh~x@FaZ zy|=Et&?`#rHTjIv_1l|QY}@wAUtbv0cj0??teojifBu$lwm-9M)BcO^Ua{iEZSRd6 z`1TW?ci8T`U3ajtZrzqwww!kAsJ1@>a&Vz zKihZg#!~sxY0v+D*pf#tzvt;SmzHjvnS8M7!)w(Qs~>*&p_hx7^y^!7>B>D;-}d)$ zkK0!*A6&KazdwBMjp2v(e(-?@dulKKd-I%qj!2$xnNqd)=?6TzYW?yDS3Td*^V&V< zY~IoE+Md6-|5abUV%#m>jW6x!eN^ezFP@(^dDG`J$2I=ffqNcwB5?>BFGyZ?ZPmdJ;U+4q`FU!VBK+^5%>=Z_q{Y1O-58W$b7bnW(A z)-IZN?wvaq*o%I6cl{R!{P>-DBc(%2ZrkzN0gs(|^?o1Sv0&XV4!mjT)GP0OW!y)v zZ~XL8>+Gh-)-IgA=llDltQ387FVa$HjEC~iscB1vWfffz}EK(Ro90>wR03Z+1?qJbjC zJ-AzN*J4F3q5tPhgb>b5Ci8y3uet4o%wAj9Uh=H9_Ka!WvQd%36$Hpg?rn{A53=?Mji~4Gbjx-R_fShckM?W} zqD7Qq?HSs5V6@eLV9S8ufxUx8i${a{?semQ(LuO1HqbpTJS-x{H?E$CtzTdK+4!}O zhr6vwZ0~v=sgvr^qP4pc8EtiEy*aO7f@Iuz(VJvBUgSO9Dg51s5PT@Yix7QT+Lxf* z)Bf?mXwjAsUq4k(8w-D{=g~7ZHpr+@$c-u-Fs$mkwEq$r9$1m#0fUTEPJGaw>1 zFwQF?rdoOrsx>A!Iy5RaG%~{7=rJ%TvTtlX56m=m3E@#0-A2TuZ4)-kCoV9`hx8_l zCD|HUf-~Ah^^Fd*4Q>hcv4&a0tr4*?XiH|ajp`X08yV9x(oWYIAAd3cwzfr!j4@2- z5+0s0L`=Q4iChZ zg&Oz7Cn}kL_%2S_X#W3<7$F#<<5?!=u7*B<}qK zW88y{bG2IBg9f;_2o3HTXbp4M!vdrGM!DB)7-IWFE%(-;an`VCaFj>ZUX3aIpL>mt z^~Tk6uMrp?^_{yE6%`sB8Ie9m;}Z{`Y*rQ8%HN=KZvsO1fb`Wd-lU!R+HarTNF+fq z?ta!-9N@fyS^wfo4ztN$gVF) zmekICID0#msYQ0ZG1=`{rUu#d#b!6LObxQ@i)5JWR+*_qcD?bOtuy;fmZ?FueWfxi zYj^wkj}5ZxE3|c>#m*txKFW?hLv}g1+39Vvy^0N~I7fFHA7|eM>9`9r`z}IZ97Na? zhG`!gKjw?f+#=iF;K>?hj(x2` zW@?dLZ#KK!-JX$}tr+04yE~a0WH%Ky_3GGPSEdHp^<~Iqnh2Fe$Qog%zsxPN>#ZZ)Zo?a}(^baD+4b`cVKI!XO3 zyB=DFgupd)ZxZ2U>~m|N0X+j_tTFC(IdE_j^x;48^*{bP9Yl}-WW>PzG(!UF19uS^ zidT7BVN^y{I6~qHRZ(P3S2#xD>)M743(fGd>k}-^QlzG%nILisNr<#Y$|5TWl&A?Z zV?u%6NuH7vTGk0t6D66~G*M9*R+V&?%J z=nw}YY9hFqFG5X+bc@OhoVR*JV)!Q zLTe0*P2gpTW))h{Ojb@4B1g$Ag_W=zt8%)4$w;KaD6&F|tjT%Mgsx%{DkW&L#48#l z@C+{#GR+B$z;Y&gMPmR$VPt`$bWs#Em8V2Oq9tH$0*{~1S56Bowue?JQUGrdA|dx4p5PVLWUpwEGC(s`04LHqrAfNPQw-0Oq`=|eO}L%G(p4NcK`XQfCKg%N!2M)J zRAmah^ZBe8nqdiv(+N%CXNGwBgBFFJOL-Qv01Ha{IO%z0m}a(|DTWIfcOPvL>_Q37Hc( z$TOa!6hdNHR^n7f28Z#iCMjkVoTLyqab9Otk!CdwOi0r_jjbXSnKQW`Jg*Cq3^W+L zp<_ZK&5)uBcGfAdqD+3ia)FT~PN6wfkwuBra44)O7~+8vWP;W-GYXlf!Bsr160EAp zszULiDsZ~YVXp*}-4$3$B3Ooj6u=e2acd%oD1qd$7+Em6A2>1~%c{Uij4rYS%W5>q zDhw?mIwOGNO=hJFI!QxJQ-aP*Dk1W$&JmP?Go=}VGNBN0p>f&_NANmH3Bbf|T z6?#CIBwSsZ6m?$JHPwW76$mPV7NB8S=rHJVoS;I;jKb-(VR)E~!7wx=hfb*AEgJvm znnEkADnncIylS$$kQ?A27$X$Pak5B34dRYS3JF~$LF<}~A+Z7!g`(*kgeLYG_g7L7 zV!@^46~;vRsIVtwa0dk)rZFT%>U^qDS2ThF=X^efimN740!#~mE$gs6^ zO;$|yO4Xn>Ar}M%dP)M12oUPf%QV=8Bqfvc&}dH9DMb``jU!cwAqZ7w1ew+#y=6)@ zk#L$oGdO7;yhn(TZ7i6EMpO$dK*B6A;Y1DM0~ZSRg<xK!NQci3!6Pgu!Gs2DAjtz(#^5rx*>_2%1+?Vfspt zaIAsIH9@gjplL@$!G z1bGF9@SK;xgis-D5N#zz6K=567Zt*BOc3Q|v4#Yv_9a>@!Crx|uYy7ZFsGS*Ht&n& ztrjapi&qH2SdG2}uOK>z^$M|yfeg)AEUeXJ=k4@mVMVJ&B)wP*9hBOaXe?9=4i>0D zNMTwukq+j4!P4M^SU%8;qqwwri6JEEWw8VWTC4&C(dhKNf(1mwgISBQM#RkjPiwRU zg#-oBVu%+L5^Ot1!3+1=;st*x$P!3eXg=6vUVZz583?c(E5avWBtg|7Xe5}D3QLo! z&FnE@zEm=efENlGXgEU(#EmABDj~}hNl|ciOt{8IhEHJ~D1-{t25$?Z*U(D>194Bo z+&3|mQpp%u6LtKM9BqsS8PCe9t~0a(Sti>h!@YyC&M=UT8iXihqNd_6(1sY8GZ87N zqru8oVDP~P$jRDp&0&(lEr3U2+ewBY6%kITERp6Wnr$?SAz%QDhM#~XVQnIV;dvEe z6RO!vCZ&==5WyW~VbrAVBwR9qQ8W@tQ`AWl6=@@*c^GG$1kJ@l_+vB(OIUcY4K)hp zu8Dq0B|{sTBNztQ1I$op95_#+pb#1bgWAlkNhN~=OR8|qAlRT?;0^MyWFSc)q*-jv z=W;5QOs5#A57<2tVQdMETpgSSTmzmSMVXjX%QjYKU~Q5Td_4{>oSAoTn2^ zOtxz($eOINs=yO4R%tV&CY21#kF$ospQE(_{()l%_Rkp^$EdLCVb|o4Owz%%lmh29 zC-)6mHzM+U;4x~n3SJg84&JlQ(iEXUvztITwk_cx5i~+2;Gn|cQB}Y#no7WpmY{Q? zhVAeqECiq+aChK18|MZe5z+Mml7M>wsR9us4dybG90a;yKx+W9>{$vb z&=!RgXcc zO9=-G%LS^-z^!LYPVXZnfImbbXd-P)g=7rmS+SujW;S;QC6W<7nJxS^;6~^R=7d0* z9K9n-NHM^89Pmrc1eLK*sp){BIaXuCTi2-ew()AtEIk=fB z54#Mvn9RWr!Os>|NdsaggNMy{0@jQ4R0`{s^a<$*v4aAgcrp zoq`lF@|^`BzOcany&x6_(c<7dZ5i5`A7mY*EDF^E`ZkenRgof(^G{_O(W|=Ka z5fLVZ0z(c8UN`ZP?d`1$iw>fQ<^kFOQ8lp#K2plSOyPvU6|!-Hp&bBQ6L8oRR&&G& zbe8jkMndcpGFO!l^fR%-GsetH>AZIMjM8Zy%1Vjtfpu=!P!J59iNdxwTjM+d2#SFE zI8Njpu2Vwo1tPRiKQ{0JwgLhaKn0N$0Cd#>_aT(=ss40&omnXjj_0v>Tv7%CHwR-n zze8Ea1f?vHi5x|gGQKKnGvxU*~$qpgnVOZ)4(k$S^JGy0A zDV^uO&nTTfl`ND-SP@DP;5h7H#6BIIN>)lEe?&1rDbNy{BbmTKN{RrKl^ow}j#G>Z z9AKr4tr~_C5wwv36(S$NG!m0>o?O;bK{kK^YiaPi6o=YAD8nBI7 ztUBX7vrrn5KLkplbCKGF^cDwvD`Z(Gv;*SIkb6dqPIaU|vr;<0Ls=Zs2#FW;yj_V zjf@0I)D=fkQ_3=?^Lv|x($IpyQ;dWJ$Xm{lod940k^|`*AH7I{6=@0)Wu$dDIu%9b z5ynPT|D%;E0vSg<05G0ehF3b@l0d#(q=agA?L3ih0eFj-DLrkrI8Two71L$JG9?Fh z1$BlT%^P`QX_SzClHrlbG;lq|fsBW1t`j`mRAikX^@EatU~7ns(y+gPwmINiNIK*T zLcpfu2?916SqB=2Y(->7+2?pex5NB_Ve@gF&hafkdSueE60*Z=UI$P>P6BR25CC0N z-hoU2gSoo5F!5x>SP*phXx|z&oyhCLEpwoG5hMnjgq;L{WV4K&mL?>OAJ;emcmqHs zb9 zdB}MrnWS=p)Ay4GX6oXYlFO8`%an@Clz0vS>KQUQb%$hNG>F9Wx{-RyndLHP$OOQN z2oS9z@y!Z_pw0^Ww;lNblq8}KeyXA9HK#dRV( z*JVoNHzCT9{uYRiQWPWc9=nZ9D+ib{f(x#WsS1dC>L?lcDEnZ>8;M8AV{&BoArSBC zm`FWxafgsdApy1SP5|2C#1(|I&n;Lq>z#)LUpcKli3M*Y|LfCL97C{1M>X^>oY@|n_Gy?yo zdsj|dQmiBb{6r!LEN~;4UuI!lfd53Kcq4Jhf%V235aLk}am zXGHi=bs{*hFjyq_B47JsRNDDTHo<@8WFXyt%kTw98`}K{1yk7}6wlUBIEzsd~l0#znkchOABl#c>c(L`96N zJA^Qbi?cHFbsXa$uLh}fET<`gQEg^O zO#^~eXbDv|M)e)%08c;$FM&Eh9DW+5)7YDl`wRcgD6B|bC;T!b#-NZ(rWjdupm_oJ zx;iH1G9?Rl2$}6bjWc)%SU~(v^x-yD{9GnV# zITj!bf(PisNF*mv-hlE$q>+*+IdxzUq4Wrqs5~$~BTG0ZmK0(nz+2(ZrQ5eoBl&^> zW*ZgR>4>QFl#I(`qS(>J*@`Yx!oF2dO^kw16foni7;z5VJLImRs)TT$?FALrm_-^* zW;;Pg@*6yFR&W%tFlw+_T}M@R8uvMkYl;-2BdE|o`dI4C)&&K4EQ-wlhze$f7U}ko zh~!ng41m?9QX2XbRf3mRo<0+MJn8s?3`w*W)o z0q{r$Gm85h$OPoEps-qnV*hwQ;ixHakZ=VQ2X_S;0C~eaCY(lz)gd($X(JTs@*Kqg zAfR=i=NymnWZ>&YZZImAVRNvk7s0y}_Vo(NUXazq%6JYURhl?$G2-BX5To2CZJo}` zcw}|U3}iaW+ihbyAJ3LhX^!VXA$LAf;tc{M{2DP|-qAXtdR$y5s(Dds1=l)lhm05< z-rhj440+><1D%ayMDzgRymUF_^xh&RkVCm9ps%!b3P>;qE1*PLM3t=r-(JRR4la(# z^Aw)_z+($(>x6A0V?>l(s4}joeIAk#T7mP5vK>qta>&SvHiC+%*dUC@F&t3pu2Q0+ z3lC2q#F}nNL3jzURZx*;NH7O>0v?ow_JlK(9?!;kBF_d=i9s~dENeeq4ngJO;R2)D zIn7Qm&eN$ZJ;-Rh?1EgXbmSM5u!B^(4Xn2g4v=1pMll|C}8$3 zNycnpQZk%`TCTM7gfwvu%`#*=i#Gx?B5h9VPdrb9m=Dm@^iu()b5Usp8H-3|K;qfQ z+2W-IWQ?$gi<-S|lfF*WG2keX)ro@1oXL1FfXkFfz=uMERRey{iB*GF4h%{IS;{FT zBFUUY;klNNI|OFu5YD7n#!*JAil_t4p<)x|{I>h)H1?+AQWvZ=sTCQq)Hr$ zU<^wvZML|dc#Hti4~SEovwe;SCBQE{H;{=FoQn{vno*O6D&REBSVS=*o_XSskB?d@ z(t+khwF`>z0Zpb^7|7vgbi9LubbN$6C)P)QmROC6J#IsZ`Qlcgo;5*8%a(c^*hpkitc1hQt*dgcgq>w}7 z>X;}o#Cs9Q&NPaUa6gguhD3f8C4u*lAn#y@@D>8_XuN}!#<#|KIu*CqG=s}v9OrmU za2|noIaH)5r`lkUn$E=qQ8%okkBO>h zgi(wDRt_aKk^rFrQIVJPG4XKGC;5GleMo_2;K0J;cVwI3;gioOVVXlyFsOs09Ux1e zQ9|2`c+p5kdKrKo2lvyAQo=N0)4{H%9N2wklp3B=f~SWhXGi%7rj#r^EIi<2Jh5i~ zu4JVYc?scS2Gx&v3ISDSIiQ3`heu(6UgOG|zTuOu?LQk6=A4ngji51J+vXfZpt4fJ zNjA_W*c~VlLMf*6vz6i6p{U+ge2LgyPAGx@i^kJi4C?Sr;b3YG z>;$}&^(iH!iIXxR3nfa!@vaX91C0W8yjJJnR3NB6nXNG<9*{uRDO8oCni+(CKBdHP zPRfL=lsHd36~`g35fMYPcS17mrz8X8aiv-nHXjnW@Ty+AMshmSQ%Bz9Cp+Xk-^wnJ z36~C;25>oZtOb=Uvo$o5@!lrt&H%|d(hk6n@bsE1TF`hiDRbSjp^*@Hz;hrxp*zaD z)U#3=)|*qAfp`rR^=nR5H<~~CYWBJ-*bHA@(-@B`M@A1wd$HBu+9%`fR(IQ11o;LA z8()1?&m-;YT|Cl$9cuEWH`$rt>9qZOTG63{Z}CYTIVSD8u4vYzIa$H zE2`?)bY_SFf8o&)#`T%{T`QKf*mi;ud5hJD>*;GIdz(J!AWzk4@Z zYw5Bf?3Wpp_HPRNw&msIu(eG_Sk_%|*E)M{-tk+9ur=qaq^zmgsr!HH8y@dIv`oIj z>+e;*(077XvfG-u9VUcdnBdjTH|*i!qF1IIxc;TMyZ(#88$6OG+&ukzb?HU*5(lmy z-v4&q)4{*K9&q*P*Q3f88dYRqQh)kE@q4Qu7(XpWw>5queODMi15X8>F@EM0U2gnb ziS5uAKd%<=US|AkOmyo#Vf~rtjgM;QKHZ%n<5t!bN0G#r3wOVpKg&(qm{h&s#g$`& zIC9R8onHE8D1Cu(3t!rLm>fbM-qoZnt=4zz1xpOC^dJ}5Sky*8;j%nMrZ;_pc z3hfFY-aH)ocFCU$f34lL-}YC@AGU4V{@;aT@tViH4q-j@pty}K#vD|eN7q{1kf>NR zKBg@@`k4PxOP@Z4CUq&xb;w_Ge&vC0uEp;jU37KG*~ibuF1_`1=<5cfi&k3QQCzq8 zd3cMTpND!({%QZsghi`o<-hrUQ1p-?LpGh>MeP{7U|Gk$7R!O2mboppAvdS#tWw8pBhJ;rUnHZNu*l*pj?v zRQJ8t7OfB1_UDZ==eph%iyoSGq9Jqs@xNc6TZJ_iJGg1U@*@KqtUh_KSksZ){r7Lb zU!=y={WsTiIGnU7?~E23oBsCZ){}Y@>pi>mDC~0M6^EN&T%i0K+rP@j!fsuwRr~Ai z%WK_&so6jN;ZbRjby>fYGrl-Ae0NjvXyaW6N+Z?09{<2}Qg zx9jQ-f9*|?-Bkv^-urZ1P=%=_#_N;)y=K*Z^wqF; zDMOkcyWvrEZ@>)tL}Q_3(I$QucXcdy@K(E0D-Jw~Z__j64*zs(%8~{jwmp4t=EdEk z|91O(_~dERX6%d(T%W*BZu55R`&`d%jfuFId%|6ENYtVuAy*TBn3#0C-P#LhHx&Kq z(d9>Bp`jP%M5esDnsRH&YTsdF@8|x(vaVy{I=*=abzODtdeoqiwbr!WQE8mMZ~y*k zlZ&7HF|KZngH*_Y=a2m--frI2Yel{hZ{K$)w`2G*--<2g$J{@;xA%w8QlKpFZbgQd)9vb!{GW2 ztM#x<+~4{8PQJdr6~^hg_f4qu-O%?_e{C1g&g0PC^}EJ?>3+F#vAVe$U3)dHeBe)i zRs2;huyANp(RX{=-^?H7*1E-_DW^{P@4Ti)*KhLE^pvLOmnE#;`%USB?P@$dw)KX0 zU{h|(&4tCT4uyovw=j2!PK6gNl$RAP-@0?R?XNctp4i~S?;8&kyK>8O#)%UpqDGFf zZj5;BS*y5JDzp>aH40xl%NwGYF2DIuE}p|^Kp^I zW;VRluI;%utNwdGabkmawEW}lC)eV=ly&DWqRq+zO2nFx zCpVoqJ?q3*HFxfr{&o3<(OU*~zTY(0w$OFr#`Wu`Pn&VLM#)qDr$Wghbry$w;huMA z{+jvozx(#v5nd}F*I!jE_S><3RISCQJjQdc#gVl`e?PsWX=ooy&$zNNiwB=;KkJ4k zQK)P8=ZDU=EnTjh5>lq%DS2npf=TX4q07&lU2mmtOiaE%clPW;Bju*ti0;bPlBEyF zS1d8J_p;@Dctq22CEIQZD48-xhEO*Xwy=uak+J)tAg?>D+xo`2WhLx{b z&YP_nP=1a_vtF-ej9s>jzxrxJuE0xE~ryc-cxyx5yX zUp5I$eAF@tuN$^I?Maom)n&-g9U(E-eh;hRe{bX^w?B)vUYKXRJfhm84eK|Y2|K?! z{L;T83e>NEDrR6vNZ}K{bB;VZ|2ED)X56e9RR;Z$tHk{g$srT>E@aBa_uE>z3RPnC zsnC$gk7Tz$M(tX%>hSKjug1+8)N5Vg5bx4OhW1U!|`ACig5-`7d#Tx&76rBXa3+0B0A`>!iHz4g3R ze-x}%Qd{|9Pw5@)8?UK7vt`novb&Qn1Z?T7(tnh=95v)^{E?g8|0!4g)}Hg{3p{;V zWpke*yN*Zk9TIPy+_AoYSn})lUo?I&+4EL1-(*1b@2I+E3u(l}QLFA(=|BAP=HJ#H z>b33;pL}RZ;>EBHs>ib}S3kV&(WO!Rxq7`4mL*iGuq|T4tnIH;W>#JEytD4{;aKzh z-;NqRy7=pIWrLs8Eg{sn(Pvh#E=sli9q)}=R3>kol@Y`IzFji>T>kt!R}7mqB2Xjs(9mB*Kcx(R;FLXr6>KioVp)dxy6}=GYTH5c(>S_ z9(O~^tvYaJdfxeYzHd3R%(m(N?Q3pyYZ~`*`KrIG7Tge7u;Z6jVsl7>3a8)UFxh&`1$1E zf}VQPf)}2vpZ{W=yz)c;Rs|aC4NvACWo=P-<>1=$i`F`(ocy=@>;rDO2ai?AK`Dn< z4v+0#^-#0pzjZ%c{a~GBx;sVMZRwUO%IyJhMB`rezGZOe6EIAzMo zi<{p)e;!?MNXMhc!`97`|8VoyD&NJti}kE_ zPhGlTLGL_y2DfUvqS@rWXA3mXE7PYY_ndWiz}mdaSEl?te!T8+{m`LTiG34u4_&i& z*JL)z+IGg8(9&*+h3YmSOVlk?%6EvTP=Z-gW9FqI^89a)pDFi;rypzivRK(I>zOfm zThyL?;_Aw8LvQWe`QiTkr3nunJSdXrJ+o1pwFRdyKiO%)8hZAlgQXg6o=|yHpOgw; z<}L4)yiZwvadpB4b!(qs|L`sgzd4xTUM=bm_579B??b;>-@NGCpWNJvylFNmsCmnl z|I|&6Y23DSt9fS|zwEk|s9bT?s@{Ke>Q-dW7aO~5X?QuIRNmYP&;EY>;ry%nlVdxr z@09Q8uG2YjmqpKjNG ze!~t6Yn4ve6uSnG8cwdp<`(ikE=-Snl&AID8vb1d4{p|M&Zw{thw6+>Z0Gmz$2Ofd zAFJG8;H~0B-%XbrwqA5;QTZBLzr_LV+CCoie$3JEiEjpJ7ppZW8&k7x%*}U2&fgzZ zB(d_Zt(1OktPjgFhl6Hr{O595U9vv)+pW{j$2MKHf7~$GJXa#FikxqB$~*TCWq9Qa z?^^>br7m=v=62$Ty7M-V8n0`$_HZkPPs;U2sSR}O%~8|JRw}xG*Nn0i)!+MVskfzH zgOu}ATTP!nJx|5wUroP#F)_YagY#9s%ul{MwCt77wwE*8PH)?~%S*ZYc&19d9+r-O zTL;$N->PN)2KA!jqJ!K{-FfkL-o?ZvYX=V2kM0mFa1l_nTabvs49XKfd5UM54N+gT zX+C=Qc`FB{&d-?`+fnpPwxGq^2Glwn%OPix5JBdI6383tvqvXE_U17{HOb;H_bbB zu0VmjJIA7;n;LXuPoJ6lZ^rtTm_U^CUb1de;>xYRJ-FEYzkBxzmb4CQ*57htRnqOC zgC7#wmRj3*?8?~Kh!LI*`Y$dpB5w+`&OfK0^tjmR(n_w5Tt0cT+`rMQu5Z?^dRqHY z1;Hcl&S}Hi)Gb@5j?Z1zvdE`p?CaNEcFis_e$IE_ZG5r%`-OeHeesx3lax+Lb;CAH zzP=!SdHW3!Lw_U_0&XO~VTu>rarJunJR?#Ll$f783SW5D_V&A1#1*&juv*hfHm)(X z>#EnIBe$M8zPiw%#p~Cv55ClHXdAL_>2~Y7pCdNkzkl%5l9t`q7aiTD^EcH!@5OEw z=QRpB_SIM2FP`bE)=|rU85~@Sc$R#u?!rZ1l|34z_ z-&)f7=JYw&DlG5aYizTo`}Q>|_3W?R*H?VszE+2oemkc%%-y%nwU{3+AA54C(e2V7 zdVO7|+}{4PN>+S#`k;@lH>%jLz@iiDYZk6}^~#keUbW>(B4Tkv$u4;DK&>5fBLfO=D!ymUo_)($0U!=%wKh8`n>M?DDlFh zFXD@yy>R*DsI6bT84|py>zNII9(cHX`PUqmYvr7~cca@$e+@~wxFb-Z_Fc4Yro*xhwGQosvIY z`>tR8c7C1a&Hc5t!W%tiCJ#S<`r@ds zrq7*Y?U=N1;*&=`pEis-Hl*4AJesv#=Gml3k?~%SAD2BkrKH9#Iem^l%QMT8UY1gl zUUc@F{qv7MKEK_*>+&nD%O%X#D_=NyG31W0w)amRsRGTSHoYkLXXB|qcfT9lDzDq# z;wvLoZCMbpFgf&CX}=e%gbs<#r5TsIKBa&7HOaz|xvEv4{D9N;6i?ZH{sz-*Nvn0q zC#p`mE&RD?QR322+N+(H0q*Wq1oc(eLt^5*{2YfR{^4}xEtHt`#4 zlnRmGZBF=oZSxcVZTPO^+y4~5pN?Ci>z6$Hj1OwCBtCaqKr0$#GNar1a?XVy5aj&8?l%nO*&7*@iQ{k~)2n1~@qhIq{X+ iRXWR_`Os=u?p(=NeBL+CQ`3?Q|1{BBs(;GehyOqG`sc#{ literal 0 HcmV?d00001 diff --git a/Demo/HudDemo/Images.xcassets/Checkmark.imageset/Checkmark.png b/Demo/HudDemo/Images.xcassets/Checkmark.imageset/Checkmark.png new file mode 100644 index 0000000000000000000000000000000000000000..c94cdd75dfd0fa769355fa43a2b540651ed67e1b GIT binary patch literal 1231 zcmaJ>U1%It6dv6WY-*towlyL+Ol{Sg`QP~^+c=roH7ics?k*TZq28Ujn~cf)WM;Oz zi6AktwpFU7sWj%H4OpnfA1W1uiq%*Z^rc|y4}Fk6lvZj{RP0Msyp!z4K7uRuKS zf+1Lhz#bp_8g^q?>IJ7f5D%D7s+R9kAn~CZZh+7j*4@(xfHeYRyaI?aLr|bm{BVe76-A*Lj^;QLd63b#7lQ`rMVng;28^uG31Y|h@PrXm z{92qLkkaK8+`u$fh`p#;C{!}K0Roz(7}|A{yq3J9xCsB3v8s1e9uFX0gppqhEp#5$ z%`Gsh-R%P1sPJh+ zQ+SDEb*06z8kXk;na^r0$H^SR3L48Wnj(pY%;-5r&b6?4FN%R@!B$)c#cg7l+hSEc zgdq0AvhRI2e@7mC>A$?<#>rDIiTfy4H!DRp`8nT7hkHd>a3!m$_o-; zD-6k1EsIPmf=nuDsYGxf0+xfJhp{=acaZ#6N?wu-#m!r)93Hqdgr0*Ki_dx8#+02 z;)~hePrY|#Om2I4@@nTN$D)~kDoEPP#dnWkDQy2~aU*eXYnc3E^4Wgl{oZG%{sT5W Bpick* literal 0 HcmV?d00001 diff --git a/Demo/HudDemo/Images.xcassets/Checkmark.imageset/Checkmark@2x.png b/Demo/HudDemo/Images.xcassets/Checkmark.imageset/Checkmark@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..49639641b53213aaf027e39e454ad39cd620b017 GIT binary patch literal 1386 zcmaJ>eM}o=7(ZZhq_QlT7$ckGIHJMG^*-8b@6L9k>$SG9LQ|>~WrXY9OSwVsy6Yi@ zKemO1sOUDjM8h-^ah-}&vzhpZf-c!`al=I=E+osMQ4_LMbYn?fwuIs#=6?caDM_2 zA&}I1bqUs^v$_C=xqGmqydq@7H|Yv2ir6D)Qg0lnhF@@E@QYbiWS(J#-FBT8IGiIt0a>+%aAslm07!8mRKvzTCr8Ud|&2PIuuG^6o~>E zo|0`gnUpEqCIShkC_9UDmZ%*EHkx7p%W_fDh7ph=k#Cy&ny4UxotZzbjRd@`4HZz~ zB?o;nDa&?1pGk9g>pR%jv{)e;X+<_TiMX+Qx zmTk#icp;q`_huFcPo13}$&4S3ncGYa<^GE7Q@OoGf7TqyEFL|6G31)Pm-UMiRm$Hd zUz8>=MPpwQC#qW)zMqSpKwF;>--@27Y8}h%JG&?S$(CeQeZZ81LBkWJ5M4h=VkphG5p~$6b4E*@4I1PR2aI+sGzNa$Wnv4t8znbz3)7 z$PkFQVEn^OL6`7{L6>+E4cTNH-0`6?DkKtQG9h;mTq5oRh$10?Z?_$iNNC!=eV_OF zJN{&zy_}ynKMz5W{K^&H09;k;$;pE6E2q1IaCz3Ks57e7jYg}e1H>(>4FIhS zi<>|Ih;rN3??E|&q`wuasWa;QuLzPFwuzRG%?xW0jUeUAOih%w00V6Rn?i~U8}C1k zp&{9Y)iQq4uX#XYXhpjYs@qr9NbOrBUdEO!MaxYA8VCbJM9pxM5)n)nHfdLY-ifd9kVg$f{G#;xRscF*y z5daajS(jivHkPKqFn3ROWGO;6!fHJPiy}68RjD})6roLUXJwmNY0nSRw@xg zR3wn{8-jkPvD_1}f=36Uq3SiN+LY>mHI1sFMjBNO^;9!93iXRpNUS{lyK)Fv*XaAC7;~Q+#??DDcY}(9L3c;XGU3jf62(^kH7pn9F6SjetY=R0d?QLxtu>NH6pf8@fBK!P=j-VGwUy|-6f^_;xB9{6rKr|)c^6c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc&_u!9QqR!T z(8R(}N5ROz&{*HVSl`fC*U-qyz|zXlQ~?TIxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlvekev%(B!Jx1#)91#swCWnyuGtD%dN zshhKznW3pE(DlGbGjnuuGIVnV@-0j(OqHN|Q?U3Ps@EK+UVWfr^g&UJ6xA>xVEO?u z;RzSWfhYacJYae+0w(NR?z>_c7#MXuT^vIyZoRqT%gyL0bG-2NN7If;vz5Dw9=q+~ zcz^7q?@q;2H?<4OpU5hl)84uAec28ZuHLxMB*d;V;Z{Oi?ckL;EZ_IQ5t8q?Ke}b`D z)GNE?E1bVcNpCHkAH2|URX}{B%LXLU&h zuB%SbNylwwgb1`s8NFYaU~@s0r^D&#g){0tEU#MjHm&SEH{H*2gJIT!W-fvEue^8d z=Q1rX31$_#yS&06Rl&ZzWWPbC!v20qK_4xR6PwRBp5?qCTAFHa->l=e@F@F=<&Sig zU$7g!(@kuiwd&qcozL-2j*?RxB||<`au_hgA9``|(!okEP;uhv>gTe~DWM4fz-^?! diff --git a/Demo/Images/37x-Checkmark@2x.png b/Demo/Images/37x-Checkmark@2x.png deleted file mode 100644 index 2cb680b5317eecb644f7082dd1a2a222276b8914..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1497 zcmeAS@N?(olHy`uVBq!ia0vp^ULefD1|(%J94Z7-k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc&_u!9QqR!T z(8R(}N5ROz&{*HVSl`fC*U-qyz|zXlQ~?TIxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlvekev%(B!Jx1#)91#swCWny!Iv6-c- ziIba|p|L5@^}t9ob98btbaOQ{HMKCYFja!;O~K}KuwG{aoO< z#DphYAP1iGQ}cl7y$G1FU8fw_&A`Cq?djqeQgQ3e?cH9?jv{OiTokW{ElPN5+@Zkb zCb%Z2rD1Mw>l4)+)_6z93vPi-+ZefLceMIy>9SfoZoC+Ft+JIDh?`O`{Kgd^U z`&gW2Gc$5^=B%)QpQda~4vbs@4NM{nzyt%UMy4tAiv8JhHhEVrw+ZCSy|*Un(&c8U zrLH%BeElkXitnkg@v8n3JEqR;*+nKZas!=tCrU}KPh686yT(Y@R&>exQn#C3yk6p& z5!_RDM@*ZiDRkXkr+NzSCDx~kZA;Uek2sv3vVGHejp!wzvP%LM#whHavbSH0Mbl)( zp$Se+S|XYvD-KO`Y7lBvk@e!4q$$Gxr)!hHXOhD!(eh_fnak`~JA0bkSJpQ@m6{dy zeTwGs$1jhvon#kN-nvBbrGsfP+e;>Iok?0D!G#;lA{I>ySs*p5+3cWD{}QIFW)ge& z!UR0#7`EDP-4(igi)a*k9;2V;>^9v4vp$O*SY-QPW?}XZ>GQK9w;5;t+MhP*T-rM+ zZ3~sT-wud|P4L*on{M=Dq3=dDC)Y?`zNMP+u zsj50Kz3ugs*%1?R&MmGUqMP)p2#<8Ld6j=3k4Q()Z-`uCD2d_Cc3*xhI{kwmlYg@&Fgt zN%au1Fmn@?`06VwY_t1~!e82VRtIoyIQ45jx1+8tFhW^1ps@;xT41a?EM!QHh-czq X2)8gya7$*D1{JoRu6{1-oD!M<&vy^T diff --git a/Demo/Images/Icon-Small.png b/Demo/Images/Icon-Small.png deleted file mode 100644 index d840cc5ff8cf5557a14a1f2ab1399f2073e44300..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2075 zcmbVNeNYo;9u6uZ77jRw3I*N9!=e;6yZH_TA=v~`1Crzl1g(Z-ff$mF$!Zcl)KRb^ zANu==gX1zkGL2)1jO;hW56kB@- z1yHMalmv#DD%K0oboGWz11imol_@hdN{))MJ^~0ga|r`l6juOdZHCUsHS;Jh>~e{| zV;ZCYFCe&vM|l}kqIe4+zzitB2&IK6sSpG(nV}G!!DK@305BDTK`L=GLm)br!Q{d$ zVD6$2-VCZ#t^^Uy`65OhKtZMJ)r8+UuHa9(T!8^q;Fv*%VHxukuq7SCF=INW2Lw_E zAXX^VI>*?tJukCGP=k68suCG6E$~8LuKG3pskHyio6Uq^gaJ{RbQZ)!gd)luSM~pB z1`@%5j^g;QVws;JD$vn=Rr)!{*P#ECHwM`KN5`U4Va(WV$AN@gDHOh^iPtnt~N z6*g>HBk1y6>T&9WQpw8P?tT5&rc4O{kH8)_A~43qh!s@Px2012O0UCGO(?lUtcNd)+yI&!OcCv$Dc2jo55)ZEbDmOgTBdk9vCx zpK;>i;$RwWb#QR-;H_IfnyRTc>JA<}Sp9CpS_b3T$*QXD^7y8`t&||CR4NJb8Qedf zA9b2cCXYXPa^Wv>x!i0U8!Nuv&=CCIwyj%le41O<*VpI9WgL~)B_&BDlG>)G!iyI# zrtjTb;Ss@RSC*CeNBGaSx3@o?OiD^}t1B#Y_x1I?dgso{I@!8DzkuI{hN6fs!MVxI z)Vl+85d84ba!=1l0wPODi01Klvc$v&l88yhRpXo4?azI?U6-!lXRH6AT3Er3R&iCFPPEto-? zeEyvCcy!cWR=4p%_Xd}f4Go(J&0W<&_4W1R|KRV~QF*wqkUTavMxoPX-H~|T!}iVl zmR&e9Jw7pUwX5q;-*DtMr$C_N?AiY7(d(L|{$=ImVpmt!al3spf6049Ms-%}qeMN%!crUV#&$+Om@bEIb-CkQ=-C6lVZEX2!Os1e zRj9(SxSpP#zdgFR9r*V5-?O+pUQK?!tKgkW_wL_E2*EM|yLLf& zxw%_RCRS5p;|M~5YQInaesw=GU6#@e!4VM=K0ZE3K|uj- zHct(;+Tgrh77ORi1t}v>o>0GEchv~ z9rby6&NH_PK4G)j{ZmtH2A!_|{Oq-&zy%L&wzTLKP)q;dpkLJi(W0AG6-$=c3ksa7 zp3NMX>N{`K`9>y4rI!j9{;RdM%5Kj-a|FVUr@9$Gj% zQcp9VId=Rw9A7C42nYa0-z=vUMW}GRr2MUqJ3Bk?w#PwfwQu;x#>M^6)04kv_KdOT z`>l(!MYrAa?_4LV4r|;@54yV#?^!jG@-w#nyRUnTi;Fw>Cys#U-8b%CHZU;2XZD}C zyLfiG@l$_aFE6h#^85V_v%k2n65hOKKOXlk4y(#+p+;NQlyM$iBN diff --git a/Demo/Images/Icon-Small@2x.png b/Demo/Images/Icon-Small@2x.png deleted file mode 100644 index c6de46def3052290ebb5f9baaf1988e7dfee3e8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3211 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 diff --git a/Demo/Images/Icon-iOS7@2x.png b/Demo/Images/Icon-iOS7@2x.png deleted file mode 100644 index 07040fca41017a839f7880107f905de3cd0b1330..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6493 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 Tp6TJ=e|YF>8fcW=bBy{Q>$N$V diff --git a/Demo/Images/Icon.png b/Demo/Images/Icon.png deleted file mode 100644 index 430cb6c2740fd523ba5d7dcfa31ba6216c7ab669..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2982 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 B1)%@{ diff --git a/Demo/Images/Icon@2x.png b/Demo/Images/Icon@2x.png deleted file mode 100644 index 68d2e0befb4e25480e3eee8496629bc2e494dc13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5470 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 diff --git a/Demo/Info.plist b/Demo/Info.plist index 5c95018a4..8ea622353 100644 --- a/Demo/Info.plist +++ b/Demo/Info.plist @@ -8,15 +8,10 @@ ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} - CFBundleIconFile - - CFBundleIconFiles - - Icon-Small - Icon-iOS7 - Icon.png - Icon@2x.png - + CFBundleIcons + + CFBundleIcons~ipad + CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion diff --git a/Demo/en.lproj/HudDemoViewController.xib b/Demo/en.lproj/HudDemoViewController.xib index 6a4d1a365..fb266e1f0 100644 --- a/Demo/en.lproj/HudDemoViewController.xib +++ b/Demo/en.lproj/HudDemoViewController.xib @@ -1,8 +1,8 @@ - + - - + + @@ -260,9 +260,10 @@ - + + From 252d75257e542be4dcecd8f4ae853f31637a5176 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Wed, 15 Jul 2015 08:19:16 +0200 Subject: [PATCH 018/117] Initial work on the auto-layout migration. --- Demo/HudDemo.xcodeproj/project.pbxproj | 2 + MBProgressHUD.h | 7 + MBProgressHUD.m | 232 +++++++----------------- MBProgressHUD.xcodeproj/project.pbxproj | 4 +- 4 files changed, 77 insertions(+), 168 deletions(-) diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index ce67e27eb..40f80e088 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -344,6 +344,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = HudDemo_Prefix.pch; INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = HudDemo; TARGETED_DEVICE_FAMILY = "1,2"; @@ -359,6 +360,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = HudDemo_Prefix.pch; INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = HudDemo; SDKROOT = iphoneos; diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 7654927bb..f707283d5 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -30,6 +30,7 @@ #import #import +@class MBBackgroundView; @protocol MBProgressHUDDelegate; @@ -182,6 +183,8 @@ typedef void (^MBProgressHUDCompletionBlock)(); */ @property (weak) id delegate; +@property (strong, readonly) MBBackgroundView *bezelView; + /** * A label that holds an optional short message to be displayed below the activity indicator. The HUD is automatically resized to fit * the entire text. If the text is too long it will get clipped by displaying "..." at the end. If left unchanged or @@ -360,6 +363,10 @@ typedef void (^MBProgressHUDCompletionBlock)(); @end +@interface MBBackgroundView : UIView + +@end + @interface MBProgressHUD (Deprecated) + (NSArray *)allHUDsForView:(UIView *)view __attribute__((deprecated("Store references when using more than one HUD per view."))); diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 59250317a..7fef6799b 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -7,12 +7,6 @@ #import "MBProgressHUD.h" #import -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 60000 - #define MBLabelAlignmentCenter NSTextAlignmentCenter -#else - #define MBLabelAlignmentCenter UITextAlignmentCenter -#endif - #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 #define MB_TEXTSIZE(text, font) [text length] > 0 ? [text \ sizeWithAttributes:@{NSFontAttributeName:font}] : CGSizeZero; @@ -39,7 +33,7 @@ #define MBMainThreadAssert() NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); -static const CGFloat kPadding = 4.f; +static const CGFloat MBDefaultPadding = 4.f; static const CGFloat MBDefaultLabelFontSize = 16.f; static const CGFloat MBDefaultDetailsLabelFontSize = 12.f; @@ -110,11 +104,9 @@ - (id)initWithFrame:(CGRect)frame { self.backgroundColor = [UIColor clearColor]; // Make it invisible for now self.alpha = 0.0f; - self.contentMode = UIViewContentModeCenter; - self.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin - | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; + self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - [self setupLabels]; + [self setupViews]; [self updateIndicators]; [self registerForKVO]; [self registerForNotifications]; @@ -159,8 +151,7 @@ - (void)hideAnimated:(BOOL)animated { if (self.minShowTime > 0.0 && self.showStarted) { NSTimeInterval interv = [[NSDate date] timeIntervalSinceDate:self.showStarted]; if (interv < self.minShowTime) { - self.minShowTimer = [NSTimer scheduledTimerWithTimeInterval:(self.minShowTime - interv) target:self - selector:@selector(handleMinShowTimer:) userInfo:nil repeats:NO]; + self.minShowTimer = [NSTimer scheduledTimerWithTimeInterval:(self.minShowTime - interv) target:self selector:@selector(handleMinShowTimer:) userInfo:nil repeats:NO]; return; } } @@ -273,27 +264,35 @@ - (void)done { #pragma mark - UI -- (void)setupLabels { - UILabel *label = [[UILabel alloc] initWithFrame:self.bounds]; +- (void)setupViews { + MBBackgroundView *bezelView = [MBBackgroundView new]; + bezelView.translatesAutoresizingMaskIntoConstraints = NO; + bezelView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5]; + [self addSubview:bezelView]; + _bezelView = bezelView; + + UILabel *label = [UILabel new]; + label.translatesAutoresizingMaskIntoConstraints = NO; label.adjustsFontSizeToFitWidth = NO; - label.textAlignment = MBLabelAlignmentCenter; + label.textAlignment = NSTextAlignmentCenter; label.opaque = NO; label.backgroundColor = [UIColor clearColor]; label.textColor = [UIColor whiteColor]; label.font = [UIFont boldSystemFontOfSize:MBDefaultLabelFontSize];; - [self addSubview:label]; + [bezelView addSubview:label]; _label = label; - UILabel *detailsLabel = [[UILabel alloc] initWithFrame:self.bounds]; + UILabel *detailsLabel = [UILabel new]; + detailsLabel.translatesAutoresizingMaskIntoConstraints = NO; detailsLabel.adjustsFontSizeToFitWidth = NO; - detailsLabel.textAlignment = MBLabelAlignmentCenter; + detailsLabel.textAlignment = NSTextAlignmentCenter; detailsLabel.opaque = NO; detailsLabel.backgroundColor = [UIColor clearColor]; detailsLabel.textColor = [UIColor whiteColor]; detailsLabel.numberOfLines = 0; detailsLabel.font = [UIFont boldSystemFontOfSize:MBDefaultDetailsLabelFontSize]; + [bezelView addSubview:detailsLabel]; _detailsLabel = detailsLabel; - [self addSubview:detailsLabel]; } - (void)updateIndicators { @@ -308,17 +307,15 @@ - (void)updateIndicators { [indicator removeFromSuperview]; indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; [(UIActivityIndicatorView *)indicator startAnimating]; - [self addSubview:indicator]; + [self.bezelView addSubview:indicator]; } -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 50000 [(UIActivityIndicatorView *)indicator setColor:self.activityIndicatorColor]; -#endif } else if (mode == MBProgressHUDModeDeterminateHorizontalBar) { // Update to bar determinate indicator [indicator removeFromSuperview]; indicator = [[MBBarProgressView alloc] init]; - [self addSubview:indicator]; + [self.bezelView addSubview:indicator]; } else if (mode == MBProgressHUDModeDeterminate || mode == MBProgressHUDModeAnnularDeterminate) { if (!isRoundIndicator) { @@ -340,153 +337,50 @@ - (void)updateIndicators { [indicator removeFromSuperview]; indicator = nil; } + indicator.translatesAutoresizingMaskIntoConstraints = NO; self.indicator = indicator; -} - -#pragma mark - Layout -- (void)layoutSubviews { - [super layoutSubviews]; - - // Entirely cover the parent view - UIView *parent = self.superview; - if (parent) { - self.frame = parent.bounds; - } - CGRect bounds = self.bounds; - CGFloat margin = self.margin; - - // Determine the total widt and height needed - CGFloat maxWidth = bounds.size.width - 4 * margin; - CGSize totalSize = CGSizeZero; - - UIView *indicator = self.indicator; - CGRect indicatorF = indicator.bounds; - indicatorF.size.width = MIN(indicatorF.size.width, maxWidth); - totalSize.width = MAX(totalSize.width, indicatorF.size.width); - totalSize.height += indicatorF.size.height; - - UILabel *label = self.label; - CGSize labelSize = MB_TEXTSIZE(label.text, label.font); - labelSize.width = MIN(labelSize.width, maxWidth); - totalSize.width = MAX(totalSize.width, labelSize.width); - totalSize.height += labelSize.height; - if (labelSize.height > 0.f && indicatorF.size.height > 0.f) { - totalSize.height += kPadding; - } - - UILabel *detailsLabel = self.detailsLabel; - CGFloat remainingHeight = bounds.size.height - totalSize.height - kPadding - 4 * margin; - CGSize maxSize = CGSizeMake(maxWidth, remainingHeight); - CGSize detailsLabelSize = MB_MULTILINE_TEXTSIZE(detailsLabel.text, detailsLabel.font, maxSize, detailsLabel.lineBreakMode); - totalSize.width = MAX(totalSize.width, detailsLabelSize.width); - totalSize.height += detailsLabelSize.height; - if (detailsLabelSize.height > 0.f && (indicatorF.size.height > 0.f || labelSize.height > 0.f)) { - totalSize.height += kPadding; - } - - totalSize.width += 2 * margin; - totalSize.height += 2 * margin; - - // Position elements - CGFloat yPos = round(((bounds.size.height - totalSize.height) / 2)) + margin + self.yOffset; - CGFloat xPos = self.xOffset; - indicatorF.origin.y = yPos; - indicatorF.origin.x = round((bounds.size.width - indicatorF.size.width) / 2) + xPos; - indicator.frame = indicatorF; - yPos += indicatorF.size.height; - - if (labelSize.height > 0.f && indicatorF.size.height > 0.f) { - yPos += kPadding; - } - CGRect labelF; - labelF.origin.y = yPos; - labelF.origin.x = round((bounds.size.width - labelSize.width) / 2) + xPos; - labelF.size = labelSize; - label.frame = labelF; - yPos += labelF.size.height; - - if (detailsLabelSize.height > 0.f && (indicatorF.size.height > 0.f || labelSize.height > 0.f)) { - yPos += kPadding; - } - CGRect detailsLabelF; - detailsLabelF.origin.y = yPos; - detailsLabelF.origin.x = round((bounds.size.width - detailsLabelSize.width) / 2) + xPos; - detailsLabelF.size = detailsLabelSize; - detailsLabel.frame = detailsLabelF; - - // Enforce minsize and quare rules - if (self.square) { - CGFloat max = MAX(totalSize.width, totalSize.height); - if (max <= bounds.size.width - 2 * margin) { - totalSize.width = max; - } - if (max <= bounds.size.height - 2 * margin) { - totalSize.height = max; - } - } - CGSize minSize = self.minSize; - if (totalSize.width < minSize.width) { - totalSize.width = minSize.width; - } - if (totalSize.height < minSize.height) { - totalSize.height = minSize.height; - } - - self.size = totalSize; + [self setNeedsUpdateConstraints]; } -#pragma mark BG Drawing - -- (void)drawRect:(CGRect)rect { - - CGContextRef context = UIGraphicsGetCurrentContext(); - UIGraphicsPushContext(context); - - if (self.dimBackground) { - //Gradient colours - size_t gradLocationsNum = 2; - CGFloat gradLocations[2] = {0.0f, 1.0f}; - CGFloat gradColors[8] = {0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.75f}; - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, gradColors, gradLocations, gradLocationsNum); - CGColorSpaceRelease(colorSpace); - //Gradient center - CGPoint gradCenter= CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2); - //Gradient radius - CGFloat gradRadius = MIN(self.bounds.size.width , self.bounds.size.height) ; - //Gradient draw - CGContextDrawRadialGradient (context, gradient, gradCenter, - 0, gradCenter, gradRadius, - kCGGradientDrawsAfterEndLocation); - CGGradientRelease(gradient); - } - - // Set background rect color - if (self.color) { - CGContextSetFillColorWithColor(context, self.color.CGColor); - } else { - CGContextSetGrayFillColor(context, 0.0f, self.opacity); - } - - - // Center HUD - CGRect allRect = self.bounds; - // Draw rounded HUD backgroud rect - CGSize size = self.size; - CGRect boxRect = CGRectMake(round((allRect.size.width - size.width) / 2) + self.xOffset, - round((allRect.size.height - size.height) / 2) + self.yOffset, size.width, size.height); - CGFloat radius = self.cornerRadius; - CGContextBeginPath(context); - CGContextMoveToPoint(context, CGRectGetMinX(boxRect) + radius, CGRectGetMinY(boxRect)); - CGContextAddArc(context, CGRectGetMaxX(boxRect) - radius, CGRectGetMinY(boxRect) + radius, radius, 3 * (CGFloat)M_PI / 2, 0, 0); - CGContextAddArc(context, CGRectGetMaxX(boxRect) - radius, CGRectGetMaxY(boxRect) - radius, radius, 0, (CGFloat)M_PI / 2, 0); - CGContextAddArc(context, CGRectGetMinX(boxRect) + radius, CGRectGetMaxY(boxRect) - radius, radius, (CGFloat)M_PI / 2, (CGFloat)M_PI, 0); - CGContextAddArc(context, CGRectGetMinX(boxRect) + radius, CGRectGetMinY(boxRect) + radius, radius, (CGFloat)M_PI, 3 * (CGFloat)M_PI / 2, 0); - CGContextClosePath(context); - CGContextFillPath(context); +#pragma mark - Layout - UIGraphicsPopContext(); +- (void)updateConstraints { + [super updateConstraints]; + + UIView *bezel = self.bezelView; + + NSMutableArray *subviews = [NSMutableArray arrayWithObjects:self.label, self.detailsLabel, nil]; + if (self.indicator) [subviews insertObject:self.indicator atIndex:0]; + + // Remove existing constraintes + [self removeConstraints:self.constraints]; + [bezel removeConstraints:bezel.constraints]; + + // Center bezel in container (self) + [self addConstraint:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.f constant:0.f]]; + [self addConstraint:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.f constant:0.f]]; + + // Layout subviews in bezel + [subviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) { + // Center in bezel + [bezel addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeCenterX multiplier:1.f constant:0.f]]; + // Ensure the edge margin is kept + [bezel addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-[view]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]]; + // Element spacing + if (idx == 0) { + // First, ensure spacing to bezel edge + [bezel addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeTop multiplier:1.f constant:0]]; + } else if (idx == subviews.count - 1) { + // Last, ensure spacigin to bezel edge + [bezel addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeBottom multiplier:1.f constant:0]]; + } + if (idx > 0) { + // Has previous + UIView *previous = subviews[idx - 1]; + [bezel addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:previous attribute:NSLayoutAttributeBottom multiplier:1.f constant:0]]; + } + }]; } #pragma mark - KVO @@ -828,6 +722,12 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N @end + +@implementation MBBackgroundView + +@end + + @implementation MBProgressHUD (Deprecated) #pragma mark - Class diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index 40ac54d92..69989f2ce 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -184,7 +184,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -212,7 +212,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; From b3c18643529336089686d541b973aeee03521153 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Thu, 16 Jul 2015 08:08:04 +0200 Subject: [PATCH 019/117] Patched progress adjustment. --- Demo/Classes/HudDemoViewController.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Demo/Classes/HudDemoViewController.m b/Demo/Classes/HudDemoViewController.m index 8e88842e7..847fc14f3 100644 --- a/Demo/Classes/HudDemoViewController.m +++ b/Demo/Classes/HudDemoViewController.m @@ -254,7 +254,9 @@ - (void)myProgressTask { float progress = 0.0f; while (progress < 1.0f) { progress += 0.01f; - HUD.progress = progress; + dispatch_async(dispatch_get_main_queue(), ^{ + HUD.progress = progress; + }); usleep(50000); } } From 3ee00aa2e7a3c8813180a3e6fe5ebde9a4adcaef Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Thu, 16 Jul 2015 08:08:36 +0200 Subject: [PATCH 020/117] Improved temporary bezel styling. --- MBProgressHUD.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 7fef6799b..62ca78841 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -267,7 +267,8 @@ - (void)done { - (void)setupViews { MBBackgroundView *bezelView = [MBBackgroundView new]; bezelView.translatesAutoresizingMaskIntoConstraints = NO; - bezelView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5]; + bezelView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.8]; + bezelView.layer.cornerRadius = 5.f; [self addSubview:bezelView]; _bezelView = bezelView; From 9d22e42d3179d09cf902a246a0c054936a233c3b Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Thu, 16 Jul 2015 08:08:51 +0200 Subject: [PATCH 021/117] Formatting.. --- MBProgressHUD.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 62ca78841..16de23641 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -37,6 +37,7 @@ static const CGFloat MBDefaultLabelFontSize = 16.f; static const CGFloat MBDefaultDetailsLabelFontSize = 12.f; + @interface MBProgressHUD () @property (nonatomic, assign) BOOL useAnimation; @@ -53,6 +54,7 @@ @interface MBProgressHUD () @end + @implementation MBProgressHUD #pragma mark - Class methods From ceb113ed3dfaab2b4834c5017ac45d7d18a3b8c5 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Thu, 16 Jul 2015 08:09:06 +0200 Subject: [PATCH 022/117] Fixed view insertion. --- MBProgressHUD.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 16de23641..2bf822ca0 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -325,7 +325,7 @@ - (void)updateIndicators { // Update to determinante indicator [indicator removeFromSuperview]; indicator = [[MBRoundProgressView alloc] init]; - [self addSubview:indicator]; + [self.bezelView addSubview:indicator]; } if (mode == MBProgressHUDModeAnnularDeterminate) { [(MBRoundProgressView *)indicator setAnnular:YES]; @@ -335,7 +335,7 @@ - (void)updateIndicators { // Update custom view indicator [indicator removeFromSuperview]; indicator = self.customView; - [self addSubview:indicator]; + [self.bezelView addSubview:indicator]; } else if (mode == MBProgressHUDModeText) { [indicator removeFromSuperview]; indicator = nil; From bce190f0f34fa1e11eb6ea6a2815db3d969f6b54 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Thu, 16 Jul 2015 08:09:38 +0200 Subject: [PATCH 023/117] Improved layout. --- MBProgressHUD.m | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 2bf822ca0..5e23dbdb8 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -352,6 +352,8 @@ - (void)updateConstraints { [super updateConstraints]; UIView *bezel = self.bezelView; + CGFloat margin = self.margin; + NSDictionary *metrics = @{@"margin": @(margin)}; NSMutableArray *subviews = [NSMutableArray arrayWithObjects:self.label, self.detailsLabel, nil]; if (self.indicator) [subviews insertObject:self.indicator atIndex:0]; @@ -363,25 +365,28 @@ - (void)updateConstraints { // Center bezel in container (self) [self addConstraint:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.f constant:0.f]]; [self addConstraint:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.f constant:0.f]]; + // Ensure minimum side margin is kept + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=margin)-[bezel]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(bezel)]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=margin)-[bezel]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(bezel)]]; // Layout subviews in bezel [subviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) { // Center in bezel [bezel addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeCenterX multiplier:1.f constant:0.f]]; - // Ensure the edge margin is kept - [bezel addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-[view]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]]; + // Ensure the minimum edge margin is kept + [bezel addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=margin)-[view]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(view)]]; // Element spacing if (idx == 0) { // First, ensure spacing to bezel edge - [bezel addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeTop multiplier:1.f constant:0]]; + [bezel addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeTop multiplier:1.f constant:margin]]; } else if (idx == subviews.count - 1) { // Last, ensure spacigin to bezel edge - [bezel addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeBottom multiplier:1.f constant:0]]; + [bezel addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeBottom multiplier:1.f constant:-margin]]; } if (idx > 0) { // Has previous UIView *previous = subviews[idx - 1]; - [bezel addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:previous attribute:NSLayoutAttributeBottom multiplier:1.f constant:0]]; + [bezel addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:previous attribute:NSLayoutAttributeBottom multiplier:1.f constant:0.f]]; } }]; } From 7afbf66cd35bc99e9ff3d120455e83effef33a04 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Thu, 16 Jul 2015 08:09:53 +0200 Subject: [PATCH 024/117] Auto layout support for custom progress indicators. --- MBProgressHUD.m | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 5e23dbdb8..44979bd56 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -519,6 +519,12 @@ - (void)dealloc { [self unregisterFromKVO]; } +#pragma mark - Layout + +- (CGSize)intrinsicContentSize { + return CGSizeMake(37.f, 37.f); +} + #pragma mark - Drawing - (void)drawRect:(CGRect)rect { @@ -620,6 +626,12 @@ - (void)dealloc { [self unregisterFromKVO]; } +#pragma mark - Layout + +- (CGSize)intrinsicContentSize { + return CGSizeMake(120.f, 20.f); +} + #pragma mark - Drawing - (void)drawRect:(CGRect)rect { From 9e110dfe78cab79b44f47a8187822c00bc3e6bb5 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Fri, 17 Jul 2015 08:52:20 +0200 Subject: [PATCH 025/117] Implemented support for dynamic padding. --- MBProgressHUD.m | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 44979bd56..8a1b191e5 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -48,6 +48,7 @@ @interface MBProgressHUD () @property (nonatomic, strong) NSTimer *graceTimer; @property (nonatomic, strong) NSTimer *minShowTimer; @property (nonatomic, strong) NSDate *showStarted; +@property (nonatomic, strong) NSArray *paddingConstraints; // Deprecated @property (copy) MBProgressHUDCompletionBlock completionBlock; @property (assign) BOOL taskInProgress; @@ -370,6 +371,7 @@ - (void)updateConstraints { [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=margin)-[bezel]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(bezel)]]; // Layout subviews in bezel + NSMutableArray *paddingConstraints = [NSMutableArray new]; [subviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) { // Center in bezel [bezel addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeCenterX multiplier:1.f constant:0.f]]; @@ -385,10 +387,33 @@ - (void)updateConstraints { } if (idx > 0) { // Has previous - UIView *previous = subviews[idx - 1]; - [bezel addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:previous attribute:NSLayoutAttributeBottom multiplier:1.f constant:0.f]]; + NSLayoutConstraint *padding = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:subviews[idx - 1] attribute:NSLayoutAttributeBottom multiplier:1.f constant:0.f]; + [bezel addConstraint:padding]; + [paddingConstraints addObject:padding]; } }]; + self.paddingConstraints = [paddingConstraints copy]; + [self updatePaddingConstraints]; +} + +- (void)layoutSubviews { + [self updatePaddingConstraints]; + [super layoutSubviews]; +} + +- (void)updatePaddingConstraints { + // Set padding dynamically, depending on whether the view is visible or not + __block BOOL hasVisibleAnchestors = NO; + [self.paddingConstraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *padding, NSUInteger idx, BOOL *stop) { + UIView *firstView = (UIView *)padding.firstItem; + UIView *secondView = (UIView *)padding.secondItem; + BOOL firstVisible = !CGSizeEqualToSize(firstView.intrinsicContentSize, CGSizeZero); + BOOL secondVisible = !CGSizeEqualToSize(secondView.intrinsicContentSize, CGSizeZero); + // Set if both views are visible of if there's a visible view on top that yet doesn't have padding + // added relative to the current view + padding.constant = (firstVisible && (secondVisible || hasVisibleAnchestors)) ? MBDefaultPadding : 0.f; + hasVisibleAnchestors |= secondVisible; + }]; } #pragma mark - KVO From 6884364369b968ae17213c40963ba19db5f13763 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Fri, 17 Jul 2015 08:52:30 +0200 Subject: [PATCH 026/117] Fixes threading. --- Demo/Classes/HudDemoViewController.m | 29 +++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/Demo/Classes/HudDemoViewController.m b/Demo/Classes/HudDemoViewController.m index 847fc14f3..10b171979 100644 --- a/Demo/Classes/HudDemoViewController.m +++ b/Demo/Classes/HudDemoViewController.m @@ -265,28 +265,31 @@ - (void)myMixedTask { // Indeterminate mode sleep(2); // Switch to determinate mode - HUD.mode = MBProgressHUDModeDeterminate; - HUD.labelText = @"Progress"; + dispatch_async(dispatch_get_main_queue(), ^{ + HUD.mode = MBProgressHUDModeDeterminate; + HUD.labelText = @"Progress"; + }); float progress = 0.0f; - while (progress < 1.0f) - { + while (progress < 1.0f) { progress += 0.01f; - HUD.progress = progress; + dispatch_async(dispatch_get_main_queue(), ^{ + HUD.progress = progress; + }); usleep(50000); } // Back to indeterminate mode - HUD.mode = MBProgressHUDModeIndeterminate; - HUD.labelText = @"Cleaning up"; + dispatch_async(dispatch_get_main_queue(), ^{ + HUD.mode = MBProgressHUDModeIndeterminate; + HUD.labelText = @"Cleaning up"; + }); sleep(2); - // UIImageView is a UIKit class, we have to initialize it on the main thread - __block UIImageView *imageView; dispatch_sync(dispatch_get_main_queue(), ^{ UIImage *image = [UIImage imageNamed:@"Checkmark"]; - imageView = [[UIImageView alloc] initWithImage:image]; + UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; + HUD.customView = imageView; + HUD.mode = MBProgressHUDModeCustomView; + HUD.labelText = @"Completed"; }); - HUD.customView = imageView; - HUD.mode = MBProgressHUDModeCustomView; - HUD.labelText = @"Completed"; sleep(2); } From 1c0dc2e519cb1bc69945e8f197e1ab8c9adc7f6f Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 18 Jul 2015 17:07:17 +0200 Subject: [PATCH 027/117] Cleaned up the API a bit more and updated the documentation. --- MBProgressHUD.h | 158 +++++++++++++++++++----------------------------- MBProgressHUD.m | 87 +++++++++++++++++++++----- 2 files changed, 133 insertions(+), 112 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index f707283d5..22ffb1e8e 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -35,41 +35,40 @@ typedef NS_ENUM(NSInteger, MBProgressHUDMode) { - /** Progress is shown using an UIActivityIndicatorView. This is the default. */ + /// UIActivityIndicatorView. MBProgressHUDModeIndeterminate, - /** Progress is shown using a round, pie-chart like, progress view. */ + /// A round, pie-chart like, progress view. MBProgressHUDModeDeterminate, - /** Progress is shown using a horizontal progress bar */ + /// Horizontal progress bar. MBProgressHUDModeDeterminateHorizontalBar, - /** Progress is shown using a ring-shaped progress view. */ + /// Ring-shaped progress view. MBProgressHUDModeAnnularDeterminate, - /** Shows a custom view */ + /// Shows a custom view. MBProgressHUDModeCustomView, - /** Shows only labels */ + /// Shows only labels. MBProgressHUDModeText }; typedef NS_ENUM(NSInteger, MBProgressHUDAnimation) { - /** Opacity animation */ + /// Opacity animation MBProgressHUDAnimationFade, - /** Opacity + scale animation */ - MBProgressHUDAnimationZoom, + /// Opacity + scale animation + MBProgressHUDAnimationZoom, + /// Opacity + scale animation (zoom out style) MBProgressHUDAnimationZoomOut = MBProgressHUDAnimationZoom, + /// Opacity + scale animation (zoom in style) MBProgressHUDAnimationZoomIn }; -typedef void (^MBProgressHUDCompletionBlock)(); - /** * Displays a simple HUD window containing a progress indicator and two optional labels for short messages. * * This is a simple drop-in class for displaying a progress HUD view similar to Apple's private UIProgressHUD class. - * The MBProgressHUD window spans over the entire space given to it by the initWithFrame constructor and catches all - * user input on this region, thereby preventing the user operations on components below the view. To allow touches - * to pass through the HUD you can set hud.userInteractionEnabled = NO. The HUD itself is - * drawn centered as a rounded semi-transparent view which resizes depending on the user specified content. + * The MBProgressHUD window spans over the entire space given to it by the initWithFrame: constructor and catches all + * user input on this region, thereby preventing the user operations on components below the view. * + * @note To still allow touches to pass through the HUD, you can set hud.userInteractionEnabled = NO. * @attention MBProgressHUD is a UI class and should therefore only be accessed on the main thread. */ @interface MBProgressHUD : UIView @@ -77,7 +76,7 @@ typedef void (^MBProgressHUDCompletionBlock)(); /** * Creates a new HUD, adds it to provided view and shows it. The counterpart to this method is hideHUDForView:animated:. * - * @note This method sets `removeFromSuperViewOnHide`. The HUD will automatically be removed from the view hierarchy when hidden. + * @note This method sets removeFromSuperViewOnHide. The HUD will automatically be removed from the view hierarchy when hidden. * * @param view The view that the HUD will be added to * @param animated If set to YES the HUD will appear using the current animationType. If set to NO the HUD will not use @@ -119,10 +118,12 @@ typedef void (^MBProgressHUDCompletionBlock)(); * @param view The view instance that will provide the bounds for the HUD. Should be the same instance as * the HUD's superview (i.e., the view that the HUD will be added to). */ -- (id)initWithView:(UIView *)view; +- (instancetype)initWithView:(UIView *)view; /** - * Display the HUD. You need to make sure that the main thread completes its run loop soon after this method call so + * Displays the HUD. + * + * @note You need to make sure that the main thread completes its run loop soon after this method call so * the user interface can be updated. Call this method when your task is already set-up to be executed in a new thread * (e.g., when using something like NSOperation or calling an asynchronous call like NSURLRequest). * @@ -134,7 +135,7 @@ typedef void (^MBProgressHUDCompletionBlock)(); - (void)showAnimated:(BOOL)animated; /** - * Hide the HUD. This still calls the hudWasHidden: delegate. This is the counterpart of the show: method. Use it to + * Hides the HUD. This still calls the hudWasHidden: delegate. This is the counterpart of the show: method. Use it to * hide the HUD when your task completes. * * @param animated If set to YES the HUD will disappear using the current animationType. If set to NO the HUD will not use @@ -145,7 +146,7 @@ typedef void (^MBProgressHUDCompletionBlock)(); - (void)hideAnimated:(BOOL)animated; /** - * Hide the HUD after a delay. This still calls the hudWasHidden: delegate. This is the counterpart of the show: method. Use it to + * Hides the HUD after a delay. This still calls the hudWasHidden: delegate. This is the counterpart of the show: method. Use it to * hide the HUD when your task completes. * * @param animated If set to YES the HUD will disappear using the current animationType. If set to NO the HUD will not use @@ -156,85 +157,64 @@ typedef void (^MBProgressHUDCompletionBlock)(); */ - (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay; +/** + * The HUD delegate object. Recives HUD state notifications. + */ +@property (weak, nonatomic) id delegate; + /** * MBProgressHUD operation mode. The default is MBProgressHUDModeIndeterminate. - * - * @see MBProgressHUDMode */ -@property (assign) MBProgressHUDMode mode; +@property (assign, nonatomic) MBProgressHUDMode mode; /** - * The animation type that should be used when the HUD is shown and hidden. - * - * @see MBProgressHUDAnimation + * The animation type that should be used when the HUD is shown and hidden. */ -@property (assign) MBProgressHUDAnimation animationType; +@property (assign, nonatomic) MBProgressHUDAnimation animationType; /** - * The UIView (e.g., a UIImageView) to be shown when the HUD is in MBProgressHUDModeCustomView. - * For best results use a 37 by 37 pixel view (so the bounds match the built in indicator bounds). + * The view containing the labels and indicator (or customView). */ -@property (strong) UIView *customView; +@property (strong, nonatomic, readonly) MBBackgroundView *bezelView; -/** - * The HUD delegate object. - * - * @see MBProgressHUDDelegate +/** + * The UIView (e.g., a UIImageView) to be shown when the HUD is in MBProgressHUDModeCustomView. + * The view should implement intrinsicContentSize for proper sizing. For best results use approximately 37 by 37 pixel. */ -@property (weak) id delegate; - -@property (strong, readonly) MBBackgroundView *bezelView; +@property (strong, nonatomic) UIView *customView; /** * A label that holds an optional short message to be displayed below the activity indicator. The HUD is automatically resized to fit - * the entire text. If the text is too long it will get clipped by displaying "..." at the end. If left unchanged or - * set to @"", then no message is displayed. + * the entire text. */ -@property (strong, readonly) UILabel *label; +@property (strong, nonatomic, readonly) UILabel *label; /** * A label that holds an optional details message displayed below the labelText message. The details text can span multiple lines. */ -@property (strong, readonly) UILabel *detailsLabel; - -/** - * The opacity of the HUD window. Defaults to 0.8 (80% opacity). - */ -@property (assign) CGFloat opacity; +@property (strong, nonatomic, readonly) UILabel *detailsLabel; /** - * The color of the HUD window. Defaults to black. If this property is set, color is set using - * this UIColor and the opacity property is not used. using retain because performing copy on - * UIColor base colors (like [UIColor greenColor]) cause problems with the copyZone. + * The bezel offset relative to the centre of the view. */ -@property (strong) UIColor *color; - -/** - * The x-axis offset of the HUD relative to the centre of the superview. - */ -@property (assign) CGFloat xOffset; - -/** - * The y-axis offset of the HUD relative to the centre of the superview. - */ -@property (assign) CGFloat yOffset; +@property (assign, nonatomic) CGPoint offset; /** * The amount of space between the HUD edge and the HUD elements (labels, indicators or custom views). - * Defaults to 20.0 + * This also represents the minimum bezel distance to the edge of the HUD view. + * Defaults to 20.f */ -@property (assign) CGFloat margin; +@property (assign, nonatomic) CGFloat margin; /** - * The corner radius for the HUD - * Defaults to 10.0 + * The minimum size of the HUD bezel. Defaults to CGSizeZero (no minimum size). */ -@property (assign) CGFloat cornerRadius; +@property (assign, nonatomic) CGSize minSize; -/** - * Cover the HUD background view with a radial gradient. +/** + * Force the HUD dimensions to be equal if possible. */ -@property (assign) BOOL dimBackground; +@property (assign, nonatomic, getter = isSquare) BOOL square; /* * Grace period is the time (in seconds) that the invoked method may be run without @@ -243,49 +223,25 @@ typedef void (^MBProgressHUDCompletionBlock)(); * This may be used to prevent HUD display for very short tasks. * Defaults to 0 (no grace time). */ -@property (assign) NSTimeInterval graceTime; +@property (assign, nonatomic) NSTimeInterval graceTime; /** * The minimum time (in seconds) that the HUD is shown. * This avoids the problem of the HUD being shown and than instantly hidden. * Defaults to 0 (no minimum show time). */ -@property (assign) NSTimeInterval minShowTime; +@property (assign, nonatomic) NSTimeInterval minShowTime; /** * Removes the HUD from its parent view when hidden. * Defaults to NO. */ -@property (assign) BOOL removeFromSuperViewOnHide; - -/** - * The color of the activity indicator. Defaults to [UIColor whiteColor] - * Does nothing on pre iOS 5. - */ -@property (strong) UIColor *activityIndicatorColor; +@property (assign, nonatomic) BOOL removeFromSuperViewOnHide; /** * The progress of the progress indicator, from 0.0 to 1.0. Defaults to 0.0. */ -@property (assign) float progress; - -/** - * The minimum size of the HUD bezel. Defaults to CGSizeZero (no minimum size). - */ -@property (assign) CGSize minSize; - -/** - * The actual size of the HUD bezel. - * You can use this to limit touch handling on the bezel aria only. - * @see https://github.com/jdg/MBProgressHUD/pull/200 - */ -@property (atomic, assign, readonly) CGSize size; - - -/** - * Force the HUD dimensions to be equal if possible. - */ -@property (assign, getter = isSquare) BOOL square; +@property (assign, nonatomic) float progress; @end @@ -378,6 +334,8 @@ typedef void (^MBProgressHUDCompletionBlock)(); - (void)hide:(BOOL)animated __attribute__((deprecated("Use hideAnimated: instead."))); - (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay __attribute__((deprecated("Use hideAnimated:afterDelay: instead."))); +typedef void (^MBProgressHUDCompletionBlock)(); + - (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated __attribute__((deprecated("Use GCD directly."))); - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block __attribute__((deprecated("Use GCD directly."))); - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(MBProgressHUDCompletionBlock)completion __attribute__((deprecated("Use GCD directly."))); @@ -393,5 +351,13 @@ typedef void (^MBProgressHUDCompletionBlock)(); @property (nonatomic, copy) NSString *detailsLabelText __attribute__((deprecated("Use detailsLabel.text instead."))); @property (nonatomic, strong) UIFont *detailsLabelFont __attribute__((deprecated("Use detailsLabel.font instead."))); @property (nonatomic, strong) UIColor *detailsLabelColor __attribute__((deprecated("Use detailsLabel.textColor instead."))); +@property (assign, nonatomic) CGFloat opacity __attribute__((deprecated("Customize bezelView properties instead."))); +@property (strong, nonatomic) UIColor *color __attribute__((deprecated("Customize bezelView properties instead."))); +@property (assign, nonatomic) CGFloat xOffset __attribute__((deprecated("Set offset.x instead."))); +@property (assign, nonatomic) CGFloat yOffset __attribute__((deprecated("Set offset.y instead."))); +@property (assign, nonatomic) CGFloat cornerRadius __attribute__((deprecated("Set bezelView.layer.cornerRadius instead."))); +@property (assign, nonatomic) BOOL dimBackground __attribute__((deprecated("Customize HUD backgroudn properties instead."))); +@property (strong, nonatomic) UIColor *activityIndicatorColor __attribute__((deprecated("Use UIAppearance to customize UIActivityIndicatorView."))); +@property (atomic, assign, readonly) CGSize size __attribute__((deprecated("Get the bezelView.frame.size instead."))); @end diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 8a1b191e5..2284f3323 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -52,6 +52,7 @@ @interface MBProgressHUD () // Deprecated @property (copy) MBProgressHUDCompletionBlock completionBlock; @property (assign) BOOL taskInProgress; +@property (strong, nonatomic) UIColor *activityIndicatorColor; @end @@ -96,10 +97,7 @@ - (id)initWithFrame:(CGRect)frame { // Set default values for properties _animationType = MBProgressHUDAnimationFade; _mode = MBProgressHUDModeIndeterminate; - _opacity = 0.8f; - _activityIndicatorColor = [UIColor whiteColor]; _margin = 20.0f; - _cornerRadius = 10.0f; _rotationTransform = CGAffineTransformIdentity; // Transparent background @@ -313,7 +311,9 @@ - (void)updateIndicators { [(UIActivityIndicatorView *)indicator startAnimating]; [self.bezelView addSubview:indicator]; } - [(UIActivityIndicatorView *)indicator setColor:self.activityIndicatorColor]; + if (self.activityIndicatorColor) { + [(UIActivityIndicatorView *)indicator setColor:self.activityIndicatorColor]; + } } else if (mode == MBProgressHUDModeDeterminateHorizontalBar) { // Update to bar determinate indicator @@ -864,63 +864,118 @@ - (void)cleanUp { #pragma mark - Labels - (NSString *)labelText { - MBMainThreadAssert() return self.label.text; } - (void)setLabelText:(NSString *)labelText { - MBMainThreadAssert() + MBMainThreadAssert(); self.label.text = labelText; } - (UIFont *)labelFont { - MBMainThreadAssert() return self.label.font; } - (void)setLabelFont:(UIFont *)labelFont { - MBMainThreadAssert() + MBMainThreadAssert(); self.label.font = labelFont; } - (UIColor *)labelColor { - MBMainThreadAssert() return self.label.textColor; } - (void)setLabelColor:(UIColor *)labelColor { - MBMainThreadAssert() + MBMainThreadAssert(); self.label.textColor = labelColor; } - (NSString *)detailsLabelText { - MBMainThreadAssert() return self.detailsLabel.text; } - (void)setDetailsLabelText:(NSString *)detailsLabelText { - MBMainThreadAssert() + MBMainThreadAssert(); self.detailsLabel.text = detailsLabelText; } - (UIFont *)detailsLabelFont { - MBMainThreadAssert() return self.detailsLabel.font; } - (void)setDetailsLabelFont:(UIFont *)detailsLabelFont { - MBMainThreadAssert() + MBMainThreadAssert(); self.detailsLabel.font = detailsLabelFont; } - (UIColor *)detailsLabelColor { - MBMainThreadAssert() return self.detailsLabel.textColor; } - (void)setDetailsLabelColor:(UIColor *)detailsLabelColor { - MBMainThreadAssert() + MBMainThreadAssert(); self.detailsLabel.textColor = detailsLabelColor; } +- (CGFloat)opacity { + // TODO: forward when appropriate + return 1.f; +} + +- (void)setOpacity:(CGFloat)opacity { + MBMainThreadAssert(); + // TODO: forward when appropriate +} + +- (UIColor *)color { + // TODO: forward when appropriate + return nil; +} + +- (void)setColor:(UIColor *)color { + MBMainThreadAssert(); + // TODO: forward when appropriate +} + +- (CGFloat)yOffset { + return self.offset.y; +} + +- (void)setYOffset:(CGFloat)yOffset { + MBMainThreadAssert(); + self.offset = CGPointMake(self.offset.x, yOffset); +} + +- (CGFloat)xOffset { + return self.offset.x; +} + +- (void)setXOffset:(CGFloat)xOffset { + MBMainThreadAssert(); + self.offset = CGPointMake(xOffset, self.offset.y); +} + +- (CGFloat)cornerRadius { + return self.bezelView.layer.cornerRadius; +} + +- (void)setCornerRadius:(CGFloat)cornerRadius { + MBMainThreadAssert(); + self.bezelView.layer.cornerRadius = cornerRadius; +} + +- (BOOL)dimBackground { + // TODO: forward when appropriate + return NO; +} + +- (void)setDimBackground:(BOOL)dimBackground { + MBMainThreadAssert(); + // TODO: forward when appropriate +} + +- (CGSize)size { + return self.bezelView.frame.size; +} + @end From f3d2d9c63c85eff128a76c47d332558bf8506193 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 18 Jul 2015 17:07:34 +0200 Subject: [PATCH 028/117] Using template images. --- Demo/Classes/HudDemoViewController.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Demo/Classes/HudDemoViewController.m b/Demo/Classes/HudDemoViewController.m index 10b171979..183ba26ea 100644 --- a/Demo/Classes/HudDemoViewController.m +++ b/Demo/Classes/HudDemoViewController.m @@ -143,7 +143,7 @@ - (IBAction)showWithCustomView:(id)sender { // The sample image is based on the work by http://www.pixelpressicons.com, http://creativecommons.org/licenses/by/2.5/ca/ // Make the customViews 37 by 37 pixels for best results (those are the bounds of the build-in progress indicators) - HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Checkmark"]]; + HUD.customView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]]; // Set custom view mode HUD.mode = MBProgressHUDModeCustomView; @@ -284,7 +284,7 @@ - (void)myMixedTask { }); sleep(2); dispatch_sync(dispatch_get_main_queue(), ^{ - UIImage *image = [UIImage imageNamed:@"Checkmark"]; + UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; HUD.customView = imageView; HUD.mode = MBProgressHUDModeCustomView; @@ -307,7 +307,7 @@ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { - HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Checkmark"]]; + HUD.customView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]]; HUD.mode = MBProgressHUDModeCustomView; [HUD hide:YES afterDelay:2]; } From 36a14f4644a1666bac313fa9c1e2a6f705452786 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 18 Jul 2015 17:09:18 +0200 Subject: [PATCH 029/117] Removed sizing helpers that are now obsolete due to auto layout. --- MBProgressHUD.m | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 2284f3323..36663455a 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -7,22 +7,6 @@ #import "MBProgressHUD.h" #import -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 - #define MB_TEXTSIZE(text, font) [text length] > 0 ? [text \ - sizeWithAttributes:@{NSFontAttributeName:font}] : CGSizeZero; -#else - #define MB_TEXTSIZE(text, font) [text length] > 0 ? [text sizeWithFont:font] : CGSizeZero; -#endif - -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 - #define MB_MULTILINE_TEXTSIZE(text, font, maxSize, mode) [text length] > 0 ? [text \ - boundingRectWithSize:maxSize options:(NSStringDrawingUsesLineFragmentOrigin) \ - attributes:@{NSFontAttributeName:font} context:nil].size : CGSizeZero; -#else - #define MB_MULTILINE_TEXTSIZE(text, font, maxSize, mode) [text length] > 0 ? [text \ - sizeWithFont:font constrainedToSize:maxSize lineBreakMode:mode] : CGSizeZero; -#endif - #ifndef kCFCoreFoundationVersionNumber_iOS_7_0 #define kCFCoreFoundationVersionNumber_iOS_7_0 847.20 #endif From bfa86eff5b04e7600585f5eaae5ce4dec0392981 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 18 Jul 2015 17:22:41 +0200 Subject: [PATCH 030/117] Cleanup. --- MBProgressHUD.h | 2 +- MBProgressHUD.m | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 22ffb1e8e..022459fab 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -109,7 +109,7 @@ typedef NS_ENUM(NSInteger, MBProgressHUDAnimation) { * @param view The view that is going to be searched. * @return A reference to the last HUD subview discovered. */ -+ (instancetype)HUDForView:(UIView *)view; ++ (MBProgressHUD *)HUDForView:(UIView *)view; /** * A convenience constructor that initializes the HUD with the view's bounds. Calls the designated constructor with diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 36663455a..03cd9386b 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -7,6 +7,7 @@ #import "MBProgressHUD.h" #import + #ifndef kCFCoreFoundationVersionNumber_iOS_7_0 #define kCFCoreFoundationVersionNumber_iOS_7_0 847.20 #endif @@ -17,6 +18,7 @@ #define MBMainThreadAssert() NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); + static const CGFloat MBDefaultPadding = 4.f; static const CGFloat MBDefaultLabelFontSize = 16.f; static const CGFloat MBDefaultDetailsLabelFontSize = 12.f; @@ -33,6 +35,7 @@ @interface MBProgressHUD () @property (nonatomic, strong) NSTimer *minShowTimer; @property (nonatomic, strong) NSDate *showStarted; @property (nonatomic, strong) NSArray *paddingConstraints; + // Deprecated @property (copy) MBProgressHUDCompletionBlock completionBlock; @property (assign) BOOL taskInProgress; @@ -63,7 +66,7 @@ + (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated { return NO; } -+ (instancetype)HUDForView:(UIView *)view { ++ (MBProgressHUD *)HUDForView:(UIView *)view { NSEnumerator *subviewsEnum = [view.subviews reverseObjectEnumerator]; for (UIView *subview in subviewsEnum) { if ([subview isKindOfClass:self]) { @@ -75,9 +78,8 @@ + (instancetype)HUDForView:(UIView *)view { #pragma mark - Lifecycle -- (id)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { +- (instancetype)initWithFrame:(CGRect)frame { + if ((self = [super initWithFrame:frame])) { // Set default values for properties _animationType = MBProgressHUDAnimationFade; _mode = MBProgressHUDModeIndeterminate; From 8c0678b52cbcf27ad71644c422a1565055c88056 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 19 Jul 2015 18:50:20 +0200 Subject: [PATCH 031/117] Scheduling minShowTimer in NSRunLoopCommonModes. --- MBProgressHUD.m | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 03cd9386b..7a27292b1 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -119,9 +119,9 @@ - (void)showAnimated:(BOOL)animated { self.finished = NO; // If the grace time is set postpone the HUD display if (self.graceTime > 0.0) { - NSTimer *newGraceTimer = [NSTimer timerWithTimeInterval:self.graceTime target:self selector:@selector(handleGraceTimer:) userInfo:nil repeats:NO]; - [[NSRunLoop currentRunLoop] addTimer:newGraceTimer forMode:NSRunLoopCommonModes]; - self.graceTimer = newGraceTimer; + NSTimer *timer = [NSTimer timerWithTimeInterval:self.graceTime target:self selector:@selector(handleGraceTimer:) userInfo:nil repeats:NO]; + [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; + self.graceTimer = timer; } // ... otherwise show the HUD imediately else { @@ -138,7 +138,9 @@ - (void)hideAnimated:(BOOL)animated { if (self.minShowTime > 0.0 && self.showStarted) { NSTimeInterval interv = [[NSDate date] timeIntervalSinceDate:self.showStarted]; if (interv < self.minShowTime) { - self.minShowTimer = [NSTimer scheduledTimerWithTimeInterval:(self.minShowTime - interv) target:self selector:@selector(handleMinShowTimer:) userInfo:nil repeats:NO]; + NSTimer *timer = [NSTimer timerWithTimeInterval:(self.minShowTime - interv) target:self selector:@selector(handleMinShowTimer:) userInfo:nil repeats:NO]; + [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; + self.minShowTimer = timer; return; } } From 8aba5989c81255343701aa7e0477b09214b749a4 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Thu, 23 Jul 2015 21:05:36 +0200 Subject: [PATCH 032/117] Documentation updates and spelling fixes. --- MBProgressHUD.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 022459fab..b4c95dae3 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -52,10 +52,10 @@ typedef NS_ENUM(NSInteger, MBProgressHUDMode) { typedef NS_ENUM(NSInteger, MBProgressHUDAnimation) { /// Opacity animation MBProgressHUDAnimationFade, - /// Opacity + scale animation + /// Opacity + scale animation (zoom in when appearing zoom out when disappearing) MBProgressHUDAnimationZoom, /// Opacity + scale animation (zoom out style) - MBProgressHUDAnimationZoomOut = MBProgressHUDAnimationZoom, + MBProgressHUDAnimationZoomOut, /// Opacity + scale animation (zoom in style) MBProgressHUDAnimationZoomIn }; @@ -158,7 +158,7 @@ typedef NS_ENUM(NSInteger, MBProgressHUDAnimation) { - (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay; /** - * The HUD delegate object. Recives HUD state notifications. + * The HUD delegate object. Receives HUD state notifications. */ @property (weak, nonatomic) id delegate; @@ -356,7 +356,7 @@ typedef void (^MBProgressHUDCompletionBlock)(); @property (assign, nonatomic) CGFloat xOffset __attribute__((deprecated("Set offset.x instead."))); @property (assign, nonatomic) CGFloat yOffset __attribute__((deprecated("Set offset.y instead."))); @property (assign, nonatomic) CGFloat cornerRadius __attribute__((deprecated("Set bezelView.layer.cornerRadius instead."))); -@property (assign, nonatomic) BOOL dimBackground __attribute__((deprecated("Customize HUD backgroudn properties instead."))); +@property (assign, nonatomic) BOOL dimBackground __attribute__((deprecated("Customize HUD background properties instead."))); @property (strong, nonatomic) UIColor *activityIndicatorColor __attribute__((deprecated("Use UIAppearance to customize UIActivityIndicatorView."))); @property (atomic, assign, readonly) CGSize size __attribute__((deprecated("Get the bezelView.frame.size instead."))); From 22dc7954c8757da35f0b2937278bce186308e63c Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Thu, 23 Jul 2015 21:05:52 +0200 Subject: [PATCH 033/117] Removed obsolete set needs display call. --- MBProgressHUD.m | 1 - 1 file changed, 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 7a27292b1..c18e497df 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -180,7 +180,6 @@ - (void)didMoveToSuperview { - (void)showUsingAnimation:(BOOL)animated { // Cancel any scheduled hideDelayed: calls [NSObject cancelPreviousPerformRequestsWithTarget:self]; - [self setNeedsDisplay]; MBProgressHUDAnimation animationType = self.animationType; if (animated && animationType == MBProgressHUDAnimationZoomIn) { From 1efc22a47d70047d88a8f5c7261b3cc229598076 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Thu, 23 Jul 2015 21:38:58 +0200 Subject: [PATCH 034/117] Cleaner animation handling. --- MBProgressHUD.m | 88 ++++++++++++++++++++++++++++--------------------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index c18e497df..d69e31493 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -181,56 +181,67 @@ - (void)showUsingAnimation:(BOOL)animated { // Cancel any scheduled hideDelayed: calls [NSObject cancelPreviousPerformRequestsWithTarget:self]; - MBProgressHUDAnimation animationType = self.animationType; - if (animated && animationType == MBProgressHUDAnimationZoomIn) { - self.transform = CGAffineTransformConcat(self.rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); - } else if (animated && animationType == MBProgressHUDAnimationZoomOut) { - self.transform = CGAffineTransformConcat(self.rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); - } self.showStarted = [NSDate date]; - // Fade in + self.alpha = 1.f; + if (animated) { - [UIView beginAnimations:nil context:NULL]; - [UIView setAnimationDuration:0.30]; - self.alpha = 1.0f; - if (animationType == MBProgressHUDAnimationZoomIn || animationType == MBProgressHUDAnimationZoomOut) { - self.transform = self.rotationTransform; - } - [UIView commitAnimations]; - } - else { - self.alpha = 1.0f; + [self animateIn:YES withType:self.animationType completion:NULL]; + } else { + self.bezelView.alpha = 1.0f; } } - (void)hideUsingAnimation:(BOOL)animated { - // Fade out if (animated && self.showStarted) { - [UIView beginAnimations:nil context:NULL]; - [UIView setAnimationDuration:0.30]; - [UIView setAnimationDelegate:self]; - [UIView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)]; - // 0.02 prevents the hud from passing through touches during the animation the hud will get completely hidden - // in the done method - MBProgressHUDAnimation animationType = self.animationType; - if (animationType == MBProgressHUDAnimationZoomIn) { - self.transform = CGAffineTransformConcat(self.rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); - } else if (animationType == MBProgressHUDAnimationZoomOut) { - self.transform = CGAffineTransformConcat(self.rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); - } - - self.alpha = 0.02f; - [UIView commitAnimations]; - } - else { - self.alpha = 0.0f; + [self animateIn:NO withType:self.animationType completion:^(BOOL finished) { + [self done]; + }]; + } else { + self.bezelView.alpha = 0.0f; [self done]; } self.showStarted = nil; } -- (void)animationFinished:(NSString *)animationID finished:(BOOL)finished context:(void*)context { - [self done]; +- (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type completion:(void(^)(BOOL finished))completion { + UIView *bezelView = self.bezelView; + + // Automatically determine the correct + if (type == MBProgressHUDAnimationZoom) { + type = animatingIn ? MBProgressHUDAnimationZoomIn : MBProgressHUDAnimationZoomOut; + } + + CGAffineTransform small = CGAffineTransformConcat(self.rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); + CGAffineTransform large = CGAffineTransformConcat(self.rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); + + // Set starting state + if (animatingIn && type == MBProgressHUDAnimationZoomIn) { + bezelView.transform = small; + } else if (animatingIn && type == MBProgressHUDAnimationZoomOut) { + self.transform = large; + } + + // Perform animations + dispatch_block_t animations = ^{ + if (animatingIn) { + bezelView.transform = self.rotationTransform; + } else if (!animatingIn && type == MBProgressHUDAnimationZoomIn) { + self.transform = large; + } else if (!animatingIn && type == MBProgressHUDAnimationZoomOut) { + self.transform = small; + } + bezelView.alpha = animatingIn ? 1.f : 0.f; + }; + + // Spring animations are nicer on iOS 7+ +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 + if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0) { + [UIView animateWithDuration:0.3 delay:0. usingSpringWithDamping:1.f initialSpringVelocity:0.f options:UIViewAnimationOptionBeginFromCurrentState animations:animations completion:completion]; + } else +#endif + { + [UIView animateWithDuration:0.3 delay:0. options:UIViewAnimationOptionBeginFromCurrentState animations:animations completion:completion]; + } } - (void)done { @@ -257,6 +268,7 @@ - (void)setupViews { bezelView.translatesAutoresizingMaskIntoConstraints = NO; bezelView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.8]; bezelView.layer.cornerRadius = 5.f; + bezelView.alpha = 0.f; [self addSubview:bezelView]; _bezelView = bezelView; From f487a8fa178135d8d8f959a503f9c04d2a7aa671 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Fri, 24 Jul 2015 06:58:06 +0200 Subject: [PATCH 035/117] Cleanup. --- MBProgressHUD.m | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index d69e31493..4ed0c6d5e 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -204,8 +204,6 @@ - (void)hideUsingAnimation:(BOOL)animated { } - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type completion:(void(^)(BOOL finished))completion { - UIView *bezelView = self.bezelView; - // Automatically determine the correct if (type == MBProgressHUDAnimationZoom) { type = animatingIn ? MBProgressHUDAnimationZoomIn : MBProgressHUDAnimationZoomOut; @@ -215,9 +213,10 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple CGAffineTransform large = CGAffineTransformConcat(self.rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); // Set starting state - if (animatingIn && type == MBProgressHUDAnimationZoomIn) { + UIView *bezelView = self.bezelView; + if (animatingIn && bezelView.alpha == 0.f && type == MBProgressHUDAnimationZoomIn) { bezelView.transform = small; - } else if (animatingIn && type == MBProgressHUDAnimationZoomOut) { + } else if (animatingIn && bezelView.alpha == 0.f && type == MBProgressHUDAnimationZoomOut) { self.transform = large; } @@ -230,18 +229,16 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple } else if (!animatingIn && type == MBProgressHUDAnimationZoomOut) { self.transform = small; } - bezelView.alpha = animatingIn ? 1.f : 0.f; }; - // Spring animations are nicer on iOS 7+ + // Spring animations are nicer, but only available on iOS 7+ #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0) { [UIView animateWithDuration:0.3 delay:0. usingSpringWithDamping:1.f initialSpringVelocity:0.f options:UIViewAnimationOptionBeginFromCurrentState animations:animations completion:completion]; - } else -#endif - { - [UIView animateWithDuration:0.3 delay:0. options:UIViewAnimationOptionBeginFromCurrentState animations:animations completion:completion]; + return; } +#endif + [UIView animateWithDuration:0.3 delay:0. options:UIViewAnimationOptionBeginFromCurrentState animations:animations completion:completion]; } - (void)done { From bec47eff431479646c5cc3ae8ea9ddf0ed4d57ad Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Fri, 24 Jul 2015 06:59:37 +0200 Subject: [PATCH 036/117] Re-added the alpha animation. --- MBProgressHUD.m | 1 + 1 file changed, 1 insertion(+) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 4ed0c6d5e..c2c3cd2b3 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -229,6 +229,7 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple } else if (!animatingIn && type == MBProgressHUDAnimationZoomOut) { self.transform = small; } + bezelView.alpha = animatingIn ? 1.f : 0.f; }; // Spring animations are nicer, but only available on iOS 7+ From 9d3fa3ac390ba5feeb46a6b53da52b72c89b4fb0 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Fri, 24 Jul 2015 07:04:10 +0200 Subject: [PATCH 037/117] Making sure that transforms are applied to the HUD bezel. --- MBProgressHUD.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index c2c3cd2b3..3f17ba475 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -217,7 +217,7 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple if (animatingIn && bezelView.alpha == 0.f && type == MBProgressHUDAnimationZoomIn) { bezelView.transform = small; } else if (animatingIn && bezelView.alpha == 0.f && type == MBProgressHUDAnimationZoomOut) { - self.transform = large; + bezelView.transform = large; } // Perform animations @@ -225,9 +225,9 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple if (animatingIn) { bezelView.transform = self.rotationTransform; } else if (!animatingIn && type == MBProgressHUDAnimationZoomIn) { - self.transform = large; + bezelView.transform = large; } else if (!animatingIn && type == MBProgressHUDAnimationZoomOut) { - self.transform = small; + bezelView.transform = small; } bezelView.alpha = animatingIn ? 1.f : 0.f; }; From 58eea2077c6b9a6789a65743cbd7f6c7994738e3 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Fri, 24 Jul 2015 07:18:51 +0200 Subject: [PATCH 038/117] Updated legacy window rotation code. --- MBProgressHUD.m | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 3f17ba475..2de31370e 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -28,7 +28,6 @@ @interface MBProgressHUD () @property (nonatomic, assign) BOOL useAnimation; @property (nonatomic, assign, getter=hasFinished) BOOL finished; -@property (nonatomic, assign) CGAffineTransform rotationTransform; @property (nonatomic, assign, readwrite) CGSize size; @property (nonatomic, strong) UIView *indicator; @property (nonatomic, strong) NSTimer *graceTimer; @@ -84,7 +83,6 @@ - (instancetype)initWithFrame:(CGRect)frame { _animationType = MBProgressHUDAnimationFade; _mode = MBProgressHUDModeIndeterminate; _margin = 20.0f; - _rotationTransform = CGAffineTransformIdentity; // Transparent background self.opaque = NO; @@ -209,8 +207,8 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple type = animatingIn ? MBProgressHUDAnimationZoomIn : MBProgressHUDAnimationZoomOut; } - CGAffineTransform small = CGAffineTransformConcat(self.rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); - CGAffineTransform large = CGAffineTransformConcat(self.rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); + CGAffineTransform small = CGAffineTransformMakeScale(0.5f, 0.5f); + CGAffineTransform large = CGAffineTransformMakeScale(1.5f, 1.5f); // Set starting state UIView *bezelView = self.bezelView; @@ -223,7 +221,7 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple // Perform animations dispatch_block_t animations = ^{ if (animatingIn) { - bezelView.transform = self.rotationTransform; + bezelView.transform = CGAffineTransformIdentity; } else if (!animatingIn && type == MBProgressHUDAnimationZoomIn) { bezelView.transform = large; } else if (!animatingIn && type == MBProgressHUDAnimationZoomOut) { @@ -478,37 +476,32 @@ - (void)updateForCurrentOrientationAnimated:(BOOL)animated { // Stay in sync with the superview in any case if (self.superview) { self.bounds = self.superview.bounds; - [self setNeedsDisplay]; } // Not needed on iOS 8+, compile out when the deployment target allows, // to avoid sharedApplication problems on extension targets #if __IPHONE_OS_VERSION_MIN_REQUIRED < 80000 - // Only needed pre iOS 7 when added to a window + // Only needed pre iOS 8 when added to a window BOOL iOS8OrLater = kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0; if (iOS8OrLater || ![self.superview isKindOfClass:[UIWindow class]]) return; UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; CGFloat radians = 0; if (UIInterfaceOrientationIsLandscape(orientation)) { - if (orientation == UIInterfaceOrientationLandscapeLeft) { radians = -(CGFloat)M_PI_2; } - else { radians = (CGFloat)M_PI_2; } + radians = orientation == UIInterfaceOrientationLandscapeLeft ? -(CGFloat)M_PI_2 : (CGFloat)M_PI_2; // Window coordinates differ! self.bounds = CGRectMake(0, 0, self.bounds.size.height, self.bounds.size.width); } else { - if (orientation == UIInterfaceOrientationPortraitUpsideDown) { radians = (CGFloat)M_PI; } - else { radians = 0; } - } - self.rotationTransform = CGAffineTransformMakeRotation(radians); - - if (animated) { - [UIView beginAnimations:nil context:nil]; - [UIView setAnimationDuration:0.3]; - } - [self setTransform:self.rotationTransform]; - if (animated) { - [UIView commitAnimations]; + radians = orientation == UIInterfaceOrientationPortraitUpsideDown ? (CGFloat)M_PI : 0.f; } + + if (animated) { + [UIView animateWithDuration:0.3 animations:^{ + self.transform = CGAffineTransformMakeRotation(radians); + }]; + } else { + self.transform = CGAffineTransformMakeRotation(radians); + } #endif } From 2fa693254516df7bfc11affabec894c410e525ec Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Tue, 28 Jul 2015 08:06:56 +0200 Subject: [PATCH 039/117] Formatting --- MBProgressHUD.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 2de31370e..dfdb39548 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -332,7 +332,8 @@ - (void)updateIndicators { [indicator removeFromSuperview]; indicator = self.customView; [self.bezelView addSubview:indicator]; - } else if (mode == MBProgressHUDModeText) { + } + else if (mode == MBProgressHUDModeText) { [indicator removeFromSuperview]; indicator = nil; } From 427b24d06643a401665931abab77b8f8ea163274 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Tue, 28 Jul 2015 08:18:43 +0200 Subject: [PATCH 040/117] Honoring offset. --- MBProgressHUD.m | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index dfdb39548..d0be9ae85 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -360,8 +360,9 @@ - (void)updateConstraints { [bezel removeConstraints:bezel.constraints]; // Center bezel in container (self) - [self addConstraint:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.f constant:0.f]]; - [self addConstraint:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.f constant:0.f]]; + CGPoint offset = self.offset; + [self addConstraint:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.f constant:offset.x]]; + [self addConstraint:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.f constant:offset.y]]; // Ensure minimum side margin is kept [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=margin)-[bezel]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(bezel)]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=margin)-[bezel]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(bezel)]]; From bea8cd649db92dbe26841a8b65743853937cf50e Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Tue, 28 Jul 2015 09:06:22 +0200 Subject: [PATCH 041/117] Support for minSize. --- MBProgressHUD.m | 45 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index d0be9ae85..ffb6ba142 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -34,6 +34,8 @@ @interface MBProgressHUD () @property (nonatomic, strong) NSTimer *minShowTimer; @property (nonatomic, strong) NSDate *showStarted; @property (nonatomic, strong) NSArray *paddingConstraints; +@property (nonatomic, strong) UIView *topSpacer; +@property (nonatomic, strong) UIView *bottomSpacer; // Deprecated @property (copy) MBProgressHUDCompletionBlock completionBlock; @@ -290,6 +292,18 @@ - (void)setupViews { detailsLabel.font = [UIFont boldSystemFontOfSize:MBDefaultDetailsLabelFontSize]; [bezelView addSubview:detailsLabel]; _detailsLabel = detailsLabel; + + UIView *topSpacer = [UIView new]; + topSpacer.translatesAutoresizingMaskIntoConstraints = NO; + topSpacer.hidden = YES; + [bezelView addSubview:topSpacer]; + _topSpacer = topSpacer; + + UIView *bottomSpacer = [UIView new]; + bottomSpacer.translatesAutoresizingMaskIntoConstraints = NO; + bottomSpacer.hidden = YES; + [bezelView addSubview:bottomSpacer]; + _bottomSpacer = bottomSpacer; } - (void)updateIndicators { @@ -352,8 +366,8 @@ - (void)updateConstraints { CGFloat margin = self.margin; NSDictionary *metrics = @{@"margin": @(margin)}; - NSMutableArray *subviews = [NSMutableArray arrayWithObjects:self.label, self.detailsLabel, nil]; - if (self.indicator) [subviews insertObject:self.indicator atIndex:0]; + NSMutableArray *subviews = [NSMutableArray arrayWithObjects:self.topSpacer, self.label, self.detailsLabel, self.bottomSpacer, nil]; + if (self.indicator) [subviews insertObject:self.indicator atIndex:1]; // Remove existing constraintes [self removeConstraints:self.constraints]; @@ -367,6 +381,24 @@ - (void)updateConstraints { [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=margin)-[bezel]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(bezel)]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=margin)-[bezel]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(bezel)]]; + // Extenra bezel constraints + CGSize minimumSize = self.minSize; + if (!CGSizeEqualToSize(minimumSize, CGSizeZero)) { + NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.f constant:minimumSize.width]; + width.priority = 999.f; + NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.f constant:minimumSize.height]; + height.priority = 999.f; + [bezel addConstraints:@[width, height]]; + } + + // Top and bottom spacing + UIView *topSpacer = self.topSpacer; + [topSpacer addConstraint:[NSLayoutConstraint constraintWithItem:topSpacer attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.f constant:margin]]; + UIView *bottomSpacer = self.bottomSpacer; + [bottomSpacer addConstraint:[NSLayoutConstraint constraintWithItem:bottomSpacer attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.f constant:margin]]; + // Top and bottom spaces should be equal + [bezel addConstraint:[NSLayoutConstraint constraintWithItem:topSpacer attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:bottomSpacer attribute:NSLayoutAttributeHeight multiplier:1.f constant:0.f]]; + // Layout subviews in bezel NSMutableArray *paddingConstraints = [NSMutableArray new]; [subviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) { @@ -377,10 +409,10 @@ - (void)updateConstraints { // Element spacing if (idx == 0) { // First, ensure spacing to bezel edge - [bezel addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeTop multiplier:1.f constant:margin]]; + [bezel addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeTop multiplier:1.f constant:0.f]]; } else if (idx == subviews.count - 1) { // Last, ensure spacigin to bezel edge - [bezel addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeBottom multiplier:1.f constant:-margin]]; + [bezel addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeBottom multiplier:1.f constant:0.f]]; } if (idx > 0) { // Has previous @@ -389,6 +421,7 @@ - (void)updateConstraints { [paddingConstraints addObject:padding]; } }]; + self.paddingConstraints = [paddingConstraints copy]; [self updatePaddingConstraints]; } @@ -404,8 +437,8 @@ - (void)updatePaddingConstraints { [self.paddingConstraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *padding, NSUInteger idx, BOOL *stop) { UIView *firstView = (UIView *)padding.firstItem; UIView *secondView = (UIView *)padding.secondItem; - BOOL firstVisible = !CGSizeEqualToSize(firstView.intrinsicContentSize, CGSizeZero); - BOOL secondVisible = !CGSizeEqualToSize(secondView.intrinsicContentSize, CGSizeZero); + BOOL firstVisible = !firstView.hidden && !CGSizeEqualToSize(firstView.intrinsicContentSize, CGSizeZero); + BOOL secondVisible = !secondView.hidden && !CGSizeEqualToSize(secondView.intrinsicContentSize, CGSizeZero); // Set if both views are visible of if there's a visible view on top that yet doesn't have padding // added relative to the current view padding.constant = (firstVisible && (secondVisible || hasVisibleAnchestors)) ? MBDefaultPadding : 0.f; From bfe2bd7e722ff4fefec8cbcbc53104f17bd55cc0 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Wed, 29 Jul 2015 07:20:11 +0200 Subject: [PATCH 042/117] Support for square aspect ratios. --- MBProgressHUD.m | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index ffb6ba142..271747f7f 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -381,7 +381,7 @@ - (void)updateConstraints { [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=margin)-[bezel]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(bezel)]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=margin)-[bezel]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(bezel)]]; - // Extenra bezel constraints + // Minimum bezel size, if set CGSize minimumSize = self.minSize; if (!CGSizeEqualToSize(minimumSize, CGSizeZero)) { NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.f constant:minimumSize.width]; @@ -391,6 +391,13 @@ - (void)updateConstraints { [bezel addConstraints:@[width, height]]; } + // Square aspect ratio, if set + if (self.square) { + NSLayoutConstraint *square = [NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeWidth multiplier:1.f constant:0]; + square.priority = 998.f; + [bezel addConstraint:square]; + } + // Top and bottom spacing UIView *topSpacer = self.topSpacer; [topSpacer addConstraint:[NSLayoutConstraint constraintWithItem:topSpacer attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.f constant:margin]]; From be7954445315ecc9ef348ef639d447ea84e66fac Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Wed, 29 Jul 2015 08:07:30 +0200 Subject: [PATCH 043/117] Replaced KVO with custom setters. --- MBProgressHUD.m | 68 +++++++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 271747f7f..348e96285 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -95,7 +95,6 @@ - (instancetype)initWithFrame:(CGRect)frame { [self setupViews]; [self updateIndicators]; - [self registerForKVO]; [self registerForNotifications]; } return self; @@ -108,7 +107,6 @@ - (id)initWithView:(UIView *)view { - (void)dealloc { [self unregisterFromNotifications]; - [self unregisterFromKVO]; } #pragma mark - Show & hide @@ -354,6 +352,10 @@ - (void)updateIndicators { indicator.translatesAutoresizingMaskIntoConstraints = NO; self.indicator = indicator; + if ([indicator respondsToSelector:@selector(setProgress:)]) { + [(id)indicator setValue:@(self.progress) forKey:@"progress"]; + } + [self setNeedsUpdateConstraints]; } @@ -453,42 +455,32 @@ - (void)updatePaddingConstraints { }]; } -#pragma mark - KVO - -- (void)registerForKVO { - for (NSString *keyPath in [self observableKeypaths]) { - [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:NULL]; - } -} - -- (void)unregisterFromKVO { - for (NSString *keyPath in [self observableKeypaths]) { - [self removeObserver:self forKeyPath:keyPath]; - } -} +#pragma mark - Properties -- (NSArray *)observableKeypaths { - return [NSArray arrayWithObjects:@"mode", @"customView", @"progress", @"activityIndicatorColor", nil]; +- (void)setMode:(MBProgressHUDMode)mode { + if (mode != _mode) { + _mode = mode; + [self updateIndicators]; + } } -- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { - MBMainThreadAssert(); - [self updateUIForKeypath:keyPath]; +- (void)setCustomView:(UIView *)customView { + if (customView != _customView) { + _customView = customView; + if (self.mode == MBProgressHUDModeCustomView) { + [self updateIndicators]; + } + } } -- (void)updateUIForKeypath:(NSString *)keyPath { - UIView *indicator = self.indicator; - if ([keyPath isEqualToString:@"mode"] || [keyPath isEqualToString:@"customView"] || - [keyPath isEqualToString:@"activityIndicatorColor"]) { - [self updateIndicators]; - } else if ([keyPath isEqualToString:@"progress"]) { - if ([indicator respondsToSelector:@selector(setProgress:)]) { - [(id)indicator setValue:@(self.progress) forKey:@"progress"]; - } - return; - } - [self setNeedsLayout]; - [self setNeedsDisplay]; +- (void)setProgress:(float)progress { + if (progress != _progress) { + _progress = progress; + UIView *indicator = self.indicator; + if ([indicator respondsToSelector:@selector(setProgress:)]) { + [(id)indicator setValue:@(self.progress) forKey:@"progress"]; + } + } } #pragma mark - Notifications @@ -1010,4 +1002,14 @@ - (CGSize)size { return self.bezelView.frame.size; } +- (void)setActivityIndicatorColor:(UIColor *)activityIndicatorColor { + if (activityIndicatorColor != _activityIndicatorColor) { + _activityIndicatorColor = activityIndicatorColor; + UIActivityIndicatorView *indicator = (UIActivityIndicatorView *)self.indicator; + if ([indicator isKindOfClass:[UIActivityIndicatorView class]]) { + [indicator setColor:activityIndicatorColor]; + } + } +} + @end From f55d80a7b1103989e305d26e6c1f24eef09ddf7a Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Wed, 29 Jul 2015 08:13:41 +0200 Subject: [PATCH 044/117] Custom setters for other properties with side effects. --- MBProgressHUD.m | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 348e96285..96b6cc153 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -473,6 +473,34 @@ - (void)setCustomView:(UIView *)customView { } } +- (void)setOffset:(CGPoint)offset { + if (!CGPointEqualToPoint(offset, _offset)) { + _offset = offset; + [self setNeedsUpdateConstraints]; + } +} + +- (void)setMargin:(CGFloat)margin { + if (margin != margin) { + _margin = margin; + [self setNeedsUpdateConstraints]; + } +} + +- (void)setMinSize:(CGSize)minSize { + if (!CGSizeEqualToSize(minSize, _minSize)) { + _minSize = minSize; + [self setNeedsUpdateConstraints]; + } +} + +- (void)setSquare:(BOOL)square { + if (square != _square) { + _square = square; + [self setNeedsUpdateConstraints]; + } +} + - (void)setProgress:(float)progress { if (progress != _progress) { _progress = progress; From 343653cad7e2dd9d943431f440bd508767b2181b Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Tue, 18 Aug 2015 07:51:23 +0200 Subject: [PATCH 045/117] Initial work on the hud background. --- MBProgressHUD.h | 15 ++++++++++ MBProgressHUD.m | 76 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 88 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index b4c95dae3..60a482e2d 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -60,6 +60,13 @@ typedef NS_ENUM(NSInteger, MBProgressHUDAnimation) { MBProgressHUDAnimationZoomIn }; +typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { + /// Solid color background + MBProgressHUDBackgroundStyleSolidColor, + /// UIVisualEffectView or UIToolbar.layer background view + MBProgressHUDBackgroundStyleBlur +}; + /** * Displays a simple HUD window containing a progress indicator and two optional labels for short messages. @@ -321,6 +328,14 @@ typedef NS_ENUM(NSInteger, MBProgressHUDAnimation) { @interface MBBackgroundView : UIView +/** + * The background style. + * Defaults to MBProgressHUDBackgroundStyleBlur on iOS 7 or later and MBProgressHUDBackgroundStyleSolidColor otherwise. + */ +@property (nonatomic) MBProgressHUDBackgroundStyle style; + +@property (nonatomic, strong) UIColor *color; + @end @interface MBProgressHUD (Deprecated) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 96b6cc153..19f1b9629 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -92,6 +92,7 @@ - (instancetype)initWithFrame:(CGRect)frame { // Make it invisible for now self.alpha = 0.0f; self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + self.layer.allowsGroupOpacity = NO; [self setupViews]; [self updateIndicators]; @@ -260,9 +261,10 @@ - (void)done { #pragma mark - UI - (void)setupViews { + UIColor *defaultColor = [UIColor colorWithRed:0.394f green:0.441f blue:0.491f alpha:1.f]; + MBBackgroundView *bezelView = [MBBackgroundView new]; bezelView.translatesAutoresizingMaskIntoConstraints = NO; - bezelView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.8]; bezelView.layer.cornerRadius = 5.f; bezelView.alpha = 0.f; [self addSubview:bezelView]; @@ -274,7 +276,7 @@ - (void)setupViews { label.textAlignment = NSTextAlignmentCenter; label.opaque = NO; label.backgroundColor = [UIColor clearColor]; - label.textColor = [UIColor whiteColor]; + label.textColor = defaultColor; label.font = [UIFont boldSystemFontOfSize:MBDefaultLabelFontSize];; [bezelView addSubview:label]; _label = label; @@ -285,7 +287,7 @@ - (void)setupViews { detailsLabel.textAlignment = NSTextAlignmentCenter; detailsLabel.opaque = NO; detailsLabel.backgroundColor = [UIColor clearColor]; - detailsLabel.textColor = [UIColor whiteColor]; + detailsLabel.textColor = defaultColor; detailsLabel.numberOfLines = 0; detailsLabel.font = [UIFont boldSystemFontOfSize:MBDefaultDetailsLabelFontSize]; [bezelView addSubview:detailsLabel]; @@ -315,6 +317,7 @@ - (void)updateIndicators { // Update to indeterminate indicator [indicator removeFromSuperview]; indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; + [(UIActivityIndicatorView *)indicator setColor:[UIColor colorWithRed:0.394f green:0.441f blue:0.491f alpha:1.f]]; [(UIActivityIndicatorView *)indicator startAnimating]; [self.bezelView addSubview:indicator]; } @@ -820,8 +823,75 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N @end +@interface MBBackgroundView () + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 +@property UIVisualEffectView *effectView; +#endif +@property UIToolbar *toolbar; + +@end + + @implementation MBBackgroundView +#pragma mark - Lifecycle + +- (instancetype)initWithFrame:(CGRect)frame { + if ((self = [super initWithFrame:frame])) { + BOOL modernStyleSupported = kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0; + _style = modernStyleSupported ? MBProgressHUDBackgroundStyleBlur : MBProgressHUDBackgroundStyleSolidColor; + _color = modernStyleSupported ? nil : [[UIColor blackColor] colorWithAlphaComponent:0.8]; + + self.clipsToBounds = YES; + + [self updateForBackgroundStyle]; + } + return self; +} + +- (void)setStyle:(MBProgressHUDBackgroundStyle)style { + if (style == MBProgressHUDBackgroundStyleBlur && kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0) { + style = MBProgressHUDBackgroundStyleSolidColor; + } + if (_style != style) { + _style = style; + [self updateForBackgroundStyle]; + } +} + +- (void)updateForBackgroundStyle { + MBProgressHUDBackgroundStyle style = self.style; + if (style == MBProgressHUDBackgroundStyleBlur) { +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 + UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; + UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect]; + [self addSubview:effectView]; + effectView.frame = self.bounds; + effectView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; + self.backgroundColor = [UIColor colorWithWhite:0.8f alpha:0.6f]; + self.layer.allowsGroupOpacity = NO; + self.effectView = effectView; +#else + UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectInset(self.bounds, -100.f, -100.f)]; + toolbar.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; + toolbar.barTintColor = self.color; + toolbar.translucent = YES; + toolbar.barTintColor = [UIColor colorWithWhite:0.95f alpha:0.6f]; + [self addSubview:toolbar]; + self.toolbar = toolbar; +#endif + } else { +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 + [self.effectView removeFromSuperview]; + self.effectView = nil; +#else + [self.toolbar removeFromSuperview]; + self.toolbar = nil; +#endif + } +} + @end From e208675d59c73425c3a2f5abd19c8ae5b955872a Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 13 Sep 2015 09:22:15 +0200 Subject: [PATCH 046/117] Initial background color support. --- MBProgressHUD.h | 5 +++++ MBProgressHUD.m | 44 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 60a482e2d..4a0595a37 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -331,9 +331,14 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { /** * The background style. * Defaults to MBProgressHUDBackgroundStyleBlur on iOS 7 or later and MBProgressHUDBackgroundStyleSolidColor otherwise. + * @note Due to iOS 7 not supporting UIVisualEffectView the blur effect differs slightly between iOS 7 and later versions. */ @property (nonatomic) MBProgressHUDBackgroundStyle style; +/** + * The background color or the blur tint color. + * @note Due to iOS 7 not supporting UIVisualEffectView the blur effect differs slightly between iOS 7 and later versions. + */ @property (nonatomic, strong) UIColor *color; @end diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 19f1b9629..667325743 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -839,9 +839,17 @@ @implementation MBBackgroundView - (instancetype)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { - BOOL modernStyleSupported = kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0; - _style = modernStyleSupported ? MBProgressHUDBackgroundStyleBlur : MBProgressHUDBackgroundStyleSolidColor; - _color = modernStyleSupported ? nil : [[UIColor blackColor] colorWithAlphaComponent:0.8]; + if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0) { + _style = MBProgressHUDBackgroundStyleBlur; +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 + _color = [UIColor colorWithWhite:0.8f alpha:0.6f]; +#else + _color = [UIColor colorWithWhite:0.95f alpha:0.6f]; +#endif + } else { + _style = MBProgressHUDBackgroundStyleSolidColor; + _color = [[UIColor blackColor] colorWithAlphaComponent:0.8]; + } self.clipsToBounds = YES; @@ -850,6 +858,9 @@ - (instancetype)initWithFrame:(CGRect)frame { return self; } +/////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - Appearance + - (void)setStyle:(MBProgressHUDBackgroundStyle)style { if (style == MBProgressHUDBackgroundStyleBlur && kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0) { style = MBProgressHUDBackgroundStyleSolidColor; @@ -860,6 +871,16 @@ - (void)setStyle:(MBProgressHUDBackgroundStyle)style { } } +- (void)setColor:(UIColor *)color { + if (color != _color && ![color isEqual:_color]) { + _color = color; + [self updateViewsForColor:color]; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - Views + - (void)updateForBackgroundStyle { MBProgressHUDBackgroundStyle style = self.style; if (style == MBProgressHUDBackgroundStyleBlur) { @@ -869,7 +890,7 @@ - (void)updateForBackgroundStyle { [self addSubview:effectView]; effectView.frame = self.bounds; effectView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; - self.backgroundColor = [UIColor colorWithWhite:0.8f alpha:0.6f]; + self.backgroundColor = self.color; self.layer.allowsGroupOpacity = NO; self.effectView = effectView; #else @@ -877,7 +898,7 @@ - (void)updateForBackgroundStyle { toolbar.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; toolbar.barTintColor = self.color; toolbar.translucent = YES; - toolbar.barTintColor = [UIColor colorWithWhite:0.95f alpha:0.6f]; + toolbar.barTintColor = color; [self addSubview:toolbar]; self.toolbar = toolbar; #endif @@ -889,6 +910,19 @@ - (void)updateForBackgroundStyle { [self.toolbar removeFromSuperview]; self.toolbar = nil; #endif + self.backgroundColor = self.color; + } +} + +- (void)updateViewsForColor:(UIColor *)color { + if (self.style == MBProgressHUDBackgroundStyleBlur) { +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 + self.backgroundColor = self.color; +#else + self.toolbar.barTintColor = color; +#endif + } else { + self.backgroundColor = self.color; } } From a440364a9dbcff3fd9c047cbeaf478a1d36e0b79 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 13 Sep 2015 09:32:25 +0200 Subject: [PATCH 047/117] Reorganized the header and added sections. --- MBProgressHUD.h | 80 +++++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 36 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 4a0595a37..dddb652d5 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -95,6 +95,8 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { */ + (instancetype)showHUDAddedTo:(UIView *)view animated:(BOOL)animated; +/// @name Showing and hiding + /** * Finds the top-most HUD subview and hides it. The counterpart to this method is showHUDAddedTo:animated:. * @@ -169,37 +171,39 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { */ @property (weak, nonatomic) id delegate; -/** - * MBProgressHUD operation mode. The default is MBProgressHUDModeIndeterminate. +/* + * Grace period is the time (in seconds) that the invoked method may be run without + * showing the HUD. If the task finishes before the grace time runs out, the HUD will + * not be shown at all. + * This may be used to prevent HUD display for very short tasks. + * Defaults to 0 (no grace time). */ -@property (assign, nonatomic) MBProgressHUDMode mode; +@property (assign, nonatomic) NSTimeInterval graceTime; /** - * The animation type that should be used when the HUD is shown and hidden. + * The minimum time (in seconds) that the HUD is shown. + * This avoids the problem of the HUD being shown and than instantly hidden. + * Defaults to 0 (no minimum show time). */ -@property (assign, nonatomic) MBProgressHUDAnimation animationType; +@property (assign, nonatomic) NSTimeInterval minShowTime; /** - * The view containing the labels and indicator (or customView). + * Removes the HUD from its parent view when hidden. + * Defaults to NO. */ -@property (strong, nonatomic, readonly) MBBackgroundView *bezelView; +@property (assign, nonatomic) BOOL removeFromSuperViewOnHide; -/** - * The UIView (e.g., a UIImageView) to be shown when the HUD is in MBProgressHUDModeCustomView. - * The view should implement intrinsicContentSize for proper sizing. For best results use approximately 37 by 37 pixel. - */ -@property (strong, nonatomic) UIView *customView; +/// @name Appearance -/** - * A label that holds an optional short message to be displayed below the activity indicator. The HUD is automatically resized to fit - * the entire text. +/** + * MBProgressHUD operation mode. The default is MBProgressHUDModeIndeterminate. */ -@property (strong, nonatomic, readonly) UILabel *label; +@property (assign, nonatomic) MBProgressHUDMode mode; /** - * A label that holds an optional details message displayed below the labelText message. The details text can span multiple lines. + * The animation type that should be used when the HUD is shown and hidden. */ -@property (strong, nonatomic, readonly) UILabel *detailsLabel; +@property (assign, nonatomic) MBProgressHUDAnimation animationType; /** * The bezel offset relative to the centre of the view. @@ -207,7 +211,7 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { @property (assign, nonatomic) CGPoint offset; /** - * The amount of space between the HUD edge and the HUD elements (labels, indicators or custom views). + * The amount of space between the HUD edge and the HUD elements (labels, indicators or custom views). * This also represents the minimum bezel distance to the edge of the HUD view. * Defaults to 20.f */ @@ -223,32 +227,36 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { */ @property (assign, nonatomic, getter = isSquare) BOOL square; -/* - * Grace period is the time (in seconds) that the invoked method may be run without - * showing the HUD. If the task finishes before the grace time runs out, the HUD will - * not be shown at all. - * This may be used to prevent HUD display for very short tasks. - * Defaults to 0 (no grace time). +/// @name Progress + +/** + * The progress of the progress indicator, from 0.0 to 1.0. Defaults to 0.0. */ -@property (assign, nonatomic) NSTimeInterval graceTime; +@property (assign, nonatomic) float progress; + +/// @name Views /** - * The minimum time (in seconds) that the HUD is shown. - * This avoids the problem of the HUD being shown and than instantly hidden. - * Defaults to 0 (no minimum show time). + * The view containing the labels and indicator (or customView). */ -@property (assign, nonatomic) NSTimeInterval minShowTime; +@property (strong, nonatomic, readonly) MBBackgroundView *bezelView; /** - * Removes the HUD from its parent view when hidden. - * Defaults to NO. + * The UIView (e.g., a UIImageView) to be shown when the HUD is in MBProgressHUDModeCustomView. + * The view should implement intrinsicContentSize for proper sizing. For best results use approximately 37 by 37 pixel. */ -@property (assign, nonatomic) BOOL removeFromSuperViewOnHide; +@property (strong, nonatomic) UIView *customView; -/** - * The progress of the progress indicator, from 0.0 to 1.0. Defaults to 0.0. +/** + * A label that holds an optional short message to be displayed below the activity indicator. The HUD is automatically resized to fit + * the entire text. */ -@property (assign, nonatomic) float progress; +@property (strong, nonatomic, readonly) UILabel *label; + +/** + * A label that holds an optional details message displayed below the labelText message. The details text can span multiple lines. + */ +@property (strong, nonatomic, readonly) UILabel *detailsLabel; @end From 4bf4207e14419f3ed9421e108340eb6bd399cba1 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 13 Sep 2015 09:35:22 +0200 Subject: [PATCH 048/117] Bumped demo deployment target to silence warnings. --- Demo/HudDemo.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index 40f80e088..677e91314 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -344,7 +344,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = HudDemo_Prefix.pch; INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = HudDemo; TARGETED_DEVICE_FAMILY = "1,2"; @@ -360,7 +360,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = HudDemo_Prefix.pch; INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = HudDemo; SDKROOT = iphoneos; From 40084a69cd96c4b845c7fddf42df9eea2ab78579 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 13 Sep 2015 10:21:13 +0200 Subject: [PATCH 049/117] Color support. --- MBProgressHUD.h | 17 +++++++++++------ MBProgressHUD.m | 50 +++++++++++++++++++++++++++++++++++++------------ 2 files changed, 49 insertions(+), 18 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index dddb652d5..94213cd27 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -200,32 +200,38 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { */ @property (assign, nonatomic) MBProgressHUDMode mode; +/** + * A color that gets forwarded to all labels and supported indicators. Set to nil to manage color individually. + * Defaults to semi-translucent black on iOS 7 and later and white on earlier iOS versions. + */ +@property (strong, nonatomic) UIColor *color; + /** * The animation type that should be used when the HUD is shown and hidden. */ -@property (assign, nonatomic) MBProgressHUDAnimation animationType; +@property (assign, nonatomic) MBProgressHUDAnimation animationType UI_APPEARANCE_SELECTOR; /** * The bezel offset relative to the centre of the view. */ -@property (assign, nonatomic) CGPoint offset; +@property (assign, nonatomic) CGPoint offset UI_APPEARANCE_SELECTOR; /** * The amount of space between the HUD edge and the HUD elements (labels, indicators or custom views). * This also represents the minimum bezel distance to the edge of the HUD view. * Defaults to 20.f */ -@property (assign, nonatomic) CGFloat margin; +@property (assign, nonatomic) CGFloat margin UI_APPEARANCE_SELECTOR; /** * The minimum size of the HUD bezel. Defaults to CGSizeZero (no minimum size). */ -@property (assign, nonatomic) CGSize minSize; +@property (assign, nonatomic) CGSize minSize UI_APPEARANCE_SELECTOR; /** * Force the HUD dimensions to be equal if possible. */ -@property (assign, nonatomic, getter = isSquare) BOOL square; +@property (assign, nonatomic, getter = isSquare) BOOL square UI_APPEARANCE_SELECTOR; /// @name Progress @@ -380,7 +386,6 @@ typedef void (^MBProgressHUDCompletionBlock)(); @property (nonatomic, strong) UIFont *detailsLabelFont __attribute__((deprecated("Use detailsLabel.font instead."))); @property (nonatomic, strong) UIColor *detailsLabelColor __attribute__((deprecated("Use detailsLabel.textColor instead."))); @property (assign, nonatomic) CGFloat opacity __attribute__((deprecated("Customize bezelView properties instead."))); -@property (strong, nonatomic) UIColor *color __attribute__((deprecated("Customize bezelView properties instead."))); @property (assign, nonatomic) CGFloat xOffset __attribute__((deprecated("Set offset.x instead."))); @property (assign, nonatomic) CGFloat yOffset __attribute__((deprecated("Set offset.y instead."))); @property (assign, nonatomic) CGFloat cornerRadius __attribute__((deprecated("Set bezelView.layer.cornerRadius instead."))); diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 667325743..0b12c0494 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -86,6 +86,9 @@ - (instancetype)initWithFrame:(CGRect)frame { _mode = MBProgressHUDModeIndeterminate; _margin = 20.0f; + // Default color, depending on the current iOS version + BOOL isLegacy = kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0; + _color = isLegacy ? [UIColor whiteColor] : [UIColor colorWithWhite:0.f alpha:0.7f]; // Transparent background self.opaque = NO; self.backgroundColor = [UIColor clearColor]; @@ -261,7 +264,7 @@ - (void)done { #pragma mark - UI - (void)setupViews { - UIColor *defaultColor = [UIColor colorWithRed:0.394f green:0.441f blue:0.491f alpha:1.f]; + UIColor *defaultColor = self.color; MBBackgroundView *bezelView = [MBBackgroundView new]; bezelView.translatesAutoresizingMaskIntoConstraints = NO; @@ -307,6 +310,7 @@ - (void)setupViews { } - (void)updateIndicators { + UIColor *defaultColor = self.color; UIView *indicator = self.indicator; BOOL isActivityIndicator = [indicator isKindOfClass:[UIActivityIndicatorView class]]; BOOL isRoundIndicator = [indicator isKindOfClass:[MBRoundProgressView class]]; @@ -317,25 +321,21 @@ - (void)updateIndicators { // Update to indeterminate indicator [indicator removeFromSuperview]; indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; - [(UIActivityIndicatorView *)indicator setColor:[UIColor colorWithRed:0.394f green:0.441f blue:0.491f alpha:1.f]]; [(UIActivityIndicatorView *)indicator startAnimating]; [self.bezelView addSubview:indicator]; } - if (self.activityIndicatorColor) { - [(UIActivityIndicatorView *)indicator setColor:self.activityIndicatorColor]; - } } else if (mode == MBProgressHUDModeDeterminateHorizontalBar) { // Update to bar determinate indicator [indicator removeFromSuperview]; - indicator = [[MBBarProgressView alloc] init]; + indicator = [[MBBarProgressView alloc] init]; [self.bezelView addSubview:indicator]; } else if (mode == MBProgressHUDModeDeterminate || mode == MBProgressHUDModeAnnularDeterminate) { if (!isRoundIndicator) { // Update to determinante indicator [indicator removeFromSuperview]; - indicator = [[MBRoundProgressView alloc] init]; + indicator = [[MBRoundProgressView alloc] init]; [self.bezelView addSubview:indicator]; } if (mode == MBProgressHUDModeAnnularDeterminate) { @@ -359,9 +359,33 @@ - (void)updateIndicators { [(id)indicator setValue:@(self.progress) forKey:@"progress"]; } + [self updateViewsForColor:self.color]; [self setNeedsUpdateConstraints]; } +- (void)updateViewsForColor:(UIColor *)color { + if (!color) return; + + self.label.textColor = color; + self.detailsLabel.textColor = color; + + // Deprecated + if (self.activityIndicatorColor) { + color = self.activityIndicatorColor; + } + + UIView *indicator = self.indicator; + if ([indicator isKindOfClass:[UIActivityIndicatorView class]]) { + ((UIActivityIndicatorView *)indicator).color = color; + } else if ([indicator isKindOfClass:[MBRoundProgressView class]]) { + ((MBRoundProgressView *)indicator).progressTintColor = color; + ((MBRoundProgressView *)indicator).backgroundTintColor = [color colorWithAlphaComponent:0.1]; + } else if ([indicator isKindOfClass:[MBBarProgressView class]]) { + ((MBBarProgressView *)indicator).progressColor = color; + ((MBBarProgressView *)indicator).lineColor = color; + } +} + #pragma mark - Layout - (void)updateConstraints { @@ -514,6 +538,13 @@ - (void)setProgress:(float)progress { } } +- (void)setColor:(UIColor *)color { + if (color != _color && ![color isEqual:_color]) { + _color = color; + [self updateViewsForColor:color]; + } +} + #pragma mark - Notifications - (void)registerForNotifications { @@ -1083,11 +1114,6 @@ - (void)setOpacity:(CGFloat)opacity { // TODO: forward when appropriate } -- (UIColor *)color { - // TODO: forward when appropriate - return nil; -} - - (void)setColor:(UIColor *)color { MBMainThreadAssert(); // TODO: forward when appropriate From c2989e253016b9058edf8e2178b3a0e4d482ee43 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 13 Sep 2015 10:32:18 +0200 Subject: [PATCH 050/117] Removed unused local var. --- MBProgressHUD.m | 1 - 1 file changed, 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 0b12c0494..68c13b2ce 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -310,7 +310,6 @@ - (void)setupViews { } - (void)updateIndicators { - UIColor *defaultColor = self.color; UIView *indicator = self.indicator; BOOL isActivityIndicator = [indicator isKindOfClass:[UIActivityIndicatorView class]]; BOOL isRoundIndicator = [indicator isKindOfClass:[MBRoundProgressView class]]; From 184bf5e9fbd37fab0ee4547389965f5e08716faf Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 13 Sep 2015 10:41:35 +0200 Subject: [PATCH 051/117] Removed the last remains of KVO. --- MBProgressHUD.m | 102 +++++++++++++++++++++++------------------------- 1 file changed, 48 insertions(+), 54 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 68c13b2ce..bfb53e40a 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -620,21 +620,39 @@ - (id)initWithFrame:(CGRect)frame { _annular = NO; _progressTintColor = [[UIColor alloc] initWithWhite:1.f alpha:1.f]; _backgroundTintColor = [[UIColor alloc] initWithWhite:1.f alpha:.1f]; - [self registerForKVO]; } return self; } -- (void)dealloc { - [self unregisterFromKVO]; -} - #pragma mark - Layout - (CGSize)intrinsicContentSize { return CGSizeMake(37.f, 37.f); } +#pragma mark - Properties + +- (void)setProgress:(float)progress { + if (progress != _progress) { + _progress = progress; + [self setNeedsDisplay]; + } +} + +- (void)setProgressTintColor:(UIColor *)progressTintColor { + if (progressTintColor != _progressTintColor && ![progressTintColor isEqual:_progressTintColor]) { + _progressTintColor = progressTintColor; + [self setNeedsDisplay]; + } +} + +- (void)setBackgroundTintColor:(UIColor *)backgroundTintColor { + if (backgroundTintColor != _backgroundTintColor && ![backgroundTintColor isEqual:_backgroundTintColor]) { + _backgroundTintColor = backgroundTintColor; + [self setNeedsDisplay]; + } +} + #pragma mark - Drawing - (void)drawRect:(CGRect)rect { @@ -685,28 +703,6 @@ - (void)drawRect:(CGRect)rect { } } -#pragma mark - KVO - -- (void)registerForKVO { - for (NSString *keyPath in [self observableKeypaths]) { - [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:NULL]; - } -} - -- (void)unregisterFromKVO { - for (NSString *keyPath in [self observableKeypaths]) { - [self removeObserver:self forKeyPath:keyPath]; - } -} - -- (NSArray *)observableKeypaths { - return [NSArray arrayWithObjects:@"progressTintColor", @"backgroundTintColor", @"progress", @"annular", nil]; -} - -- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { - [self setNeedsDisplay]; -} - @end @@ -727,21 +723,41 @@ - (id)initWithFrame:(CGRect)frame { _progressRemainingColor = [UIColor clearColor]; self.backgroundColor = [UIColor clearColor]; self.opaque = NO; - [self registerForKVO]; } return self; } -- (void)dealloc { - [self unregisterFromKVO]; -} - #pragma mark - Layout - (CGSize)intrinsicContentSize { return CGSizeMake(120.f, 20.f); } +#pragma mark - Properties + +// @"lineColor", @"progressRemainingColor", @"progressColor", @"progress" + +- (void)setProgress:(float)progress { + if (progress != _progress) { + _progress = progress; + [self setNeedsDisplay]; + } +} + +- (void)setProgressColor:(UIColor *)progressColor { + if (progressColor != _progressColor && ![progressColor isEqual:_progressColor]) { + _progressColor = progressColor; + [self setNeedsDisplay]; + } +} + +- (void)setProgressRemainingColor:(UIColor *)progressRemainingColor { + if (progressRemainingColor != _progressRemainingColor && ![progressRemainingColor isEqual:_progressRemainingColor]) { + _progressRemainingColor = progressRemainingColor; + [self setNeedsDisplay]; + } +} + #pragma mark - Drawing - (void)drawRect:(CGRect)rect { @@ -828,28 +844,6 @@ - (void)drawRect:(CGRect)rect { } } -#pragma mark - KVO - -- (void)registerForKVO { - for (NSString *keyPath in [self observableKeypaths]) { - [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:NULL]; - } -} - -- (void)unregisterFromKVO { - for (NSString *keyPath in [self observableKeypaths]) { - [self removeObserver:self forKeyPath:keyPath]; - } -} - -- (NSArray *)observableKeypaths { - return [NSArray arrayWithObjects:@"lineColor", @"progressRemainingColor", @"progressColor", @"progress", nil]; -} - -- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { - [self setNeedsDisplay]; -} - @end From b039d5dd86af11777305d5e3e0dfa62edfd6660a Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 13 Sep 2015 10:42:03 +0200 Subject: [PATCH 052/117] Removed comment. --- MBProgressHUD.m | 2 -- 1 file changed, 2 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index bfb53e40a..95bd9337a 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -735,8 +735,6 @@ - (CGSize)intrinsicContentSize { #pragma mark - Properties -// @"lineColor", @"progressRemainingColor", @"progressColor", @"progress" - - (void)setProgress:(float)progress { if (progress != _progress) { _progress = progress; From 5094d45f8c60efb0fd048b720fef613dd104aff1 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 13 Sep 2015 11:24:35 +0200 Subject: [PATCH 053/117] Refreshed the determinate mode for iOS 7+. --- MBProgressHUD.m | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 95bd9337a..650853faf 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -656,19 +656,16 @@ - (void)setBackgroundTintColor:(UIColor *)backgroundTintColor { #pragma mark - Drawing - (void)drawRect:(CGRect)rect { - - CGRect allRect = self.bounds; - CGRect circleRect = CGRectInset(allRect, 2.0f, 2.0f); CGContextRef context = UIGraphicsGetCurrentContext(); - + BOOL isPreiOS7 = kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0; + if (_annular) { // Draw background - BOOL isPreiOS7 = kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0; CGFloat lineWidth = isPreiOS7 ? 5.f : 2.f; UIBezierPath *processBackgroundPath = [UIBezierPath bezierPath]; processBackgroundPath.lineWidth = lineWidth; processBackgroundPath.lineCapStyle = kCGLineCapButt; - CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2); + CGPoint center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); CGFloat radius = (self.bounds.size.width - lineWidth)/2; CGFloat startAngle = - ((float)M_PI / 2); // 90 degrees CGFloat endAngle = (2 * (float)M_PI) + startAngle; @@ -685,21 +682,36 @@ - (void)drawRect:(CGRect)rect { [processPath stroke]; } else { // Draw background + CGFloat lineWidth = 2.f; + CGRect allRect = self.bounds; + CGRect circleRect = CGRectInset(allRect, lineWidth/2.f, lineWidth/2.f); [_progressTintColor setStroke]; [_backgroundTintColor setFill]; - CGContextSetLineWidth(context, 2.0f); + CGContextSetLineWidth(context, lineWidth); CGContextFillEllipseInRect(context, circleRect); CGContextStrokeEllipseInRect(context, circleRect); - // Draw progress - CGPoint center = CGPointMake(allRect.size.width / 2, allRect.size.height / 2); - CGFloat radius = (allRect.size.width - 4) / 2; - CGFloat startAngle = - ((float)M_PI / 2); // 90 degrees - CGFloat endAngle = (self.progress * 2 * (float)M_PI) + startAngle; - [_progressTintColor setFill]; - CGContextMoveToPoint(context, center.x, center.y); - CGContextAddArc(context, center.x, center.y, radius, startAngle, endAngle, 0); - CGContextClosePath(context); - CGContextFillPath(context); + CGPoint center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); + // 90 degrees + CGFloat startAngle = - ((float)M_PI / 2.f); + // Draw progress + if (isPreiOS7) { + CGFloat radius = (CGRectGetWidth(self.bounds) / 2.f) - lineWidth; + CGFloat endAngle = (self.progress * 2.f * (float)M_PI) + startAngle; + [_progressTintColor setFill]; + CGContextMoveToPoint(context, center.x, center.y); + CGContextAddArc(context, center.x, center.y, radius, startAngle, endAngle, 0); + CGContextClosePath(context); + CGContextFillPath(context); + } else { + UIBezierPath *processPath = [UIBezierPath bezierPath]; + processPath.lineCapStyle = kCGLineCapButt; + processPath.lineWidth = lineWidth * 2.f; + CGFloat radius = (CGRectGetWidth(self.bounds) / 2.f) - (processPath.lineWidth / 2.f) - lineWidth; + CGFloat endAngle = (self.progress * 2.f * (float)M_PI) + startAngle; + [processPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; + [_progressTintColor set]; + [processPath stroke]; + } } } From eb5b08346bbd2a03ac3894cb36d43b800fa70ffc Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 13 Sep 2015 11:27:28 +0200 Subject: [PATCH 054/117] Refreshed the bar mode for iOS 7+. --- MBProgressHUD.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 650853faf..ef7fad01a 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -742,7 +742,8 @@ - (id)initWithFrame:(CGRect)frame { #pragma mark - Layout - (CGSize)intrinsicContentSize { - return CGSizeMake(120.f, 20.f); + BOOL isPreiOS7 = kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0; + return CGSizeMake(120.f, isPreiOS7 ? 20.f : 10.f); } #pragma mark - Properties From 8cd77c6565c817a9191d1bf39f64e6852cc043fd Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 13 Sep 2015 11:33:23 +0200 Subject: [PATCH 055/117] Don't set the fill color on iOS 7+. --- MBProgressHUD.h | 3 ++- MBProgressHUD.m | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 94213cd27..c5b62488e 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -296,7 +296,8 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { @property (nonatomic, strong) UIColor *progressTintColor; /** - * Indicator background (non-progress) color. + * Indicator background (non-progress) color. + * Only applicable on iOS version older than iOS 7. * Defaults to translucent white (alpha 0.1) */ @property (nonatomic, strong) UIColor *backgroundTintColor; diff --git a/MBProgressHUD.m b/MBProgressHUD.m index ef7fad01a..625e27c9d 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -685,12 +685,14 @@ - (void)drawRect:(CGRect)rect { CGFloat lineWidth = 2.f; CGRect allRect = self.bounds; CGRect circleRect = CGRectInset(allRect, lineWidth/2.f, lineWidth/2.f); + CGPoint center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); [_progressTintColor setStroke]; [_backgroundTintColor setFill]; CGContextSetLineWidth(context, lineWidth); - CGContextFillEllipseInRect(context, circleRect); + if (isPreiOS7) { + CGContextFillEllipseInRect(context, circleRect); + } CGContextStrokeEllipseInRect(context, circleRect); - CGPoint center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); // 90 degrees CGFloat startAngle = - ((float)M_PI / 2.f); // Draw progress From 0690b7fdf4bbb7137857ccab795974c9727f4cb1 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 13 Sep 2015 11:38:35 +0200 Subject: [PATCH 056/117] Made the color an appearance selector. --- MBProgressHUD.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index c5b62488e..4a61c1ee2 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -204,7 +204,7 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { * A color that gets forwarded to all labels and supported indicators. Set to nil to manage color individually. * Defaults to semi-translucent black on iOS 7 and later and white on earlier iOS versions. */ -@property (strong, nonatomic) UIColor *color; +@property (strong, nonatomic) UIColor *color UI_APPEARANCE_SELECTOR; /** * The animation type that should be used when the HUD is shown and hidden. From 85d6948184a6048b39d0056e82cd62a5e8f98651 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 13 Sep 2015 11:39:51 +0200 Subject: [PATCH 057/117] Setting the tint color for custom views on iOS 7+. --- MBProgressHUD.h | 3 ++- MBProgressHUD.m | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 4a61c1ee2..34206b937 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -201,7 +201,8 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { @property (assign, nonatomic) MBProgressHUDMode mode; /** - * A color that gets forwarded to all labels and supported indicators. Set to nil to manage color individually. + * A color that gets forwarded to all labels and supported indicators. Also sets the tintColor + * for custom views on iOS 7+. Set to nil to manage color individually. * Defaults to semi-translucent black on iOS 7 and later and white on earlier iOS versions. */ @property (strong, nonatomic) UIColor *color UI_APPEARANCE_SELECTOR; diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 625e27c9d..81d391f22 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -382,6 +382,12 @@ - (void)updateViewsForColor:(UIColor *)color { } else if ([indicator isKindOfClass:[MBBarProgressView class]]) { ((MBBarProgressView *)indicator).progressColor = color; ((MBBarProgressView *)indicator).lineColor = color; + } else { +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 + if ([indicator respondsToSelector:@selector(setTintColor:)]) { + [indicator setTintColor:color]; + } +#endif } } From 0647d468896752462df11ddff15996d8aec7ee91 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 13 Sep 2015 12:02:44 +0200 Subject: [PATCH 058/117] Custom background view support and dimming compatibility. --- MBProgressHUD.h | 5 +++++ MBProgressHUD.m | 23 ++++++++++++++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 34206b937..f6eac38e3 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -248,6 +248,11 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { */ @property (strong, nonatomic, readonly) MBBackgroundView *bezelView; +/** + * + */ +@property (strong, nonatomic, readonly) MBBackgroundView *backgroundView; + /** * The UIView (e.g., a UIImageView) to be shown when the HUD is in MBProgressHUDModeCustomView. * The view should implement intrinsicContentSize for proper sizing. For best results use approximately 37 by 37 pixel. diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 81d391f22..77cd21117 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -189,7 +189,8 @@ - (void)showUsingAnimation:(BOOL)animated { if (animated) { [self animateIn:YES withType:self.animationType completion:NULL]; } else { - self.bezelView.alpha = 1.0f; + self.bezelView.alpha = 1.f; + self.backgroundView.alpha = 1.f; } } @@ -199,7 +200,8 @@ - (void)hideUsingAnimation:(BOOL)animated { [self done]; }]; } else { - self.bezelView.alpha = 0.0f; + self.bezelView.alpha = 0.f; + self.backgroundView.alpha = 1.f; [self done]; } self.showStarted = nil; @@ -232,6 +234,7 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple bezelView.transform = small; } bezelView.alpha = animatingIn ? 1.f : 0.f; + self.backgroundView.alpha = animatingIn ? 1.f : 0.f; }; // Spring animations are nicer, but only available on iOS 7+ @@ -266,6 +269,14 @@ - (void)done { - (void)setupViews { UIColor *defaultColor = self.color; + MBBackgroundView *backgroundView = [[MBBackgroundView alloc] initWithFrame:self.bounds]; + backgroundView.style = MBProgressHUDBackgroundStyleSolidColor; + backgroundView.backgroundColor = [UIColor clearColor]; + backgroundView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + backgroundView.alpha = 0.f; + [self addSubview:backgroundView]; + _backgroundView = backgroundView; + MBBackgroundView *bezelView = [MBBackgroundView new]; bezelView.translatesAutoresizingMaskIntoConstraints = NO; bezelView.layer.cornerRadius = 5.f; @@ -1159,13 +1170,15 @@ - (void)setCornerRadius:(CGFloat)cornerRadius { } - (BOOL)dimBackground { - // TODO: forward when appropriate - return NO; + MBBackgroundView *backgroundView = self.backgroundView; + UIColor *dimmedColor = [UIColor colorWithWhite:0.f alpha:.2f]; + return backgroundView.style == MBProgressHUDBackgroundStyleSolidColor && [backgroundView.color isEqual:dimmedColor]; } - (void)setDimBackground:(BOOL)dimBackground { MBMainThreadAssert(); - // TODO: forward when appropriate + self.backgroundView.style = MBProgressHUDBackgroundStyleSolidColor; + self.backgroundView.color = dimBackground ? [UIColor colorWithWhite:0.f alpha:.2f] : [UIColor clearColor]; } - (CGSize)size { From 7a13716d15f02aab7f00a47226629f4ff41497f3 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 13 Sep 2015 13:50:28 +0200 Subject: [PATCH 059/117] Initial work on the example redesign. --- Demo/Classes/HudDemoAppDelegate.h | 23 -- Demo/Classes/HudDemoAppDelegate.m | 23 -- Demo/Classes/HudDemoViewController.m | 331 ------------------ Demo/Classes/MBHudDemoAppDelegate.h | 15 + Demo/Classes/MBHudDemoAppDelegate.m | 19 + ...Controller.h => MBHudDemoViewController.h} | 4 +- Demo/Classes/MBHudDemoViewController.m | 98 ++++++ Demo/HudDemo.xcodeproj/project.pbxproj | 50 +-- Demo/Info.plist | 4 +- Demo/en.lproj/HudDemoViewController.xib | 270 -------------- Demo/en.lproj/Launch.storyboard | 8 +- Demo/en.lproj/Main.storyboard | 60 ++++ Demo/en.lproj/MainWindow.xib | 77 ---- Demo/main.m | 5 +- MBProgressHUD.h | 3 +- MBProgressHUD.m | 52 ++- 16 files changed, 260 insertions(+), 782 deletions(-) delete mode 100644 Demo/Classes/HudDemoAppDelegate.h delete mode 100644 Demo/Classes/HudDemoAppDelegate.m delete mode 100644 Demo/Classes/HudDemoViewController.m create mode 100644 Demo/Classes/MBHudDemoAppDelegate.h create mode 100644 Demo/Classes/MBHudDemoAppDelegate.m rename Demo/Classes/{HudDemoViewController.h => MBHudDemoViewController.h} (51%) create mode 100644 Demo/Classes/MBHudDemoViewController.m delete mode 100644 Demo/en.lproj/HudDemoViewController.xib create mode 100644 Demo/en.lproj/Main.storyboard delete mode 100644 Demo/en.lproj/MainWindow.xib diff --git a/Demo/Classes/HudDemoAppDelegate.h b/Demo/Classes/HudDemoAppDelegate.h deleted file mode 100644 index 1b144a05a..000000000 --- a/Demo/Classes/HudDemoAppDelegate.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// HudDemoAppDelegate.h -// HudDemo -// -// Created by Matej Bukovinski on 2.4.09. -// Copyright bukovinski.com 2009. All rights reserved. -// - -#import - -@class HudDemoViewController; - - -@interface HudDemoAppDelegate : NSObject { - UIWindow *window; - UINavigationController *navController; -} - -@property (nonatomic, retain) IBOutlet UIWindow *window; -@property (nonatomic, retain) IBOutlet UINavigationController *navController; - -@end - diff --git a/Demo/Classes/HudDemoAppDelegate.m b/Demo/Classes/HudDemoAppDelegate.m deleted file mode 100644 index fc20ed35e..000000000 --- a/Demo/Classes/HudDemoAppDelegate.m +++ /dev/null @@ -1,23 +0,0 @@ -// -// HudDemoAppDelegate.m -// HudDemo -// -// Created by Matej Bukovinski on 2.4.09. -// Copyright bukovinski.com 2009. All rights reserved. -// - -#import "HudDemoAppDelegate.h" -#import "HudDemoViewController.h" - - -@implementation HudDemoAppDelegate - -@synthesize window; -@synthesize navController; - -- (void)applicationDidFinishLaunching:(UIApplication *)application { - window.rootViewController = navController; - [window makeKeyAndVisible]; -} - -@end diff --git a/Demo/Classes/HudDemoViewController.m b/Demo/Classes/HudDemoViewController.m deleted file mode 100644 index 183ba26ea..000000000 --- a/Demo/Classes/HudDemoViewController.m +++ /dev/null @@ -1,331 +0,0 @@ -// -// HudDemoViewController.m -// HudDemo -// -// Created by Matej Bukovinski on 30.9.09. -// Copyright bukovinski.com 2009. All rights reserved. -// - -#import "HudDemoViewController.h" -#import "MBProgressHUD.h" -#import - - -#define SCREENSHOT_MODE 0 - -#ifndef kCFCoreFoundationVersionNumber_iOS_8_0 - #define kCFCoreFoundationVersionNumber_iOS_7_0 847.20 -#endif - - -@interface HudDemoViewController () { - MBProgressHUD *HUD; - long long expectedLength; - long long currentLength; -} - -@property (retain, nonatomic) IBOutletCollection(UIButton) NSArray *buttons; - -@end - - -@implementation HudDemoViewController - -#pragma mark - Lifecycle methods - -- (void)viewDidLoad { - UIView *content = [[self.view subviews] objectAtIndex:0]; -#if SCREENSHOT_MODE - [content.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; -#endif - if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0) { - [self.buttons setValue:@5.f forKeyPath:@"layer.cornerRadius"]; - } else { - [self.buttons setValue:nil forKey:@"backgroundColor"]; - } - ((UIScrollView *)self.view).contentSize = content.bounds.size; -} - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - return YES; -} - -- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { - UIView *content = [[self.view subviews] objectAtIndex:0]; - ((UIScrollView *)self.view).contentSize = content.bounds.size; -} - -#pragma mark - Actions - -- (IBAction)showSimple:(id)sender { - // The hud will dispable all input on the view (use the higest view possible in the view hierarchy) - HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view]; - [self.navigationController.view addSubview:HUD]; - - // Regiser for HUD callbacks so we can remove it from the window at the right time - HUD.delegate = self; - - // Show the HUD while the provided method executes in a new thread - [HUD showWhileExecuting:@selector(myTask) onTarget:self withObject:nil animated:YES]; -} - -- (IBAction)showWithLabel:(id)sender { - - HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view]; - [self.navigationController.view addSubview:HUD]; - - HUD.delegate = self; - HUD.labelText = @"Loading"; - - [HUD showWhileExecuting:@selector(myTask) onTarget:self withObject:nil animated:YES]; -} - -- (IBAction)showWithDetailsLabel:(id)sender { - - HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view]; - [self.navigationController.view addSubview:HUD]; - - HUD.delegate = self; - HUD.labelText = @"Loading"; - HUD.detailsLabelText = @"updating data"; - HUD.square = YES; - - [HUD showWhileExecuting:@selector(myTask) onTarget:self withObject:nil animated:YES]; -} - -- (IBAction)showWithLabelDeterminate:(id)sender { - - HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view]; - [self.navigationController.view addSubview:HUD]; - - // Set determinate mode - HUD.mode = MBProgressHUDModeDeterminate; - - HUD.delegate = self; - HUD.labelText = @"Loading"; - - // myProgressTask uses the HUD instance to update progress - [HUD showWhileExecuting:@selector(myProgressTask) onTarget:self withObject:nil animated:YES]; -} - -- (IBAction)showWIthLabelAnnularDeterminate:(id)sender { - HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view]; - [self.navigationController.view addSubview:HUD]; - - // Set determinate mode - HUD.mode = MBProgressHUDModeAnnularDeterminate; - - HUD.delegate = self; - HUD.labelText = @"Loading"; - - // myProgressTask uses the HUD instance to update progress - [HUD showWhileExecuting:@selector(myProgressTask) onTarget:self withObject:nil animated:YES]; -} - -- (IBAction)showWithLabelDeterminateHorizontalBar:(id)sender { - - HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view]; - [self.navigationController.view addSubview:HUD]; - - // Set determinate bar mode - HUD.mode = MBProgressHUDModeDeterminateHorizontalBar; - - HUD.delegate = self; - - // myProgressTask uses the HUD instance to update progress - [HUD showWhileExecuting:@selector(myProgressTask) onTarget:self withObject:nil animated:YES]; -} - -- (IBAction)showWithCustomView:(id)sender { - - HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view]; - [self.navigationController.view addSubview:HUD]; - - // The sample image is based on the work by http://www.pixelpressicons.com, http://creativecommons.org/licenses/by/2.5/ca/ - // Make the customViews 37 by 37 pixels for best results (those are the bounds of the build-in progress indicators) - HUD.customView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]]; - - // Set custom view mode - HUD.mode = MBProgressHUDModeCustomView; - - HUD.delegate = self; - HUD.labelText = @"Completed"; - - [HUD show:YES]; - [HUD hide:YES afterDelay:3]; -} - -- (IBAction)showWithLabelMixed:(id)sender { - - HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view]; - [self.navigationController.view addSubview:HUD]; - - HUD.delegate = self; - HUD.labelText = @"Connecting"; - HUD.minSize = CGSizeMake(135.f, 135.f); - - [HUD showWhileExecuting:@selector(myMixedTask) onTarget:self withObject:nil animated:YES]; -} - -- (IBAction)showUsingBlocks:(id)sender { -#if NS_BLOCKS_AVAILABLE - MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:self.navigationController.view]; - [self.navigationController.view addSubview:hud]; - hud.labelText = @"With a block"; - - [hud showAnimated:YES whileExecutingBlock:^{ - [self myTask]; - } completionBlock:^{ - [hud removeFromSuperview]; - }]; -#endif -} - -- (IBAction)showOnWindow:(id)sender { - // The hud will dispable all input on the window - HUD = [[MBProgressHUD alloc] initWithView:self.view.window]; - [self.view.window addSubview:HUD]; - - HUD.delegate = self; - HUD.labelText = @"Loading"; - - [HUD showWhileExecuting:@selector(myTask) onTarget:self withObject:nil animated:YES]; -} - -- (IBAction)showURL:(id)sender { - NSURL *URL = [NSURL URLWithString:@"http://a1408.g.akamai.net/5/1408/1388/2005110403/1a1a1ad948be278cff2d96046ad90768d848b41947aa1986/sample_iPod.m4v.zip"]; - NSURLRequest *request = [NSURLRequest requestWithURL:URL]; - - NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; - [connection start]; - - HUD = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; - HUD.delegate = self; -} - - -- (IBAction)showWithGradient:(id)sender { - - HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view]; - [self.navigationController.view addSubview:HUD]; - - HUD.dimBackground = YES; - - // Regiser for HUD callbacks so we can remove it from the window at the right time - HUD.delegate = self; - - // Show the HUD while the provided method executes in a new thread - [HUD showWhileExecuting:@selector(myTask) onTarget:self withObject:nil animated:YES]; -} - -- (IBAction)showTextOnly:(id)sender { - - MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; - - // Configure for text only and offset down - hud.mode = MBProgressHUDModeText; - hud.labelText = @"Some message..."; - hud.margin = 10.f; - hud.removeFromSuperViewOnHide = YES; - - [hud hide:YES afterDelay:3]; -} - -- (IBAction)showWithColor:(id)sender{ - HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view]; - [self.navigationController.view addSubview:HUD]; - - // Set the hud to display with a color - HUD.color = [UIColor colorWithRed:0.23 green:0.50 blue:0.82 alpha:0.90]; - - HUD.delegate = self; - [HUD showWhileExecuting:@selector(myTask) onTarget:self withObject:nil animated:YES]; -} - -#pragma mark - Execution code - -- (void)myTask { - // Do something usefull in here instead of sleeping ... - sleep(3); -} - -- (void)myProgressTask { - // This just increases the progress indicator in a loop - float progress = 0.0f; - while (progress < 1.0f) { - progress += 0.01f; - dispatch_async(dispatch_get_main_queue(), ^{ - HUD.progress = progress; - }); - usleep(50000); - } -} - -- (void)myMixedTask { - // Indeterminate mode - sleep(2); - // Switch to determinate mode - dispatch_async(dispatch_get_main_queue(), ^{ - HUD.mode = MBProgressHUDModeDeterminate; - HUD.labelText = @"Progress"; - }); - float progress = 0.0f; - while (progress < 1.0f) { - progress += 0.01f; - dispatch_async(dispatch_get_main_queue(), ^{ - HUD.progress = progress; - }); - usleep(50000); - } - // Back to indeterminate mode - dispatch_async(dispatch_get_main_queue(), ^{ - HUD.mode = MBProgressHUDModeIndeterminate; - HUD.labelText = @"Cleaning up"; - }); - sleep(2); - dispatch_sync(dispatch_get_main_queue(), ^{ - UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; - HUD.customView = imageView; - HUD.mode = MBProgressHUDModeCustomView; - HUD.labelText = @"Completed"; - }); - sleep(2); -} - -#pragma mark - NSURLConnectionDelegete - -- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { - expectedLength = MAX([response expectedContentLength], 1); - currentLength = 0; - HUD.mode = MBProgressHUDModeDeterminate; -} - -- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { - currentLength += [data length]; - HUD.progress = currentLength / (float)expectedLength; -} - -- (void)connectionDidFinishLoading:(NSURLConnection *)connection { - HUD.customView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]]; - HUD.mode = MBProgressHUDModeCustomView; - [HUD hide:YES afterDelay:2]; -} - -- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { - [HUD hide:YES]; -} - -#pragma mark - MBProgressHUDDelegate - -- (void)hudWasHidden:(MBProgressHUD *)hud { - // Remove HUD from screen when the HUD was hidded - [HUD removeFromSuperview]; - HUD = nil; -} - -- (void)viewDidUnload { - [self setButtons:nil]; - [super viewDidUnload]; -} -@end diff --git a/Demo/Classes/MBHudDemoAppDelegate.h b/Demo/Classes/MBHudDemoAppDelegate.h new file mode 100644 index 000000000..dc9588e59 --- /dev/null +++ b/Demo/Classes/MBHudDemoAppDelegate.h @@ -0,0 +1,15 @@ +// +// MBHudDemoAppDelegate.h +// HudDemo +// +// Created by Matej Bukovinski on 2.4.09. +// Copyright bukovinski.com 2009-2015. All rights reserved. +// + +#import + +@interface MBHudDemoAppDelegate : NSObject + +@property (strong, nonatomic) UIWindow *window; + +@end diff --git a/Demo/Classes/MBHudDemoAppDelegate.m b/Demo/Classes/MBHudDemoAppDelegate.m new file mode 100644 index 000000000..deea6839b --- /dev/null +++ b/Demo/Classes/MBHudDemoAppDelegate.m @@ -0,0 +1,19 @@ +// +// MBHudDemoAppDelegate.m +// HudDemo +// +// Created by Matej Bukovinski on 2.4.09. +// Copyright bukovinski.com 2009-2015. All rights reserved. +// + +#import "MBHudDemoAppDelegate.h" +#import "MBHudDemoViewController.h" + + +@implementation MBHudDemoAppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + return YES; +} + +@end diff --git a/Demo/Classes/HudDemoViewController.h b/Demo/Classes/MBHudDemoViewController.h similarity index 51% rename from Demo/Classes/HudDemoViewController.h rename to Demo/Classes/MBHudDemoViewController.h index 6b4013430..231a84c68 100644 --- a/Demo/Classes/HudDemoViewController.h +++ b/Demo/Classes/MBHudDemoViewController.h @@ -3,12 +3,12 @@ // HudDemo // // Created by Matej Bukovinski on 30.9.09. -// Copyright bukovinski.com 2009. All rights reserved. +// Copyright bukovinski.com 2009-2015. All rights reserved. // #import -@interface HudDemoViewController : UIViewController +@interface MBHudDemoViewController : UITableViewController @end diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m new file mode 100644 index 000000000..83b39650f --- /dev/null +++ b/Demo/Classes/MBHudDemoViewController.m @@ -0,0 +1,98 @@ +// +// MBHudDemoViewController.m +// HudDemo +// +// Created by Matej Bukovinski on 30.9.09. +// Copyright bukovinski.com 2009-2015. All rights reserved. +// + +#import "MBHudDemoViewController.h" +#import "MBProgressHUD.h" + + +@interface MBExample : NSObject + +@property (nonatomic, copy) NSString *title; +@property (nonatomic, assign) SEL selector; + +@end + + +@implementation MBExample + ++ (instancetype)exampleWithTitle:(NSString *)title selector:(SEL)selector { + MBExample *example = [[self class] new]; + example.title = title; + example.selector = selector; + return example; +} + +@end + + +@interface MBHudDemoViewController () + +@property (nonatomic, strong) NSArray *examples; + +@end + + +@implementation MBHudDemoViewController + +#pragma mark - Lifecycle + +- (void)awakeFromNib { + [super awakeFromNib]; + self.examples = + @[[MBExample exampleWithTitle:@"Indeterminate progress" selector:@selector(simple)], + [MBExample exampleWithTitle:@"With label" selector:@selector(simple)], + [MBExample exampleWithTitle:@"With details label" selector:@selector(simple)], + [MBExample exampleWithTitle:@"Determinate mode" selector:@selector(simple)], + [MBExample exampleWithTitle:@"Annular determinate mode" selector:@selector(simple)], + [MBExample exampleWithTitle:@"Bar determinate mode" selector:@selector(simple)], + [MBExample exampleWithTitle:@"Custom view" selector:@selector(simple)], + [MBExample exampleWithTitle:@"Mode switching" selector:@selector(simple)], + [MBExample exampleWithTitle:@"Using blocks" selector:@selector(simple)], + [MBExample exampleWithTitle:@"On window" selector:@selector(simple)], + [MBExample exampleWithTitle:@"NSURLConnection" selector:@selector(simple)], + [MBExample exampleWithTitle:@"Dim background" selector:@selector(simple)], + [MBExample exampleWithTitle:@"Text only" selector:@selector(simple)], + [MBExample exampleWithTitle:@"Colored" selector:@selector(simple)]]; +} + +#pragma mark - Examples + +- (void)simple { + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + [hud hideAnimated:YES afterDelay:3.f]; +} + +#pragma mark - UITableViewDelegate + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return self.examples.count; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + MBExample *example = self.examples[indexPath.row]; + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MBExampleCell" forIndexPath:indexPath]; + cell.textLabel.text = example.title; + cell.textLabel.textColor = [UIColor colorWithRed:0.393f green:0.467f blue:0.572f alpha:1.f]; + cell.textLabel.textAlignment = NSTextAlignmentCenter; + cell.selectedBackgroundView = [UIView new]; + cell.selectedBackgroundView.backgroundColor = [cell.textLabel.textColor colorWithAlphaComponent:0.5]; + return cell; +} + +#pragma mark - UITableViewDelegate + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + MBExample *example = self.examples[indexPath.row]; + [self performSelector:example.selector]; + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + }); +} + +@end diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index 677e91314..8082a761e 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -7,17 +7,16 @@ objects = { /* Begin PBXBuildFile section */ - 1D3623260D0F684500981E51 /* HudDemoAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* HudDemoAppDelegate.m */; }; + 1D3623260D0F684500981E51 /* MBHudDemoAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* MBHudDemoAppDelegate.m */; }; 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; - 28D7ACF80DDB3853001CB0EB /* HudDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* HudDemoViewController.m */; }; + 28D7ACF80DDB3853001CB0EB /* MBHudDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* MBHudDemoViewController.m */; }; D22F7D810F85241C00550BB3 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D22F7D800F85241C00550BB3 /* MBProgressHUD.m */; }; - D286A7321518C53500E13FB8 /* HudDemoViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = D286A7341518C53500E13FB8 /* HudDemoViewController.xib */; }; - D286A7361518C53C00E13FB8 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = D286A7381518C53C00E13FB8 /* MainWindow.xib */; }; D286A76D1518CA9F00E13FB8 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D286A76C1518CA9F00E13FB8 /* CoreGraphics.framework */; }; D28CBB321A87A45A0052DCEC /* HudTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D28CBB311A87A45A0052DCEC /* HudTests.m */; }; D28CBB381A87A4A10052DCEC /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D22F7D800F85241C00550BB3 /* MBProgressHUD.m */; }; + D2BC092F1BA587FB00589A7C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D2BC09311BA587FB00589A7C /* Main.storyboard */; }; D2EEB37B1B558F0900F59EC1 /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D2EEB3791B558F0900F59EC1 /* Launch.storyboard */; }; D2EEB3811B55967200F59EC1 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D2EEB3801B55967200F59EC1 /* Images.xcassets */; }; /* End PBXBuildFile section */ @@ -34,23 +33,22 @@ /* Begin PBXFileReference section */ 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1D3623240D0F684500981E51 /* HudDemoAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HudDemoAppDelegate.h; sourceTree = ""; }; - 1D3623250D0F684500981E51 /* HudDemoAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HudDemoAppDelegate.m; sourceTree = ""; }; + 1D3623240D0F684500981E51 /* MBHudDemoAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MBHudDemoAppDelegate.h; sourceTree = ""; }; + 1D3623250D0F684500981E51 /* MBHudDemoAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MBHudDemoAppDelegate.m; sourceTree = ""; }; 1D6058910D05DD3D006BFB54 /* HudDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HudDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 28D7ACF60DDB3853001CB0EB /* HudDemoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HudDemoViewController.h; sourceTree = ""; }; - 28D7ACF70DDB3853001CB0EB /* HudDemoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HudDemoViewController.m; sourceTree = ""; usesTabs = 1; }; + 28D7ACF60DDB3853001CB0EB /* MBHudDemoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MBHudDemoViewController.h; sourceTree = ""; }; + 28D7ACF70DDB3853001CB0EB /* MBHudDemoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MBHudDemoViewController.m; sourceTree = ""; usesTabs = 1; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* HudDemo_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HudDemo_Prefix.pch; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; D22F7D7F0F85241C00550BB3 /* MBProgressHUD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MBProgressHUD.h; path = ../MBProgressHUD.h; sourceTree = SOURCE_ROOT; }; D22F7D800F85241C00550BB3 /* MBProgressHUD.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MBProgressHUD.m; path = ../MBProgressHUD.m; sourceTree = ""; }; - D286A7331518C53500E13FB8 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/HudDemoViewController.xib; sourceTree = ""; }; - D286A7371518C53C00E13FB8 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainWindow.xib; sourceTree = ""; }; D286A76C1518CA9F00E13FB8 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; D28CBB2D1A87A45A0052DCEC /* HudTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HudTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; D28CBB301A87A45A0052DCEC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; D28CBB311A87A45A0052DCEC /* HudTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HudTests.m; sourceTree = ""; }; + D2BC09301BA587FB00589A7C /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/Main.storyboard; sourceTree = ""; }; D2EEB37A1B558F0900F59EC1 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/Launch.storyboard; sourceTree = ""; }; D2EEB3801B55967200F59EC1 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = HudDemo/Images.xcassets; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ @@ -79,10 +77,10 @@ 080E96DDFE201D6D7F000001 /* HudDemo */ = { isa = PBXGroup; children = ( - 1D3623240D0F684500981E51 /* HudDemoAppDelegate.h */, - 1D3623250D0F684500981E51 /* HudDemoAppDelegate.m */, - 28D7ACF60DDB3853001CB0EB /* HudDemoViewController.h */, - 28D7ACF70DDB3853001CB0EB /* HudDemoViewController.m */, + 1D3623240D0F684500981E51 /* MBHudDemoAppDelegate.h */, + 1D3623250D0F684500981E51 /* MBHudDemoAppDelegate.m */, + 28D7ACF60DDB3853001CB0EB /* MBHudDemoViewController.h */, + 28D7ACF70DDB3853001CB0EB /* MBHudDemoViewController.m */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, ); @@ -146,8 +144,7 @@ isa = PBXGroup; children = ( D2EEB3791B558F0900F59EC1 /* Launch.storyboard */, - D286A7341518C53500E13FB8 /* HudDemoViewController.xib */, - D286A7381518C53C00E13FB8 /* MainWindow.xib */, + D2BC09311BA587FB00589A7C /* Main.storyboard */, ); name = UI; sourceTree = ""; @@ -258,9 +255,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - D286A7361518C53C00E13FB8 /* MainWindow.xib in Resources */, + D2BC092F1BA587FB00589A7C /* Main.storyboard in Resources */, D2EEB3811B55967200F59EC1 /* Images.xcassets in Resources */, - D286A7321518C53500E13FB8 /* HudDemoViewController.xib in Resources */, D2EEB37B1B558F0900F59EC1 /* Launch.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -280,8 +276,8 @@ buildActionMask = 2147483647; files = ( 1D60589B0D05DD56006BFB54 /* main.m in Sources */, - 1D3623260D0F684500981E51 /* HudDemoAppDelegate.m in Sources */, - 28D7ACF80DDB3853001CB0EB /* HudDemoViewController.m in Sources */, + 1D3623260D0F684500981E51 /* MBHudDemoAppDelegate.m in Sources */, + 28D7ACF80DDB3853001CB0EB /* MBHudDemoViewController.m in Sources */, D22F7D810F85241C00550BB3 /* MBProgressHUD.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -306,20 +302,12 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ - D286A7341518C53500E13FB8 /* HudDemoViewController.xib */ = { + D2BC09311BA587FB00589A7C /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - D286A7331518C53500E13FB8 /* en */, + D2BC09301BA587FB00589A7C /* en */, ); - name = HudDemoViewController.xib; - sourceTree = ""; - }; - D286A7381518C53C00E13FB8 /* MainWindow.xib */ = { - isa = PBXVariantGroup; - children = ( - D286A7371518C53C00E13FB8 /* en */, - ); - name = MainWindow.xib; + name = Main.storyboard; sourceTree = ""; }; D2EEB3791B558F0900F59EC1 /* Launch.storyboard */ = { diff --git a/Demo/Info.plist b/Demo/Info.plist index 8ea622353..d11b218f8 100644 --- a/Demo/Info.plist +++ b/Demo/Info.plist @@ -28,8 +28,6 @@ 1.0 LSRequiresIPhoneOS - NSMainNibFile - MainWindow UILaunchImages @@ -55,6 +53,8 @@ UILaunchStoryboardName Launch + UIMainStoryboardFile + Main UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/Demo/en.lproj/HudDemoViewController.xib b/Demo/en.lproj/HudDemoViewController.xib deleted file mode 100644 index fb266e1f0..000000000 --- a/Demo/en.lproj/HudDemoViewController.xib +++ /dev/null @@ -1,270 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Demo/en.lproj/Launch.storyboard b/Demo/en.lproj/Launch.storyboard index 13ffa5a5c..b5298c762 100644 --- a/Demo/en.lproj/Launch.storyboard +++ b/Demo/en.lproj/Launch.storyboard @@ -1,8 +1,8 @@ - + - + @@ -12,6 +12,7 @@ + @@ -32,7 +33,8 @@ - + + diff --git a/Demo/en.lproj/Main.storyboard b/Demo/en.lproj/Main.storyboard new file mode 100644 index 000000000..cefc1b4f1 --- /dev/null +++ b/Demo/en.lproj/Main.storyboard @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo/en.lproj/MainWindow.xib b/Demo/en.lproj/MainWindow.xib deleted file mode 100644 index dffe5065e..000000000 --- a/Demo/en.lproj/MainWindow.xib +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Demo/main.m b/Demo/main.m index 26f40e483..ef3472167 100644 --- a/Demo/main.m +++ b/Demo/main.m @@ -3,13 +3,14 @@ // HudDemo // // Created by Matej Bukovinski on 2.4.09. -// Copyright bukovinski.com 2009. All rights reserved. +// Copyright bukovinski.com 2009-2015. All rights reserved. // #import +#import "MBHudDemoAppDelegate.h" int main(int argc, char *argv[]) { @autoreleasepool { - return UIApplicationMain(argc, argv, nil, nil); + return UIApplicationMain(argc, argv, nil, NSStringFromClass([MBHudDemoAppDelegate class])); } } diff --git a/MBProgressHUD.h b/MBProgressHUD.h index f6eac38e3..cc83d3229 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -205,7 +205,7 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { * for custom views on iOS 7+. Set to nil to manage color individually. * Defaults to semi-translucent black on iOS 7 and later and white on earlier iOS versions. */ -@property (strong, nonatomic) UIColor *color UI_APPEARANCE_SELECTOR; +@property (strong, nonatomic) UIColor *contentColor UI_APPEARANCE_SELECTOR; /** * The animation type that should be used when the HUD is shown and hidden. @@ -393,6 +393,7 @@ typedef void (^MBProgressHUDCompletionBlock)(); @property (nonatomic, strong) UIFont *detailsLabelFont __attribute__((deprecated("Use detailsLabel.font instead."))); @property (nonatomic, strong) UIColor *detailsLabelColor __attribute__((deprecated("Use detailsLabel.textColor instead."))); @property (assign, nonatomic) CGFloat opacity __attribute__((deprecated("Customize bezelView properties instead."))); +@property (strong, nonatomic) UIColor *color __attribute__((deprecated("Customize the bezelView color instead."))); @property (assign, nonatomic) CGFloat xOffset __attribute__((deprecated("Set offset.x instead."))); @property (assign, nonatomic) CGFloat yOffset __attribute__((deprecated("Set offset.y instead."))); @property (assign, nonatomic) CGFloat cornerRadius __attribute__((deprecated("Set bezelView.layer.cornerRadius instead."))); diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 77cd21117..48a392168 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -24,11 +24,14 @@ static const CGFloat MBDefaultDetailsLabelFontSize = 12.f; -@interface MBProgressHUD () +@interface MBProgressHUD () { + // Depricated + UIColor *_activityIndicatorColor; + CGFloat _opacity; +} @property (nonatomic, assign) BOOL useAnimation; @property (nonatomic, assign, getter=hasFinished) BOOL finished; -@property (nonatomic, assign, readwrite) CGSize size; @property (nonatomic, strong) UIView *indicator; @property (nonatomic, strong) NSTimer *graceTimer; @property (nonatomic, strong) NSTimer *minShowTimer; @@ -40,7 +43,6 @@ @interface MBProgressHUD () // Deprecated @property (copy) MBProgressHUDCompletionBlock completionBlock; @property (assign) BOOL taskInProgress; -@property (strong, nonatomic) UIColor *activityIndicatorColor; @end @@ -85,10 +87,11 @@ - (instancetype)initWithFrame:(CGRect)frame { _animationType = MBProgressHUDAnimationFade; _mode = MBProgressHUDModeIndeterminate; _margin = 20.0f; + _opacity = 1.f; // Default color, depending on the current iOS version BOOL isLegacy = kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0; - _color = isLegacy ? [UIColor whiteColor] : [UIColor colorWithWhite:0.f alpha:0.7f]; + _contentColor = isLegacy ? [UIColor whiteColor] : [UIColor colorWithWhite:0.f alpha:0.7f]; // Transparent background self.opaque = NO; self.backgroundColor = [UIColor clearColor]; @@ -189,7 +192,10 @@ - (void)showUsingAnimation:(BOOL)animated { if (animated) { [self animateIn:YES withType:self.animationType completion:NULL]; } else { - self.bezelView.alpha = 1.f; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + self.bezelView.alpha = self.opacity; +#pragma clang diagnostic pop self.backgroundView.alpha = 1.f; } } @@ -233,7 +239,10 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple } else if (!animatingIn && type == MBProgressHUDAnimationZoomOut) { bezelView.transform = small; } - bezelView.alpha = animatingIn ? 1.f : 0.f; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + bezelView.alpha = animatingIn ? self.opacity : 0.f; +#pragma clang diagnostic pop self.backgroundView.alpha = animatingIn ? 1.f : 0.f; }; @@ -267,7 +276,7 @@ - (void)done { #pragma mark - UI - (void)setupViews { - UIColor *defaultColor = self.color; + UIColor *defaultColor = self.contentColor; MBBackgroundView *backgroundView = [[MBBackgroundView alloc] initWithFrame:self.bounds]; backgroundView.style = MBProgressHUDBackgroundStyleSolidColor; @@ -369,7 +378,7 @@ - (void)updateIndicators { [(id)indicator setValue:@(self.progress) forKey:@"progress"]; } - [self updateViewsForColor:self.color]; + [self updateViewsForColor:self.contentColor]; [self setNeedsUpdateConstraints]; } @@ -379,10 +388,12 @@ - (void)updateViewsForColor:(UIColor *)color { self.label.textColor = color; self.detailsLabel.textColor = color; - // Deprecated +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" if (self.activityIndicatorColor) { color = self.activityIndicatorColor; } +#pragma clang diagnostic pop UIView *indicator = self.indicator; if ([indicator isKindOfClass:[UIActivityIndicatorView class]]) { @@ -554,10 +565,10 @@ - (void)setProgress:(float)progress { } } -- (void)setColor:(UIColor *)color { - if (color != _color && ![color isEqual:_color]) { - _color = color; - [self updateViewsForColor:color]; +- (void)setContentColor:(UIColor *)contentColor { + if (contentColor != _contentColor && ![contentColor isEqual:_contentColor]) { + _contentColor = contentColor; + [self updateViewsForColor:contentColor]; } } @@ -1128,18 +1139,21 @@ - (void)setDetailsLabelColor:(UIColor *)detailsLabelColor { } - (CGFloat)opacity { - // TODO: forward when appropriate - return 1.f; + return _opacity; } - (void)setOpacity:(CGFloat)opacity { MBMainThreadAssert(); - // TODO: forward when appropriate + _opacity = opacity; +} + +- (UIColor *)color { + return self.bezelView.color; } - (void)setColor:(UIColor *)color { MBMainThreadAssert(); - // TODO: forward when appropriate + self.bezelView.color = color; } - (CGFloat)yOffset { @@ -1185,6 +1199,10 @@ - (CGSize)size { return self.bezelView.frame.size; } +- (UIColor *)activityIndicatorColor { + return _activityIndicatorColor; +} + - (void)setActivityIndicatorColor:(UIColor *)activityIndicatorColor { if (activityIndicatorColor != _activityIndicatorColor) { _activityIndicatorColor = activityIndicatorColor; From 8ad3217f8e019c2997192628ff7f907a0372c775 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 14 Sep 2015 07:49:59 +0200 Subject: [PATCH 060/117] Silencing selector warning. --- Demo/Classes/MBHudDemoViewController.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index 83b39650f..4ba3cba89 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -88,7 +88,10 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { MBExample *example = self.examples[indexPath.row]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" [self performSelector:example.selector]; +#pragma clang diagnostic pop dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [tableView deselectRowAtIndexPath:indexPath animated:YES]; From ee53addbac30608ad3770db3a7675f5c17e79696 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 14 Sep 2015 07:51:27 +0200 Subject: [PATCH 061/117] Removed unnecessary framework search path. --- Demo/HudDemo.xcodeproj/project.pbxproj | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index 8082a761e..338f267cf 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -424,10 +424,6 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -461,10 +457,6 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; From ebd0f7d473af4101b01f2481f73d695817ef7138 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 14 Sep 2015 08:00:01 +0200 Subject: [PATCH 062/117] Removed test target (for now). --- Demo/HudDemo.xcodeproj/project.pbxproj | 138 ------------------ .../xcshareddata/xcschemes/HudDemo.xcscheme | 10 -- Framework-Info.plist | 2 +- MBProgressHUD.xcodeproj/project.pbxproj | 5 +- 4 files changed, 5 insertions(+), 150 deletions(-) diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index 338f267cf..1886b2e61 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -14,23 +14,11 @@ 28D7ACF80DDB3853001CB0EB /* MBHudDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* MBHudDemoViewController.m */; }; D22F7D810F85241C00550BB3 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D22F7D800F85241C00550BB3 /* MBProgressHUD.m */; }; D286A76D1518CA9F00E13FB8 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D286A76C1518CA9F00E13FB8 /* CoreGraphics.framework */; }; - D28CBB321A87A45A0052DCEC /* HudTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D28CBB311A87A45A0052DCEC /* HudTests.m */; }; - D28CBB381A87A4A10052DCEC /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D22F7D800F85241C00550BB3 /* MBProgressHUD.m */; }; D2BC092F1BA587FB00589A7C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D2BC09311BA587FB00589A7C /* Main.storyboard */; }; D2EEB37B1B558F0900F59EC1 /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D2EEB3791B558F0900F59EC1 /* Launch.storyboard */; }; D2EEB3811B55967200F59EC1 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D2EEB3801B55967200F59EC1 /* Images.xcassets */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - D28CBB331A87A45A0052DCEC /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1D6058900D05DD3D006BFB54; - remoteInfo = HudDemo; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXFileReference section */ 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 1D3623240D0F684500981E51 /* MBHudDemoAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MBHudDemoAppDelegate.h; sourceTree = ""; }; @@ -45,7 +33,6 @@ D22F7D7F0F85241C00550BB3 /* MBProgressHUD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MBProgressHUD.h; path = ../MBProgressHUD.h; sourceTree = SOURCE_ROOT; }; D22F7D800F85241C00550BB3 /* MBProgressHUD.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MBProgressHUD.m; path = ../MBProgressHUD.m; sourceTree = ""; }; D286A76C1518CA9F00E13FB8 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - D28CBB2D1A87A45A0052DCEC /* HudTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HudTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; D28CBB301A87A45A0052DCEC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; D28CBB311A87A45A0052DCEC /* HudTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HudTests.m; sourceTree = ""; }; D2BC09301BA587FB00589A7C /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/Main.storyboard; sourceTree = ""; }; @@ -64,13 +51,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - D28CBB2A1A87A45A0052DCEC /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -92,7 +72,6 @@ isa = PBXGroup; children = ( 1D6058910D05DD3D006BFB54 /* HudDemo.app */, - D28CBB2D1A87A45A0052DCEC /* HudTests.xctest */, ); name = Products; sourceTree = ""; @@ -195,24 +174,6 @@ productReference = 1D6058910D05DD3D006BFB54 /* HudDemo.app */; productType = "com.apple.product-type.application"; }; - D28CBB2C1A87A45A0052DCEC /* HudTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = D28CBB351A87A45A0052DCEC /* Build configuration list for PBXNativeTarget "HudTests" */; - buildPhases = ( - D28CBB291A87A45A0052DCEC /* Sources */, - D28CBB2A1A87A45A0052DCEC /* Frameworks */, - D28CBB2B1A87A45A0052DCEC /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - D28CBB341A87A45A0052DCEC /* PBXTargetDependency */, - ); - name = HudTests; - productName = HudTests; - productReference = D28CBB2D1A87A45A0052DCEC /* HudTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -222,12 +183,6 @@ CLASSPREFIX = MB; LastUpgradeCheck = 0700; ORGANIZATIONNAME = "Matej Bukovinski"; - TargetAttributes = { - D28CBB2C1A87A45A0052DCEC = { - CreatedOnToolsVersion = 6.1.1; - TestTargetID = 1D6058900D05DD3D006BFB54; - }; - }; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "HudDemo" */; compatibilityVersion = "Xcode 3.2"; @@ -245,7 +200,6 @@ projectRoot = ""; targets = ( 1D6058900D05DD3D006BFB54 /* HudDemo */, - D28CBB2C1A87A45A0052DCEC /* HudTests */, ); }; /* End PBXProject section */ @@ -261,13 +215,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - D28CBB2B1A87A45A0052DCEC /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -282,25 +229,8 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - D28CBB291A87A45A0052DCEC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - D28CBB321A87A45A0052DCEC /* HudTests.m in Sources */, - D28CBB381A87A4A10052DCEC /* MBProgressHUD.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - D28CBB341A87A45A0052DCEC /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1D6058900D05DD3D006BFB54 /* HudDemo */; - targetProxy = D28CBB331A87A45A0052DCEC /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin PBXVariantGroup section */ D2BC09311BA587FB00589A7C /* Main.storyboard */ = { isa = PBXVariantGroup; @@ -412,65 +342,6 @@ }; name = Release; }; - D28CBB361A87A45A0052DCEC /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INFOPLIST_FILE = HudTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HudDemo.app/HudDemo"; - }; - name = Debug; - }; - D28CBB371A87A45A0052DCEC /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INFOPLIST_FILE = HudTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HudDemo.app/HudDemo"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -492,15 +363,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - D28CBB351A87A45A0052DCEC /* Build configuration list for PBXNativeTarget "HudTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - D28CBB361A87A45A0052DCEC /* Debug */, - D28CBB371A87A45A0052DCEC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; diff --git a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme index b96c43807..6cbd5e036 100644 --- a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme +++ b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme @@ -42,16 +42,6 @@ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES"> - - - - CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.matej.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index 689b7b7e8..fb4911a3e 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -165,7 +165,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = MB; - LastUpgradeCheck = 0630; + LastUpgradeCheck = 0700; ORGANIZATIONNAME = "Matej Bukovinski"; TargetAttributes = { 1D104D791ACA36CC00973364 = { @@ -246,6 +246,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.matej.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = MBProgressHUD; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -277,6 +278,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.matej.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = MBProgressHUD; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -301,6 +303,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; From 7391373de183d92dce6971ec4159ce7c2a21e6e7 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 14 Sep 2015 08:00:50 +0200 Subject: [PATCH 063/117] Exposed the framework scheme. --- .../MBProgressHUD Framework.xcscheme | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme diff --git a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme new file mode 100644 index 000000000..3093feaa9 --- /dev/null +++ b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 4f54a2fa6274e069ad67112f0cd64c5fad88b595 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 14 Sep 2015 08:18:12 +0200 Subject: [PATCH 064/117] Switching to Xcode 7. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 3a4a9281b..fb1d4aa5e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: objective-c +osx_image: xcode7 xcode_workspace: MBProgressHUD.xcworkspace xcode_scheme: HudDemo xcode_sdk: iphonesimulator From 66dfd14a984eda5e988fae3347967e576563ef20 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 14 Sep 2015 08:44:04 +0200 Subject: [PATCH 065/117] Grouping examples. --- Demo/Classes/MBHudDemoViewController.m | 40 ++++++++++++++------------ Demo/en.lproj/Main.storyboard | 6 ++-- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index 4ba3cba89..7e3042ab1 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -32,7 +32,7 @@ + (instancetype)exampleWithTitle:(NSString *)title selector:(SEL)selector { @interface MBHudDemoViewController () -@property (nonatomic, strong) NSArray *examples; +@property (nonatomic, strong) NSArray *> *examples; @end @@ -44,20 +44,20 @@ @implementation MBHudDemoViewController - (void)awakeFromNib { [super awakeFromNib]; self.examples = - @[[MBExample exampleWithTitle:@"Indeterminate progress" selector:@selector(simple)], - [MBExample exampleWithTitle:@"With label" selector:@selector(simple)], - [MBExample exampleWithTitle:@"With details label" selector:@selector(simple)], - [MBExample exampleWithTitle:@"Determinate mode" selector:@selector(simple)], - [MBExample exampleWithTitle:@"Annular determinate mode" selector:@selector(simple)], - [MBExample exampleWithTitle:@"Bar determinate mode" selector:@selector(simple)], - [MBExample exampleWithTitle:@"Custom view" selector:@selector(simple)], - [MBExample exampleWithTitle:@"Mode switching" selector:@selector(simple)], - [MBExample exampleWithTitle:@"Using blocks" selector:@selector(simple)], - [MBExample exampleWithTitle:@"On window" selector:@selector(simple)], - [MBExample exampleWithTitle:@"NSURLConnection" selector:@selector(simple)], - [MBExample exampleWithTitle:@"Dim background" selector:@selector(simple)], - [MBExample exampleWithTitle:@"Text only" selector:@selector(simple)], - [MBExample exampleWithTitle:@"Colored" selector:@selector(simple)]]; + @[@[[MBExample exampleWithTitle:@"Indeterminate mode" selector:@selector(simple)], + [MBExample exampleWithTitle:@"With label" selector:@selector(simple)], + [MBExample exampleWithTitle:@"With details label" selector:@selector(simple)], + [MBExample exampleWithTitle:@"On window" selector:@selector(simple)]], + @[[MBExample exampleWithTitle:@"Determinate mode" selector:@selector(simple)], + [MBExample exampleWithTitle:@"Annular determinate mode" selector:@selector(simple)], + [MBExample exampleWithTitle:@"Bar determinate mode" selector:@selector(simple)]], + @[[MBExample exampleWithTitle:@"Custom view" selector:@selector(simple)], + [MBExample exampleWithTitle:@"Text only" selector:@selector(simple)], + [MBExample exampleWithTitle:@"Mode switching" selector:@selector(simple)]], + @[[MBExample exampleWithTitle:@"NSURLConnection" selector:@selector(simple)]], + @[[MBExample exampleWithTitle:@"Dim background" selector:@selector(simple)], + [MBExample exampleWithTitle:@"Colored" selector:@selector(simple)]] + ]; } #pragma mark - Examples @@ -69,12 +69,16 @@ - (void)simple { #pragma mark - UITableViewDelegate -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return self.examples.count; } +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return self.examples[section].count; +} + - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - MBExample *example = self.examples[indexPath.row]; + MBExample *example = self.examples[indexPath.section][indexPath.row]; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MBExampleCell" forIndexPath:indexPath]; cell.textLabel.text = example.title; cell.textLabel.textColor = [UIColor colorWithRed:0.393f green:0.467f blue:0.572f alpha:1.f]; @@ -87,7 +91,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N #pragma mark - UITableViewDelegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - MBExample *example = self.examples[indexPath.row]; + MBExample *example = self.examples[indexPath.section][indexPath.row]; #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks" [self performSelector:example.selector]; diff --git a/Demo/en.lproj/Main.storyboard b/Demo/en.lproj/Main.storyboard index cefc1b4f1..c582ec644 100644 --- a/Demo/en.lproj/Main.storyboard +++ b/Demo/en.lproj/Main.storyboard @@ -9,15 +9,15 @@ - + - + - + From 72146210682998e3ad0f6449e6718e7083ef69ab Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 14 Sep 2015 08:46:58 +0200 Subject: [PATCH 066/117] Matching up launch storyboard background color. --- Demo/en.lproj/Launch.storyboard | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Demo/en.lproj/Launch.storyboard b/Demo/en.lproj/Launch.storyboard index b5298c762..d232745a9 100644 --- a/Demo/en.lproj/Launch.storyboard +++ b/Demo/en.lproj/Launch.storyboard @@ -34,7 +34,7 @@ - + From 789127c0e699197bc103e2edc09f2e3f2f7ebd72 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 14 Sep 2015 08:52:00 +0200 Subject: [PATCH 067/117] Global styling. --- Demo/Classes/MBHudDemoAppDelegate.m | 1 + Demo/Classes/MBHudDemoViewController.m | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Demo/Classes/MBHudDemoAppDelegate.m b/Demo/Classes/MBHudDemoAppDelegate.m index deea6839b..30779b567 100644 --- a/Demo/Classes/MBHudDemoAppDelegate.m +++ b/Demo/Classes/MBHudDemoAppDelegate.m @@ -13,6 +13,7 @@ @implementation MBHudDemoAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + self.window.tintColor = [UIColor colorWithRed:0.337 green:0.57 blue:0.731 alpha:1]; return YES; } diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index 7e3042ab1..9af64c1c9 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -81,7 +81,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N MBExample *example = self.examples[indexPath.section][indexPath.row]; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MBExampleCell" forIndexPath:indexPath]; cell.textLabel.text = example.title; - cell.textLabel.textColor = [UIColor colorWithRed:0.393f green:0.467f blue:0.572f alpha:1.f]; + cell.textLabel.textColor = self.view.tintColor; cell.textLabel.textAlignment = NSTextAlignmentCenter; cell.selectedBackgroundView = [UIView new]; cell.selectedBackgroundView.backgroundColor = [cell.textLabel.textColor colorWithAlphaComponent:0.5]; From 200c7393d62b8798d58c94421e141eab598ea448 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 14 Sep 2015 08:54:05 +0200 Subject: [PATCH 068/117] Adjusted selection color. --- Demo/Classes/MBHudDemoViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index 9af64c1c9..568bcdbcc 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -84,7 +84,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N cell.textLabel.textColor = self.view.tintColor; cell.textLabel.textAlignment = NSTextAlignmentCenter; cell.selectedBackgroundView = [UIView new]; - cell.selectedBackgroundView.backgroundColor = [cell.textLabel.textColor colorWithAlphaComponent:0.5]; + cell.selectedBackgroundView.backgroundColor = [cell.textLabel.textColor colorWithAlphaComponent:0.1f]; return cell; } From 1e276402b95c59f84641280b38dbe61eeab18911 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 14 Sep 2015 08:54:31 +0200 Subject: [PATCH 069/117] Matching floating point style. --- Demo/Classes/MBHudDemoAppDelegate.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Demo/Classes/MBHudDemoAppDelegate.m b/Demo/Classes/MBHudDemoAppDelegate.m index 30779b567..4b4b64b5d 100644 --- a/Demo/Classes/MBHudDemoAppDelegate.m +++ b/Demo/Classes/MBHudDemoAppDelegate.m @@ -13,7 +13,7 @@ @implementation MBHudDemoAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - self.window.tintColor = [UIColor colorWithRed:0.337 green:0.57 blue:0.731 alpha:1]; + self.window.tintColor = [UIColor colorWithRed:.337f green:.57f blue:.731f alpha:1.f]; return YES; } From bafe0e3d14d919ed8d763cd7d8ca9ea7a2c79639 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 14 Sep 2015 09:03:23 +0200 Subject: [PATCH 070/117] Improved and documented the indeterminate example. --- Demo/Classes/MBHudDemoViewController.m | 52 ++++++++++++++++++-------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index 568bcdbcc..1f7808cef 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -44,27 +44,49 @@ @implementation MBHudDemoViewController - (void)awakeFromNib { [super awakeFromNib]; self.examples = - @[@[[MBExample exampleWithTitle:@"Indeterminate mode" selector:@selector(simple)], - [MBExample exampleWithTitle:@"With label" selector:@selector(simple)], - [MBExample exampleWithTitle:@"With details label" selector:@selector(simple)], - [MBExample exampleWithTitle:@"On window" selector:@selector(simple)]], - @[[MBExample exampleWithTitle:@"Determinate mode" selector:@selector(simple)], - [MBExample exampleWithTitle:@"Annular determinate mode" selector:@selector(simple)], - [MBExample exampleWithTitle:@"Bar determinate mode" selector:@selector(simple)]], - @[[MBExample exampleWithTitle:@"Custom view" selector:@selector(simple)], - [MBExample exampleWithTitle:@"Text only" selector:@selector(simple)], - [MBExample exampleWithTitle:@"Mode switching" selector:@selector(simple)]], - @[[MBExample exampleWithTitle:@"NSURLConnection" selector:@selector(simple)]], - @[[MBExample exampleWithTitle:@"Dim background" selector:@selector(simple)], - [MBExample exampleWithTitle:@"Colored" selector:@selector(simple)]] + @[@[[MBExample exampleWithTitle:@"Indeterminate mode" selector:@selector(indeterminateExample)], + [MBExample exampleWithTitle:@"With label" selector:@selector(indeterminateExample)], + [MBExample exampleWithTitle:@"With details label" selector:@selector(indeterminateExample)], + [MBExample exampleWithTitle:@"On window" selector:@selector(indeterminateExample)]], + @[[MBExample exampleWithTitle:@"Determinate mode" selector:@selector(indeterminateExample)], + [MBExample exampleWithTitle:@"Annular determinate mode" selector:@selector(indeterminateExample)], + [MBExample exampleWithTitle:@"Bar determinate mode" selector:@selector(indeterminateExample)]], + @[[MBExample exampleWithTitle:@"Custom view" selector:@selector(indeterminateExample)], + [MBExample exampleWithTitle:@"Text only" selector:@selector(indeterminateExample)], + [MBExample exampleWithTitle:@"Mode switching" selector:@selector(indeterminateExample)]], + @[[MBExample exampleWithTitle:@"NSURLConnection" selector:@selector(indeterminateExample)]], + @[[MBExample exampleWithTitle:@"Dim background" selector:@selector(indeterminateExample)], + [MBExample exampleWithTitle:@"Colored" selector:@selector(indeterminateExample)]] ]; } #pragma mark - Examples -- (void)simple { +- (void)indeterminateExample { + // Show the HUD on the root view (self.view is a scrollable table view and thus not suitable, + // as the HUD would move with the content as we scroll). MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; - [hud hideAnimated:YES afterDelay:3.f]; + + // Fire off an asynchronous task, giving UIKit the opportunity to redraw wit the HUD added to the + // view hierarchy. + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + + // Do something useful in the background + [self doSomeWork]; + + // IMPORTANT - Dispatch back to the main thread. Always access UI + // classes (including MBProgressHUD) on the main thread. + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); +} + +#pragma mark - Tasks + +- (void)doSomeWork { + // Simulate by just waiting. + sleep(3.); } #pragma mark - UITableViewDelegate From f2361de0b66e9aa602238d43224d1a3c4fe306d0 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 14 Sep 2015 09:13:42 +0200 Subject: [PATCH 071/117] Added examples for the first section. --- Demo/Classes/MBHudDemoViewController.m | 47 ++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index 1f7808cef..8bd889f5e 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -45,8 +45,8 @@ - (void)awakeFromNib { [super awakeFromNib]; self.examples = @[@[[MBExample exampleWithTitle:@"Indeterminate mode" selector:@selector(indeterminateExample)], - [MBExample exampleWithTitle:@"With label" selector:@selector(indeterminateExample)], - [MBExample exampleWithTitle:@"With details label" selector:@selector(indeterminateExample)], + [MBExample exampleWithTitle:@"With label" selector:@selector(labelExample)], + [MBExample exampleWithTitle:@"With details label" selector:@selector(detailsLabelExample)], [MBExample exampleWithTitle:@"On window" selector:@selector(indeterminateExample)]], @[[MBExample exampleWithTitle:@"Determinate mode" selector:@selector(indeterminateExample)], [MBExample exampleWithTitle:@"Annular determinate mode" selector:@selector(indeterminateExample)], @@ -82,6 +82,49 @@ - (void)indeterminateExample { }); } +- (void)labelExample { + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set the label text. + hud.label.text = NSLocalizedString(@"Loading...", @"HUD title"); + // You can also adjust other label properties if needed. + // hud.label.font = [UIFont italicSystemFontOfSize:16.f]; + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + [self doSomeWork]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); +} + +- (void)detailsLabelExample { + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set the label text. + hud.label.text = NSLocalizedString(@"Loading...", @"HUD title"); + // Set the details label text. Let's make it multiline this time. + hud.detailsLabel.text = NSLocalizedString(@"Parsing data\n(1/1)", @"HUD title"); + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + [self doSomeWork]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); +} + +- (void)windowExample { + // Covers the entire screen. Similar to using the root view controller view. + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view.window animated:YES]; + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + [self doSomeWork]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); +} + #pragma mark - Tasks - (void)doSomeWork { From 951568b2c554c4960a70d2c8e56767ea283cd81a Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 14 Sep 2015 09:20:57 +0200 Subject: [PATCH 072/117] Determinate mode example. --- Demo/Classes/MBHudDemoViewController.m | 32 +++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index 8bd889f5e..f260db002 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -48,7 +48,7 @@ - (void)awakeFromNib { [MBExample exampleWithTitle:@"With label" selector:@selector(labelExample)], [MBExample exampleWithTitle:@"With details label" selector:@selector(detailsLabelExample)], [MBExample exampleWithTitle:@"On window" selector:@selector(indeterminateExample)]], - @[[MBExample exampleWithTitle:@"Determinate mode" selector:@selector(indeterminateExample)], + @[[MBExample exampleWithTitle:@"Determinate mode" selector:@selector(determinateExample)], [MBExample exampleWithTitle:@"Annular determinate mode" selector:@selector(indeterminateExample)], [MBExample exampleWithTitle:@"Bar determinate mode" selector:@selector(indeterminateExample)]], @[[MBExample exampleWithTitle:@"Custom view" selector:@selector(indeterminateExample)], @@ -125,6 +125,22 @@ - (void)windowExample { }); } +- (void)determinateExample { + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set the determinate mode to show task porgress. + hud.mode = MBProgressHUDModeDeterminate; + hud.label.text = NSLocalizedString(@"Loading...", @"HUD title"); + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + // Do something useful in the background and update the HUD periodically. + [self doSomeWorkWithProgress]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); +} + #pragma mark - Tasks - (void)doSomeWork { @@ -132,6 +148,20 @@ - (void)doSomeWork { sleep(3.); } +- (void)doSomeWorkWithProgress { + // This just increases the progress indicator in a loop. + float progress = 0.0f; + while (progress < 1.0f) { + progress += 0.01f; + dispatch_async(dispatch_get_main_queue(), ^{ + // Instead we could have also passed a reference to the HUD + // to the HUD to myProgressTask as a method parameter. + [MBProgressHUD HUDForView:self.navigationController.view].progress = progress; + }); + usleep(50000); + } +} + #pragma mark - UITableViewDelegate - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { From 019cae831440c15972048dd1653988ce2311405e Mon Sep 17 00:00:00 2001 From: Tobias Ottenweller Date: Sat, 19 Sep 2015 12:50:17 +0200 Subject: [PATCH 073/117] marked framework scheme as shared. --- .../MBProgressHUD Framework.xcscheme | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme diff --git a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme new file mode 100644 index 000000000..3093feaa9 --- /dev/null +++ b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 68b3c7480d1e49e4ed11a0c0f9db6ac9828a936a Mon Sep 17 00:00:00 2001 From: Andrey Filipenkov Date: Thu, 22 Oct 2015 15:33:46 +0200 Subject: [PATCH 074/117] fix compilation for tvOS --- MBProgressHUD.m | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 9fecbb532..cc6eae9c7 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -715,17 +715,22 @@ - (void)updateUIForKeypath:(NSString *)keyPath { #pragma mark - Notifications - (void)registerForNotifications { +#if !TARGET_OS_TV NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc addObserver:self selector:@selector(statusBarOrientationDidChange:) - name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; + name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; +#endif } - (void)unregisterFromNotifications { +#if !TARGET_OS_TV NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc removeObserver:self name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; + [nc removeObserver:self name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; +#endif } +#if !TARGET_OS_TV - (void)statusBarOrientationDidChange:(NSNotification *)notification { UIView *superview = self.superview; if (!superview) { @@ -734,6 +739,7 @@ - (void)statusBarOrientationDidChange:(NSNotification *)notification { [self updateForCurrentOrientationAnimated:YES]; } } +#endif - (void)updateForCurrentOrientationAnimated:(BOOL)animated { // Stay in sync with the superview in any case From dc5fe5a3a7b93d11a2446135643f46cc5d2f823c Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Fri, 30 Oct 2015 09:22:36 +0100 Subject: [PATCH 075/117] Added some more examples. --- Demo/Classes/MBHudDemoViewController.m | 179 ++++++++++++++++-- .../AppIcon.appiconset/Contents.json | 10 + Demo/Info.plist | 13 ++ MBProgressHUD.m | 5 +- 4 files changed, 194 insertions(+), 13 deletions(-) diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index f260db002..c455d58df 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -30,7 +30,7 @@ + (instancetype)exampleWithTitle:(NSString *)title selector:(SEL)selector { @end -@interface MBHudDemoViewController () +@interface MBHudDemoViewController () @property (nonatomic, strong) NSArray *> *examples; @@ -49,12 +49,12 @@ - (void)awakeFromNib { [MBExample exampleWithTitle:@"With details label" selector:@selector(detailsLabelExample)], [MBExample exampleWithTitle:@"On window" selector:@selector(indeterminateExample)]], @[[MBExample exampleWithTitle:@"Determinate mode" selector:@selector(determinateExample)], - [MBExample exampleWithTitle:@"Annular determinate mode" selector:@selector(indeterminateExample)], - [MBExample exampleWithTitle:@"Bar determinate mode" selector:@selector(indeterminateExample)]], - @[[MBExample exampleWithTitle:@"Custom view" selector:@selector(indeterminateExample)], - [MBExample exampleWithTitle:@"Text only" selector:@selector(indeterminateExample)], - [MBExample exampleWithTitle:@"Mode switching" selector:@selector(indeterminateExample)]], - @[[MBExample exampleWithTitle:@"NSURLConnection" selector:@selector(indeterminateExample)]], + [MBExample exampleWithTitle:@"Annular determinate mode" selector:@selector(annularDeterminateExample)], + [MBExample exampleWithTitle:@"Bar determinate mode" selector:@selector(barDeterminateExample)]], + @[[MBExample exampleWithTitle:@"Custom view" selector:@selector(customViewExample)], + [MBExample exampleWithTitle:@"Text only" selector:@selector(textExample)], + [MBExample exampleWithTitle:@"Mode switching" selector:@selector(modeSwitchingExample)]], + @[[MBExample exampleWithTitle:@"NSURLSession" selector:@selector(networkingExample)]], @[[MBExample exampleWithTitle:@"Dim background" selector:@selector(indeterminateExample)], [MBExample exampleWithTitle:@"Colored" selector:@selector(indeterminateExample)]] ]; @@ -86,7 +86,7 @@ - (void)labelExample { MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; // Set the label text. - hud.label.text = NSLocalizedString(@"Loading...", @"HUD title"); + hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); // You can also adjust other label properties if needed. // hud.label.font = [UIFont italicSystemFontOfSize:16.f]; @@ -102,7 +102,7 @@ - (void)detailsLabelExample { MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; // Set the label text. - hud.label.text = NSLocalizedString(@"Loading...", @"HUD title"); + hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); // Set the details label text. Let's make it multiline this time. hud.detailsLabel.text = NSLocalizedString(@"Parsing data\n(1/1)", @"HUD title"); @@ -128,9 +128,9 @@ - (void)windowExample { - (void)determinateExample { MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; - // Set the determinate mode to show task porgress. + // Set the determinate mode to show task progress. hud.mode = MBProgressHUDModeDeterminate; - hud.label.text = NSLocalizedString(@"Loading...", @"HUD title"); + hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ // Do something useful in the background and update the HUD periodically. @@ -141,6 +141,94 @@ - (void)determinateExample { }); } +- (void)annularDeterminateExample { + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set the annular determinate mode to show task progress. + hud.mode = MBProgressHUDModeAnnularDeterminate; + hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + // Do something useful in the background and update the HUD periodically. + [self doSomeWorkWithProgress]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); +} + +- (void)barDeterminateExample { + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set the bar determinate mode to show task progress. + hud.mode = MBProgressHUDModeDeterminateHorizontalBar; + hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + // Do something useful in the background and update the HUD periodically. + [self doSomeWorkWithProgress]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); +} + +- (void)customViewExample { + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set the custom view mode to show any view. + hud.mode = MBProgressHUDModeCustomView; + // Set an image view with a checkmark. + UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + hud.customView = [[UIImageView alloc] initWithImage:image]; + // Looks a bit nicer if we make it square. + hud.square = YES; + // Optional label text. + hud.label.text = NSLocalizedString(@"Done", @"HUD done title"); + + [hud hideAnimated:YES afterDelay:3.f]; +} + +- (void)textExample { + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set the annular determinate mode to show task progress. + hud.mode = MBProgressHUDModeText; + hud.label.text = NSLocalizedString(@"Message here!", @"HUD message title"); + // TODO: support large values + //hud.offset = CGPointMake(0.f, CGFLOAT_MAX); + + [hud hideAnimated:YES afterDelay:3.f]; +} + +- (void)modeSwitchingExample { + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set some text to show the initial status. + hud.label.text = NSLocalizedString(@"Preparing...", @"HUD preparing title"); + // Will look best, if we set a minimum size. + hud.minSize = CGSizeMake(150.f, 100.f); + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + // Do something useful in the background and update the HUD periodically. + [self doSomeWorkWithMixedProgress]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); +} + +- (void)networkingExample { + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set some text to show the initial status. + hud.label.text = NSLocalizedString(@"Preparing...", @"HUD preparing title"); + // Will look best, if we set a minimum size. + hud.minSize = CGSizeMake(150.f, 100.f); + + [self doSomeNetworkWorkWithProgress]; +} + #pragma mark - Tasks - (void)doSomeWork { @@ -162,6 +250,47 @@ - (void)doSomeWorkWithProgress { } } +- (void)doSomeWorkWithMixedProgress { + MBProgressHUD *hud = [MBProgressHUD HUDForView:self.navigationController.view]; + // Indeterminate mode + sleep(2); + // Switch to determinate mode + dispatch_async(dispatch_get_main_queue(), ^{ + hud.mode = MBProgressHUDModeDeterminate; + hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); + }); + float progress = 0.0f; + while (progress < 1.0f) { + progress += 0.01f; + dispatch_async(dispatch_get_main_queue(), ^{ + hud.progress = progress; + }); + usleep(50000); + } + // Back to indeterminate mode + dispatch_async(dispatch_get_main_queue(), ^{ + hud.mode = MBProgressHUDModeIndeterminate; + hud.label.text = NSLocalizedString(@"Cleaning up...", @"HUD cleanining up title"); + }); + sleep(2); + dispatch_sync(dispatch_get_main_queue(), ^{ + UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; + hud.customView = imageView; + hud.mode = MBProgressHUDModeCustomView; + hud.label.text = NSLocalizedString(@"Completed", @"HUD completed title"); + }); + sleep(2); +} + +- (void)doSomeNetworkWorkWithProgress { + NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; + NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil]; + NSURL *URL = [NSURL URLWithString:@"https://support.apple.com/library/APPLE/APPLECARE_ALLGEOS/HT1425/sample_iPod.m4v.zip"]; + NSURLSessionDownloadTask *task = [session downloadTaskWithURL:URL]; + [task resume]; +} + #pragma mark - UITableViewDelegate - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { @@ -197,4 +326,32 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath }); } +#pragma mark - NSURLSessionDelegate + +- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { + // Do something with the data at location... + + // Update the UI on the main thread + dispatch_async(dispatch_get_main_queue(), ^{ + MBProgressHUD *hud = [MBProgressHUD HUDForView:self.navigationController.view]; + UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; + hud.customView = imageView; + hud.mode = MBProgressHUDModeCustomView; + hud.label.text = NSLocalizedString(@"Completed", @"HUD completed title"); + [hud hideAnimated:YES afterDelay:3.f]; + }); +} + +- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { + float progress = (float)totalBytesWritten / (float)totalBytesExpectedToWrite; + + // Update the UI on the main thread + dispatch_async(dispatch_get_main_queue(), ^{ + MBProgressHUD *hud = [MBProgressHUD HUDForView:self.navigationController.view]; + hud.mode = MBProgressHUDModeDeterminate; + hud.progress = progress; + }); +} + @end diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Contents.json b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Contents.json index da7af1236..3fb11c367 100644 --- a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Contents.json @@ -12,12 +12,22 @@ "filename" : "Icon-Small@2x.png", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, { "size" : "40x40", "idiom" : "iphone", "filename" : "Icon-Small-40@2x.png", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, { "size" : "57x57", "idiom" : "iphone", diff --git a/Demo/Info.plist b/Demo/Info.plist index d11b218f8..66981dd3d 100644 --- a/Demo/Info.plist +++ b/Demo/Info.plist @@ -62,5 +62,18 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + NSAppTransportSecurity + + NSExceptionDomains + + akamai.net + + NSIncludesSubdomains + + NSTemporaryExceptionAllowsInsecureHTTPLoads + + + + diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 3bf5a5af6..f641f1efb 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -431,8 +431,9 @@ - (void)updateConstraints { // Center bezel in container (self) CGPoint offset = self.offset; - [self addConstraint:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.f constant:offset.x]]; - [self addConstraint:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.f constant:offset.y]]; + NSLayoutConstraint *xOffset = [NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.f constant:offset.x]; + NSLayoutConstraint *yOffset = [NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.f constant:offset.y]; + [self addConstraints:@[xOffset, yOffset]]; // Ensure minimum side margin is kept [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=margin)-[bezel]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(bezel)]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=margin)-[bezel]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(bezel)]]; From 4624d82d9a99f8eeceb5be0a9336cc299bbe189d Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Fri, 30 Oct 2015 09:23:16 +0100 Subject: [PATCH 076/117] Removed obsolete entry. --- Demo/Info.plist | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/Demo/Info.plist b/Demo/Info.plist index 66981dd3d..d11b218f8 100644 --- a/Demo/Info.plist +++ b/Demo/Info.plist @@ -62,18 +62,5 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - NSAppTransportSecurity - - NSExceptionDomains - - akamai.net - - NSIncludesSubdomains - - NSTemporaryExceptionAllowsInsecureHTTPLoads - - - - From 5b2fb4a8e8239844201c7b8f94cd93fe16f2e8a0 Mon Sep 17 00:00:00 2001 From: Rounak Date: Tue, 10 Nov 2015 16:15:42 -0800 Subject: [PATCH 077/117] fix typo --- MBProgressHUD.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 3ff015ef2..cfcbe5c51 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -434,7 +434,7 @@ typedef void (^MBProgressHUDCompletionBlock)(); /** * The actual size of the HUD bezel. - * You can use this to limit touch handling on the bezel aria only. + * You can use this to limit touch handling on the bezel area only. * @see https://github.com/jdg/MBProgressHUD/pull/200 */ @property (atomic, assign, readonly) CGSize size; From 47900134273608e5a58655968bdcbd13c29c3d93 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 23 Nov 2015 11:12:14 +0100 Subject: [PATCH 078/117] Fixed issues with overlapping alpha components. --- MBProgressHUD.m | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index f641f1efb..6c15cdfa2 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -743,11 +743,14 @@ - (void)drawRect:(CGRect)rect { UIBezierPath *processPath = [UIBezierPath bezierPath]; processPath.lineCapStyle = kCGLineCapButt; processPath.lineWidth = lineWidth * 2.f; - CGFloat radius = (CGRectGetWidth(self.bounds) / 2.f) - (processPath.lineWidth / 2.f) - lineWidth; + CGFloat radius = (CGRectGetWidth(self.bounds) / 2.f) - (processPath.lineWidth / 2.f); CGFloat endAngle = (self.progress * 2.f * (float)M_PI) + startAngle; [processPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; + // Ensure that we don't get color overlaping when _progressTintColor alpha < 1.f. + CGContextSetBlendMode(context, kCGBlendModeCopy); [_progressTintColor set]; [processPath stroke]; + } } } From 1db6c6d77cb114d8b26b5cff0d3b3c2a3fbc9387 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 23 Nov 2015 11:13:16 +0100 Subject: [PATCH 079/117] Formatting. --- MBProgressHUD.m | 1 - 1 file changed, 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 6c15cdfa2..394f07900 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -750,7 +750,6 @@ - (void)drawRect:(CGRect)rect { CGContextSetBlendMode(context, kCGBlendModeCopy); [_progressTintColor set]; [processPath stroke]; - } } } From 9204c36a3752b56a1c9f40b9e7b67557d1156dc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rok=20Gregoric=CC=8C?= Date: Fri, 27 Nov 2015 15:23:11 +0100 Subject: [PATCH 080/117] ActivityIndicatorColor should change progressTintColor for modes Determinate and AnnularDeterminate. --- MBProgressHUD.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index cc6eae9c7..4f51fee9d 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -507,7 +507,9 @@ - (void)updateIndicators { if (mode == MBProgressHUDModeAnnularDeterminate) { [(MBRoundProgressView *)indicator setAnnular:YES]; } - } + [(MBRoundProgressView *)indicator setProgressTintColor:self.activityIndicatorColor]; + [(MBRoundProgressView *)indicator setBackgroundTintColor:[self.activityIndicatorColor colorWithAlphaComponent:0.1f]]; + } else if (mode == MBProgressHUDModeCustomView && customView != indicator) { // Update custom view indicator [indicator removeFromSuperview]; From f303b71e945c96683a18c3852ecc2ccc3d659d11 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 5 Dec 2015 14:12:00 +0100 Subject: [PATCH 081/117] Removed separator. --- MBProgressHUD.m | 1 - 1 file changed, 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 394f07900..26ca5d789 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -932,7 +932,6 @@ - (instancetype)initWithFrame:(CGRect)frame { return self; } -/////////////////////////////////////////////////////////////////////////////////////////// #pragma mark - Appearance - (void)setStyle:(MBProgressHUDBackgroundStyle)style { From 82cbc6f6b09e428f061f239c77ab2115ac9f6b5b Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 5 Dec 2015 18:09:42 +0100 Subject: [PATCH 082/117] More powerful offset handling and improved autolayout constraints. --- Demo/Classes/MBHudDemoViewController.m | 4 +- MBProgressHUD.h | 6 ++- MBProgressHUD.m | 57 +++++++++++++++++++------- 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index c455d58df..0991564d4 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -195,8 +195,8 @@ - (void)textExample { // Set the annular determinate mode to show task progress. hud.mode = MBProgressHUDModeText; hud.label.text = NSLocalizedString(@"Message here!", @"HUD message title"); - // TODO: support large values - //hud.offset = CGPointMake(0.f, CGFLOAT_MAX); + // Move to bottm center. + hud.offset = CGPointMake(0.f, MBProgressMaxOffset); [hud hideAnimated:YES afterDelay:3.f]; } diff --git a/MBProgressHUD.h b/MBProgressHUD.h index cc83d3229..d0046e077 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -34,6 +34,8 @@ @protocol MBProgressHUDDelegate; +extern CGFloat const MBProgressMaxOffset; + typedef NS_ENUM(NSInteger, MBProgressHUDMode) { /// UIActivityIndicatorView. MBProgressHUDModeIndeterminate, @@ -213,7 +215,9 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { @property (assign, nonatomic) MBProgressHUDAnimation animationType UI_APPEARANCE_SELECTOR; /** - * The bezel offset relative to the centre of the view. + * The bezel offset relative to the center of the view. You can use MBProgressMaxOffset + * and -MBProgressMaxOffset to move the HUD all the way to the screen edge in each direction. + * E.g., CGPointMake(0.f, MBProgressMaxOffset) would position the HUD centered on the bottom edge. */ @property (assign, nonatomic) CGPoint offset UI_APPEARANCE_SELECTOR; diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 26ca5d789..a88733a59 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -18,6 +18,7 @@ #define MBMainThreadAssert() NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); +CGFloat const MBProgressMaxOffset = 1000000.f; static const CGFloat MBDefaultPadding = 4.f; static const CGFloat MBDefaultLabelFontSize = 16.f; @@ -429,29 +430,39 @@ - (void)updateConstraints { [self removeConstraints:self.constraints]; [bezel removeConstraints:bezel.constraints]; - // Center bezel in container (self) + // Bump content hugging, to get the smallest bezel posible + [bezel setContentHuggingPriority:UILayoutPriorityDefaultLow + 1 forAxis:UILayoutConstraintAxisHorizontal]; + [bezel setContentHuggingPriority:UILayoutPriorityDefaultLow + 1 forAxis:UILayoutConstraintAxisVertical]; + + // Center bezel in container (self), applying the offset if set CGPoint offset = self.offset; - NSLayoutConstraint *xOffset = [NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.f constant:offset.x]; - NSLayoutConstraint *yOffset = [NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.f constant:offset.y]; - [self addConstraints:@[xOffset, yOffset]]; + NSMutableArray *centeringConstraints = [NSMutableArray array]; + [centeringConstraints addObject:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.f constant:offset.x]]; + [centeringConstraints addObject:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.f constant:offset.y]]; + [self applyPriority:998.f toConstraints:centeringConstraints]; + [self addConstraints:centeringConstraints]; + // Ensure minimum side margin is kept - [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=margin)-[bezel]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(bezel)]]; - [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=margin)-[bezel]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(bezel)]]; + NSMutableArray *sideConstraints = [NSMutableArray array]; + [sideConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=margin)-[bezel]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(bezel)]]; + [sideConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=margin)-[bezel]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(bezel)]]; + [self applyPriority:999.f toConstraints:sideConstraints]; + [self addConstraints:sideConstraints]; // Minimum bezel size, if set CGSize minimumSize = self.minSize; if (!CGSizeEqualToSize(minimumSize, CGSizeZero)) { - NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.f constant:minimumSize.width]; - width.priority = 999.f; - NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.f constant:minimumSize.height]; - height.priority = 999.f; - [bezel addConstraints:@[width, height]]; + NSMutableArray *minSizeConstraints = [NSMutableArray array]; + [minSizeConstraints addObject:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.f constant:minimumSize.width]]; + [minSizeConstraints addObject:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.f constant:minimumSize.height]]; + [self applyPriority:997.f toConstraints:minSizeConstraints]; + [bezel addConstraints:minSizeConstraints]; } // Square aspect ratio, if set if (self.square) { NSLayoutConstraint *square = [NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeWidth multiplier:1.f constant:0]; - square.priority = 998.f; + square.priority = 997.f; [bezel addConstraint:square]; } @@ -484,6 +495,9 @@ - (void)updateConstraints { [bezel addConstraint:padding]; [paddingConstraints addObject:padding]; } + // Make it harder to compress items if the HUD is pushed off center + [view setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisHorizontal]; + [view setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisVertical]; }]; self.paddingConstraints = [paddingConstraints copy]; @@ -497,7 +511,7 @@ - (void)layoutSubviews { - (void)updatePaddingConstraints { // Set padding dynamically, depending on whether the view is visible or not - __block BOOL hasVisibleAnchestors = NO; + __block BOOL hasVisibleAncestors = NO; [self.paddingConstraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *padding, NSUInteger idx, BOOL *stop) { UIView *firstView = (UIView *)padding.firstItem; UIView *secondView = (UIView *)padding.secondItem; @@ -505,11 +519,17 @@ - (void)updatePaddingConstraints { BOOL secondVisible = !secondView.hidden && !CGSizeEqualToSize(secondView.intrinsicContentSize, CGSizeZero); // Set if both views are visible of if there's a visible view on top that yet doesn't have padding // added relative to the current view - padding.constant = (firstVisible && (secondVisible || hasVisibleAnchestors)) ? MBDefaultPadding : 0.f; - hasVisibleAnchestors |= secondVisible; + padding.constant = (firstVisible && (secondVisible || hasVisibleAncestors)) ? MBDefaultPadding : 0.f; + hasVisibleAncestors |= secondVisible; }]; } +- (void)applyPriority:(UILayoutPriority)priority toConstraints:(NSArray *)constraints { + for (NSLayoutConstraint *constraint in constraints) { + constraint.priority = priority; + } +} + #pragma mark - Properties - (void)setMode:(MBProgressHUDMode)mode { @@ -932,6 +952,13 @@ - (instancetype)initWithFrame:(CGRect)frame { return self; } +#pragma mark - Layout + +- (CGSize)intrinsicContentSize { + // Smallest size possible. Content pushes against this. + return CGSizeZero; +} + #pragma mark - Appearance - (void)setStyle:(MBProgressHUDBackgroundStyle)style { From a1302e953ad3a8dd1d8fde3785ee0837dec61e1d Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 5 Dec 2015 18:35:30 +0100 Subject: [PATCH 083/117] Added support for motion effects. --- MBProgressHUD.h | 6 ++++++ MBProgressHUD.m | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index d0046e077..1a8d2eb26 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -238,6 +238,12 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { */ @property (assign, nonatomic, getter = isSquare) BOOL square UI_APPEARANCE_SELECTOR; +/** + * When enabled, the bezel center gets slightly affected by the device accelerometer data. + * Has no effect on iOS < 7.0. Defaults to YES. + */ +@property (assign, nonatomic, getter=areDefaultMotionEffectsEnabled) BOOL defaultMotionEffectsEnabled UI_APPEARANCE_SELECTOR; + /// @name Progress /** diff --git a/MBProgressHUD.m b/MBProgressHUD.m index a88733a59..685bac272 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -89,6 +89,7 @@ - (instancetype)initWithFrame:(CGRect)frame { _mode = MBProgressHUDModeIndeterminate; _margin = 20.0f; _opacity = 1.f; + _defaultMotionEffectsEnabled = YES; // Default color, depending on the current iOS version BOOL isLegacy = kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0; @@ -293,6 +294,7 @@ - (void)setupViews { bezelView.alpha = 0.f; [self addSubview:bezelView]; _bezelView = bezelView; + [self updateBezelMotionEffects]; UILabel *label = [UILabel new]; label.translatesAutoresizingMaskIntoConstraints = NO; @@ -414,6 +416,34 @@ - (void)updateViewsForColor:(UIColor *)color { } } +- (void)updateBezelMotionEffects { +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 + MBBackgroundView *bezelView = self.bezelView; + if (![bezelView respondsToSelector:@selector(addMotionEffect:)]) return; + + if (self.defaultMotionEffectsEnabled) { + CGFloat effectOffset = 10.f; + UIInterpolatingMotionEffect *effectX = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis]; + effectX.maximumRelativeValue = @(effectOffset); + effectX.minimumRelativeValue = @(-effectOffset); + + UIInterpolatingMotionEffect *effectY = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y" type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis]; + effectY.maximumRelativeValue = @(effectOffset); + effectY.minimumRelativeValue = @(-effectOffset); + + UIMotionEffectGroup *group = [[UIMotionEffectGroup alloc] init]; + group.motionEffects = @[effectX, effectY]; + + [bezelView addMotionEffect:group]; + } else { + NSArray *effects = [bezelView motionEffects]; + for (UIMotionEffect *effect in effects) { + [bezelView removeMotionEffect:effect]; + } + } +#endif +} + #pragma mark - Layout - (void)updateConstraints { @@ -593,6 +623,13 @@ - (void)setContentColor:(UIColor *)contentColor { } } +- (void)setDefaultMotionEffectsEnabled:(BOOL)defaultMotionEffectsEnabled { + if (defaultMotionEffectsEnabled != _defaultMotionEffectsEnabled) { + _defaultMotionEffectsEnabled = defaultMotionEffectsEnabled; + [self updateBezelMotionEffects]; + } +} + #pragma mark - Notifications - (void)registerForNotifications { From dec9671f700109f3e0858ad66c20f5224697d4be Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 5 Dec 2015 18:51:38 +0100 Subject: [PATCH 084/117] Setting the compression factors when first creating the views. --- MBProgressHUD.m | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 685bac272..f8a0e1ae3 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -304,9 +304,11 @@ - (void)setupViews { label.backgroundColor = [UIColor clearColor]; label.textColor = defaultColor; label.font = [UIFont boldSystemFontOfSize:MBDefaultLabelFontSize];; + [label setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisHorizontal]; + [label setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisVertical]; [bezelView addSubview:label]; _label = label; - + UILabel *detailsLabel = [UILabel new]; detailsLabel.translatesAutoresizingMaskIntoConstraints = NO; detailsLabel.adjustsFontSizeToFitWidth = NO; @@ -316,6 +318,8 @@ - (void)setupViews { detailsLabel.textColor = defaultColor; detailsLabel.numberOfLines = 0; detailsLabel.font = [UIFont boldSystemFontOfSize:MBDefaultDetailsLabelFontSize]; + [detailsLabel setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisHorizontal]; + [detailsLabel setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisVertical]; [bezelView addSubview:detailsLabel]; _detailsLabel = detailsLabel; @@ -381,6 +385,9 @@ - (void)updateIndicators { [(id)indicator setValue:@(self.progress) forKey:@"progress"]; } + [indicator setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisHorizontal]; + [indicator setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisVertical]; + [self updateViewsForColor:self.contentColor]; [self setNeedsUpdateConstraints]; } @@ -525,9 +532,6 @@ - (void)updateConstraints { [bezel addConstraint:padding]; [paddingConstraints addObject:padding]; } - // Make it harder to compress items if the HUD is pushed off center - [view setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisHorizontal]; - [view setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisVertical]; }]; self.paddingConstraints = [paddingConstraints copy]; From 2a2f1598e809b1d2423c3a3a1d676f845c2b3632 Mon Sep 17 00:00:00 2001 From: Valeriy Van Date: Sat, 12 Dec 2015 17:18:19 +0200 Subject: [PATCH 085/117] Typo fixed. --- MBProgressHUD.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 4f51fee9d..996b1cb83 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -533,7 +533,7 @@ - (void)layoutSubviews { } CGRect bounds = self.bounds; - // Determine the total widt and height needed + // Determine the total width and height needed CGFloat maxWidth = bounds.size.width - 4 * margin; CGSize totalSize = CGSizeZero; From 93c69582423da38ee5925d4f09a010ab8b7b7e45 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Tue, 22 Dec 2015 08:34:36 +0100 Subject: [PATCH 086/117] Touched by Xcode. --- Demo/HudDemo.xcodeproj/project.pbxproj | 7 ++++++- .../xcshareddata/xcschemes/HudDemo.xcscheme | 13 ++++++++----- Demo/HudTests/Info.plist | 2 +- Demo/Info.plist | 2 +- .../xcschemes/MBProgressHUD Framework.xcscheme | 2 +- .../xcshareddata/xcschemes/MBProgressHUD.xcscheme | 13 ++++++++----- 6 files changed, 25 insertions(+), 14 deletions(-) diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index 2fdf39504..cda9aaf88 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -261,7 +261,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = MB; - LastUpgradeCheck = 0630; + LastUpgradeCheck = 0720; ORGANIZATIONNAME = "Matej Bukovinski"; TargetAttributes = { D28CBB2C1A87A45A0052DCEC = { @@ -382,6 +382,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = HudDemo_Prefix.pch; INFOPLIST_FILE = Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = HudDemo; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -395,6 +396,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = HudDemo_Prefix.pch; INFOPLIST_FILE = Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = HudDemo; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -413,6 +415,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; @@ -484,6 +487,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HudDemo.app/HudDemo"; }; @@ -513,6 +517,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HudDemo.app/HudDemo"; VALIDATE_PRODUCT = YES; diff --git a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme index 3e25c0eea..5e5c0b4cf 100644 --- a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme +++ b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme @@ -1,6 +1,6 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> @@ -62,17 +62,20 @@ ReferencedContainer = "container:HudDemo.xcodeproj"> + + @@ -90,10 +93,10 @@ diff --git a/Demo/HudTests/Info.plist b/Demo/HudTests/Info.plist index fc755afa6..ba72822e8 100644 --- a/Demo/HudTests/Info.plist +++ b/Demo/HudTests/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.bukovinski.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/Demo/Info.plist b/Demo/Info.plist index bbbffe1fc..2ae77bf5d 100644 --- a/Demo/Info.plist +++ b/Demo/Info.plist @@ -18,7 +18,7 @@ Icon@2x.png CFBundleIdentifier - com.bukovinski.${PRODUCT_NAME:identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme index 3093feaa9..4820e0310 100644 --- a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme +++ b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme @@ -1,6 +1,6 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> + + Date: Tue, 22 Dec 2015 08:35:33 +0100 Subject: [PATCH 087/117] Version bump. --- MBProgressHUD.h | 2 +- MBProgressHUD.m | 2 +- MBProgressHUD.podspec | 2 +- README.mdown | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index cfcbe5c51..40e71a9b2 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -1,6 +1,6 @@ // // MBProgressHUD.h -// Version 0.9.1 +// Version 0.9.2 // Created by Matej Bukovinski on 2.4.09. // diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 996b1cb83..bf5f7fff1 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -1,6 +1,6 @@ // // MBProgressHUD.m -// Version 0.9.1 +// Version 0.9.2 // Created by Matej Bukovinski on 2.4.09. // diff --git a/MBProgressHUD.podspec b/MBProgressHUD.podspec index 40f188826..afbd61087 100644 --- a/MBProgressHUD.podspec +++ b/MBProgressHUD.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "MBProgressHUD" - s.version = "0.9.1" + s.version = "0.9.2" s.summary = "An iOS activity indicator view." s.description = <<-DESC MBProgressHUD is an iOS drop-in class that displays a translucent HUD diff --git a/README.mdown b/README.mdown index 29d76ce9a..df9675675 100644 --- a/README.mdown +++ b/README.mdown @@ -26,7 +26,7 @@ You will need the latest developer tools in order to build MBProgressHUD. Old Xc [CocoaPods](http://cocoapods.org) is the recommended way to add MBProgressHUD to your project. -1. Add a pod entry for MBProgressHUD to your Podfile `pod 'MBProgressHUD', '~> 0.9.1'` +1. Add a pod entry for MBProgressHUD to your Podfile `pod 'MBProgressHUD', '~> 0.9.2'` 2. Install the pod(s) by running `pod install`. 3. Include MBProgressHUD wherever you need it with `#import "MBProgressHUD.h"`. From fbb5141587243bdaebc8baf349131250cca7404a Mon Sep 17 00:00:00 2001 From: Aral Balkan Date: Tue, 22 Dec 2015 12:58:05 +0000 Subject: [PATCH 088/117] Updated the readme to add installation instructions and badge for Carthage support. Also added badges for Cocoapods support and the license. --- README.mdown | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/README.mdown b/README.mdown index df9675675..fa9190e9f 100644 --- a/README.mdown +++ b/README.mdown @@ -1,6 +1,8 @@ -# MBProgressHUD [![Build Status](https://travis-ci.org/matej/MBProgressHUD.svg?branch=master)](https://travis-ci.org/matej/MBProgressHUD) +# MBProgressHUD -MBProgressHUD is an iOS drop-in class that displays a translucent HUD with an indicator and/or labels while work is being done in a background thread. The HUD is meant as a replacement for the undocumented, private UIKit UIProgressHUD with some additional features. +[![Build Status](https://travis-ci.org/matej/MBProgressHUD.svg?branch=master)](https://travis-ci.org/matej/MBProgressHUD) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application) [![Cocoapods compatible](https://img.shields.io/cocoapods/v/MBProgressHUD.svg?style=flat)](https://cocoapods.org/pods/MBProgressHUD) [![License: MIT](https://img.shields.io/cocoapods/l/MBProgressHUD.svg?style=flat)](http://opensource.org/licenses/MIT) + +MBProgressHUD is an iOS drop-in class that displays a translucent HUD with an indicator and/or labels while work is being done in a background thread. The HUD is meant as a replacement for the undocumented, private UIKit UIProgressHUD with some additional features. [![](http://dl.dropbox.com/u/378729/MBProgressHUD/1-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/1.png) [![](http://dl.dropbox.com/u/378729/MBProgressHUD/2-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/2.png) @@ -30,26 +32,32 @@ You will need the latest developer tools in order to build MBProgressHUD. Old Xc 2. Install the pod(s) by running `pod install`. 3. Include MBProgressHUD wherever you need it with `#import "MBProgressHUD.h"`. +### Carthage + +1. Add MBProgressHUD to your Cartfile. e.g., `github "jdg/MBProgressHUD" ~> 0.9.2` +2. Run `carthage update` +3. Follow the rest of the [standard Carthage installation instructions](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application) to add MBProgressHUD to your project. + ### Source files Alternatively you can directly add the `MBProgressHUD.h` and `MBProgressHUD.m` source files to your project. -1. Download the [latest code version](https://github.com/matej/MBProgressHUD/archive/master.zip) or add the repository as a git submodule to your git-tracked project. -2. Open your project in Xcode, then drag and drop `MBProgressHUD.h` and `MBProgressHUD.m` onto your project (use the "Product Navigator view"). Make sure to select Copy items when asked if you extracted the code archive outside of your project. +1. Download the [latest code version](https://github.com/matej/MBProgressHUD/archive/master.zip) or add the repository as a git submodule to your git-tracked project. +2. Open your project in Xcode, then drag and drop `MBProgressHUD.h` and `MBProgressHUD.m` onto your project (use the "Product Navigator view"). Make sure to select Copy items when asked if you extracted the code archive outside of your project. 3. Include MBProgressHUD wherever you need it with `#import "MBProgressHUD.h"`. ### Static library -You can also add MBProgressHUD as a static library to your project or workspace. +You can also add MBProgressHUD as a static library to your project or workspace. -1. Download the [latest code version](https://github.com/matej/MBProgressHUD/downloads) or add the repository as a git submodule to your git-tracked project. -2. Open your project in Xcode, then drag and drop `MBProgressHUD.xcodeproj` onto your project or workspace (use the "Product Navigator view"). -3. Select your target and go to the Build phases tab. In the Link Binary With Libraries section select the add button. On the sheet find and add `libMBProgressHUD.a`. You might also need to add `MBProgressHUD` to the Target Dependencies list. +1. Download the [latest code version](https://github.com/matej/MBProgressHUD/downloads) or add the repository as a git submodule to your git-tracked project. +2. Open your project in Xcode, then drag and drop `MBProgressHUD.xcodeproj` onto your project or workspace (use the "Product Navigator view"). +3. Select your target and go to the Build phases tab. In the Link Binary With Libraries section select the add button. On the sheet find and add `libMBProgressHUD.a`. You might also need to add `MBProgressHUD` to the Target Dependencies list. 4. Include MBProgressHUD wherever you need it with `#import `. ## Usage -The main guideline you need to follow when dealing with MBProgressHUD while running long-running tasks is keeping the main thread work-free, so the UI can be updated promptly. The recommended way of using MBProgressHUD is therefore to set it up on the main thread and then spinning the task, that you want to perform, off onto a new thread. +The main guideline you need to follow when dealing with MBProgressHUD while running long-running tasks is keeping the main thread work-free, so the UI can be updated promptly. The recommended way of using MBProgressHUD is therefore to set it up on the main thread and then spinning the task, that you want to perform, off onto a new thread. ```objective-c [MBProgressHUD showHUDAddedTo:self.view animated:YES]; @@ -61,7 +69,7 @@ dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ }); ``` -If you need to configure the HUD you can do this by using the MBProgressHUD reference that showHUDAddedTo:animated: returns. +If you need to configure the HUD you can do this by using the MBProgressHUD reference that showHUDAddedTo:animated: returns. ```objective-c MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; @@ -94,8 +102,8 @@ For more examples, including how to use MBProgressHUD with asynchronous operatio ## License -This code is distributed under the terms and conditions of the [MIT license](LICENSE). +This code is distributed under the terms and conditions of the [MIT license](LICENSE). ## Change-log -A brief summary of each MBProgressHUD release can be found on the [wiki](https://github.com/matej/MBProgressHUD/wiki/Change-log). +A brief summary of each MBProgressHUD release can be found on the [wiki](https://github.com/matej/MBProgressHUD/wiki/Change-log). From 0b43a40bc6797b6de733c83ac32735203e63b8bf Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Tue, 29 Dec 2015 16:15:56 +0100 Subject: [PATCH 089/117] Added additional icons. --- .../AppIcon.appiconset/Contents.json | 12 ++++++++++-- .../AppIcon.appiconset/Icon-167.png | Bin 0 -> 470878 bytes .../AppIcon.appiconset/Icon-Small-40@3x.png | Bin 0 -> 468760 bytes .../AppIcon.appiconset/Icon-Small@3x.png | Bin 0 -> 467119 bytes 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-167.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Contents.json b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Contents.json index 3fb11c367..7110beb82 100644 --- a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Contents.json @@ -13,8 +13,9 @@ "scale" : "2x" }, { - "idiom" : "iphone", "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-Small@3x.png", "scale" : "3x" }, { @@ -24,8 +25,9 @@ "scale" : "2x" }, { - "idiom" : "iphone", "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-Small-40@3x.png", "scale" : "3x" }, { @@ -111,6 +113,12 @@ "idiom" : "ipad", "filename" : "Icon-76@2x.png", "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-167.png", + "scale" : "2x" } ], "info" : { diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-167.png b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-167.png new file mode 100644 index 0000000000000000000000000000000000000000..42842994409f753381d21865efde33b73b6b7818 GIT binary patch literal 470878 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 literal 0 HcmV?d00001 diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4f32b2d977a985dbf4503078a0ec2a8c73509dd7 GIT binary patch literal 468760 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

IWFE&Nw|IliXeU$G^dt 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%0AE3O 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μ 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 I*}ca6FE%(PasU7T literal 0 HcmV?d00001 From fdff68e52853984f16a3678981f4a887eb7ffef3 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Tue, 29 Dec 2015 21:28:01 +0100 Subject: [PATCH 090/117] Added a button element and cancelation example. --- Demo/Classes/MBHudDemoViewController.m | 28 +++++++++ Demo/en.lproj/Main.storyboard | 10 +--- MBProgressHUD.h | 5 ++ MBProgressHUD.m | 80 +++++++++++++++++++++----- 4 files changed, 103 insertions(+), 20 deletions(-) diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index 0991564d4..2800f0475 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -33,6 +33,7 @@ + (instancetype)exampleWithTitle:(NSString *)title selector:(SEL)selector { @interface MBHudDemoViewController () @property (nonatomic, strong) NSArray *> *examples; +@property (nonatomic, assign) BOOL canceled; @end @@ -53,6 +54,7 @@ - (void)awakeFromNib { [MBExample exampleWithTitle:@"Bar determinate mode" selector:@selector(barDeterminateExample)]], @[[MBExample exampleWithTitle:@"Custom view" selector:@selector(customViewExample)], [MBExample exampleWithTitle:@"Text only" selector:@selector(textExample)], + [MBExample exampleWithTitle:@"Cancel button" selector:@selector(cancelationExample)], [MBExample exampleWithTitle:@"Mode switching" selector:@selector(modeSwitchingExample)]], @[[MBExample exampleWithTitle:@"NSURLSession" selector:@selector(networkingExample)]], @[[MBExample exampleWithTitle:@"Dim background" selector:@selector(indeterminateExample)], @@ -201,6 +203,26 @@ - (void)textExample { [hud hideAnimated:YES afterDelay:3.f]; } +- (void)cancelationExample { + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set the determinate mode to show task progress. + hud.mode = MBProgressHUDModeDeterminate; + hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); + + // Configure the button. + [hud.button setTitle:NSLocalizedString(@"Cancel", @"HUD cancel button title") forState:UIControlStateNormal]; + [hud.button addTarget:self action:@selector(cancelWork:) forControlEvents:UIControlEventTouchUpInside]; + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + // Do something useful in the background and update the HUD periodically. + [self doSomeWorkWithProgress]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); +} + - (void)modeSwitchingExample { MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; @@ -237,9 +259,11 @@ - (void)doSomeWork { } - (void)doSomeWorkWithProgress { + self.canceled = NO; // This just increases the progress indicator in a loop. float progress = 0.0f; while (progress < 1.0f) { + if (self.canceled) break; progress += 0.01f; dispatch_async(dispatch_get_main_queue(), ^{ // Instead we could have also passed a reference to the HUD @@ -291,6 +315,10 @@ - (void)doSomeNetworkWorkWithProgress { [task resume]; } +- (void)cancelWork:(id)sender { + self.canceled = YES; +} + #pragma mark - UITableViewDelegate - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { diff --git a/Demo/en.lproj/Main.storyboard b/Demo/en.lproj/Main.storyboard index c582ec644..ce0a44e20 100644 --- a/Demo/en.lproj/Main.storyboard +++ b/Demo/en.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + @@ -12,7 +12,6 @@ - @@ -20,11 +19,9 @@ - + - - @@ -46,7 +43,6 @@ - diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 1a8d2eb26..e42d03616 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -280,6 +280,11 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { */ @property (strong, nonatomic, readonly) UILabel *detailsLabel; +/** + * A button that is placed below the labels. Visible only if a target / action is added. + */ +@property (strong, nonatomic, readonly) UIButton *button; + @end diff --git a/MBProgressHUD.m b/MBProgressHUD.m index f8a0e1ae3..d8cf2c3ab 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -48,6 +48,10 @@ @interface MBProgressHUD () { @end +@interface MBProgressHUDRoundedButton : UIButton +@end + + @implementation MBProgressHUD #pragma mark - Class methods @@ -297,32 +301,33 @@ - (void)setupViews { [self updateBezelMotionEffects]; UILabel *label = [UILabel new]; - label.translatesAutoresizingMaskIntoConstraints = NO; label.adjustsFontSizeToFitWidth = NO; label.textAlignment = NSTextAlignmentCenter; - label.opaque = NO; - label.backgroundColor = [UIColor clearColor]; label.textColor = defaultColor; label.font = [UIFont boldSystemFontOfSize:MBDefaultLabelFontSize];; - [label setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisHorizontal]; - [label setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisVertical]; - [bezelView addSubview:label]; _label = label; UILabel *detailsLabel = [UILabel new]; - detailsLabel.translatesAutoresizingMaskIntoConstraints = NO; detailsLabel.adjustsFontSizeToFitWidth = NO; detailsLabel.textAlignment = NSTextAlignmentCenter; - detailsLabel.opaque = NO; - detailsLabel.backgroundColor = [UIColor clearColor]; detailsLabel.textColor = defaultColor; detailsLabel.numberOfLines = 0; detailsLabel.font = [UIFont boldSystemFontOfSize:MBDefaultDetailsLabelFontSize]; - [detailsLabel setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisHorizontal]; - [detailsLabel setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisVertical]; - [bezelView addSubview:detailsLabel]; _detailsLabel = detailsLabel; + UIButton *button = [MBProgressHUDRoundedButton buttonWithType:UIButtonTypeCustom]; + button.titleLabel.textAlignment = NSTextAlignmentCenter; + button.titleLabel.font = [UIFont boldSystemFontOfSize:MBDefaultDetailsLabelFontSize]; + [button setTitleColor:defaultColor forState:UIControlStateNormal]; + _button = button; + + for (UIView *view in @[label, detailsLabel, button]) { + view.translatesAutoresizingMaskIntoConstraints = NO; + [view setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisHorizontal]; + [view setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisVertical]; + [bezelView addSubview:view]; + } + UIView *topSpacer = [UIView new]; topSpacer.translatesAutoresizingMaskIntoConstraints = NO; topSpacer.hidden = YES; @@ -397,6 +402,7 @@ - (void)updateViewsForColor:(UIColor *)color { self.label.textColor = color; self.detailsLabel.textColor = color; + [self.button setTitleColor:color forState:UIControlStateNormal]; #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" @@ -460,7 +466,7 @@ - (void)updateConstraints { CGFloat margin = self.margin; NSDictionary *metrics = @{@"margin": @(margin)}; - NSMutableArray *subviews = [NSMutableArray arrayWithObjects:self.topSpacer, self.label, self.detailsLabel, self.bottomSpacer, nil]; + NSMutableArray *subviews = [NSMutableArray arrayWithObjects:self.topSpacer, self.label, self.detailsLabel, self.button, self.bottomSpacer, nil]; if (self.indicator) [subviews insertObject:self.indicator atIndex:1]; // Remove existing constraintes @@ -1290,3 +1296,51 @@ - (void)setActivityIndicatorColor:(UIColor *)activityIndicatorColor { } @end + +@implementation MBProgressHUDRoundedButton + +#pragma mark - Lifecycle + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + CALayer *layer = self.layer; + layer.borderWidth = 1.f; + } + return self; +} + +#pragma mark - Layout + +- (void)layoutSubviews { + [super layoutSubviews]; + // Fully rounded corners. + CGFloat height = CGRectGetHeight(self.bounds); + self.layer.cornerRadius = ceil(height / 2.f); +} + +- (CGSize)intrinsicContentSize { + // Only show, if we have associated control events. + if (self.allControlEvents == 0) return CGSizeZero; + CGSize size = [super intrinsicContentSize]; + // Add some side padding. + size.width += 20.f; + return size; +} + +#pragma mark - Color + +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + [super setTitleColor:color forState:state]; + // Update related colors. + [self setHighlighted:self.highlighted]; + self.layer.borderColor = color.CGColor; +} + +- (void)setHighlighted:(BOOL)highlighted { + [super setHighlighted:highlighted]; + UIColor *baseColor = [self titleColorForState:UIControlStateSelected]; + self.backgroundColor = highlighted ? [baseColor colorWithAlphaComponent:0.1f] : [UIColor clearColor]; +} + +@end From 323efb5ffd8f98abbe62adcf899c3ce21d73807b Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Wed, 30 Dec 2015 09:05:19 +0100 Subject: [PATCH 091/117] Re-arranged examples. --- Demo/Classes/MBHudDemoViewController.m | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index 2800f0475..60cced4f3 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -47,17 +47,17 @@ - (void)awakeFromNib { self.examples = @[@[[MBExample exampleWithTitle:@"Indeterminate mode" selector:@selector(indeterminateExample)], [MBExample exampleWithTitle:@"With label" selector:@selector(labelExample)], - [MBExample exampleWithTitle:@"With details label" selector:@selector(detailsLabelExample)], - [MBExample exampleWithTitle:@"On window" selector:@selector(indeterminateExample)]], + [MBExample exampleWithTitle:@"With details label" selector:@selector(detailsLabelExample)]], @[[MBExample exampleWithTitle:@"Determinate mode" selector:@selector(determinateExample)], [MBExample exampleWithTitle:@"Annular determinate mode" selector:@selector(annularDeterminateExample)], [MBExample exampleWithTitle:@"Bar determinate mode" selector:@selector(barDeterminateExample)]], - @[[MBExample exampleWithTitle:@"Custom view" selector:@selector(customViewExample)], - [MBExample exampleWithTitle:@"Text only" selector:@selector(textExample)], - [MBExample exampleWithTitle:@"Cancel button" selector:@selector(cancelationExample)], + @[[MBExample exampleWithTitle:@"Text only" selector:@selector(textExample)], + [MBExample exampleWithTitle:@"Custom view" selector:@selector(customViewExample)], + [MBExample exampleWithTitle:@"With action button" selector:@selector(cancelationExample)], [MBExample exampleWithTitle:@"Mode switching" selector:@selector(modeSwitchingExample)]], - @[[MBExample exampleWithTitle:@"NSURLSession" selector:@selector(networkingExample)]], - @[[MBExample exampleWithTitle:@"Dim background" selector:@selector(indeterminateExample)], + @[[MBExample exampleWithTitle:@"On window" selector:@selector(indeterminateExample)], + [MBExample exampleWithTitle:@"NSURLSession" selector:@selector(networkingExample)], + [MBExample exampleWithTitle:@"Dim background" selector:@selector(indeterminateExample)], [MBExample exampleWithTitle:@"Colored" selector:@selector(indeterminateExample)]] ]; } From 1df8d5dde55571f338b9758eaf52492b1c14c15b Mon Sep 17 00:00:00 2001 From: nsgeek Date: Wed, 20 Jan 2016 21:44:51 -0800 Subject: [PATCH 092/117] CB-4842: adjustments for walmart-ios-shared as framework --- MBProgressHUD.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index e7bfe5690..07362d5af 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -4,9 +4,9 @@ // Created by Matej Bukovinski on 2.4.09. // -#import "MBProgressHUD.h" #import - +#import +#import "MBProgressHUD.h" #if __has_feature(objc_arc) #define MB_AUTORELEASE(exp) exp From 29601420180d861961c6c95d3a6e9df3449a66e2 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 31 Jan 2016 14:30:30 +0100 Subject: [PATCH 093/117] Added some initial tests. --- Demo/HudDemo.xcodeproj/project.pbxproj | 164 ++++++++++++++++++++++--- Demo/HudTests/HudTests.m | 105 +++++++++++++--- 2 files changed, 235 insertions(+), 34 deletions(-) diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index 1886b2e61..ac93f79b5 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -14,11 +14,22 @@ 28D7ACF80DDB3853001CB0EB /* MBHudDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* MBHudDemoViewController.m */; }; D22F7D810F85241C00550BB3 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D22F7D800F85241C00550BB3 /* MBProgressHUD.m */; }; D286A76D1518CA9F00E13FB8 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D286A76C1518CA9F00E13FB8 /* CoreGraphics.framework */; }; + D2B174121C5E3A3D00021915 /* HudTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D2B174111C5E3A3D00021915 /* HudTests.m */; }; D2BC092F1BA587FB00589A7C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D2BC09311BA587FB00589A7C /* Main.storyboard */; }; D2EEB37B1B558F0900F59EC1 /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D2EEB3791B558F0900F59EC1 /* Launch.storyboard */; }; D2EEB3811B55967200F59EC1 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D2EEB3801B55967200F59EC1 /* Images.xcassets */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + D2B174141C5E3A3D00021915 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1D6058900D05DD3D006BFB54; + remoteInfo = HudDemo; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 1D3623240D0F684500981E51 /* MBHudDemoAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MBHudDemoAppDelegate.h; sourceTree = ""; }; @@ -33,8 +44,9 @@ D22F7D7F0F85241C00550BB3 /* MBProgressHUD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MBProgressHUD.h; path = ../MBProgressHUD.h; sourceTree = SOURCE_ROOT; }; D22F7D800F85241C00550BB3 /* MBProgressHUD.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MBProgressHUD.m; path = ../MBProgressHUD.m; sourceTree = ""; }; D286A76C1518CA9F00E13FB8 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - D28CBB301A87A45A0052DCEC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - D28CBB311A87A45A0052DCEC /* HudTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HudTests.m; sourceTree = ""; }; + D2B1740F1C5E3A3D00021915 /* HudTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HudTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + D2B174111C5E3A3D00021915 /* HudTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HudTests.m; sourceTree = ""; }; + D2B174131C5E3A3D00021915 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; D2BC09301BA587FB00589A7C /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/Main.storyboard; sourceTree = ""; }; D2EEB37A1B558F0900F59EC1 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/Launch.storyboard; sourceTree = ""; }; D2EEB3801B55967200F59EC1 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = HudDemo/Images.xcassets; sourceTree = SOURCE_ROOT; }; @@ -51,6 +63,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + D2B1740C1C5E3A3D00021915 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -72,6 +91,7 @@ isa = PBXGroup; children = ( 1D6058910D05DD3D006BFB54 /* HudDemo.app */, + D2B1740F1C5E3A3D00021915 /* HudTests.xctest */, ); name = Products; sourceTree = ""; @@ -80,7 +100,7 @@ isa = PBXGroup; children = ( 080E96DDFE201D6D7F000001 /* HudDemo */, - D28CBB2E1A87A45A0052DCEC /* HudTests */, + D2B174101C5E3A3D00021915 /* HudTests */, D28CBB391A87A6B00052DCEC /* MBProgressHUD */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, @@ -128,30 +148,22 @@ name = UI; sourceTree = ""; }; - D28CBB2E1A87A45A0052DCEC /* HudTests */ = { - isa = PBXGroup; - children = ( - D28CBB311A87A45A0052DCEC /* HudTests.m */, - D28CBB2F1A87A45A0052DCEC /* Supporting Files */, - ); - path = HudTests; - sourceTree = ""; - }; - D28CBB2F1A87A45A0052DCEC /* Supporting Files */ = { + D28CBB391A87A6B00052DCEC /* MBProgressHUD */ = { isa = PBXGroup; children = ( - D28CBB301A87A45A0052DCEC /* Info.plist */, + D22F7D7F0F85241C00550BB3 /* MBProgressHUD.h */, + D22F7D800F85241C00550BB3 /* MBProgressHUD.m */, ); - name = "Supporting Files"; + name = MBProgressHUD; sourceTree = ""; }; - D28CBB391A87A6B00052DCEC /* MBProgressHUD */ = { + D2B174101C5E3A3D00021915 /* HudTests */ = { isa = PBXGroup; children = ( - D22F7D7F0F85241C00550BB3 /* MBProgressHUD.h */, - D22F7D800F85241C00550BB3 /* MBProgressHUD.m */, + D2B174111C5E3A3D00021915 /* HudTests.m */, + D2B174131C5E3A3D00021915 /* Info.plist */, ); - name = MBProgressHUD; + path = HudTests; sourceTree = ""; }; /* End PBXGroup section */ @@ -174,6 +186,24 @@ productReference = 1D6058910D05DD3D006BFB54 /* HudDemo.app */; productType = "com.apple.product-type.application"; }; + D2B1740E1C5E3A3D00021915 /* HudTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = D2B174161C5E3A3D00021915 /* Build configuration list for PBXNativeTarget "HudTests" */; + buildPhases = ( + D2B1740B1C5E3A3D00021915 /* Sources */, + D2B1740C1C5E3A3D00021915 /* Frameworks */, + D2B1740D1C5E3A3D00021915 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + D2B174151C5E3A3D00021915 /* PBXTargetDependency */, + ); + name = HudTests; + productName = HudTests; + productReference = D2B1740F1C5E3A3D00021915 /* HudTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -183,6 +213,12 @@ CLASSPREFIX = MB; LastUpgradeCheck = 0700; ORGANIZATIONNAME = "Matej Bukovinski"; + TargetAttributes = { + D2B1740E1C5E3A3D00021915 = { + CreatedOnToolsVersion = 7.2; + TestTargetID = 1D6058900D05DD3D006BFB54; + }; + }; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "HudDemo" */; compatibilityVersion = "Xcode 3.2"; @@ -200,6 +236,7 @@ projectRoot = ""; targets = ( 1D6058900D05DD3D006BFB54 /* HudDemo */, + D2B1740E1C5E3A3D00021915 /* HudTests */, ); }; /* End PBXProject section */ @@ -215,6 +252,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + D2B1740D1C5E3A3D00021915 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -229,8 +273,24 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + D2B1740B1C5E3A3D00021915 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D2B174121C5E3A3D00021915 /* HudTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + D2B174151C5E3A3D00021915 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1D6058900D05DD3D006BFB54 /* HudDemo */; + targetProxy = D2B174141C5E3A3D00021915 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ D2BC09311BA587FB00589A7C /* Main.storyboard */ = { isa = PBXVariantGroup; @@ -342,6 +402,64 @@ }; name = Release; }; + D2B174171C5E3A3D00021915 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = HudTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.bukovinski.HudTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HudDemo.app/HudDemo"; + }; + name = Debug; + }; + D2B174181C5E3A3D00021915 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = HudTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = com.bukovinski.HudTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HudDemo.app/HudDemo"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -363,6 +481,14 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + D2B174161C5E3A3D00021915 /* Build configuration list for PBXNativeTarget "HudTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D2B174171C5E3A3D00021915 /* Debug */, + D2B174181C5E3A3D00021915 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; diff --git a/Demo/HudTests/HudTests.m b/Demo/HudTests/HudTests.m index 04cd00655..33653bbcc 100644 --- a/Demo/HudTests/HudTests.m +++ b/Demo/HudTests/HudTests.m @@ -2,41 +2,116 @@ // HudTests.m // HudTests // -// Created by Matej Bukovinski on 8. 02. 15. -// Copyright (c) 2015 Matej Bukovinski. All rights reserved. +// Created by Matej Bukovinski on 31. 01. 16. +// Copyright © 2016 Matej Bukovinski. All rights reserved. // -#import #import #import "MBProgressHUD.h" -@interface HudTests : XCTestCase +#define weakify(var) __weak typeof(var) weak_##var = var; -@property (nonatomic, strong) MBProgressHUD *hud; -@property (nonatomic, strong) UIView *view; +#define strongify(var) \ +_Pragma("clang diagnostic push") \ +_Pragma("clang diagnostic ignored \"-Wshadow\"") \ +__strong typeof(var) var = weak_##var; \ +_Pragma("clang diagnostic pop") + + +@interface HudTests : XCTestCase + +@property (nonatomic) XCTestExpectation *hideExpectation; +@property (nonatomic, copy) dispatch_block_t hideChecks; @end + @implementation HudTests - (void)setUp { [super setUp]; - - self.view = [[UIView alloc] init]; - self.view.bounds = [[UIScreen mainScreen] bounds]; - self.hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; } - (void)tearDown { - self.hud = nil; - self.view = nil; - [super tearDown]; } -- (void)testThatHUDExists { - XCTAssertNotNil(self.hud, @"Should be able to create a new HUD instance"); +#pragma mark - Convenience + +- (void)testNonAnimatedConvenienceHUDPresentation { + UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIView *rootView = rootViewController.view; + + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:rootView animated:NO]; + + XCTAssertNotNil(hud, @"A HUD should be created."); + XCTAssertEqualObjects(hud.superview, rootView, @"The hood should be added to the view."); + XCTAssertTrue(hud.removeFromSuperViewOnHide, @"removeFromSuperViewOnHide should be enabled"); + XCTAssertEqual(hud.alpha, 1.f, @"The HUD should be visible."); + XCTAssertFalse(hud.hidden, @"The HUD should be visible."); + + XCTAssertEqual(hud.bezelView.alpha, 1.f, @"The HUD should be visible."); + XCTAssertFalse([hud.bezelView.layer.animationKeys containsObject:@"opacity"], @"The opacity should NOT be animated."); + + XCTAssertEqualObjects([MBProgressHUD HUDForView:rootView], hud, @"The HUD should be found via the convenience operation."); + + XCTAssertTrue([MBProgressHUD hideHUDForView:rootView animated:NO], @"The HUD should be found and removed."); + + XCTAssertFalse([rootView.subviews containsObject:hud], @"The HUD should no longer be part of the view hierarchy."); + XCTAssertEqual(hud.alpha, 0.f, @"The hud should be faded out."); + XCTAssertNil(hud.superview, @"The HUD should no longer be part of the view hierarchy."); + + XCTAssertFalse([MBProgressHUD hideHUDForView:rootView animated:NO], @"A subsequent HUD hide operation should fail."); +} + +- (void)testAnimatedConvenienceHUDPresentation { + UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIView *rootView = rootViewController.view; + + self.hideExpectation = [self expectationWithDescription:@"The hudWasHidden: delegate should have been called."]; + + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:rootView animated:YES]; + hud.delegate = self; + + XCTAssertNotNil(hud, @"A HUD should be created."); + XCTAssertEqualObjects(hud.superview, rootView, @"The hood should be added to the view."); + XCTAssertTrue(hud.removeFromSuperViewOnHide, @"removeFromSuperViewOnHide should be enabled"); + XCTAssertEqual(hud.alpha, 1.f, @"The HUD should be visible."); + XCTAssertFalse(hud.hidden, @"The HUD should be visible."); + + XCTAssertEqual(hud.bezelView.alpha, 1.f, @"The HUD should be visible."); + XCTAssertTrue([hud.bezelView.layer.animationKeys containsObject:@"opacity"], @"The opacity should be animated."); + + XCTAssertEqualObjects([MBProgressHUD HUDForView:rootView], hud, @"The HUD should be found via the convenience operation."); + + XCTAssertTrue([MBProgressHUD hideHUDForView:rootView animated:YES], @"The HUD should be found and removed."); + + XCTAssertTrue([rootView.subviews containsObject:hud], @"The HUD should still be part of the view hierarchy."); + XCTAssertEqual(hud.alpha, 1.f, @"The hud should still be visible."); + XCTAssertEqualObjects(hud.superview, rootView, @"The hood should be added to the view."); + + weakify(self); + self.hideChecks = ^{ + strongify(self); + XCTAssertFalse([rootView.subviews containsObject:hud], @"The HUD should no longer be part of the view hierarchy."); + XCTAssertEqual(hud.alpha, 0.f, @"The hud should be faded out."); + XCTAssertNil(hud.superview, @"The HUD should no longer be part of the view hierarchy."); + + XCTAssertFalse([MBProgressHUD hideHUDForView:rootView animated:YES], @"A subsequent HUD hide operation should fail."); + }; + + [self waitForExpectationsWithTimeout:5. handler:nil]; +} + +#pragma mark - MBProgressHUDDelegate + +- (void)hudWasHidden:(MBProgressHUD *)hud { + if (self.hideChecks) self.hideChecks(); + self.hideChecks = nil; + + [self.hideExpectation fulfill]; + self.hideExpectation = nil; } @end From 7a2b1ec8d77a8e96347cc794468c6cd40032df93 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 31 Jan 2016 14:36:55 +0100 Subject: [PATCH 094/117] Scheme and travis setup for the new tests. --- .travis.yml | 5 +- .../xcshareddata/xcschemes/HudDemo.xcscheme | 2 +- .../xcshareddata/xcschemes/HudTests.xcscheme | 56 +++++++++++++++++++ 3 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudTests.xcscheme diff --git a/.travis.yml b/.travis.yml index fb1d4aa5e..caba0050e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,4 @@ language: objective-c -osx_image: xcode7 +osx_image: xcode7.3 xcode_workspace: MBProgressHUD.xcworkspace -xcode_scheme: HudDemo -xcode_sdk: iphonesimulator +xcode_scheme: HudTests diff --git a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme index 6cbd5e036..343209e18 100644 --- a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme +++ b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme @@ -28,7 +28,7 @@ buildForAnalyzing = "YES"> diff --git a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudTests.xcscheme b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudTests.xcscheme new file mode 100644 index 000000000..5141bc4cf --- /dev/null +++ b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudTests.xcscheme @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + From ae6aabb87ee6766bebc7f0ddbcd62bf7020ad4d1 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 31 Jan 2016 14:47:56 +0100 Subject: [PATCH 095/117] Configured test scheme for running. --- .../xcshareddata/xcschemes/HudTests.xcscheme | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudTests.xcscheme b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudTests.xcscheme index 5141bc4cf..9ecd5ba5f 100644 --- a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudTests.xcscheme +++ b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudTests.xcscheme @@ -23,6 +23,15 @@ + + + + @@ -36,6 +45,16 @@ debugDocumentVersioning = "YES" debugServiceExtension = "internal" allowLocationSimulation = "YES"> + + + +

!sfrhL!5bo$EQv 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

@@ -45,6 +64,15 @@ savedToolIdentifier = "" useCustomWorkingDirectory = "NO" debugDocumentVersioning = "YES"> + + + + From 66ecfd19fb95f6e040b47d872da54b55ed308e8f Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 31 Jan 2016 14:48:05 +0100 Subject: [PATCH 096/117] Added SDK configuration option. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index caba0050e..45b6ebeb5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,3 +2,4 @@ language: objective-c osx_image: xcode7.3 xcode_workspace: MBProgressHUD.xcworkspace xcode_scheme: HudTests +xcode_sdk: iphonesimulator From 8c9aacb712ec412abcf6f8e5c98dbe8b007ba3f1 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 31 Jan 2016 14:56:14 +0100 Subject: [PATCH 097/117] codecov.io integration --- .travis.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 45b6ebeb5..a72200746 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ language: objective-c osx_image: xcode7.3 -xcode_workspace: MBProgressHUD.xcworkspace -xcode_scheme: HudTests -xcode_sdk: iphonesimulator +script: + - xctool -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator build test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES +after_success: + - bash <(curl -s https://codecov.io/bash) From 354346840f999eacb2143fc99ba39cb91bbaaf65 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 31 Jan 2016 15:02:01 +0100 Subject: [PATCH 098/117] Added changelog. --- CHANGELOG.mdown | 94 +++++++++++++++++++++++++++++++++++++++++++++++++ README.mdown | 2 +- 2 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 CHANGELOG.mdown diff --git a/CHANGELOG.mdown b/CHANGELOG.mdown new file mode 100644 index 000000000..d50226395 --- /dev/null +++ b/CHANGELOG.mdown @@ -0,0 +1,94 @@ +**Version 0.9.2** @ 22.12.15 + + - Timer improvements + - Additional assertions + - Added a framework target + - Tint progress tint color enhancements + +**Version 0.9.1** @ 06.03.15 + + - Bug-fixes + - Modernization + +**Version 0.9** @ 12.08.14 + + - iOS 8 compatibility and some bug fixes. + - Additional iOS 7 / iOS 8 styling enhancements. + - Improved 64bit support. + - Demo modernization. + +**Version 0.8** @ 19.09.13 + +- iOS 7 compatibility and some bug fixes. + +**Version 0.7** @ 25.06.13 + +- Added horizontal bar mode. ([jjxtra](https://github.com/jjxtra)). +- CI integration. + +**Version 0.6** @ 13.03.13 + +- Full cocoapods support. +- Static library integration option. +- Improved blocks support. +- Bezel color. +- Demo app fixes (iOS 6). +- Various bug-fixes and enhancements. + +**Version 0.5** @ 22.03.12 + +- Major source code modernization and cleanup (KVO, layout code, instance vars, etc.). +- New annular determinate mode. +- New text only mode. +- Added a static library project and Xcode 4 workspace. +- Added methods to find and return HUD(s) on a view. +- Various bug fixes. +- Various demo project enhancements (hi-res rescues, new samples). + +IMPORTANT: Requires LLVM 3+. + +**Version 0.41** @ 03.01.12 + +- Support for ARC. + +**Version 0.4** @ 25.07.10 + +- Different animation modes. Default set to zoom. +- Class convenience methods ([tadelv](http://github.com/tadelv)). +- Autorotation when added to a UIWindow ([wuf810](http://github.com/wuf810)). +- Extended demo app. +- Several smaller fixes. + +**Version 0.33** @ 27.03.10 + +- Custom view operation mode added. +- Fixed a memory leak. + +**Version 0.32** @ 4.01.10 + +- Added minShowTime, graceTime, xOffset, yOffset. +- Various fixes. + +**Version 0.31** @ 8.10.09 + +- Fix for touch through during the fade-out animation. + +**Version 0.3** @ 30.9.09 + +- Added show: and hide: methods. +- Now using UIViews layoutSubviews to automate layout calls. +- Added some floors to round pixel positions and thereby prevent unsharp views. +- Some additional documentation and code cleanup. + +**Version 0.2** @ 21.7.09 + +- Added determinate progress mode and switching capabilities between determinate and indeterminate modes. +- Various bug-fixes. + +**Version 0.11** @ 2.6.09. + +- Updated labelText and detailsLabelText properties to support text modifications while the HUD is being shown. + +**Version 0.1** @ 2.4.09 + +- Initial release. \ No newline at end of file diff --git a/README.mdown b/README.mdown index 29d76ce9a..e56ab3ac3 100644 --- a/README.mdown +++ b/README.mdown @@ -98,4 +98,4 @@ This code is distributed under the terms and conditions of the [MIT license](LIC ## Change-log -A brief summary of each MBProgressHUD release can be found on the [wiki](https://github.com/matej/MBProgressHUD/wiki/Change-log). +A brief summary of each MBProgressHUD release can be found in the [CHANGELOG](CHANGELOG.mdown). From fa6b939fa7f6ce3fa86a2662cb84b525ff552bd4 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 31 Jan 2016 15:09:14 +0100 Subject: [PATCH 099/117] Explicit destination setting. --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a72200746..367c4f282 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: objective-c -osx_image: xcode7.3 +osx_image: xcode7.2 script: - - xctool -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator build test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES + - xctool -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air 2,OS=9.2" build test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES after_success: - bash <(curl -s https://codecov.io/bash) From 3e64c75ebcebdd8575083d6391c9a21a3854558f Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 31 Jan 2016 15:14:39 +0100 Subject: [PATCH 100/117] Updated codecov integration. --- .travis.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 367c4f282..8f7239e07 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,8 @@ language: objective-c osx_image: xcode7.2 -script: - - xctool -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air 2,OS=9.2" build test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES +install: + pip install codecov after_success: - - bash <(curl -s https://codecov.io/bash) + codecov +script: + - xctool -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air 2,OS=9.2" build test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES \ No newline at end of file From 9d59d0bbee240ed9632286e1927ba8b9055623ee Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 31 Jan 2016 15:17:38 +0100 Subject: [PATCH 101/117] Revert "Updated codecov integration. " This reverts commit 3e64c75ebcebdd8575083d6391c9a21a3854558f. --- .travis.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8f7239e07..367c4f282 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,6 @@ language: objective-c osx_image: xcode7.2 -install: - pip install codecov -after_success: - codecov script: - - xctool -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air 2,OS=9.2" build test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES \ No newline at end of file + - xctool -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air 2,OS=9.2" build test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES +after_success: + - bash <(curl -s https://codecov.io/bash) From de4938c0bb3d6ee49b825409d8360290fee64f6a Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 31 Jan 2016 15:44:38 +0100 Subject: [PATCH 102/117] Converting tabs to spaces. --- Demo/Classes/MBHudDemoViewController.m | 508 +++++++++++----------- MBProgressHUD.h | 34 +- MBProgressHUD.m | 564 ++++++++++++------------- 3 files changed, 553 insertions(+), 553 deletions(-) diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index 60cced4f3..606340fc2 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -21,10 +21,10 @@ @interface MBExample : NSObject @implementation MBExample + (instancetype)exampleWithTitle:(NSString *)title selector:(SEL)selector { - MBExample *example = [[self class] new]; - example.title = title; - example.selector = selector; - return example; + MBExample *example = [[self class] new]; + example.title = title; + example.selector = selector; + return example; } @end @@ -43,343 +43,343 @@ @implementation MBHudDemoViewController #pragma mark - Lifecycle - (void)awakeFromNib { - [super awakeFromNib]; - self.examples = - @[@[[MBExample exampleWithTitle:@"Indeterminate mode" selector:@selector(indeterminateExample)], - [MBExample exampleWithTitle:@"With label" selector:@selector(labelExample)], - [MBExample exampleWithTitle:@"With details label" selector:@selector(detailsLabelExample)]], - @[[MBExample exampleWithTitle:@"Determinate mode" selector:@selector(determinateExample)], - [MBExample exampleWithTitle:@"Annular determinate mode" selector:@selector(annularDeterminateExample)], - [MBExample exampleWithTitle:@"Bar determinate mode" selector:@selector(barDeterminateExample)]], - @[[MBExample exampleWithTitle:@"Text only" selector:@selector(textExample)], - [MBExample exampleWithTitle:@"Custom view" selector:@selector(customViewExample)], - [MBExample exampleWithTitle:@"With action button" selector:@selector(cancelationExample)], - [MBExample exampleWithTitle:@"Mode switching" selector:@selector(modeSwitchingExample)]], - @[[MBExample exampleWithTitle:@"On window" selector:@selector(indeterminateExample)], - [MBExample exampleWithTitle:@"NSURLSession" selector:@selector(networkingExample)], - [MBExample exampleWithTitle:@"Dim background" selector:@selector(indeterminateExample)], - [MBExample exampleWithTitle:@"Colored" selector:@selector(indeterminateExample)]] - ]; + [super awakeFromNib]; + self.examples = + @[@[[MBExample exampleWithTitle:@"Indeterminate mode" selector:@selector(indeterminateExample)], + [MBExample exampleWithTitle:@"With label" selector:@selector(labelExample)], + [MBExample exampleWithTitle:@"With details label" selector:@selector(detailsLabelExample)]], + @[[MBExample exampleWithTitle:@"Determinate mode" selector:@selector(determinateExample)], + [MBExample exampleWithTitle:@"Annular determinate mode" selector:@selector(annularDeterminateExample)], + [MBExample exampleWithTitle:@"Bar determinate mode" selector:@selector(barDeterminateExample)]], + @[[MBExample exampleWithTitle:@"Text only" selector:@selector(textExample)], + [MBExample exampleWithTitle:@"Custom view" selector:@selector(customViewExample)], + [MBExample exampleWithTitle:@"With action button" selector:@selector(cancelationExample)], + [MBExample exampleWithTitle:@"Mode switching" selector:@selector(modeSwitchingExample)]], + @[[MBExample exampleWithTitle:@"On window" selector:@selector(indeterminateExample)], + [MBExample exampleWithTitle:@"NSURLSession" selector:@selector(networkingExample)], + [MBExample exampleWithTitle:@"Dim background" selector:@selector(indeterminateExample)], + [MBExample exampleWithTitle:@"Colored" selector:@selector(indeterminateExample)]] + ]; } #pragma mark - Examples - (void)indeterminateExample { - // Show the HUD on the root view (self.view is a scrollable table view and thus not suitable, - // as the HUD would move with the content as we scroll). - MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; - - // Fire off an asynchronous task, giving UIKit the opportunity to redraw wit the HUD added to the - // view hierarchy. - dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ - - // Do something useful in the background - [self doSomeWork]; - - // IMPORTANT - Dispatch back to the main thread. Always access UI - // classes (including MBProgressHUD) on the main thread. - dispatch_async(dispatch_get_main_queue(), ^{ - [hud hideAnimated:YES]; - }); - }); + // Show the HUD on the root view (self.view is a scrollable table view and thus not suitable, + // as the HUD would move with the content as we scroll). + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Fire off an asynchronous task, giving UIKit the opportunity to redraw wit the HUD added to the + // view hierarchy. + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + + // Do something useful in the background + [self doSomeWork]; + + // IMPORTANT - Dispatch back to the main thread. Always access UI + // classes (including MBProgressHUD) on the main thread. + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); } - (void)labelExample { - MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; - - // Set the label text. - hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); - // You can also adjust other label properties if needed. - // hud.label.font = [UIFont italicSystemFontOfSize:16.f]; - - dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ - [self doSomeWork]; - dispatch_async(dispatch_get_main_queue(), ^{ - [hud hideAnimated:YES]; - }); - }); + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set the label text. + hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); + // You can also adjust other label properties if needed. + // hud.label.font = [UIFont italicSystemFontOfSize:16.f]; + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + [self doSomeWork]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); } - (void)detailsLabelExample { - MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; - - // Set the label text. - hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); - // Set the details label text. Let's make it multiline this time. - hud.detailsLabel.text = NSLocalizedString(@"Parsing data\n(1/1)", @"HUD title"); - - dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ - [self doSomeWork]; - dispatch_async(dispatch_get_main_queue(), ^{ - [hud hideAnimated:YES]; - }); - }); + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set the label text. + hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); + // Set the details label text. Let's make it multiline this time. + hud.detailsLabel.text = NSLocalizedString(@"Parsing data\n(1/1)", @"HUD title"); + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + [self doSomeWork]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); } - (void)windowExample { - // Covers the entire screen. Similar to using the root view controller view. - MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view.window animated:YES]; - dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ - [self doSomeWork]; - dispatch_async(dispatch_get_main_queue(), ^{ - [hud hideAnimated:YES]; - }); - }); + // Covers the entire screen. Similar to using the root view controller view. + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view.window animated:YES]; + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + [self doSomeWork]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); } - (void)determinateExample { - MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; - - // Set the determinate mode to show task progress. - hud.mode = MBProgressHUDModeDeterminate; - hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); - - dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ - // Do something useful in the background and update the HUD periodically. - [self doSomeWorkWithProgress]; - dispatch_async(dispatch_get_main_queue(), ^{ - [hud hideAnimated:YES]; - }); - }); + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set the determinate mode to show task progress. + hud.mode = MBProgressHUDModeDeterminate; + hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + // Do something useful in the background and update the HUD periodically. + [self doSomeWorkWithProgress]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); } - (void)annularDeterminateExample { - MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; - - // Set the annular determinate mode to show task progress. - hud.mode = MBProgressHUDModeAnnularDeterminate; - hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); - - dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ - // Do something useful in the background and update the HUD periodically. - [self doSomeWorkWithProgress]; - dispatch_async(dispatch_get_main_queue(), ^{ - [hud hideAnimated:YES]; - }); - }); + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set the annular determinate mode to show task progress. + hud.mode = MBProgressHUDModeAnnularDeterminate; + hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + // Do something useful in the background and update the HUD periodically. + [self doSomeWorkWithProgress]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); } - (void)barDeterminateExample { - MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; - - // Set the bar determinate mode to show task progress. - hud.mode = MBProgressHUDModeDeterminateHorizontalBar; - hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); - - dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ - // Do something useful in the background and update the HUD periodically. - [self doSomeWorkWithProgress]; - dispatch_async(dispatch_get_main_queue(), ^{ - [hud hideAnimated:YES]; - }); - }); + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set the bar determinate mode to show task progress. + hud.mode = MBProgressHUDModeDeterminateHorizontalBar; + hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + // Do something useful in the background and update the HUD periodically. + [self doSomeWorkWithProgress]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); } - (void)customViewExample { - MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; - - // Set the custom view mode to show any view. - hud.mode = MBProgressHUDModeCustomView; - // Set an image view with a checkmark. - UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - hud.customView = [[UIImageView alloc] initWithImage:image]; - // Looks a bit nicer if we make it square. - hud.square = YES; - // Optional label text. - hud.label.text = NSLocalizedString(@"Done", @"HUD done title"); - - [hud hideAnimated:YES afterDelay:3.f]; + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set the custom view mode to show any view. + hud.mode = MBProgressHUDModeCustomView; + // Set an image view with a checkmark. + UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + hud.customView = [[UIImageView alloc] initWithImage:image]; + // Looks a bit nicer if we make it square. + hud.square = YES; + // Optional label text. + hud.label.text = NSLocalizedString(@"Done", @"HUD done title"); + + [hud hideAnimated:YES afterDelay:3.f]; } - (void)textExample { - MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; - // Set the annular determinate mode to show task progress. - hud.mode = MBProgressHUDModeText; - hud.label.text = NSLocalizedString(@"Message here!", @"HUD message title"); - // Move to bottm center. - hud.offset = CGPointMake(0.f, MBProgressMaxOffset); + // Set the annular determinate mode to show task progress. + hud.mode = MBProgressHUDModeText; + hud.label.text = NSLocalizedString(@"Message here!", @"HUD message title"); + // Move to bottm center. + hud.offset = CGPointMake(0.f, MBProgressMaxOffset); - [hud hideAnimated:YES afterDelay:3.f]; + [hud hideAnimated:YES afterDelay:3.f]; } - (void)cancelationExample { - MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; - - // Set the determinate mode to show task progress. - hud.mode = MBProgressHUDModeDeterminate; - hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); - - // Configure the button. - [hud.button setTitle:NSLocalizedString(@"Cancel", @"HUD cancel button title") forState:UIControlStateNormal]; - [hud.button addTarget:self action:@selector(cancelWork:) forControlEvents:UIControlEventTouchUpInside]; - - dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ - // Do something useful in the background and update the HUD periodically. - [self doSomeWorkWithProgress]; - dispatch_async(dispatch_get_main_queue(), ^{ - [hud hideAnimated:YES]; - }); - }); + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set the determinate mode to show task progress. + hud.mode = MBProgressHUDModeDeterminate; + hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); + + // Configure the button. + [hud.button setTitle:NSLocalizedString(@"Cancel", @"HUD cancel button title") forState:UIControlStateNormal]; + [hud.button addTarget:self action:@selector(cancelWork:) forControlEvents:UIControlEventTouchUpInside]; + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + // Do something useful in the background and update the HUD periodically. + [self doSomeWorkWithProgress]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); } - (void)modeSwitchingExample { - MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; - - // Set some text to show the initial status. - hud.label.text = NSLocalizedString(@"Preparing...", @"HUD preparing title"); - // Will look best, if we set a minimum size. - hud.minSize = CGSizeMake(150.f, 100.f); - - dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ - // Do something useful in the background and update the HUD periodically. - [self doSomeWorkWithMixedProgress]; - dispatch_async(dispatch_get_main_queue(), ^{ - [hud hideAnimated:YES]; - }); - }); + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Set some text to show the initial status. + hud.label.text = NSLocalizedString(@"Preparing...", @"HUD preparing title"); + // Will look best, if we set a minimum size. + hud.minSize = CGSizeMake(150.f, 100.f); + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + // Do something useful in the background and update the HUD periodically. + [self doSomeWorkWithMixedProgress]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); } - (void)networkingExample { - MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; - // Set some text to show the initial status. - hud.label.text = NSLocalizedString(@"Preparing...", @"HUD preparing title"); - // Will look best, if we set a minimum size. - hud.minSize = CGSizeMake(150.f, 100.f); + // Set some text to show the initial status. + hud.label.text = NSLocalizedString(@"Preparing...", @"HUD preparing title"); + // Will look best, if we set a minimum size. + hud.minSize = CGSizeMake(150.f, 100.f); - [self doSomeNetworkWorkWithProgress]; + [self doSomeNetworkWorkWithProgress]; } #pragma mark - Tasks - (void)doSomeWork { - // Simulate by just waiting. - sleep(3.); + // Simulate by just waiting. + sleep(3.); } - (void)doSomeWorkWithProgress { - self.canceled = NO; - // This just increases the progress indicator in a loop. - float progress = 0.0f; - while (progress < 1.0f) { - if (self.canceled) break; - progress += 0.01f; - dispatch_async(dispatch_get_main_queue(), ^{ - // Instead we could have also passed a reference to the HUD - // to the HUD to myProgressTask as a method parameter. - [MBProgressHUD HUDForView:self.navigationController.view].progress = progress; - }); - usleep(50000); - } + self.canceled = NO; + // This just increases the progress indicator in a loop. + float progress = 0.0f; + while (progress < 1.0f) { + if (self.canceled) break; + progress += 0.01f; + dispatch_async(dispatch_get_main_queue(), ^{ + // Instead we could have also passed a reference to the HUD + // to the HUD to myProgressTask as a method parameter. + [MBProgressHUD HUDForView:self.navigationController.view].progress = progress; + }); + usleep(50000); + } } - (void)doSomeWorkWithMixedProgress { - MBProgressHUD *hud = [MBProgressHUD HUDForView:self.navigationController.view]; - // Indeterminate mode - sleep(2); - // Switch to determinate mode - dispatch_async(dispatch_get_main_queue(), ^{ - hud.mode = MBProgressHUDModeDeterminate; - hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); - }); - float progress = 0.0f; - while (progress < 1.0f) { - progress += 0.01f; - dispatch_async(dispatch_get_main_queue(), ^{ - hud.progress = progress; - }); - usleep(50000); - } - // Back to indeterminate mode - dispatch_async(dispatch_get_main_queue(), ^{ - hud.mode = MBProgressHUDModeIndeterminate; - hud.label.text = NSLocalizedString(@"Cleaning up...", @"HUD cleanining up title"); - }); - sleep(2); - dispatch_sync(dispatch_get_main_queue(), ^{ - UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; - hud.customView = imageView; - hud.mode = MBProgressHUDModeCustomView; - hud.label.text = NSLocalizedString(@"Completed", @"HUD completed title"); - }); - sleep(2); + MBProgressHUD *hud = [MBProgressHUD HUDForView:self.navigationController.view]; + // Indeterminate mode + sleep(2); + // Switch to determinate mode + dispatch_async(dispatch_get_main_queue(), ^{ + hud.mode = MBProgressHUDModeDeterminate; + hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); + }); + float progress = 0.0f; + while (progress < 1.0f) { + progress += 0.01f; + dispatch_async(dispatch_get_main_queue(), ^{ + hud.progress = progress; + }); + usleep(50000); + } + // Back to indeterminate mode + dispatch_async(dispatch_get_main_queue(), ^{ + hud.mode = MBProgressHUDModeIndeterminate; + hud.label.text = NSLocalizedString(@"Cleaning up...", @"HUD cleanining up title"); + }); + sleep(2); + dispatch_sync(dispatch_get_main_queue(), ^{ + UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; + hud.customView = imageView; + hud.mode = MBProgressHUDModeCustomView; + hud.label.text = NSLocalizedString(@"Completed", @"HUD completed title"); + }); + sleep(2); } - (void)doSomeNetworkWorkWithProgress { - NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; - NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil]; - NSURL *URL = [NSURL URLWithString:@"https://support.apple.com/library/APPLE/APPLECARE_ALLGEOS/HT1425/sample_iPod.m4v.zip"]; - NSURLSessionDownloadTask *task = [session downloadTaskWithURL:URL]; - [task resume]; + NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; + NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil]; + NSURL *URL = [NSURL URLWithString:@"https://support.apple.com/library/APPLE/APPLECARE_ALLGEOS/HT1425/sample_iPod.m4v.zip"]; + NSURLSessionDownloadTask *task = [session downloadTaskWithURL:URL]; + [task resume]; } - (void)cancelWork:(id)sender { - self.canceled = YES; + self.canceled = YES; } #pragma mark - UITableViewDelegate - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return self.examples.count; + return self.examples.count; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return self.examples[section].count; + return self.examples[section].count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - MBExample *example = self.examples[indexPath.section][indexPath.row]; - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MBExampleCell" forIndexPath:indexPath]; - cell.textLabel.text = example.title; - cell.textLabel.textColor = self.view.tintColor; - cell.textLabel.textAlignment = NSTextAlignmentCenter; - cell.selectedBackgroundView = [UIView new]; - cell.selectedBackgroundView.backgroundColor = [cell.textLabel.textColor colorWithAlphaComponent:0.1f]; - return cell; + MBExample *example = self.examples[indexPath.section][indexPath.row]; + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MBExampleCell" forIndexPath:indexPath]; + cell.textLabel.text = example.title; + cell.textLabel.textColor = self.view.tintColor; + cell.textLabel.textAlignment = NSTextAlignmentCenter; + cell.selectedBackgroundView = [UIView new]; + cell.selectedBackgroundView.backgroundColor = [cell.textLabel.textColor colorWithAlphaComponent:0.1f]; + return cell; } #pragma mark - UITableViewDelegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - MBExample *example = self.examples[indexPath.section][indexPath.row]; + MBExample *example = self.examples[indexPath.section][indexPath.row]; #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks" - [self performSelector:example.selector]; + [self performSelector:example.selector]; #pragma clang diagnostic pop - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - }); + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + }); } #pragma mark - NSURLSessionDelegate - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { - // Do something with the data at location... - - // Update the UI on the main thread - dispatch_async(dispatch_get_main_queue(), ^{ - MBProgressHUD *hud = [MBProgressHUD HUDForView:self.navigationController.view]; - UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; - hud.customView = imageView; - hud.mode = MBProgressHUDModeCustomView; - hud.label.text = NSLocalizedString(@"Completed", @"HUD completed title"); - [hud hideAnimated:YES afterDelay:3.f]; - }); + // Do something with the data at location... + + // Update the UI on the main thread + dispatch_async(dispatch_get_main_queue(), ^{ + MBProgressHUD *hud = [MBProgressHUD HUDForView:self.navigationController.view]; + UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; + hud.customView = imageView; + hud.mode = MBProgressHUDModeCustomView; + hud.label.text = NSLocalizedString(@"Completed", @"HUD completed title"); + [hud hideAnimated:YES afterDelay:3.f]; + }); } - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { - float progress = (float)totalBytesWritten / (float)totalBytesExpectedToWrite; - - // Update the UI on the main thread - dispatch_async(dispatch_get_main_queue(), ^{ - MBProgressHUD *hud = [MBProgressHUD HUDForView:self.navigationController.view]; - hud.mode = MBProgressHUDModeDeterminate; - hud.progress = progress; - }); + float progress = (float)totalBytesWritten / (float)totalBytesExpectedToWrite; + + // Update the UI on the main thread + dispatch_async(dispatch_get_main_queue(), ^{ + MBProgressHUD *hud = [MBProgressHUD HUDForView:self.navigationController.view]; + hud.mode = MBProgressHUDModeDeterminate; + hud.progress = progress; + }); } @end diff --git a/MBProgressHUD.h b/MBProgressHUD.h index e42d03616..e42f302fd 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -37,29 +37,29 @@ extern CGFloat const MBProgressMaxOffset; typedef NS_ENUM(NSInteger, MBProgressHUDMode) { - /// UIActivityIndicatorView. - MBProgressHUDModeIndeterminate, - /// A round, pie-chart like, progress view. - MBProgressHUDModeDeterminate, - /// Horizontal progress bar. - MBProgressHUDModeDeterminateHorizontalBar, - /// Ring-shaped progress view. - MBProgressHUDModeAnnularDeterminate, - /// Shows a custom view. - MBProgressHUDModeCustomView, - /// Shows only labels. - MBProgressHUDModeText + /// UIActivityIndicatorView. + MBProgressHUDModeIndeterminate, + /// A round, pie-chart like, progress view. + MBProgressHUDModeDeterminate, + /// Horizontal progress bar. + MBProgressHUDModeDeterminateHorizontalBar, + /// Ring-shaped progress view. + MBProgressHUDModeAnnularDeterminate, + /// Shows a custom view. + MBProgressHUDModeCustomView, + /// Shows only labels. + MBProgressHUDModeText }; typedef NS_ENUM(NSInteger, MBProgressHUDAnimation) { - /// Opacity animation - MBProgressHUDAnimationFade, - /// Opacity + scale animation (zoom in when appearing zoom out when disappearing) + /// Opacity animation + MBProgressHUDAnimationFade, + /// Opacity + scale animation (zoom in when appearing zoom out when disappearing) MBProgressHUDAnimationZoom, /// Opacity + scale animation (zoom out style) - MBProgressHUDAnimationZoomOut, + MBProgressHUDAnimationZoomOut, /// Opacity + scale animation (zoom in style) - MBProgressHUDAnimationZoomIn + MBProgressHUDAnimationZoomIn }; typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { diff --git a/MBProgressHUD.m b/MBProgressHUD.m index d8cf2c3ab..64229c5f9 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -9,11 +9,11 @@ #ifndef kCFCoreFoundationVersionNumber_iOS_7_0 - #define kCFCoreFoundationVersionNumber_iOS_7_0 847.20 + #define kCFCoreFoundationVersionNumber_iOS_7_0 847.20 #endif #ifndef kCFCoreFoundationVersionNumber_iOS_8_0 - #define kCFCoreFoundationVersionNumber_iOS_8_0 1129.15 + #define kCFCoreFoundationVersionNumber_iOS_8_0 1129.15 #endif #define MBMainThreadAssert() NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); @@ -57,127 +57,127 @@ @implementation MBProgressHUD #pragma mark - Class methods + (instancetype)showHUDAddedTo:(UIView *)view animated:(BOOL)animated { - MBProgressHUD *hud = [[self alloc] initWithView:view]; - hud.removeFromSuperViewOnHide = YES; - [view addSubview:hud]; + MBProgressHUD *hud = [[self alloc] initWithView:view]; + hud.removeFromSuperViewOnHide = YES; + [view addSubview:hud]; [hud showAnimated:animated]; - return hud; + return hud; } + (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated { - MBProgressHUD *hud = [self HUDForView:view]; - if (hud != nil) { - hud.removeFromSuperViewOnHide = YES; - [hud hideAnimated:animated]; - return YES; - } - return NO; + MBProgressHUD *hud = [self HUDForView:view]; + if (hud != nil) { + hud.removeFromSuperViewOnHide = YES; + [hud hideAnimated:animated]; + return YES; + } + return NO; } + (MBProgressHUD *)HUDForView:(UIView *)view { - NSEnumerator *subviewsEnum = [view.subviews reverseObjectEnumerator]; - for (UIView *subview in subviewsEnum) { - if ([subview isKindOfClass:self]) { - return (MBProgressHUD *)subview; - } - } - return nil; + NSEnumerator *subviewsEnum = [view.subviews reverseObjectEnumerator]; + for (UIView *subview in subviewsEnum) { + if ([subview isKindOfClass:self]) { + return (MBProgressHUD *)subview; + } + } + return nil; } #pragma mark - Lifecycle - (instancetype)initWithFrame:(CGRect)frame { - if ((self = [super initWithFrame:frame])) { - // Set default values for properties - _animationType = MBProgressHUDAnimationFade; - _mode = MBProgressHUDModeIndeterminate; - _margin = 20.0f; + if ((self = [super initWithFrame:frame])) { + // Set default values for properties + _animationType = MBProgressHUDAnimationFade; + _mode = MBProgressHUDModeIndeterminate; + _margin = 20.0f; _opacity = 1.f; _defaultMotionEffectsEnabled = YES; // Default color, depending on the current iOS version BOOL isLegacy = kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0; _contentColor = isLegacy ? [UIColor whiteColor] : [UIColor colorWithWhite:0.f alpha:0.7f]; - // Transparent background - self.opaque = NO; - self.backgroundColor = [UIColor clearColor]; - // Make it invisible for now - self.alpha = 0.0f; + // Transparent background + self.opaque = NO; + self.backgroundColor = [UIColor clearColor]; + // Make it invisible for now + self.alpha = 0.0f; self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; self.layer.allowsGroupOpacity = NO; - [self setupViews]; - [self updateIndicators]; - [self registerForNotifications]; - } - return self; + [self setupViews]; + [self updateIndicators]; + [self registerForNotifications]; + } + return self; } - (id)initWithView:(UIView *)view { - NSAssert(view, @"View must not be nil."); - return [self initWithFrame:view.bounds]; + NSAssert(view, @"View must not be nil."); + return [self initWithFrame:view.bounds]; } - (void)dealloc { - [self unregisterFromNotifications]; + [self unregisterFromNotifications]; } #pragma mark - Show & hide - (void)showAnimated:(BOOL)animated { MBMainThreadAssert(); - self.useAnimation = animated; + self.useAnimation = animated; self.finished = NO; - // If the grace time is set postpone the HUD display - if (self.graceTime > 0.0) { + // If the grace time is set postpone the HUD display + if (self.graceTime > 0.0) { NSTimer *timer = [NSTimer timerWithTimeInterval:self.graceTime target:self selector:@selector(handleGraceTimer:) userInfo:nil repeats:NO]; [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; self.graceTimer = timer; - } - // ... otherwise show the HUD imediately - else { - [self showUsingAnimation:self.useAnimation]; - } + } + // ... otherwise show the HUD imediately + else { + [self showUsingAnimation:self.useAnimation]; + } } - (void)hideAnimated:(BOOL)animated { MBMainThreadAssert(); - self.useAnimation = animated; + self.useAnimation = animated; self.finished = YES; - // If the minShow time is set, calculate how long the hud was shown, - // and pospone the hiding operation if necessary - if (self.minShowTime > 0.0 && self.showStarted) { - NSTimeInterval interv = [[NSDate date] timeIntervalSinceDate:self.showStarted]; - if (interv < self.minShowTime) { + // If the minShow time is set, calculate how long the hud was shown, + // and pospone the hiding operation if necessary + if (self.minShowTime > 0.0 && self.showStarted) { + NSTimeInterval interv = [[NSDate date] timeIntervalSinceDate:self.showStarted]; + if (interv < self.minShowTime) { NSTimer *timer = [NSTimer timerWithTimeInterval:(self.minShowTime - interv) target:self selector:@selector(handleMinShowTimer:) userInfo:nil repeats:NO]; [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; self.minShowTimer = timer; - return; - } - } - // ... otherwise hide the HUD immediately - [self hideUsingAnimation:self.useAnimation]; + return; + } + } + // ... otherwise hide the HUD immediately + [self hideUsingAnimation:self.useAnimation]; } - (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay { - [self performSelector:@selector(hideDelayed:) withObject:[NSNumber numberWithBool:animated] afterDelay:delay]; + [self performSelector:@selector(hideDelayed:) withObject:[NSNumber numberWithBool:animated] afterDelay:delay]; } - (void)hideDelayed:(NSNumber *)animated { - [self hideAnimated:[animated boolValue]]; + [self hideAnimated:[animated boolValue]]; } #pragma mark - Timer callbacks - (void)handleGraceTimer:(NSTimer *)theTimer { - // Show the HUD only if the task is still running - if (self.hasFinished) { - [self showUsingAnimation:self.useAnimation]; - } + // Show the HUD only if the task is still running + if (self.hasFinished) { + [self showUsingAnimation:self.useAnimation]; + } } - (void)handleMinShowTimer:(NSTimer *)theTimer { - [self hideUsingAnimation:self.useAnimation]; + [self hideUsingAnimation:self.useAnimation]; } #pragma mark - View Hierrarchy @@ -192,31 +192,31 @@ - (void)showUsingAnimation:(BOOL)animated { // Cancel any scheduled hideDelayed: calls [NSObject cancelPreviousPerformRequestsWithTarget:self]; - self.showStarted = [NSDate date]; + self.showStarted = [NSDate date]; self.alpha = 1.f; - if (animated) { + if (animated) { [self animateIn:YES withType:self.animationType completion:NULL]; - } else { + } else { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" - self.bezelView.alpha = self.opacity; + self.bezelView.alpha = self.opacity; #pragma clang diagnostic pop self.backgroundView.alpha = 1.f; - } + } } - (void)hideUsingAnimation:(BOOL)animated { - if (animated && self.showStarted) { + if (animated && self.showStarted) { [self animateIn:NO withType:self.animationType completion:^(BOOL finished) { [self done]; }]; - } else { - self.bezelView.alpha = 0.f; + } else { + self.bezelView.alpha = 0.f; self.backgroundView.alpha = 1.f; - [self done]; - } - self.showStarted = nil; + [self done]; + } + self.showStarted = nil; } - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type completion:(void(^)(BOOL finished))completion { @@ -263,20 +263,20 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple } - (void)done { - [NSObject cancelPreviousPerformRequestsWithTarget:self]; - self.alpha = 0.0f; - if (self.removeFromSuperViewOnHide) { - [self removeFromSuperview]; - } - if (self.completionBlock) { - self.completionBlock(); - self.completionBlock = NULL; - } + [NSObject cancelPreviousPerformRequestsWithTarget:self]; + self.alpha = 0.0f; + if (self.removeFromSuperViewOnHide) { + [self removeFromSuperview]; + } + if (self.completionBlock) { + self.completionBlock(); + self.completionBlock = NULL; + } id delegate = self.delegate; - if ([delegate respondsToSelector:@selector(hudWasHidden:)]) { - [delegate performSelector:@selector(hudWasHidden:) withObject:self]; - } + if ([delegate respondsToSelector:@selector(hudWasHidden:)]) { + [delegate performSelector:@selector(hudWasHidden:) withObject:self]; + } } #pragma mark - UI @@ -300,19 +300,19 @@ - (void)setupViews { _bezelView = bezelView; [self updateBezelMotionEffects]; - UILabel *label = [UILabel new]; - label.adjustsFontSizeToFitWidth = NO; - label.textAlignment = NSTextAlignmentCenter; - label.textColor = defaultColor; - label.font = [UIFont boldSystemFontOfSize:MBDefaultLabelFontSize];; + UILabel *label = [UILabel new]; + label.adjustsFontSizeToFitWidth = NO; + label.textAlignment = NSTextAlignmentCenter; + label.textColor = defaultColor; + label.font = [UIFont boldSystemFontOfSize:MBDefaultLabelFontSize];; _label = label; - UILabel *detailsLabel = [UILabel new]; - detailsLabel.adjustsFontSizeToFitWidth = NO; - detailsLabel.textAlignment = NSTextAlignmentCenter; - detailsLabel.textColor = defaultColor; - detailsLabel.numberOfLines = 0; - detailsLabel.font = [UIFont boldSystemFontOfSize:MBDefaultDetailsLabelFontSize]; + UILabel *detailsLabel = [UILabel new]; + detailsLabel.adjustsFontSizeToFitWidth = NO; + detailsLabel.textAlignment = NSTextAlignmentCenter; + detailsLabel.textColor = defaultColor; + detailsLabel.numberOfLines = 0; + detailsLabel.font = [UIFont boldSystemFontOfSize:MBDefaultDetailsLabelFontSize]; _detailsLabel = detailsLabel; UIButton *button = [MBProgressHUDRoundedButton buttonWithType:UIButtonTypeCustom]; @@ -343,46 +343,46 @@ - (void)setupViews { - (void)updateIndicators { UIView *indicator = self.indicator; - BOOL isActivityIndicator = [indicator isKindOfClass:[UIActivityIndicatorView class]]; - BOOL isRoundIndicator = [indicator isKindOfClass:[MBRoundProgressView class]]; + BOOL isActivityIndicator = [indicator isKindOfClass:[UIActivityIndicatorView class]]; + BOOL isRoundIndicator = [indicator isKindOfClass:[MBRoundProgressView class]]; MBProgressHUDMode mode = self.mode; - if (mode == MBProgressHUDModeIndeterminate) { - if (!isActivityIndicator) { - // Update to indeterminate indicator - [indicator removeFromSuperview]; - indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; - [(UIActivityIndicatorView *)indicator startAnimating]; - [self.bezelView addSubview:indicator]; - } - } - else if (mode == MBProgressHUDModeDeterminateHorizontalBar) { - // Update to bar determinate indicator - [indicator removeFromSuperview]; + if (mode == MBProgressHUDModeIndeterminate) { + if (!isActivityIndicator) { + // Update to indeterminate indicator + [indicator removeFromSuperview]; + indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; + [(UIActivityIndicatorView *)indicator startAnimating]; + [self.bezelView addSubview:indicator]; + } + } + else if (mode == MBProgressHUDModeDeterminateHorizontalBar) { + // Update to bar determinate indicator + [indicator removeFromSuperview]; indicator = [[MBBarProgressView alloc] init]; - [self.bezelView addSubview:indicator]; - } - else if (mode == MBProgressHUDModeDeterminate || mode == MBProgressHUDModeAnnularDeterminate) { - if (!isRoundIndicator) { - // Update to determinante indicator - [indicator removeFromSuperview]; + [self.bezelView addSubview:indicator]; + } + else if (mode == MBProgressHUDModeDeterminate || mode == MBProgressHUDModeAnnularDeterminate) { + if (!isRoundIndicator) { + // Update to determinante indicator + [indicator removeFromSuperview]; indicator = [[MBRoundProgressView alloc] init]; - [self.bezelView addSubview:indicator]; - } - if (mode == MBProgressHUDModeAnnularDeterminate) { - [(MBRoundProgressView *)indicator setAnnular:YES]; - } - } - else if (mode == MBProgressHUDModeCustomView && self.customView != indicator) { - // Update custom view indicator - [indicator removeFromSuperview]; - indicator = self.customView; - [self.bezelView addSubview:indicator]; - } + [self.bezelView addSubview:indicator]; + } + if (mode == MBProgressHUDModeAnnularDeterminate) { + [(MBRoundProgressView *)indicator setAnnular:YES]; + } + } + else if (mode == MBProgressHUDModeCustomView && self.customView != indicator) { + // Update custom view indicator + [indicator removeFromSuperview]; + indicator = self.customView; + [self.bezelView addSubview:indicator]; + } else if (mode == MBProgressHUDModeText) { - [indicator removeFromSuperview]; - indicator = nil; - } + [indicator removeFromSuperview]; + indicator = nil; + } indicator.translatesAutoresizingMaskIntoConstraints = NO; self.indicator = indicator; @@ -644,28 +644,28 @@ - (void)setDefaultMotionEffectsEnabled:(BOOL)defaultMotionEffectsEnabled { - (void)registerForNotifications { #if !TARGET_OS_TV - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc addObserver:self selector:@selector(statusBarOrientationDidChange:) + [nc addObserver:self selector:@selector(statusBarOrientationDidChange:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; #endif } - (void)unregisterFromNotifications { #if !TARGET_OS_TV - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc removeObserver:self name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; #endif } #if !TARGET_OS_TV - (void)statusBarOrientationDidChange:(NSNotification *)notification { - UIView *superview = self.superview; - if (!superview) { - return; - } else { - [self updateForCurrentOrientationAnimated:YES]; - } + UIView *superview = self.superview; + if (!superview) { + return; + } else { + [self updateForCurrentOrientationAnimated:YES]; + } } #endif @@ -682,15 +682,15 @@ - (void)updateForCurrentOrientationAnimated:(BOOL)animated { BOOL iOS8OrLater = kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0; if (iOS8OrLater || ![self.superview isKindOfClass:[UIWindow class]]) return; - UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; - CGFloat radians = 0; - if (UIInterfaceOrientationIsLandscape(orientation)) { + UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; + CGFloat radians = 0; + if (UIInterfaceOrientationIsLandscape(orientation)) { radians = orientation == UIInterfaceOrientationLandscapeLeft ? -(CGFloat)M_PI_2 : (CGFloat)M_PI_2; - // Window coordinates differ! - self.bounds = CGRectMake(0, 0, self.bounds.size.height, self.bounds.size.width); - } else { + // Window coordinates differ! + self.bounds = CGRectMake(0, 0, self.bounds.size.height, self.bounds.size.width); + } else { radians = orientation == UIInterfaceOrientationPortraitUpsideDown ? (CGFloat)M_PI : 0.f; - } + } if (animated) { [UIView animateWithDuration:0.3 animations:^{ @@ -710,20 +710,20 @@ @implementation MBRoundProgressView #pragma mark - Lifecycle - (id)init { - return [self initWithFrame:CGRectMake(0.f, 0.f, 37.f, 37.f)]; + return [self initWithFrame:CGRectMake(0.f, 0.f, 37.f, 37.f)]; } - (id)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - self.backgroundColor = [UIColor clearColor]; - self.opaque = NO; - _progress = 0.f; - _annular = NO; - _progressTintColor = [[UIColor alloc] initWithWhite:1.f alpha:1.f]; - _backgroundTintColor = [[UIColor alloc] initWithWhite:1.f alpha:.1f]; - } - return self; + self = [super initWithFrame:frame]; + if (self) { + self.backgroundColor = [UIColor clearColor]; + self.opaque = NO; + _progress = 0.f; + _annular = NO; + _progressTintColor = [[UIColor alloc] initWithWhite:1.f alpha:1.f]; + _backgroundTintColor = [[UIColor alloc] initWithWhite:1.f alpha:.1f]; + } + return self; } #pragma mark - Layout @@ -758,43 +758,43 @@ - (void)setBackgroundTintColor:(UIColor *)backgroundTintColor { #pragma mark - Drawing - (void)drawRect:(CGRect)rect { - CGContextRef context = UIGraphicsGetCurrentContext(); + CGContextRef context = UIGraphicsGetCurrentContext(); BOOL isPreiOS7 = kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0; - if (_annular) { - // Draw background - CGFloat lineWidth = isPreiOS7 ? 5.f : 2.f; - UIBezierPath *processBackgroundPath = [UIBezierPath bezierPath]; - processBackgroundPath.lineWidth = lineWidth; - processBackgroundPath.lineCapStyle = kCGLineCapButt; - CGPoint center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); - CGFloat radius = (self.bounds.size.width - lineWidth)/2; - CGFloat startAngle = - ((float)M_PI / 2); // 90 degrees - CGFloat endAngle = (2 * (float)M_PI) + startAngle; - [processBackgroundPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; - [_backgroundTintColor set]; - [processBackgroundPath stroke]; - // Draw progress - UIBezierPath *processPath = [UIBezierPath bezierPath]; - processPath.lineCapStyle = isPreiOS7 ? kCGLineCapRound : kCGLineCapSquare; - processPath.lineWidth = lineWidth; - endAngle = (self.progress * 2 * (float)M_PI) + startAngle; - [processPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; - [_progressTintColor set]; - [processPath stroke]; - } else { - // Draw background + if (_annular) { + // Draw background + CGFloat lineWidth = isPreiOS7 ? 5.f : 2.f; + UIBezierPath *processBackgroundPath = [UIBezierPath bezierPath]; + processBackgroundPath.lineWidth = lineWidth; + processBackgroundPath.lineCapStyle = kCGLineCapButt; + CGPoint center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); + CGFloat radius = (self.bounds.size.width - lineWidth)/2; + CGFloat startAngle = - ((float)M_PI / 2); // 90 degrees + CGFloat endAngle = (2 * (float)M_PI) + startAngle; + [processBackgroundPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; + [_backgroundTintColor set]; + [processBackgroundPath stroke]; + // Draw progress + UIBezierPath *processPath = [UIBezierPath bezierPath]; + processPath.lineCapStyle = isPreiOS7 ? kCGLineCapRound : kCGLineCapSquare; + processPath.lineWidth = lineWidth; + endAngle = (self.progress * 2 * (float)M_PI) + startAngle; + [processPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; + [_progressTintColor set]; + [processPath stroke]; + } else { + // Draw background CGFloat lineWidth = 2.f; CGRect allRect = self.bounds; CGRect circleRect = CGRectInset(allRect, lineWidth/2.f, lineWidth/2.f); CGPoint center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); - [_progressTintColor setStroke]; - [_backgroundTintColor setFill]; - CGContextSetLineWidth(context, lineWidth); + [_progressTintColor setStroke]; + [_backgroundTintColor setFill]; + CGContextSetLineWidth(context, lineWidth); if (isPreiOS7) { CGContextFillEllipseInRect(context, circleRect); } - CGContextStrokeEllipseInRect(context, circleRect); + CGContextStrokeEllipseInRect(context, circleRect); // 90 degrees CGFloat startAngle = - ((float)M_PI / 2.f); // Draw progress @@ -818,7 +818,7 @@ - (void)drawRect:(CGRect)rect { [_progressTintColor set]; [processPath stroke]; } - } + } } @end @@ -829,20 +829,20 @@ @implementation MBBarProgressView #pragma mark - Lifecycle - (id)init { - return [self initWithFrame:CGRectMake(.0f, .0f, 120.0f, 20.0f)]; + return [self initWithFrame:CGRectMake(.0f, .0f, 120.0f, 20.0f)]; } - (id)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - _progress = 0.f; - _lineColor = [UIColor whiteColor]; - _progressColor = [UIColor whiteColor]; - _progressRemainingColor = [UIColor clearColor]; - self.backgroundColor = [UIColor clearColor]; - self.opaque = NO; - } - return self; + self = [super initWithFrame:frame]; + if (self) { + _progress = 0.f; + _lineColor = [UIColor whiteColor]; + _progressColor = [UIColor whiteColor]; + _progressRemainingColor = [UIColor clearColor]; + self.backgroundColor = [UIColor clearColor]; + self.opaque = NO; + } + return self; } #pragma mark - Layout @@ -878,87 +878,87 @@ - (void)setProgressRemainingColor:(UIColor *)progressRemainingColor { #pragma mark - Drawing - (void)drawRect:(CGRect)rect { - CGContextRef context = UIGraphicsGetCurrentContext(); - - CGContextSetLineWidth(context, 2); - CGContextSetStrokeColorWithColor(context,[_lineColor CGColor]); - CGContextSetFillColorWithColor(context, [_progressRemainingColor CGColor]); - - // Draw background - CGFloat radius = (rect.size.height / 2) - 2; - CGContextMoveToPoint(context, 2, rect.size.height/2); - CGContextAddArcToPoint(context, 2, 2, radius + 2, 2, radius); - CGContextAddLineToPoint(context, rect.size.width - radius - 2, 2); - CGContextAddArcToPoint(context, rect.size.width - 2, 2, rect.size.width - 2, rect.size.height / 2, radius); - CGContextAddArcToPoint(context, rect.size.width - 2, rect.size.height - 2, rect.size.width - radius - 2, rect.size.height - 2, radius); - CGContextAddLineToPoint(context, radius + 2, rect.size.height - 2); - CGContextAddArcToPoint(context, 2, rect.size.height - 2, 2, rect.size.height/2, radius); - CGContextFillPath(context); - - // Draw border - CGContextMoveToPoint(context, 2, rect.size.height/2); - CGContextAddArcToPoint(context, 2, 2, radius + 2, 2, radius); - CGContextAddLineToPoint(context, rect.size.width - radius - 2, 2); - CGContextAddArcToPoint(context, rect.size.width - 2, 2, rect.size.width - 2, rect.size.height / 2, radius); - CGContextAddArcToPoint(context, rect.size.width - 2, rect.size.height - 2, rect.size.width - radius - 2, rect.size.height - 2, radius); - CGContextAddLineToPoint(context, radius + 2, rect.size.height - 2); - CGContextAddArcToPoint(context, 2, rect.size.height - 2, 2, rect.size.height/2, radius); - CGContextStrokePath(context); - - CGContextSetFillColorWithColor(context, [_progressColor CGColor]); - radius = radius - 2; - CGFloat amount = self.progress * rect.size.width; - - // Progress in the middle area - if (amount >= radius + 4 && amount <= (rect.size.width - radius - 4)) { - CGContextMoveToPoint(context, 4, rect.size.height/2); - CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius); - CGContextAddLineToPoint(context, amount, 4); - CGContextAddLineToPoint(context, amount, radius + 4); - - CGContextMoveToPoint(context, 4, rect.size.height/2); - CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius); - CGContextAddLineToPoint(context, amount, rect.size.height - 4); - CGContextAddLineToPoint(context, amount, radius + 4); - - CGContextFillPath(context); - } - - // Progress in the right arc - else if (amount > radius + 4) { - CGFloat x = amount - (rect.size.width - radius - 4); - - CGContextMoveToPoint(context, 4, rect.size.height/2); - CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius); - CGContextAddLineToPoint(context, rect.size.width - radius - 4, 4); - CGFloat angle = -acos(x/radius); - if (isnan(angle)) angle = 0; - CGContextAddArc(context, rect.size.width - radius - 4, rect.size.height/2, radius, M_PI, angle, 0); - CGContextAddLineToPoint(context, amount, rect.size.height/2); - - CGContextMoveToPoint(context, 4, rect.size.height/2); - CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius); - CGContextAddLineToPoint(context, rect.size.width - radius - 4, rect.size.height - 4); - angle = acos(x/radius); - if (isnan(angle)) angle = 0; - CGContextAddArc(context, rect.size.width - radius - 4, rect.size.height/2, radius, -M_PI, angle, 1); - CGContextAddLineToPoint(context, amount, rect.size.height/2); - - CGContextFillPath(context); - } - - // Progress is in the left arc - else if (amount < radius + 4 && amount > 0) { - CGContextMoveToPoint(context, 4, rect.size.height/2); - CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius); - CGContextAddLineToPoint(context, radius + 4, rect.size.height/2); - - CGContextMoveToPoint(context, 4, rect.size.height/2); - CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius); - CGContextAddLineToPoint(context, radius + 4, rect.size.height/2); - - CGContextFillPath(context); - } + CGContextRef context = UIGraphicsGetCurrentContext(); + + CGContextSetLineWidth(context, 2); + CGContextSetStrokeColorWithColor(context,[_lineColor CGColor]); + CGContextSetFillColorWithColor(context, [_progressRemainingColor CGColor]); + + // Draw background + CGFloat radius = (rect.size.height / 2) - 2; + CGContextMoveToPoint(context, 2, rect.size.height/2); + CGContextAddArcToPoint(context, 2, 2, radius + 2, 2, radius); + CGContextAddLineToPoint(context, rect.size.width - radius - 2, 2); + CGContextAddArcToPoint(context, rect.size.width - 2, 2, rect.size.width - 2, rect.size.height / 2, radius); + CGContextAddArcToPoint(context, rect.size.width - 2, rect.size.height - 2, rect.size.width - radius - 2, rect.size.height - 2, radius); + CGContextAddLineToPoint(context, radius + 2, rect.size.height - 2); + CGContextAddArcToPoint(context, 2, rect.size.height - 2, 2, rect.size.height/2, radius); + CGContextFillPath(context); + + // Draw border + CGContextMoveToPoint(context, 2, rect.size.height/2); + CGContextAddArcToPoint(context, 2, 2, radius + 2, 2, radius); + CGContextAddLineToPoint(context, rect.size.width - radius - 2, 2); + CGContextAddArcToPoint(context, rect.size.width - 2, 2, rect.size.width - 2, rect.size.height / 2, radius); + CGContextAddArcToPoint(context, rect.size.width - 2, rect.size.height - 2, rect.size.width - radius - 2, rect.size.height - 2, radius); + CGContextAddLineToPoint(context, radius + 2, rect.size.height - 2); + CGContextAddArcToPoint(context, 2, rect.size.height - 2, 2, rect.size.height/2, radius); + CGContextStrokePath(context); + + CGContextSetFillColorWithColor(context, [_progressColor CGColor]); + radius = radius - 2; + CGFloat amount = self.progress * rect.size.width; + + // Progress in the middle area + if (amount >= radius + 4 && amount <= (rect.size.width - radius - 4)) { + CGContextMoveToPoint(context, 4, rect.size.height/2); + CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius); + CGContextAddLineToPoint(context, amount, 4); + CGContextAddLineToPoint(context, amount, radius + 4); + + CGContextMoveToPoint(context, 4, rect.size.height/2); + CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius); + CGContextAddLineToPoint(context, amount, rect.size.height - 4); + CGContextAddLineToPoint(context, amount, radius + 4); + + CGContextFillPath(context); + } + + // Progress in the right arc + else if (amount > radius + 4) { + CGFloat x = amount - (rect.size.width - radius - 4); + + CGContextMoveToPoint(context, 4, rect.size.height/2); + CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius); + CGContextAddLineToPoint(context, rect.size.width - radius - 4, 4); + CGFloat angle = -acos(x/radius); + if (isnan(angle)) angle = 0; + CGContextAddArc(context, rect.size.width - radius - 4, rect.size.height/2, radius, M_PI, angle, 0); + CGContextAddLineToPoint(context, amount, rect.size.height/2); + + CGContextMoveToPoint(context, 4, rect.size.height/2); + CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius); + CGContextAddLineToPoint(context, rect.size.width - radius - 4, rect.size.height - 4); + angle = acos(x/radius); + if (isnan(angle)) angle = 0; + CGContextAddArc(context, rect.size.width - radius - 4, rect.size.height/2, radius, -M_PI, angle, 1); + CGContextAddLineToPoint(context, amount, rect.size.height/2); + + CGContextFillPath(context); + } + + // Progress is in the left arc + else if (amount < radius + 4 && amount > 0) { + CGContextMoveToPoint(context, 4, rect.size.height/2); + CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius); + CGContextAddLineToPoint(context, radius + 4, rect.size.height/2); + + CGContextMoveToPoint(context, 4, rect.size.height/2); + CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius); + CGContextAddLineToPoint(context, radius + 4, rect.size.height/2); + + CGContextFillPath(context); + } } @end @@ -1143,7 +1143,7 @@ - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block } - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue { - [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:NULL]; + [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:NULL]; } - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue From 011c76ede6a750a7935d7f4324cbe28788a97561 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 31 Jan 2016 16:02:19 +0100 Subject: [PATCH 103/117] Added nullability. --- MBProgressHUD.h | 21 +++++++++++++-------- MBProgressHUD.m | 10 +++++++--- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index e42f302fd..ac207da01 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -70,6 +70,9 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { }; +NS_ASSUME_NONNULL_BEGIN + + /** * Displays a simple HUD window containing a progress indicator and two optional labels for short messages. * @@ -120,7 +123,7 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { * @param view The view that is going to be searched. * @return A reference to the last HUD subview discovered. */ -+ (MBProgressHUD *)HUDForView:(UIView *)view; ++ (nullable MBProgressHUD *)HUDForView:(UIView *)view; /** * A convenience constructor that initializes the HUD with the view's bounds. Calls the designated constructor with @@ -207,7 +210,7 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { * for custom views on iOS 7+. Set to nil to manage color individually. * Defaults to semi-translucent black on iOS 7 and later and white on earlier iOS versions. */ -@property (strong, nonatomic) UIColor *contentColor UI_APPEARANCE_SELECTOR; +@property (strong, nonatomic, nullable) UIColor *contentColor UI_APPEARANCE_SELECTOR; /** * The animation type that should be used when the HUD is shown and hidden. @@ -267,7 +270,7 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { * The UIView (e.g., a UIImageView) to be shown when the HUD is in MBProgressHUDModeCustomView. * The view should implement intrinsicContentSize for proper sizing. For best results use approximately 37 by 37 pixel. */ -@property (strong, nonatomic) UIView *customView; +@property (strong, nonatomic, nullable) UIView *customView; /** * A label that holds an optional short message to be displayed below the activity indicator. The HUD is automatically resized to fit @@ -324,7 +327,7 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { @property (nonatomic, strong) UIColor *backgroundTintColor; /* - * Display mode - NO = round or YES = annular. Defaults to round. + * Display mode - NO = round or YES = annular. De+faults to round. */ @property (nonatomic, assign, getter = isAnnular) BOOL annular; @@ -394,12 +397,12 @@ typedef void (^MBProgressHUDCompletionBlock)(); - (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated __attribute__((deprecated("Use GCD directly."))); - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block __attribute__((deprecated("Use GCD directly."))); -- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(MBProgressHUDCompletionBlock)completion __attribute__((deprecated("Use GCD directly."))); +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(nullable MBProgressHUDCompletionBlock)completion __attribute__((deprecated("Use GCD directly."))); - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue __attribute__((deprecated("Use GCD directly."))); - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue - completionBlock:(MBProgressHUDCompletionBlock)completion __attribute__((deprecated("Use GCD directly."))); -@property (copy) MBProgressHUDCompletionBlock completionBlock __attribute__((deprecated("Use GCD directly."))); -@property (assign) BOOL taskInProgress __attribute__((deprecated("No longer needed for ."))); + completionBlock:(nullable MBProgressHUDCompletionBlock)completion __attribute__((deprecated("Use GCD directly."))); +@property (copy, nullable) MBProgressHUDCompletionBlock completionBlock __attribute__((deprecated("Use GCD directly."))); +@property (assign) BOOL taskInProgress __attribute__((deprecated("No longer needed."))); @property (nonatomic, copy) NSString *labelText __attribute__((deprecated("Use label.text instead."))); @property (nonatomic, strong) UIFont *labelFont __attribute__((deprecated("Use label.font instead."))); @@ -417,3 +420,5 @@ typedef void (^MBProgressHUDCompletionBlock)(); @property (atomic, assign, readonly) CGSize size __attribute__((deprecated("Get the bezelView.frame.size instead."))); @end + +NS_ASSUME_NONNULL_END diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 64229c5f9..8ca814d73 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -42,7 +42,7 @@ @interface MBProgressHUD () { @property (nonatomic, strong) UIView *bottomSpacer; // Deprecated -@property (copy) MBProgressHUDCompletionBlock completionBlock; +@property (copy, nullable) MBProgressHUDCompletionBlock completionBlock; @property (assign) BOOL taskInProgress; @end @@ -742,6 +742,7 @@ - (void)setProgress:(float)progress { } - (void)setProgressTintColor:(UIColor *)progressTintColor { + NSAssert(progressTintColor, @"The color should not be nil."); if (progressTintColor != _progressTintColor && ![progressTintColor isEqual:_progressTintColor]) { _progressTintColor = progressTintColor; [self setNeedsDisplay]; @@ -749,6 +750,7 @@ - (void)setProgressTintColor:(UIColor *)progressTintColor { } - (void)setBackgroundTintColor:(UIColor *)backgroundTintColor { + NSAssert(backgroundTintColor, @"The color should not be nil."); if (backgroundTintColor != _backgroundTintColor && ![backgroundTintColor isEqual:_backgroundTintColor]) { _backgroundTintColor = backgroundTintColor; [self setNeedsDisplay]; @@ -862,6 +864,7 @@ - (void)setProgress:(float)progress { } - (void)setProgressColor:(UIColor *)progressColor { + NSAssert(progressColor, @"The color should not be nil."); if (progressColor != _progressColor && ![progressColor isEqual:_progressColor]) { _progressColor = progressColor; [self setNeedsDisplay]; @@ -869,6 +872,7 @@ - (void)setProgressColor:(UIColor *)progressColor { } - (void)setProgressRemainingColor:(UIColor *)progressRemainingColor { + NSAssert(progressRemainingColor, @"The color should not be nil."); if (progressRemainingColor != _progressRemainingColor && ![progressRemainingColor isEqual:_progressRemainingColor]) { _progressRemainingColor = progressRemainingColor; [self setNeedsDisplay]; @@ -1019,6 +1023,7 @@ - (void)setStyle:(MBProgressHUDBackgroundStyle)style { } - (void)setColor:(UIColor *)color { + NSAssert(color, @"The color should not be nil."); if (color != _color && ![color isEqual:_color]) { _color = color; [self updateViewsForColor:color]; @@ -1146,8 +1151,7 @@ - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:NULL]; } -- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue - completionBlock:(MBProgressHUDCompletionBlock)completion { +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue completionBlock:(nullable MBProgressHUDCompletionBlock)completion { self.taskInProgress = YES; self.completionBlock = completion; dispatch_async(queue, ^(void) { From 9c91d4e7763877de31ea2f450767caa8b9d3b6c4 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 31 Jan 2016 16:03:44 +0100 Subject: [PATCH 104/117] Added missing documentation. --- MBProgressHUD.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index ac207da01..658273bf0 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -262,7 +262,7 @@ NS_ASSUME_NONNULL_BEGIN @property (strong, nonatomic, readonly) MBBackgroundView *bezelView; /** - * + * View coving the entire HUD area, placed behind bezelView. */ @property (strong, nonatomic, readonly) MBBackgroundView *backgroundView; From cc02637cc5626728bd75a90550d3ac5b8e3405f7 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 31 Jan 2016 16:41:40 +0100 Subject: [PATCH 105/117] New images. --- README.mdown | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.mdown b/README.mdown index e56ab3ac3..0fcc7390a 100644 --- a/README.mdown +++ b/README.mdown @@ -2,13 +2,13 @@ MBProgressHUD is an iOS drop-in class that displays a translucent HUD with an indicator and/or labels while work is being done in a background thread. The HUD is meant as a replacement for the undocumented, private UIKit UIProgressHUD with some additional features. -[![](http://dl.dropbox.com/u/378729/MBProgressHUD/1-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/1.png) -[![](http://dl.dropbox.com/u/378729/MBProgressHUD/2-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/2.png) -[![](http://dl.dropbox.com/u/378729/MBProgressHUD/3-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/3.png) -[![](http://dl.dropbox.com/u/378729/MBProgressHUD/4-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/4.png) -[![](http://dl.dropbox.com/u/378729/MBProgressHUD/5-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/5.png) -[![](http://dl.dropbox.com/u/378729/MBProgressHUD/6-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/6.png) -[![](http://dl.dropbox.com/u/378729/MBProgressHUD/7-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/7.png) +[![](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/1-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/1.png) +[![](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/2-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/2.png) +[![](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/3-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/3.png) +[![](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/4-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/4.png) +[![](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/5-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/5.png) +[![](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/6-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/6.png) +[![](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/7-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/7.png) ## Requirements From 5935c741ab0522b3623a5c09599121f14312be8f Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 31 Jan 2016 16:54:33 +0100 Subject: [PATCH 106/117] Update README.mdown --- README.mdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.mdown b/README.mdown index d87252015..2029c94d7 100644 --- a/README.mdown +++ b/README.mdown @@ -2,7 +2,7 @@ [![Build Status](https://travis-ci.org/matej/MBProgressHUD.svg?branch=master)](https://travis-ci.org/matej/MBProgressHUD) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application) [![Cocoapods compatible](https://img.shields.io/cocoapods/v/MBProgressHUD.svg?style=flat)](https://cocoapods.org/pods/MBProgressHUD) [![License: MIT](https://img.shields.io/cocoapods/l/MBProgressHUD.svg?style=flat)](http://opensource.org/licenses/MIT) -MBProgressHUD is an iOS drop-in class that displays a translucent HUD with an indicator and/or labels while work is being done in a background thread. The HUD is meant as a replacement for the undocumented, private UIKit UIProgressHUD with some additional features. +`MBProgressHUD` is an iOS drop-in class that displays a translucent HUD with an indicator and/or labels while work is being done in a background thread. The HUD is meant as a replacement for the undocumented, private `UIKit` `UIProgressHUD` with some additional features. [![](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/1-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/1.png) [![](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/2-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/2.png) @@ -14,13 +14,13 @@ MBProgressHUD is an iOS drop-in class that displays a translucent HUD with an in ## Requirements -MBProgressHUD works on any iOS version and is compatible with both ARC and non-ARC projects. It depends on the following Apple frameworks, which should already be included with most Xcode templates: +`MBProgressHUD` works on iOS 6+ and requires ARC to build. It depends on the following Apple frameworks, which should already be included with most Xcode templates: * Foundation.framework * UIKit.framework * CoreGraphics.framework -You will need the latest developer tools in order to build MBProgressHUD. Old Xcode versions might work, but compatibility will not be explicitly maintained. +You will need the latest developer tools in order to build `MBProgressHUD`. Old Xcode versions might work, but compatibility will not be explicitly maintained. ## Adding MBProgressHUD to your project From a3d360c6a2dccded7a6b6bcb22bd5b2ad56f77d1 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 31 Jan 2016 17:11:48 +0100 Subject: [PATCH 107/117] Update README.mdown --- README.mdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.mdown b/README.mdown index 2029c94d7..8743b451b 100644 --- a/README.mdown +++ b/README.mdown @@ -12,6 +12,8 @@ [![](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/6-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/6.png) [![](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/7-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/v1/7.png) +**NOTE:** The class has recently undegone a major rewrite. The old version is available in the [legacy](https://github.com/jdg/MBProgressHUD/tree/legacy) branch, should you need it. + ## Requirements `MBProgressHUD` works on iOS 6+ and requires ARC to build. It depends on the following Apple frameworks, which should already be included with most Xcode templates: From e733e566c85689be28a386e94065f431c83afdfb Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 31 Jan 2016 17:13:50 +0100 Subject: [PATCH 108/117] Added codecov badge. --- README.mdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.mdown b/README.mdown index 8743b451b..e8ef16fa1 100644 --- a/README.mdown +++ b/README.mdown @@ -1,6 +1,7 @@ # MBProgressHUD -[![Build Status](https://travis-ci.org/matej/MBProgressHUD.svg?branch=master)](https://travis-ci.org/matej/MBProgressHUD) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application) [![Cocoapods compatible](https://img.shields.io/cocoapods/v/MBProgressHUD.svg?style=flat)](https://cocoapods.org/pods/MBProgressHUD) [![License: MIT](https://img.shields.io/cocoapods/l/MBProgressHUD.svg?style=flat)](http://opensource.org/licenses/MIT) +[![Build Status](https://travis-ci.org/matej/MBProgressHUD.svg?branch=master)](https://travis-ci.org/matej/MBProgressHUD) [![codecov.io](https://codecov.io/github/matej/MBProgressHUD/coverage.svg?branch=master)](https://codecov.io/github/matej/MBProgressHUD?branch=master) + [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application) [![Cocoapods compatible](https://img.shields.io/cocoapods/v/MBProgressHUD.svg?style=flat)](https://cocoapods.org/pods/MBProgressHUD) [![License: MIT](https://img.shields.io/cocoapods/l/MBProgressHUD.svg?style=flat)](http://opensource.org/licenses/MIT) `MBProgressHUD` is an iOS drop-in class that displays a translucent HUD with an indicator and/or labels while work is being done in a background thread. The HUD is meant as a replacement for the undocumented, private `UIKit` `UIProgressHUD` with some additional features. From 2107d0d6a32b508153c8b7fc57d33b661a595533 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 31 Jan 2016 17:38:29 +0100 Subject: [PATCH 109/117] Better support for xibs. --- MBProgressHUD.m | 51 ++++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 74dd88f68..8369ba21d 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -86,29 +86,40 @@ + (MBProgressHUD *)HUDForView:(UIView *)view { #pragma mark - Lifecycle +- (void)commonInit { + // Set default values for properties + _animationType = MBProgressHUDAnimationFade; + _mode = MBProgressHUDModeIndeterminate; + _margin = 20.0f; + _opacity = 1.f; + _defaultMotionEffectsEnabled = YES; + + // Default color, depending on the current iOS version + BOOL isLegacy = kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0; + _contentColor = isLegacy ? [UIColor whiteColor] : [UIColor colorWithWhite:0.f alpha:0.7f]; + // Transparent background + self.opaque = NO; + self.backgroundColor = [UIColor clearColor]; + // Make it invisible for now + self.alpha = 0.0f; + self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + self.layer.allowsGroupOpacity = NO; + + [self setupViews]; + [self updateIndicators]; + [self registerForNotifications]; +} + - (instancetype)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { - // Set default values for properties - _animationType = MBProgressHUDAnimationFade; - _mode = MBProgressHUDModeIndeterminate; - _margin = 20.0f; - _opacity = 1.f; - _defaultMotionEffectsEnabled = YES; - - // Default color, depending on the current iOS version - BOOL isLegacy = kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0; - _contentColor = isLegacy ? [UIColor whiteColor] : [UIColor colorWithWhite:0.f alpha:0.7f]; - // Transparent background - self.opaque = NO; - self.backgroundColor = [UIColor clearColor]; - // Make it invisible for now - self.alpha = 0.0f; - self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - self.layer.allowsGroupOpacity = NO; + [self commonInit]; + } + return self; +} - [self setupViews]; - [self updateIndicators]; - [self registerForNotifications]; +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if ((self = [super initWithCoder:aDecoder])) { + [self commonInit]; } return self; } From daff1bf4525def74a66b169565db6624f66a15b2 Mon Sep 17 00:00:00 2001 From: nsgeek Date: Mon, 1 Feb 2016 07:55:41 -0800 Subject: [PATCH 110/117] CB-4842: changed some includes to @module style after converting some of our libs to frameworks --- MBProgressHUD.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 07362d5af..2a9f95e4b 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -5,7 +5,8 @@ // #import -#import +@import IOSShared; + #import "MBProgressHUD.h" #if __has_feature(objc_arc) From c9ec43b031e31da9a9161be99435edcfc75747ed Mon Sep 17 00:00:00 2001 From: nsgeek Date: Fri, 5 Feb 2016 17:34:02 -0800 Subject: [PATCH 111/117] CB-4842: added QADeployment build config --- MBProgressHUD.xcodeproj/project.pbxproj | 94 +++++++++++++++++++++++-- 1 file changed, 87 insertions(+), 7 deletions(-) diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index fb4911a3e..65479e567 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -229,16 +229,12 @@ CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); + GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = "Framework-Info.plist"; @@ -263,8 +259,6 @@ CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -287,6 +281,87 @@ }; name = Release; }; + C38D09661C65837A00D639D7 /* QADeployment */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + SDKROOT = iphoneos; + }; + name = QADeployment; + }; + C38D09671C65837A00D639D7 /* QADeployment */ = { + isa = XCBuildConfiguration; + buildSettings = { + DSTROOT = /tmp/MBProgressHUD.dst; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "MBProgressHUD-Prefix.pch"; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = MBProgressHUD; + SKIP_INSTALL = YES; + }; + name = QADeployment; + }; + C38D09681C65837A00D639D7 /* QADeployment */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = "Framework-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.matej.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = MBProgressHUD; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = QADeployment; + }; D286A7541518C70F00E13FB8 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -301,6 +376,7 @@ CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -340,6 +416,7 @@ CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution"; COPY_PHASE_STRIP = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -388,6 +465,7 @@ isa = XCConfigurationList; buildConfigurations = ( 1D104D8E1ACA36CC00973364 /* Debug */, + C38D09681C65837A00D639D7 /* QADeployment */, 1D104D8F1ACA36CC00973364 /* Release */, ); defaultConfigurationIsVisible = 0; @@ -397,6 +475,7 @@ isa = XCConfigurationList; buildConfigurations = ( D286A7541518C70F00E13FB8 /* Debug */, + C38D09661C65837A00D639D7 /* QADeployment */, D286A7551518C70F00E13FB8 /* Release */, ); defaultConfigurationIsVisible = 0; @@ -406,6 +485,7 @@ isa = XCConfigurationList; buildConfigurations = ( D286A7571518C70F00E13FB8 /* Debug */, + C38D09671C65837A00D639D7 /* QADeployment */, D286A7581518C70F00E13FB8 /* Release */, ); defaultConfigurationIsVisible = 0; From 0faf56b76aa236302655bfbe1e7022c6c58cc4cf Mon Sep 17 00:00:00 2001 From: nsgeek Date: Mon, 8 Feb 2016 18:17:07 -0800 Subject: [PATCH 112/117] CB-4842: bumped deployment version to 8.2, disabled bitcode, and confirmed standard arch. setting. --- MBProgressHUD.xcodeproj/project.pbxproj | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index 65479e567..56f48a502 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -297,6 +297,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; + ENABLE_BITCODE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -315,7 +316,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; SDKROOT = iphoneos; }; name = QADeployment; @@ -378,6 +379,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; + ENABLE_BITCODE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -396,7 +398,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -418,6 +420,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; COPY_PHASE_STRIP = YES; + ENABLE_BITCODE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; @@ -428,7 +431,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; From 00e927f0def5f931144bfda3a5188a680d90b024 Mon Sep 17 00:00:00 2001 From: nsgeek Date: Wed, 24 Feb 2016 00:26:40 -0800 Subject: [PATCH 113/117] some project adjustments to build with walmart-core --- .gitignore | 1 + MBProgressHUD.xcodeproj/project.pbxproj | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 7aee0c65a..c0acb979b 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ build/ *.perspectivev3 xcuserdata/ *.xccheckout +*.xcscmblueprint # old skool .svn diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index 56f48a502..422da943d 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -239,7 +239,6 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = "Framework-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.matej.$(PRODUCT_NAME:rfc1034identifier)"; @@ -269,7 +268,6 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = "Framework-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "com.matej.$(PRODUCT_NAME:rfc1034identifier)"; @@ -351,7 +349,6 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = "Framework-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.matej.$(PRODUCT_NAME:rfc1034identifier)"; From 8a8f0e755e23c4fd9e2723e031f573b2f9045280 Mon Sep 17 00:00:00 2001 From: Cody Garvin Date: Thu, 14 Apr 2016 11:06:21 -0700 Subject: [PATCH 114/117] Updated project for version compatibility --- .../xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme | 2 +- .../xcshareddata/xcschemes/MBProgressHUD.xcscheme | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme index 4820e0310..9f8058451 100644 --- a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme +++ b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme @@ -1,6 +1,6 @@ Date: Tue, 16 Feb 2016 19:44:54 +0800 Subject: [PATCH 115/117] graceTime --- MBProgressHUD.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 8369ba21d..c70edfc24 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -182,7 +182,7 @@ - (void)hideDelayed:(NSNumber *)animated { - (void)handleGraceTimer:(NSTimer *)theTimer { // Show the HUD only if the task is still running - if (self.hasFinished) { + if (!self.hasFinished) { [self showUsingAnimation:self.useAnimation]; } } From 42c6601d8fc83c9b730da28d57422bfeba119402 Mon Sep 17 00:00:00 2001 From: David Pettigrew Date: Wed, 7 Dec 2016 15:31:01 -0800 Subject: [PATCH 116/117] Updated project settings, enabling Unit Testing where possible --- MBProgressHUD.xcodeproj/project.pbxproj | 11 ++++++++++- .../xcschemes/MBProgressHUD Framework.xcscheme | 2 +- .../xcshareddata/xcschemes/MBProgressHUD.xcscheme | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index 422da943d..d1f202fc7 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -165,7 +165,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = MB; - LastUpgradeCheck = 0700; + LastUpgradeCheck = 0810; ORGANIZATIONNAME = "Matej Bukovinski"; TargetAttributes = { 1D104D791ACA36CC00973364 = { @@ -229,6 +229,7 @@ CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -258,6 +259,7 @@ CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -290,7 +292,9 @@ CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -339,6 +343,7 @@ CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -371,7 +376,9 @@ CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -412,7 +419,9 @@ CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; diff --git a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme index 9f8058451..189d4531b 100644 --- a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme +++ b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework.xcscheme @@ -1,6 +1,6 @@ Date: Mon, 12 Dec 2016 16:12:49 -0800 Subject: [PATCH 117/117] swift3 update. no actual code so just project file update --- MBProgressHUD.xcodeproj/project.pbxproj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index d1f202fc7..20e9a54dc 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -171,6 +171,9 @@ 1D104D791ACA36CC00973364 = { CreatedOnToolsVersion = 6.2; }; + D286A7481518C70F00E13FB8 = { + LastSwiftMigration = 0810; + }; }; }; buildConfigurationList = D286A7431518C70E00E13FB8 /* Build configuration list for PBXProject "MBProgressHUD" */; @@ -332,6 +335,7 @@ OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = MBProgressHUD; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; }; name = QADeployment; }; @@ -452,6 +456,7 @@ OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = MBProgressHUD; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -464,6 +469,7 @@ OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = MBProgressHUD; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; }; name = Release; };