From 2dbe3e42d069a7623dfcfbf8ca4d919f56e9c547 Mon Sep 17 00:00:00 2001 From: Wilson Yuan Date: Wed, 30 Dec 2015 20:54:27 +0800 Subject: [PATCH 001/173] Fix delay problem when hud show in the scrollview. --- MBProgressHUD.m | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index bf5f7fff1..2eb61c487 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -277,11 +277,12 @@ - (void)hide:(BOOL)animated { } - (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay { - [self performSelector:@selector(hideDelayed:) withObject:[NSNumber numberWithBool:animated] afterDelay:delay]; + NSTimer *timer = [NSTimer timerWithTimeInterval:delay target:self selector:@selector(hideDelayed:) userInfo:[NSNumber numberWithBool:animated] repeats:NO]; + [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; } -- (void)hideDelayed:(NSNumber *)animated { - [self hide:[animated boolValue]]; +- (void)hideDelayed:(NSTimer *)timer { + [self hide:[timer.userInfo boolValue]]; } #pragma mark - Timer callbacks From 8bb8d79140069e9d95220f1c725c372d3f611280 Mon Sep 17 00:00:00 2001 From: Jon Chmura Date: Tue, 23 Feb 2016 18:27:29 -0800 Subject: [PATCH 002/173] Removed iOS < 8 specific code that lacked app extension support. --- MBProgressHUD.m | 26 ------------------------- MBProgressHUD.xcodeproj/project.pbxproj | 4 ++-- 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 9ecc36a52..1c4af49d2 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -691,32 +691,6 @@ - (void)updateForCurrentOrientationAnimated:(BOOL)animated { if (self.superview) { self.bounds = self.superview.bounds; } - - // 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 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)) { - 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 { - 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 } @end diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index fb4911a3e..d3cb3fca0 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -320,7 +320,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.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -351,7 +351,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.0; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; From 7105c505c855126cec5661e9a637fb9657f6694f Mon Sep 17 00:00:00 2001 From: Jon Chmura Date: Tue, 22 Mar 2016 13:21:47 -0700 Subject: [PATCH 003/173] Revert "Removed iOS < 8 specific code that lacked app extension support." This reverts commit 8bb8d79140069e9d95220f1c725c372d3f611280. --- MBProgressHUD.m | 26 +++++++++++++++++++++++++ MBProgressHUD.xcodeproj/project.pbxproj | 4 ++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 1c4af49d2..9ecc36a52 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -691,6 +691,32 @@ - (void)updateForCurrentOrientationAnimated:(BOOL)animated { if (self.superview) { self.bounds = self.superview.bounds; } + + // 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 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)) { + 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 { + 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 } @end diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index d3cb3fca0..fb4911a3e 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -320,7 +320,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -351,7 +351,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; From fbf05a09c283b283483eac7de4745639259b9219 Mon Sep 17 00:00:00 2001 From: Jon Chmura Date: Tue, 22 Mar 2016 13:30:41 -0700 Subject: [PATCH 004/173] Use performSelector on UIApplication sharedApplication to avoid extension compilation errors. --- MBProgressHUD.m | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 9ecc36a52..4a4381d81 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -699,22 +699,28 @@ - (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)) { - 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 { - radians = orientation == UIInterfaceOrientationPortraitUpsideDown ? (CGFloat)M_PI : 0.f; - } - - if (animated) { - [UIView animateWithDuration:0.3 animations:^{ + // Make extension friendly + Class UIApplicationClass = NSClassFromString(@"UIApplication"); + if(UIApplicationClass && [UIApplicationClass respondsToSelector:@selector(sharedApplication)]) { + UIApplication *application = [UIApplication performSelector:@selector(sharedApplication)]; + + UIInterfaceOrientation orientation = application.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 { + radians = orientation == UIInterfaceOrientationPortraitUpsideDown ? (CGFloat)M_PI : 0.f; + } + + if (animated) { + [UIView animateWithDuration:0.3 animations:^{ + self.transform = CGAffineTransformMakeRotation(radians); + }]; + } else { self.transform = CGAffineTransformMakeRotation(radians); - }]; - } else { - self.transform = CGAffineTransformMakeRotation(radians); + } } #endif } From 2703ca16013959f15cbb7d88255f3c2bbf998237 Mon Sep 17 00:00:00 2001 From: Florian Morello Date: Tue, 29 Mar 2016 14:38:00 +0200 Subject: [PATCH 005/173] Add support of tvOS --- MBProgressHUD.podspec | 1 + 1 file changed, 1 insertion(+) diff --git a/MBProgressHUD.podspec b/MBProgressHUD.podspec index afbd61087..1d8fd52fc 100644 --- a/MBProgressHUD.podspec +++ b/MBProgressHUD.podspec @@ -13,6 +13,7 @@ Pod::Spec.new do |s| s.author = { 'Matej Bukovinski' => 'matej@bukovinski.com' } s.source = { :git => "https://github.com/matej/MBProgressHUD.git", :tag => s.version.to_s } s.platform = :ios + s.platform = :tvos s.source_files = '*.{h,m}' s.framework = "CoreGraphics" s.requires_arc = true From 15718b937ddfbcd731720b7b4e67d164ab0ad90f Mon Sep 17 00:00:00 2001 From: Florian Morello Date: Tue, 29 Mar 2016 14:45:41 +0200 Subject: [PATCH 006/173] fix deployment target for tvos according to https://guides.cocoapods.org/syntax/podspec.html#deployment_target --- MBProgressHUD.podspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MBProgressHUD.podspec b/MBProgressHUD.podspec index 1d8fd52fc..48f237684 100644 --- a/MBProgressHUD.podspec +++ b/MBProgressHUD.podspec @@ -12,8 +12,8 @@ Pod::Spec.new do |s| s.license = { :type => 'MIT', :file => 'LICENSE' } s.author = { 'Matej Bukovinski' => 'matej@bukovinski.com' } s.source = { :git => "https://github.com/matej/MBProgressHUD.git", :tag => s.version.to_s } - s.platform = :ios - s.platform = :tvos + s.ios.deployment_target = '6.0' + s.tvos.deployment_target = '9.0' s.source_files = '*.{h,m}' s.framework = "CoreGraphics" s.requires_arc = true From a46e1bc21f165d2dd042065070f758fa1a3ed916 Mon Sep 17 00:00:00 2001 From: Florian Morello Date: Tue, 29 Mar 2016 15:14:28 +0200 Subject: [PATCH 007/173] use TARGET_OS_TV TargetConditionals --- MBProgressHUD.m | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 9ecc36a52..28fac6a8a 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -265,7 +265,7 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple }; // Spring animations are nicer, but only available on iOS 7+ -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 || TARGET_OS_TV if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0) { [UIView animateWithDuration:0.3 delay:0. usingSpringWithDamping:1.f initialSpringVelocity:0.f options:UIViewAnimationOptionBeginFromCurrentState animations:animations completion:completion]; return; @@ -433,7 +433,7 @@ - (void)updateViewsForColor:(UIColor *)color { ((MBBarProgressView *)indicator).progressColor = color; ((MBBarProgressView *)indicator).lineColor = color; } else { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 || TARGET_TV_OS if ([indicator respondsToSelector:@selector(setTintColor:)]) { [indicator setTintColor:color]; } @@ -442,7 +442,7 @@ - (void)updateViewsForColor:(UIColor *)color { } - (void)updateBezelMotionEffects { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 || TARGET_TV_OS MBBackgroundView *bezelView = self.bezelView; if (![bezelView respondsToSelector:@selector(addMotionEffect:)]) return; @@ -987,10 +987,11 @@ - (void)drawRect:(CGRect)rect { @interface MBBackgroundView () -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV @property UIVisualEffectView *effectView; -#endif +# else @property UIToolbar *toolbar; +#endif @end @@ -1003,7 +1004,7 @@ - (instancetype)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0) { _style = MBProgressHUDBackgroundStyleBlur; -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_TV_OS _color = [UIColor colorWithWhite:0.8f alpha:0.6f]; #else _color = [UIColor colorWithWhite:0.95f alpha:0.6f]; @@ -1053,7 +1054,7 @@ - (void)setColor:(UIColor *)color { - (void)updateForBackgroundStyle { MBProgressHUDBackgroundStyle style = self.style; if (style == MBProgressHUDBackgroundStyleBlur) { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect]; [self addSubview:effectView]; @@ -1072,7 +1073,7 @@ - (void)updateForBackgroundStyle { self.toolbar = toolbar; #endif } else { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV [self.effectView removeFromSuperview]; self.effectView = nil; #else @@ -1085,7 +1086,7 @@ - (void)updateForBackgroundStyle { - (void)updateViewsForColor:(UIColor *)color { if (self.style == MBProgressHUDBackgroundStyleBlur) { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_TV_OS self.backgroundColor = self.color; #else self.toolbar.barTintColor = color; From 5fb23d6df89624002f28afe62f498e21d2b09b38 Mon Sep 17 00:00:00 2001 From: Florian Morello Date: Tue, 29 Mar 2016 15:23:37 +0200 Subject: [PATCH 008/173] Fix target conditionals TARGET_OS_TV --- MBProgressHUD.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 28fac6a8a..f429acb48 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -433,7 +433,7 @@ - (void)updateViewsForColor:(UIColor *)color { ((MBBarProgressView *)indicator).progressColor = color; ((MBBarProgressView *)indicator).lineColor = color; } else { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 || TARGET_TV_OS +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 || TARGET_OS_TV if ([indicator respondsToSelector:@selector(setTintColor:)]) { [indicator setTintColor:color]; } @@ -442,7 +442,7 @@ - (void)updateViewsForColor:(UIColor *)color { } - (void)updateBezelMotionEffects { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 || TARGET_TV_OS +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 || TARGET_OS_TV MBBackgroundView *bezelView = self.bezelView; if (![bezelView respondsToSelector:@selector(addMotionEffect:)]) return; @@ -1004,7 +1004,7 @@ - (instancetype)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0) { _style = MBProgressHUDBackgroundStyleBlur; -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_TV_OS +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV _color = [UIColor colorWithWhite:0.8f alpha:0.6f]; #else _color = [UIColor colorWithWhite:0.95f alpha:0.6f]; @@ -1086,7 +1086,7 @@ - (void)updateForBackgroundStyle { - (void)updateViewsForColor:(UIColor *)color { if (self.style == MBProgressHUDBackgroundStyleBlur) { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_TV_OS +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV self.backgroundColor = self.color; #else self.toolbar.barTintColor = color; From a6d9f95b1e73c1f74561af5945ef54c85661b098 Mon Sep 17 00:00:00 2001 From: Henrik Wittland Date: Wed, 30 Mar 2016 11:30:30 +0200 Subject: [PATCH 009/173] changed completionBlock handling --- MBProgressHUD.m | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 9ecc36a52..b97e1496f 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -220,15 +220,16 @@ - (void)showUsingAnimation:(BOOL)animated { - (void)hideUsingAnimation:(BOOL)animated { if (animated && self.showStarted) { + self.showStarted = nil; [self animateIn:NO withType:self.animationType completion:^(BOOL finished) { [self done]; }]; } else { + self.showStarted = nil; self.bezelView.alpha = 0.f; self.backgroundView.alpha = 1.f; [self done]; } - self.showStarted = nil; } - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type completion:(void(^)(BOOL finished))completion { @@ -281,10 +282,10 @@ - (void)done { [self removeFromSuperview]; } if (self.completionBlock) { - self.completionBlock(); + MBProgressHUDCompletionBlock block = self.completionBlock; self.completionBlock = NULL; + block(); } - id delegate = self.delegate; if ([delegate respondsToSelector:@selector(hudWasHidden:)]) { [delegate performSelector:@selector(hudWasHidden:) withObject:self]; From 782538a3fccf4a32daa36576950e66ff1bd5d7a9 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 2 Apr 2016 15:29:04 +0200 Subject: [PATCH 010/173] Hide timer invalidation. --- MBProgressHUD.m | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 29e7cd597..99e594ac4 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -36,6 +36,7 @@ @interface MBProgressHUD () { @property (nonatomic, strong) UIView *indicator; @property (nonatomic, strong) NSTimer *graceTimer; @property (nonatomic, strong) NSTimer *minShowTimer; +@property (nonatomic, strong) NSTimer *hideDelayTimer; @property (nonatomic, strong) NSDate *showStarted; @property (nonatomic, strong) NSArray *paddingConstraints; @property (nonatomic, strong) NSArray *bezelConstraints; @@ -172,12 +173,9 @@ - (void)hideAnimated:(BOOL)animated { } - (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay { - NSTimer *timer = [NSTimer timerWithTimeInterval:delay target:self selector:@selector(hideDelayed:) userInfo:[NSNumber numberWithBool:animated] repeats:NO]; + NSTimer *timer = [NSTimer timerWithTimeInterval:delay target:self selector:@selector(handleHideTimer:) userInfo:@(animated) repeats:NO]; [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; -} - -- (void)hideDelayed:(NSTimer *)timer { - [self hideAnimated:[timer.userInfo boolValue]]; + self.hideDelayTimer = timer; } #pragma mark - Timer callbacks @@ -193,6 +191,10 @@ - (void)handleMinShowTimer:(NSTimer *)theTimer { [self hideUsingAnimation:self.useAnimation]; } +- (void)handleHideTimer:(NSTimer *)timer { + [self hideAnimated:[timer.userInfo boolValue]]; +} + #pragma mark - View Hierrarchy - (void)didMoveToSuperview { @@ -203,7 +205,7 @@ - (void)didMoveToSuperview { - (void)showUsingAnimation:(BOOL)animated { // Cancel any scheduled hideDelayed: calls - [NSObject cancelPreviousPerformRequestsWithTarget:self]; + [self.hideDelayTimer invalidate]; self.showStarted = [NSDate date]; self.alpha = 1.f; @@ -276,7 +278,9 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple } - (void)done { - [NSObject cancelPreviousPerformRequestsWithTarget:self]; + // Cancel any scheduled hideDelayed: calls + [self.hideDelayTimer invalidate]; + self.alpha = 0.0f; if (self.removeFromSuperViewOnHide) { [self removeFromSuperview]; From 57d5f406b1f09c254348afd9bdbfe8fbc5fae5bb Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 2 Apr 2016 15:30:15 +0200 Subject: [PATCH 011/173] Invalidate grace timer when hiding. Allows quicker deallocation when a grace time is given. --- MBProgressHUD.m | 1 + 1 file changed, 1 insertion(+) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 99e594ac4..82d189cde 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -155,6 +155,7 @@ - (void)showAnimated:(BOOL)animated { - (void)hideAnimated:(BOOL)animated { MBMainThreadAssert(); + [self.graceTimer invalidate]; self.useAnimation = animated; self.finished = YES; // If the minShow time is set, calculate how long the hud was shown, From 14ec8907afff038dd93f17de11b936088d5844f0 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 2 Apr 2016 15:41:23 +0200 Subject: [PATCH 012/173] Invalidating the previous min show timer if showing again. --- MBProgressHUD.m | 1 + 1 file changed, 1 insertion(+) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 82d189cde..5e3cdc3ec 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -139,6 +139,7 @@ - (void)dealloc { - (void)showAnimated:(BOOL)animated { MBMainThreadAssert(); + [self.minShowTimer invalidate]; self.useAnimation = animated; self.finished = NO; // If the grace time is set postpone the HUD display From 7ea2306a8dda650b736bd4cfc6eaca3b565f2bd7 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 2 Apr 2016 15:45:21 +0200 Subject: [PATCH 013/173] Made timer properties weak. So they automatically become nil when the timers get invalidated. --- MBProgressHUD.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 5e3cdc3ec..4f7404ae3 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -34,14 +34,14 @@ @interface MBProgressHUD () { @property (nonatomic, assign) BOOL useAnimation; @property (nonatomic, assign, getter=hasFinished) BOOL finished; @property (nonatomic, strong) UIView *indicator; -@property (nonatomic, strong) NSTimer *graceTimer; -@property (nonatomic, strong) NSTimer *minShowTimer; -@property (nonatomic, strong) NSTimer *hideDelayTimer; @property (nonatomic, strong) NSDate *showStarted; @property (nonatomic, strong) NSArray *paddingConstraints; @property (nonatomic, strong) NSArray *bezelConstraints; @property (nonatomic, strong) UIView *topSpacer; @property (nonatomic, strong) UIView *bottomSpacer; +@property (nonatomic, weak) NSTimer *graceTimer; +@property (nonatomic, weak) NSTimer *minShowTimer; +@property (nonatomic, weak) NSTimer *hideDelayTimer; // Deprecated @property (copy, nullable) MBProgressHUDCompletionBlock completionBlock; From f39a83aef637b3c6fb0c1adc160b8cbb894a7b9a Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 2 Apr 2016 18:49:42 +0200 Subject: [PATCH 014/173] Improved HUD reuse & tests. #292 #335 --- Demo/HudTests/HudTests.m | 52 ++++++++++++++++++++++++++++++++++++++++ MBProgressHUD.m | 19 ++++++++++----- 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/Demo/HudTests/HudTests.m b/Demo/HudTests/HudTests.m index 33653bbcc..5b7cb67ea 100644 --- a/Demo/HudTests/HudTests.m +++ b/Demo/HudTests/HudTests.m @@ -104,6 +104,58 @@ - (void)testAnimatedConvenienceHUDPresentation { [self waitForExpectationsWithTimeout:5. handler:nil]; } +- (void)testNonAnimatedHudReuse { + UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIView *rootView = rootViewController.view; + + MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; + [rootView addSubview:hud]; + [hud showAnimated:NO]; + + XCTAssertNotNil(hud, @"A HUD should be created."); + + [hud hideAnimated:NO]; + [hud showAnimated:NO]; + + XCTAssertEqualObjects(hud.superview, rootView, @"The hood should be added to the view."); + 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."); + + [hud hideAnimated:NO]; + [hud removeFromSuperview]; +} + +- (void)testAnimatedImmediateHudReuse { + UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIView *rootView = rootViewController.view; + + XCTestExpectation *hideExpectation = [self expectationWithDescription:@"The hud should have been hidden."]; + + MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; + [rootView addSubview:hud]; + [hud showAnimated:YES]; + + XCTAssertNotNil(hud, @"A HUD should be created."); + + [hud hideAnimated:YES]; + [hud showAnimated:YES]; + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + XCTAssertEqualObjects(hud.superview, rootView, @"The hood should be added to the view."); + 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."); + + [hud hideAnimated:NO]; + [hud removeFromSuperview]; + + [hideExpectation fulfill]; + }); + + [self waitForExpectationsWithTimeout:5. handler:nil]; +} + #pragma mark - MBProgressHUDDelegate - (void)hudWasHidden:(MBProgressHUD *)hud { diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 4f7404ae3..63528a801 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -206,6 +206,10 @@ - (void)didMoveToSuperview { #pragma mark - Internal show & hide operations - (void)showUsingAnimation:(BOOL)animated { + // Cancel any previous animations + [self.bezelView.layer removeAllAnimations]; + [self.backgroundView.layer removeAllAnimations]; + // Cancel any scheduled hideDelayed: calls [self.hideDelayTimer invalidate]; @@ -226,12 +230,12 @@ - (void)showUsingAnimation:(BOOL)animated { - (void)hideUsingAnimation:(BOOL)animated { if (animated && self.showStarted) { [self animateIn:NO withType:self.animationType completion:^(BOOL finished) { - [self done]; + [self doneFinished:finished]; }]; } else { self.bezelView.alpha = 0.f; self.backgroundView.alpha = 1.f; - [self done]; + [self doneFinished:YES]; } self.showStarted = nil; } @@ -279,14 +283,17 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple [UIView animateWithDuration:0.3 delay:0. options:UIViewAnimationOptionBeginFromCurrentState animations:animations completion:completion]; } -- (void)done { +- (void)doneFinished:(BOOL)finished { // Cancel any scheduled hideDelayed: calls [self.hideDelayTimer invalidate]; - self.alpha = 0.0f; - if (self.removeFromSuperViewOnHide) { - [self removeFromSuperview]; + if (finished) { + self.alpha = 0.0f; + if (self.removeFromSuperViewOnHide) { + [self removeFromSuperview]; + } } + if (self.completionBlock) { self.completionBlock(); self.completionBlock = NULL; From f6913b4db141e840b07f8c1bbee4e5ef302c1157 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 2 Apr 2016 19:18:50 +0200 Subject: [PATCH 015/173] Min show time test. --- Demo/HudTests/HudTests.m | 46 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/Demo/HudTests/HudTests.m b/Demo/HudTests/HudTests.m index 5b7cb67ea..d40be8dd2 100644 --- a/Demo/HudTests/HudTests.m +++ b/Demo/HudTests/HudTests.m @@ -46,7 +46,7 @@ - (void)testNonAnimatedConvenienceHUDPresentation { 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."); + XCTAssertEqualObjects(hud.superview, rootView, @"The hud 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."); @@ -75,7 +75,7 @@ - (void)testAnimatedConvenienceHUDPresentation { hud.delegate = self; XCTAssertNotNil(hud, @"A HUD should be created."); - XCTAssertEqualObjects(hud.superview, rootView, @"The hood should be added to the view."); + XCTAssertEqualObjects(hud.superview, rootView, @"The hud 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."); @@ -89,7 +89,7 @@ - (void)testAnimatedConvenienceHUDPresentation { 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."); + XCTAssertEqualObjects(hud.superview, rootView, @"The hud should be added to the view."); weakify(self); self.hideChecks = ^{ @@ -156,6 +156,46 @@ - (void)testAnimatedImmediateHudReuse { [self waitForExpectationsWithTimeout:5. handler:nil]; } +- (void)testMinShowTime { + UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIView *rootView = rootViewController.view; + + self.hideExpectation = [self expectationWithDescription:@"The hudWasHidden: delegate should have been called."]; + + MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; + hud.delegate = self; + hud.removeFromSuperViewOnHide = YES; + hud.minShowTime = 2.; + [rootView addSubview:hud]; + [hud showAnimated:YES]; + + XCTAssertNotNil(hud, @"A HUD should be created."); + + [hud hideAnimated:YES]; + + __block BOOL checkedAfterOneSecond = NO; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + // Check that the hud is still visible + XCTAssertEqualObjects(hud.superview, rootView, @"The hud should be added to the view."); + 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."); + checkedAfterOneSecond = YES; + }); + + weakify(self); + self.hideChecks = ^{ + strongify(self); + XCTAssertTrue(checkedAfterOneSecond); + }; + + [self waitForExpectationsWithTimeout:5. handler:nil]; + + 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."); +} + #pragma mark - MBProgressHUDDelegate - (void)hudWasHidden:(MBProgressHUD *)hud { From 32843df5b64cbabb77413ee140d4ec0cc153fb90 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 2 Apr 2016 19:37:02 +0200 Subject: [PATCH 016/173] Consolidated some common tests into reusable macros. --- Demo/HudTests/HudTests.m | 53 ++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/Demo/HudTests/HudTests.m b/Demo/HudTests/HudTests.m index d40be8dd2..88d9f4f4c 100644 --- a/Demo/HudTests/HudTests.m +++ b/Demo/HudTests/HudTests.m @@ -18,6 +18,20 @@ __strong typeof(var) var = weak_##var; \ _Pragma("clang diagnostic pop") +#define MBTestHUDIsVisible(hud, rootView) \ +do { \ +XCTAssertEqualObjects(hud.superview, rootView, @"The hud should be added to the view."); \ +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."); \ +} while (0) + +#define MBTestHUDIsHidenAndRemoved(hud, rootView) \ +do { \ +XCTAssertFalse([rootView.subviews containsObject:hud], @"The HUD should not be part of the view hierarchy."); \ +XCTAssertEqual(hud.alpha, 0.f, @"The hud should be faded out."); \ +XCTAssertNil(hud.superview, @"The HUD should not have a superview."); \ +} while (0) @interface HudTests : XCTestCase @@ -46,10 +60,7 @@ - (void)testNonAnimatedConvenienceHUDPresentation { MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:rootView animated:NO]; XCTAssertNotNil(hud, @"A HUD should be created."); - XCTAssertEqualObjects(hud.superview, rootView, @"The hud 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."); + MBTestHUDIsVisible(hud, rootView); XCTAssertEqual(hud.bezelView.alpha, 1.f, @"The HUD should be visible."); XCTAssertFalse([hud.bezelView.layer.animationKeys containsObject:@"opacity"], @"The opacity should NOT be animated."); @@ -58,9 +69,7 @@ - (void)testNonAnimatedConvenienceHUDPresentation { 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."); + MBTestHUDIsHidenAndRemoved(hud, rootView); XCTAssertFalse([MBProgressHUD hideHUDForView:rootView animated:NO], @"A subsequent HUD hide operation should fail."); } @@ -75,10 +84,7 @@ - (void)testAnimatedConvenienceHUDPresentation { hud.delegate = self; XCTAssertNotNil(hud, @"A HUD should be created."); - XCTAssertEqualObjects(hud.superview, rootView, @"The hud 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."); + MBTestHUDIsVisible(hud, rootView); XCTAssertEqual(hud.bezelView.alpha, 1.f, @"The HUD should be visible."); XCTAssertTrue([hud.bezelView.layer.animationKeys containsObject:@"opacity"], @"The opacity should be animated."); @@ -90,13 +96,13 @@ - (void)testAnimatedConvenienceHUDPresentation { 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 hud should be added to the view."); + XCTAssertEqual(hud.bezelView.alpha, 0.f, @"The HUD bezel should be animated out."); + XCTAssertTrue([hud.bezelView.layer.animationKeys containsObject:@"opacity"], @"The opacity should be animated."); 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."); + MBTestHUDIsHidenAndRemoved(hud, rootView); XCTAssertFalse([MBProgressHUD hideHUDForView:rootView animated:YES], @"A subsequent HUD hide operation should fail."); }; @@ -117,10 +123,7 @@ - (void)testNonAnimatedHudReuse { [hud hideAnimated:NO]; [hud showAnimated:NO]; - XCTAssertEqualObjects(hud.superview, rootView, @"The hood should be added to the view."); - 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."); + MBTestHUDIsVisible(hud, rootView); [hud hideAnimated:NO]; [hud removeFromSuperview]; @@ -142,10 +145,7 @@ - (void)testAnimatedImmediateHudReuse { [hud showAnimated:YES]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - XCTAssertEqualObjects(hud.superview, rootView, @"The hood should be added to the view."); - 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."); + MBTestHUDIsVisible(hud, rootView); [hud hideAnimated:NO]; [hud removeFromSuperview]; @@ -176,10 +176,7 @@ - (void)testMinShowTime { __block BOOL checkedAfterOneSecond = NO; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // Check that the hud is still visible - XCTAssertEqualObjects(hud.superview, rootView, @"The hud should be added to the view."); - 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."); + MBTestHUDIsVisible(hud, rootView); checkedAfterOneSecond = YES; }); @@ -191,9 +188,7 @@ - (void)testMinShowTime { [self waitForExpectationsWithTimeout:5. handler:nil]; - 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."); + MBTestHUDIsHidenAndRemoved(hud, rootView); } #pragma mark - MBProgressHUDDelegate From 7e65c68e9fa50cf512d6708371629d378597c53d Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 2 Apr 2016 19:54:46 +0200 Subject: [PATCH 017/173] Grace time tests. --- Demo/HudTests/HudTests.m | 83 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/Demo/HudTests/HudTests.m b/Demo/HudTests/HudTests.m index 88d9f4f4c..fb534cb1c 100644 --- a/Demo/HudTests/HudTests.m +++ b/Demo/HudTests/HudTests.m @@ -191,6 +191,89 @@ - (void)testMinShowTime { MBTestHUDIsHidenAndRemoved(hud, rootView); } +- (void)testGraceTime { + UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIView *rootView = rootViewController.view; + + self.hideExpectation = [self expectationWithDescription:@"The hudWasHidden: delegate should have been called."]; + + MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; + hud.delegate = self; + hud.removeFromSuperViewOnHide = YES; + hud.graceTime = 2.; + [rootView addSubview:hud]; + [hud showAnimated:YES]; + + XCTAssertNotNil(hud, @"A HUD should be created."); + + // The HUD should be added to the view but still hidden + XCTAssertEqualObjects(hud.superview, rootView, @"The hud should be added to the view."); \ + XCTAssertEqual(hud.alpha, 0.f, @"The HUD should not be visible."); \ + XCTAssertFalse(hud.hidden, @"The HUD should be visible."); \ + XCTAssertEqual(hud.bezelView.alpha, 0.f, @"The HUD should not be visible."); \ + + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + // The HUD should be added to the view but still hidden + XCTAssertEqualObjects(hud.superview, rootView, @"The hud should be added to the view."); \ + XCTAssertEqual(hud.alpha, 0.f, @"The HUD should not be visible."); \ + XCTAssertFalse(hud.hidden, @"The HUD should be visible."); \ + XCTAssertEqual(hud.bezelView.alpha, 0.f, @"The HUD should not be visible."); \ + }); + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + // After the grace time passes, the HUD should be shown. + MBTestHUDIsVisible(hud, rootView); + [hud hideAnimated:YES]; + }); + + [self waitForExpectationsWithTimeout:5. handler:nil]; + + MBTestHUDIsHidenAndRemoved(hud, rootView); +} + +- (void)testHideBeforeGraceTimeElapsed { + UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIView *rootView = rootViewController.view; + + self.hideExpectation = [self expectationWithDescription:@"The hudWasHidden: delegate should have been called."]; + + MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; + hud.delegate = self; + hud.removeFromSuperViewOnHide = YES; + hud.graceTime = 2.; + [rootView addSubview:hud]; + [hud showAnimated:YES]; + + XCTAssertNotNil(hud, @"A HUD should be created."); + + // The HUD should be added to the view but still hidden + XCTAssertEqualObjects(hud.superview, rootView, @"The hud should be added to the view."); \ + XCTAssertEqual(hud.alpha, 0.f, @"The HUD should not be visible."); \ + XCTAssertFalse(hud.hidden, @"The HUD should be visible."); \ + XCTAssertEqual(hud.bezelView.alpha, 0.f, @"The HUD should not be visible."); \ + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + // The HUD should be added to the view but still hidden + XCTAssertEqualObjects(hud.superview, rootView, @"The hud should be added to the view."); \ + XCTAssertEqual(hud.alpha, 0.f, @"The HUD should not be visible."); \ + XCTAssertFalse(hud.hidden, @"The HUD should be visible."); \ + XCTAssertEqual(hud.bezelView.alpha, 0.f, @"The HUD should not be visible."); \ + [hud hideAnimated:YES]; + }); + + XCTestExpectation *hideCheckExpectation = [self expectationWithDescription:@"Hide check"]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + // After the grace time passes, the HUD should still not be shown. + MBTestHUDIsHidenAndRemoved(hud, rootView); + [hideCheckExpectation fulfill]; + }); + + [self waitForExpectationsWithTimeout:5. handler:nil]; + + MBTestHUDIsHidenAndRemoved(hud, rootView); +} + #pragma mark - MBProgressHUDDelegate - (void)hudWasHidden:(MBProgressHUD *)hud { From ebdd2ff653bb73da5ae9f3498b7d27ec3d2b6750 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 2 Apr 2016 19:55:31 +0200 Subject: [PATCH 018/173] Cleanup. --- Demo/HudTests/HudTests.m | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Demo/HudTests/HudTests.m b/Demo/HudTests/HudTests.m index fb534cb1c..b040c22b9 100644 --- a/Demo/HudTests/HudTests.m +++ b/Demo/HudTests/HudTests.m @@ -43,14 +43,6 @@ @interface HudTests : XCTestCase @implementation HudTests -- (void)setUp { - [super setUp]; -} - -- (void)tearDown { - [super tearDown]; -} - #pragma mark - Convenience - (void)testNonAnimatedConvenienceHUDPresentation { @@ -110,6 +102,8 @@ - (void)testAnimatedConvenienceHUDPresentation { [self waitForExpectationsWithTimeout:5. handler:nil]; } +#pragma mark - Ruse + - (void)testNonAnimatedHudReuse { UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; UIView *rootView = rootViewController.view; @@ -156,6 +150,8 @@ - (void)testAnimatedImmediateHudReuse { [self waitForExpectationsWithTimeout:5. handler:nil]; } +#pragma mark - Min show time + - (void)testMinShowTime { UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; UIView *rootView = rootViewController.view; @@ -191,6 +187,8 @@ - (void)testMinShowTime { MBTestHUDIsHidenAndRemoved(hud, rootView); } +#pragma mark - Grace time + - (void)testGraceTime { UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; UIView *rootView = rootViewController.view; From d802c7c73c24cfd7e8f1501ae910298527275d1c Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 2 Apr 2016 20:16:52 +0200 Subject: [PATCH 019/173] Delayed hide test. --- Demo/HudTests/HudTests.m | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/Demo/HudTests/HudTests.m b/Demo/HudTests/HudTests.m index b040c22b9..f2c41859d 100644 --- a/Demo/HudTests/HudTests.m +++ b/Demo/HudTests/HudTests.m @@ -102,6 +102,39 @@ - (void)testAnimatedConvenienceHUDPresentation { [self waitForExpectationsWithTimeout:5. handler:nil]; } +#pragma mark - Delay + +- (void)testDelayedHide { + 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:NO]; + hud.delegate = self; + + XCTAssertNotNil(hud, @"A HUD should be created."); + + [hud hideAnimated:NO afterDelay:2]; + + MBTestHUDIsVisible(hud, rootView); + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + MBTestHUDIsVisible(hud, rootView); + }); + + XCTestExpectation *hideCheckExpectation = [self expectationWithDescription:@"Hide check"]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + // After the grace time passes, the HUD should still not be shown. + MBTestHUDIsHidenAndRemoved(hud, rootView); + [hideCheckExpectation fulfill]; + }); + + [self waitForExpectationsWithTimeout:5. handler:nil]; + + MBTestHUDIsHidenAndRemoved(hud, rootView); +} + #pragma mark - Ruse - (void)testNonAnimatedHudReuse { From 49c1136fa67dfe7caa560012e904a7ad935eaf10 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 2 Apr 2016 20:26:06 +0200 Subject: [PATCH 020/173] Extended documentation. #358 --- README.mdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.mdown b/README.mdown index 101d5e7f6..92850241c 100644 --- a/README.mdown +++ b/README.mdown @@ -72,6 +72,8 @@ dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ }); ``` +You can add the HUD on any view or window. It is however a good idea to avoid adding the HUD to certain `UIKit` views with complex view hierarchies - like `UITableView` or `UICollectionView`. Those can mutate their subviews in unexpected ways and thereby break HUD display. + If you need to configure the HUD you can do this by using the MBProgressHUD reference that showHUDAddedTo:animated: returns. ```objective-c From c9028d2412608d1437ef44d2180369f48316dce1 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 2 Apr 2016 21:20:15 +0200 Subject: [PATCH 021/173] Cleanup and extended comment. #356 --- MBProgressHUD.m | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index cafee599b..b1af129b6 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -713,28 +713,29 @@ - (void)updateForCurrentOrientationAnimated:(BOOL)animated { BOOL iOS8OrLater = kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0; if (iOS8OrLater || ![self.superview isKindOfClass:[UIWindow class]]) return; - // Make extension friendly + // Make extension friendly. Will not get called on extensions (iOS 8+) due to the above check. + // This just ensures we don't get a warning about extension-unsafe API. Class UIApplicationClass = NSClassFromString(@"UIApplication"); - if(UIApplicationClass && [UIApplicationClass respondsToSelector:@selector(sharedApplication)]) { - UIApplication *application = [UIApplication performSelector:@selector(sharedApplication)]; - - UIInterfaceOrientation orientation = application.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 { - radians = orientation == UIInterfaceOrientationPortraitUpsideDown ? (CGFloat)M_PI : 0.f; - } - - if (animated) { - [UIView animateWithDuration:0.3 animations:^{ - self.transform = CGAffineTransformMakeRotation(radians); - }]; - } else { + if (!UIApplicationClass || ![UIApplicationClass respondsToSelector:@selector(sharedApplication)]) return; + + UIApplication *application = [UIApplication performSelector:@selector(sharedApplication)]; + UIInterfaceOrientation orientation = application.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 { + 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 b1b206c7ca5d3b335ce11054a5b0edcfdc1492fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9F=A9=E5=86=AC?= Date: Tue, 5 Apr 2016 18:36:56 +0800 Subject: [PATCH 022/173] fixed setMargin no effect --- MBProgressHUD.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 66cf0a15e..ef6f91c9d 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -628,7 +628,7 @@ - (void)setOffset:(CGPoint)offset { } - (void)setMargin:(CGFloat)margin { - if (margin != margin) { + if (margin != _margin) { _margin = margin; [self setNeedsUpdateConstraints]; } From 874860e0f55fac83e3584439f77611bb0eeec828 Mon Sep 17 00:00:00 2001 From: Victor Ilyukevich Date: Fri, 15 Apr 2016 19:55:31 -0700 Subject: [PATCH 023/173] Failing unit test to show the HUD is not removed --- Demo/HudTests/HudTests.m | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Demo/HudTests/HudTests.m b/Demo/HudTests/HudTests.m index f2c41859d..59374a262 100644 --- a/Demo/HudTests/HudTests.m +++ b/Demo/HudTests/HudTests.m @@ -156,6 +156,31 @@ - (void)testNonAnimatedHudReuse { [hud removeFromSuperview]; } +- (void)testUnfinishedHidingAnimation { + UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIView *rootView = rootViewController.view; + + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:rootView animated:NO]; + + [hud hideAnimated:YES]; + + // Cancel all animations. It will cause `UIView+animate...` to call completionBlock with `finished = NO`. + // It's same as if you call `[hud hideAnimated:YES]` while the app is in background. + [hud.bezelView.layer removeAllAnimations]; + [hud.backgroundView.layer removeAllAnimations]; + + XCTestExpectation *hideCheckExpectation = [self expectationWithDescription:@"Hide check"]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + // After the grace time passes, the HUD should still not be shown. + MBTestHUDIsHidenAndRemoved(hud, rootView); + [hideCheckExpectation fulfill]; + }); + + [self waitForExpectationsWithTimeout:5. handler:nil]; + + MBTestHUDIsHidenAndRemoved(hud, rootView); +} + - (void)testAnimatedImmediateHudReuse { UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; UIView *rootView = rootViewController.view; From 5ec046ae8e1f3babd42e921817135034cbb38680 Mon Sep 17 00:00:00 2001 From: Victor Ilyukevich Date: Fri, 15 Apr 2016 18:35:45 -0700 Subject: [PATCH 024/173] Remove from superview even if animation wasn't finished Steps to reproduce in the sample app 1. Tap on a "Determinate mode" to bring the HUD 2. While the HUS is still presented background the app 3. Wait for 5 seconds until the HUD should have disappered 4. Foreground the app Expected: no HUD, you can interact with the app. Result without this: you can't interact with the app. It happens because HUD wasn't removed from its superview. And it wasn't removed because the app was in background when `hideAnimated:` was called and animation wasn't finished. --- MBProgressHUD.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index ef6f91c9d..abcd3aa63 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -231,13 +231,13 @@ - (void)hideUsingAnimation:(BOOL)animated { if (animated && self.showStarted) { self.showStarted = nil; [self animateIn:NO withType:self.animationType completion:^(BOOL finished) { - [self doneFinished:finished]; + [self done]; }]; } else { self.showStarted = nil; self.bezelView.alpha = 0.f; self.backgroundView.alpha = 1.f; - [self doneFinished:YES]; + [self done]; } } @@ -284,11 +284,11 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple [UIView animateWithDuration:0.3 delay:0. options:UIViewAnimationOptionBeginFromCurrentState animations:animations completion:completion]; } -- (void)doneFinished:(BOOL)finished { +- (void)done { // Cancel any scheduled hideDelayed: calls [self.hideDelayTimer invalidate]; - if (finished) { + if (self.hasFinished) { self.alpha = 0.0f; if (self.removeFromSuperViewOnHide) { [self removeFromSuperview]; From abf99ff2c3f3ea996d6bfe50d85426f04fb4e370 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sat, 16 Apr 2016 08:29:48 +0200 Subject: [PATCH 025/173] Ensure label background is always clear. --- MBProgressHUD.m | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 66cf0a15e..2142ce97b 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -331,7 +331,9 @@ - (void)setupViews { label.adjustsFontSizeToFitWidth = NO; label.textAlignment = NSTextAlignmentCenter; label.textColor = defaultColor; - label.font = [UIFont boldSystemFontOfSize:MBDefaultLabelFontSize];; + label.font = [UIFont boldSystemFontOfSize:MBDefaultLabelFontSize]; + label.opaque = NO; + label.backgroundColor = [UIColor clearColor]; _label = label; UILabel *detailsLabel = [UILabel new]; @@ -340,6 +342,8 @@ - (void)setupViews { detailsLabel.textColor = defaultColor; detailsLabel.numberOfLines = 0; detailsLabel.font = [UIFont boldSystemFontOfSize:MBDefaultDetailsLabelFontSize]; + detailsLabel.opaque = NO; + detailsLabel.backgroundColor = [UIColor clearColor]; _detailsLabel = detailsLabel; UIButton *button = [MBProgressHUDRoundedButton buttonWithType:UIButtonTypeCustom]; From ba3bd1b313bf0bbb642d97900a0b4866c2c5aa5c Mon Sep 17 00:00:00 2001 From: Aleksander Balicki Date: Tue, 3 May 2016 13:57:39 +0200 Subject: [PATCH 026/173] Added support for NSProgress --- CHANGELOG.mdown | 4 +++ Demo/Classes/MBHudDemoViewController.m | 35 ++++++++++++++++++++++++-- Demo/HudDemo.xcodeproj/project.pbxproj | 5 ++++ MBProgressHUD.h | 7 ++++++ MBProgressHUD.m | 28 +++++++++++++++++++++ MBProgressHUD.podspec | 2 +- README.mdown | 12 +++++++++ 7 files changed, 90 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.mdown b/CHANGELOG.mdown index d50226395..2c8a6aff1 100644 --- a/CHANGELOG.mdown +++ b/CHANGELOG.mdown @@ -1,3 +1,7 @@ +**master** + + - Added support for `NSProgress` + **Version 0.9.2** @ 22.12.15 - Timer improvements diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index 606340fc2..2f93119f6 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -8,7 +8,7 @@ #import "MBHudDemoViewController.h" #import "MBProgressHUD.h" - +#import @interface MBExample : NSObject @@ -33,7 +33,7 @@ + (instancetype)exampleWithTitle:(NSString *)title selector:(SEL)selector { @interface MBHudDemoViewController () @property (nonatomic, strong) NSArray *> *examples; -@property (nonatomic, assign) BOOL canceled; +@property (atomic, assign) BOOL canceled; // atomic, because it may be cancelled from main thread, flag is read on a background thread @end @@ -57,6 +57,7 @@ - (void)awakeFromNib { [MBExample exampleWithTitle:@"Mode switching" selector:@selector(modeSwitchingExample)]], @[[MBExample exampleWithTitle:@"On window" selector:@selector(indeterminateExample)], [MBExample exampleWithTitle:@"NSURLSession" selector:@selector(networkingExample)], + [MBExample exampleWithTitle:@"Determinate with NSProgress" selector:@selector(determinateNSProgressExample)], [MBExample exampleWithTitle:@"Dim background" selector:@selector(indeterminateExample)], [MBExample exampleWithTitle:@"Colored" selector:@selector(indeterminateExample)]] ]; @@ -143,6 +144,26 @@ - (void)determinateExample { }); } +- (void)determinateNSProgressExample { + 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"); + + NSProgress *progressObject = [NSProgress progressWithTotalUnitCount:200000]; + + hud.progressObject = progressObject; + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + // Do something useful in the background and update the HUD periodically. + [self doSomeWorkWithProgressObject:progressObject]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); +} + - (void)annularDeterminateExample { MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; @@ -258,6 +279,16 @@ - (void)doSomeWork { sleep(3.); } +- (void)doSomeWorkWithProgressObject:(NSProgress *)progressObject { + self.canceled = NO; + // This just increases the progress indicator in a loop. + while (progressObject.fractionCompleted < 1.0f) { + if (self.canceled) break; + [progressObject becomeCurrentWithPendingUnitCount:1]; + [progressObject resignCurrent]; + } +} + - (void)doSomeWorkWithProgress { self.canceled = NO; // This just increases the progress indicator in a loop. diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index 46034fb45..891457fc4 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 28D7ACF80DDB3853001CB0EB /* MBHudDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* MBHudDemoViewController.m */; }; + 5BE141EE1CD8C33D0023BC9E /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BE141ED1CD8C33D0023BC9E /* QuartzCore.framework */; }; 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 */; }; @@ -40,6 +41,7 @@ 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 = ""; }; + 5BE141ED1CD8C33D0023BC9E /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 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 = ""; }; @@ -57,6 +59,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 5BE141EE1CD8C33D0023BC9E /* QuartzCore.framework in Frameworks */, D286A76D1518CA9F00E13FB8 /* CoreGraphics.framework in Frameworks */, 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, @@ -132,6 +135,7 @@ 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( + 5BE141ED1CD8C33D0023BC9E /* QuartzCore.framework */, D286A76C1518CA9F00E13FB8 /* CoreGraphics.framework */, 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 1D30AB110D05D00D00671497 /* Foundation.framework */, @@ -488,6 +492,7 @@ D2B174181C5E3A3D00021915 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 964d41fec..c68f99321 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -254,6 +254,13 @@ NS_ASSUME_NONNULL_BEGIN */ @property (assign, nonatomic) float progress; +/// @name ProgressObject + +/** + * The NSProgress object feeding the progress information to the progress indicator. + */ +@property (strong, nonatomic, nullable) NSProgress *progressObject; + /// @name Views /** diff --git a/MBProgressHUD.m b/MBProgressHUD.m index cf8bae3c6..d944f9166 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -42,6 +42,7 @@ @interface MBProgressHUD () { @property (nonatomic, weak) NSTimer *graceTimer; @property (nonatomic, weak) NSTimer *minShowTimer; @property (nonatomic, weak) NSTimer *hideDelayTimer; +@property (nonatomic, weak) CADisplayLink *progressObjectDisplayLink; // Deprecated @property (copy, nullable) MBProgressHUDCompletionBlock completionBlock; @@ -156,6 +157,7 @@ - (void)showAnimated:(BOOL)animated { - (void)hideAnimated:(BOOL)animated { MBMainThreadAssert(); + self.progressObjectDisplayLink = nil; [self.graceTimer invalidate]; self.useAnimation = animated; self.finished = YES; @@ -652,6 +654,32 @@ - (void)setSquare:(BOOL)square { } } +- (void)setProgressObjectDisplayLink:(CADisplayLink *)progressObjectDisplayLink { + if (progressObjectDisplayLink != _progressObjectDisplayLink) { + [_progressObjectDisplayLink invalidate]; + + _progressObjectDisplayLink = progressObjectDisplayLink; + + [_progressObjectDisplayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; + } +} + +- (void)setProgressObject:(NSProgress *)progressObject { + if (progressObject != _progressObject) { + _progressObject = progressObject; + + // We're using CADisplayLink, because NSProgress can change very quickly and observing it may starve the main thread, + // so we're refreshing the progress only every frame draw + self.progressObjectDisplayLink = [CADisplayLink displayLinkWithTarget:self + selector:@selector(updateProgressFromProgressObject)]; + + } +} + +- (void)updateProgressFromProgressObject { + self.progress = self.progressObject.fractionCompleted; +} + - (void)setProgress:(float)progress { if (progress != _progress) { _progress = progress; diff --git a/MBProgressHUD.podspec b/MBProgressHUD.podspec index 48f237684..3f1a0ef88 100644 --- a/MBProgressHUD.podspec +++ b/MBProgressHUD.podspec @@ -15,6 +15,6 @@ Pod::Spec.new do |s| s.ios.deployment_target = '6.0' s.tvos.deployment_target = '9.0' s.source_files = '*.{h,m}' - s.framework = "CoreGraphics" + s.frameworks = "CoreGraphics", "QuartzCore" s.requires_arc = true end diff --git a/README.mdown b/README.mdown index 92850241c..00199c64b 100644 --- a/README.mdown +++ b/README.mdown @@ -87,6 +87,18 @@ hud.labelText = @"Loading"; }]; ``` +You can also use a `NSProgress` object and MBProgressHUD will update itself when there is progress reported through that object. + +```objective-c +MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; +hud.mode = MBProgressHUDModeAnnularDeterminate; +hud.labelText = @"Loading"; +NSProgress *progress = [self doSomethingInBackgroundCompletion:^{ + [hud hide:YES]; +}]; +hud.progressObject = progress; +``` + UI updates should always be done on the main thread. Some MBProgressHUD setters are however considered "thread safe" and can be called from background threads. Those also include `setMode:`, `setCustomView:`, `setLabelText:`, `setLabelFont:`, `setDetailsLabelText:`, `setDetailsLabelFont:` and `setProgress:`. If you need to run your long-running task in the main thread, you should perform it with a slight delay, so UIKit will have enough time to update the UI (i.e., draw the HUD) before you block the main thread with your task. From 316cb39f860b0bcf70acb2523dc9f39af833916c Mon Sep 17 00:00:00 2001 From: Johannes Marbach Date: Tue, 10 May 2016 11:59:46 +0200 Subject: [PATCH 027/173] Fix spelling errors in internal and external comments --- MBProgressHUD.h | 26 +++++++++++++------------- MBProgressHUD.m | 26 +++++++++++++------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 964d41fec..8266f4cd4 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -105,7 +105,7 @@ NS_ASSUME_NONNULL_BEGIN /** * Finds the top-most HUD subview and hides it. The counterpart to this method is showHUDAddedTo: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 is going to be searched for a HUD subview. * @param animated If set to YES the HUD will disappear using the current animationType. If set to NO the HUD will not use @@ -127,7 +127,7 @@ NS_ASSUME_NONNULL_BEGIN /** * A convenience constructor that initializes the HUD with the view's bounds. Calls the designated constructor with - * view.bounds as the parameter + * view.bounds as the parameter. * * @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). @@ -137,9 +137,9 @@ NS_ASSUME_NONNULL_BEGIN /** * 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). + * @note You need to make sure that the main thread completes its run loop soon after this method call so that + * 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 making an asynchronous call like NSURLRequest). * * @param animated If set to YES the HUD will appear using the current animationType. If set to NO the HUD will not use * animations while appearing. @@ -262,13 +262,13 @@ NS_ASSUME_NONNULL_BEGIN @property (strong, nonatomic, readonly) MBBackgroundView *bezelView; /** - * View coving the entire HUD area, placed behind bezelView. + * View covering the entire HUD area, placed behind 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. + * The view should implement intrinsicContentSize for proper sizing. For best results use approximately 37 by 37 pixels. */ @property (strong, nonatomic, nullable) UIView *customView; @@ -315,19 +315,19 @@ NS_ASSUME_NONNULL_BEGIN /** * Indicator progress color. - * Defaults to white [UIColor whiteColor] + * Defaults to white [UIColor whiteColor]. */ @property (nonatomic, strong) UIColor *progressTintColor; /** * Indicator background (non-progress) color. - * Only applicable on iOS version older than iOS 7. - * Defaults to translucent white (alpha 0.1) + * Only applicable on iOS versions older than iOS 7. + * Defaults to translucent white (alpha 0.1). */ @property (nonatomic, strong) UIColor *backgroundTintColor; /* - * Display mode - NO = round or YES = annular. De+faults to round. + * Display mode - NO = round or YES = annular. Defaults to round. */ @property (nonatomic, assign, getter = isAnnular) BOOL annular; @@ -370,13 +370,13 @@ NS_ASSUME_NONNULL_BEGIN /** * 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. + * @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. + * @note Due to iOS 7 not supporting UIVisualEffectView, the blur effect differs slightly between iOS 7 and later versions. */ @property (nonatomic, strong) UIColor *color; diff --git a/MBProgressHUD.m b/MBProgressHUD.m index cf8bae3c6..bf9427593 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -26,7 +26,7 @@ @interface MBProgressHUD () { - // Depricated + // Deprecated UIColor *_activityIndicatorColor; CGFloat _opacity; } @@ -142,7 +142,7 @@ - (void)showAnimated:(BOOL)animated { [self.minShowTimer invalidate]; self.useAnimation = animated; self.finished = NO; - // If the grace time is set postpone the HUD display + // 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]; @@ -159,8 +159,8 @@ - (void)hideAnimated:(BOOL)animated { [self.graceTimer invalidate]; 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 the minShow time is set, calculate how long the HUD was shown, + // and postpone the hiding operation if necessary if (self.minShowTime > 0.0 && self.showStarted) { NSTimeInterval interv = [[NSDate date] timeIntervalSinceDate:self.showStarted]; if (interv < self.minShowTime) { @@ -242,7 +242,7 @@ - (void)hideUsingAnimation:(BOOL)animated { } - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type completion:(void(^)(BOOL finished))completion { - // Automatically determine the correct + // Automatically determine the correct zoom animation type if (type == MBProgressHUDAnimationZoom) { type = animatingIn ? MBProgressHUDAnimationZoomIn : MBProgressHUDAnimationZoomOut; } @@ -501,7 +501,7 @@ - (void)updateConstraints { 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 + // Remove existing constraints [self removeConstraints:self.constraints]; [topSpacer removeConstraints:topSpacer.constraints]; [bottomSpacer removeConstraints:bottomSpacer.constraints]; @@ -560,7 +560,7 @@ - (void)updateConstraints { // First, ensure spacing to bezel edge [bezelConstraints addObject:[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 + // Last, ensure spacing to bezel edge [bezelConstraints addObject:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeBottom multiplier:1.f constant:0.f]]; } if (idx > 0) { @@ -593,8 +593,8 @@ - (void)updatePaddingConstraints { UIView *secondView = (UIView *)padding.secondItem; 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 + // Set if both views are visible or if there's a visible view on top that doesn't have padding + // added relative to the current view yet padding.constant = (firstVisible && (secondVisible || hasVisibleAncestors)) ? MBDefaultPadding : 0.f; hasVisibleAncestors |= secondVisible; }]; @@ -1362,16 +1362,16 @@ - (instancetype)initWithFrame:(CGRect)frame { - (void)layoutSubviews { [super layoutSubviews]; - // Fully rounded corners. + // 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. + // Only show if we have associated control events if (self.allControlEvents == 0) return CGSizeZero; CGSize size = [super intrinsicContentSize]; - // Add some side padding. + // Add some side padding size.width += 20.f; return size; } @@ -1380,7 +1380,7 @@ - (CGSize)intrinsicContentSize { - (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { [super setTitleColor:color forState:state]; - // Update related colors. + // Update related colors [self setHighlighted:self.highlighted]; self.layer.borderColor = color.CGColor; } From 383e8f51310d803838b49f22fea9e4e316f1339c Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Fri, 3 Jun 2016 20:25:34 +0200 Subject: [PATCH 028/173] Brought back completionBlock from the dead. --- MBProgressHUD.h | 10 +++++++--- MBProgressHUD.m | 9 +++------ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 964d41fec..1281f06f5 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -69,6 +69,8 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { MBProgressHUDBackgroundStyleBlur }; +typedef void (^MBProgressHUDCompletionBlock)(); + NS_ASSUME_NONNULL_BEGIN @@ -176,6 +178,11 @@ NS_ASSUME_NONNULL_BEGIN */ @property (weak, nonatomic) id delegate; +/** + * Called after the HUD is hiden. + */ +@property (copy, nullable) MBProgressHUDCompletionBlock completionBlock; + /* * 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 @@ -393,15 +400,12 @@ NS_ASSUME_NONNULL_BEGIN - (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:(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:(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."))); diff --git a/MBProgressHUD.m b/MBProgressHUD.m index cf8bae3c6..341c4cef6 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -44,7 +44,6 @@ @interface MBProgressHUD () { @property (nonatomic, weak) NSTimer *hideDelayTimer; // Deprecated -@property (copy, nullable) MBProgressHUDCompletionBlock completionBlock; @property (assign) BOOL taskInProgress; @end @@ -294,11 +293,9 @@ - (void)doneFinished:(BOOL)finished { [self removeFromSuperview]; } } - - if (self.completionBlock) { - MBProgressHUDCompletionBlock block = self.completionBlock; - self.completionBlock = NULL; - block(); + MBProgressHUDCompletionBlock completionBlock = self.completionBlock; + if (completionBlock) { + completionBlock(); } id delegate = self.delegate; if ([delegate respondsToSelector:@selector(hudWasHidden:)]) { From c2d44aa0e81a71e193b17eb418ad7198b7b49b01 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Fri, 3 Jun 2016 20:25:48 +0200 Subject: [PATCH 029/173] Added a completion block test. --- Demo/HudTests/HudTests.m | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Demo/HudTests/HudTests.m b/Demo/HudTests/HudTests.m index f2c41859d..09c441810 100644 --- a/Demo/HudTests/HudTests.m +++ b/Demo/HudTests/HudTests.m @@ -102,6 +102,24 @@ - (void)testAnimatedConvenienceHUDPresentation { [self waitForExpectationsWithTimeout:5. handler:nil]; } +- (void)testCompletionBlock { + UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIView *rootView = rootViewController.view; + + self.hideExpectation = [self expectationWithDescription:@"The hudWasHidden: delegate should have been called."]; + XCTestExpectation *completionExpectation = [self expectationWithDescription:@"The completionBlock: should have been called."]; + + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:rootView animated:YES]; + hud.delegate = self; + hud.completionBlock = ^{ + [completionExpectation fulfill]; + }; + + [hud hideAnimated:YES]; + + [self waitForExpectationsWithTimeout:5. handler:nil]; +} + #pragma mark - Delay - (void)testDelayedHide { From d6f3e37d7b37ee79187e8e069287bbb6c3d01dc3 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 19 Jun 2016 11:37:43 +0200 Subject: [PATCH 030/173] Implemented the color example. --- Demo/Classes/MBHudDemoViewController.m | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index 606340fc2..b6e8aa6cb 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -58,7 +58,7 @@ - (void)awakeFromNib { @[[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)]] + [MBExample exampleWithTitle:@"Colored" selector:@selector(colorExample)]] ]; } @@ -251,6 +251,21 @@ - (void)networkingExample { [self doSomeNetworkWorkWithProgress]; } +- (void)colorExample { + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + hud.contentColor = [UIColor colorWithRed:0.f green:0.6f blue:0.7f alpha:1.f]; + + // Set the label text. + hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); + + 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 47628963938f7f3bf039a370636a4522a7ce4f3f Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 19 Jun 2016 11:41:40 +0200 Subject: [PATCH 031/173] Implemented the dim background example. --- Demo/Classes/MBHudDemoViewController.m | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index b6e8aa6cb..acb372e0f 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -57,7 +57,7 @@ - (void)awakeFromNib { [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:@"Dim background" selector:@selector(dimBackgroundExample)], [MBExample exampleWithTitle:@"Colored" selector:@selector(colorExample)]] ]; } @@ -251,6 +251,21 @@ - (void)networkingExample { [self doSomeNetworkWorkWithProgress]; } +- (void)dimBackgroundExample { + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; + + // Change the background view style and color. + hud.backgroundView.style = MBProgressHUDBackgroundStyleSolidColor; + hud.backgroundView.color = [UIColor colorWithWhite:0.f alpha:0.1f]; + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ + [self doSomeWork]; + dispatch_async(dispatch_get_main_queue(), ^{ + [hud hideAnimated:YES]; + }); + }); +} + - (void)colorExample { MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; hud.contentColor = [UIColor colorWithRed:0.f green:0.6f blue:0.7f alpha:1.f]; From f663584e423168f2c1f479c0178717515067e041 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 19 Jun 2016 12:17:34 +0200 Subject: [PATCH 032/173] Prioritize UIAppearance over contentColor. --- MBProgressHUD.h | 2 +- MBProgressHUD.m | 25 ++++++++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 08ebb7fdd..b3dbff6fe 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -420,7 +420,7 @@ NS_ASSUME_NONNULL_BEGIN @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 background properties instead."))); -@property (strong, nonatomic) UIColor *activityIndicatorColor __attribute__((deprecated("Use UIAppearance to customize UIActivityIndicatorView."))); +@property (strong, nonatomic) UIColor *activityIndicatorColor __attribute__((deprecated("Use UIAppearance to customize UIActivityIndicatorView. E.g.: [UIActivityIndicatorView appearanceWhenContainedIn:[MBProgressHUD class], nil].color = [UIColor redColor];"))); @property (atomic, assign, readonly) CGSize size __attribute__((deprecated("Get the bezelView.frame.size instead."))); @end diff --git a/MBProgressHUD.m b/MBProgressHUD.m index de02dc7fc..9d677692b 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -439,15 +439,30 @@ - (void)updateViewsForColor:(UIColor *)color { } #pragma clang diagnostic pop + // UIApprance settings are prioritized. If they are preset the set color is ignored. + UIView *indicator = self.indicator; if ([indicator isKindOfClass:[UIActivityIndicatorView class]]) { - ((UIActivityIndicatorView *)indicator).color = color; + UIActivityIndicatorView *appearance = [UIActivityIndicatorView appearanceWhenContainedIn:[MBProgressHUD class], nil]; + if (appearance.color == nil) { + ((UIActivityIndicatorView *)indicator).color = color; + } } else if ([indicator isKindOfClass:[MBRoundProgressView class]]) { - ((MBRoundProgressView *)indicator).progressTintColor = color; - ((MBRoundProgressView *)indicator).backgroundTintColor = [color colorWithAlphaComponent:0.1]; + MBRoundProgressView *appearance = [MBRoundProgressView appearanceWhenContainedIn:[MBProgressHUD class], nil]; + if (appearance.progressTintColor == nil) { + ((MBRoundProgressView *)indicator).progressTintColor = color; + } + if (appearance.backgroundTintColor == nil) { + ((MBRoundProgressView *)indicator).backgroundTintColor = [color colorWithAlphaComponent:0.1]; + } } else if ([indicator isKindOfClass:[MBBarProgressView class]]) { - ((MBBarProgressView *)indicator).progressColor = color; - ((MBBarProgressView *)indicator).lineColor = color; + MBBarProgressView *appearance = [MBBarProgressView appearanceWhenContainedIn:[MBProgressHUD class], nil]; + if (appearance.progressColor == nil) { + ((MBBarProgressView *)indicator).progressColor = color; + } + if (appearance.lineColor == nil) { + ((MBBarProgressView *)indicator).lineColor = color; + } } else { #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 || TARGET_OS_TV if ([indicator respondsToSelector:@selector(setTintColor:)]) { From ca93b61a84b5e07d9f128c17dcd2aa640478fb2b Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 19 Jun 2016 12:53:16 +0200 Subject: [PATCH 033/173] Fixed runtime checks for UIBlurEffect. --- MBProgressHUD.m | 72 ++++++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 9d677692b..6c0d5401c 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -1027,9 +1027,8 @@ @interface MBBackgroundView () #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV @property UIVisualEffectView *effectView; -# else -@property UIToolbar *toolbar; #endif +@property UIToolbar *toolbar; @end @@ -1042,11 +1041,11 @@ - (instancetype)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0) { _style = MBProgressHUDBackgroundStyleBlur; -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV - _color = [UIColor colorWithWhite:0.8f alpha:0.6f]; -#else - _color = [UIColor colorWithWhite:0.95f alpha:0.6f]; -#endif + if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0) { + _color = [UIColor colorWithWhite:0.8f alpha:0.6f]; + } else { + _color = [UIColor colorWithWhite:0.95f alpha:0.6f]; + } } else { _style = MBProgressHUDBackgroundStyleSolidColor; _color = [[UIColor blackColor] colorWithAlphaComponent:0.8]; @@ -1093,30 +1092,37 @@ - (void)updateForBackgroundStyle { MBProgressHUDBackgroundStyle style = self.style; if (style == MBProgressHUDBackgroundStyleBlur) { #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV - UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; - UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect]; - [self addSubview:effectView]; - effectView.frame = self.bounds; - effectView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; - self.backgroundColor = self.color; - 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 = color; - [self addSubview:toolbar]; - self.toolbar = toolbar; + if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0) { + UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; + UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect]; + [self addSubview:effectView]; + effectView.frame = self.bounds; + effectView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; + self.backgroundColor = self.color; + self.layer.allowsGroupOpacity = NO; + self.effectView = effectView; + } else { +#endif + UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectInset(self.bounds, -100.f, -100.f)]; + toolbar.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; + toolbar.barTintColor = self.color; + toolbar.translucent = YES; + [self addSubview:toolbar]; + self.toolbar = toolbar; +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV + } #endif } else { #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV - [self.effectView removeFromSuperview]; - self.effectView = nil; -#else - [self.toolbar removeFromSuperview]; - self.toolbar = nil; + if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0) { + [self.effectView removeFromSuperview]; + self.effectView = nil; + } else { +#endif + [self.toolbar removeFromSuperview]; + self.toolbar = nil; +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV + } #endif self.backgroundColor = self.color; } @@ -1124,11 +1130,11 @@ - (void)updateForBackgroundStyle { - (void)updateViewsForColor:(UIColor *)color { if (self.style == MBProgressHUDBackgroundStyleBlur) { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV - self.backgroundColor = self.color; -#else - self.toolbar.barTintColor = color; -#endif + if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0) { + self.backgroundColor = self.color; + } else { + self.toolbar.barTintColor = color; + } } else { self.backgroundColor = self.color; } From 3baf8db932e2280e84779c54ace3fc29fc6f0957 Mon Sep 17 00:00:00 2001 From: longpham Date: Thu, 23 Jun 2016 13:38:01 +0700 Subject: [PATCH 034/173] Fixes for deprecated api --- MBProgressHUD.m | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 6c0d5401c..4961493a7 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -443,12 +443,24 @@ - (void)updateViewsForColor:(UIColor *)color { UIView *indicator = self.indicator; if ([indicator isKindOfClass:[UIActivityIndicatorView class]]) { - UIActivityIndicatorView *appearance = [UIActivityIndicatorView appearanceWhenContainedIn:[MBProgressHUD class], nil]; + UIActivityIndicatorView *appearance = nil; +#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000 + appearance = [UIActivityIndicatorView appearanceWhenContainedIn:[MBProgressHUD class], nil]; +#else + // For iOS9+ + appearance = [UIActivityIndicatorView appearanceWhenContainedInInstancesOfClasses:@[[MBProgressHUD class]]]; +#endif + if (appearance.color == nil) { ((UIActivityIndicatorView *)indicator).color = color; } } else if ([indicator isKindOfClass:[MBRoundProgressView class]]) { - MBRoundProgressView *appearance = [MBRoundProgressView appearanceWhenContainedIn:[MBProgressHUD class], nil]; + MBRoundProgressView *appearance = nil; +#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000 + appearance = [MBRoundProgressView appearanceWhenContainedIn:[MBProgressHUD class], nil]; +#else + appearance = [MBRoundProgressView appearanceWhenContainedInInstancesOfClasses:@[[MBProgressHUD class]]]; +#endif if (appearance.progressTintColor == nil) { ((MBRoundProgressView *)indicator).progressTintColor = color; } @@ -456,7 +468,12 @@ - (void)updateViewsForColor:(UIColor *)color { ((MBRoundProgressView *)indicator).backgroundTintColor = [color colorWithAlphaComponent:0.1]; } } else if ([indicator isKindOfClass:[MBBarProgressView class]]) { - MBBarProgressView *appearance = [MBBarProgressView appearanceWhenContainedIn:[MBProgressHUD class], nil]; + MBBarProgressView *appearance = nil; +#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000 + appearance = [MBBarProgressView appearanceWhenContainedIn:[MBProgressHUD class], nil]; +#else + appearance = [MBBarProgressView appearanceWhenContainedInInstancesOfClasses:@[[MBProgressHUD class]]]; +#endif if (appearance.progressColor == nil) { ((MBBarProgressView *)indicator).progressColor = color; } From c8c91f778334687b38e565982fc86f451e0ef258 Mon Sep 17 00:00:00 2001 From: Matt Palcic Date: Thu, 23 Jun 2016 14:31:53 -0400 Subject: [PATCH 035/173] Fixed a crash on iOS 8.x and earlier --- MBProgressHUD.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 4961493a7..cd3b5a8fb 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -444,7 +444,7 @@ - (void)updateViewsForColor:(UIColor *)color { UIView *indicator = self.indicator; if ([indicator isKindOfClass:[UIActivityIndicatorView class]]) { UIActivityIndicatorView *appearance = nil; -#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000 +#if __IPHONE_OS_VERSION_MIN_REQUIRED < 90000 appearance = [UIActivityIndicatorView appearanceWhenContainedIn:[MBProgressHUD class], nil]; #else // For iOS9+ @@ -456,7 +456,7 @@ - (void)updateViewsForColor:(UIColor *)color { } } else if ([indicator isKindOfClass:[MBRoundProgressView class]]) { MBRoundProgressView *appearance = nil; -#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000 +#if __IPHONE_OS_VERSION_MIN_REQUIRED < 90000 appearance = [MBRoundProgressView appearanceWhenContainedIn:[MBProgressHUD class], nil]; #else appearance = [MBRoundProgressView appearanceWhenContainedInInstancesOfClasses:@[[MBProgressHUD class]]]; @@ -469,7 +469,7 @@ - (void)updateViewsForColor:(UIColor *)color { } } else if ([indicator isKindOfClass:[MBBarProgressView class]]) { MBBarProgressView *appearance = nil; -#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000 +#if __IPHONE_OS_VERSION_MIN_REQUIRED < 90000 appearance = [MBBarProgressView appearanceWhenContainedIn:[MBProgressHUD class], nil]; #else appearance = [MBBarProgressView appearanceWhenContainedInInstancesOfClasses:@[[MBProgressHUD class]]]; From 61e5236bd3b896940f3c22e897b86c4fa555afc1 Mon Sep 17 00:00:00 2001 From: ychzzhcy Date: Thu, 30 Jun 2016 13:57:10 +0800 Subject: [PATCH 036/173] fix typo --- MBProgressHUD.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index cd3b5a8fb..357c2a3f1 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -147,7 +147,7 @@ - (void)showAnimated:(BOOL)animated { [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; self.graceTimer = timer; } - // ... otherwise show the HUD imediately + // ... otherwise show the HUD immediately else { [self showUsingAnimation:self.useAnimation]; } @@ -439,7 +439,7 @@ - (void)updateViewsForColor:(UIColor *)color { } #pragma clang diagnostic pop - // UIApprance settings are prioritized. If they are preset the set color is ignored. + // UIAppearance settings are prioritized. If they are preset the set color is ignored. UIView *indicator = self.indicator; if ([indicator isKindOfClass:[UIActivityIndicatorView class]]) { @@ -447,7 +447,7 @@ - (void)updateViewsForColor:(UIColor *)color { #if __IPHONE_OS_VERSION_MIN_REQUIRED < 90000 appearance = [UIActivityIndicatorView appearanceWhenContainedIn:[MBProgressHUD class], nil]; #else - // For iOS9+ + // For iOS 9+ appearance = [UIActivityIndicatorView appearanceWhenContainedInInstancesOfClasses:@[[MBProgressHUD class]]]; #endif From 2171272be3de8ef86c9b6c0ecf8bf8ba458aa1f0 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Thu, 7 Jul 2016 07:46:33 +0200 Subject: [PATCH 037/173] Avoids unnecessarily calling updatePaddingConstraints --- MBProgressHUD.m | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 357c2a3f1..ffc5ef167 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -610,7 +610,13 @@ - (void)updateConstraints { } - (void)layoutSubviews { - [self updatePaddingConstraints]; + // There is no need to update constraints if they are going to + // be recreated in [super layoutSubviews] due to needsUpdateConstraints being set. + // This also avoids an issue on iOS 8, where updatePaddingConstraints + // would trigger a zombie object access. + if (!self.needsUpdateConstraints) { + [self updatePaddingConstraints]; + } [super layoutSubviews]; } From a29c736ef8c101c848947389a91bc1ab76715581 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 06:53:15 +0200 Subject: [PATCH 038/173] Changelog formatting --- CHANGELOG.mdown | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.mdown b/CHANGELOG.mdown index d50226395..b1e44d5c8 100644 --- a/CHANGELOG.mdown +++ b/CHANGELOG.mdown @@ -1,21 +1,21 @@ **Version 0.9.2** @ 22.12.15 - - Timer improvements - - Additional assertions - - Added a framework target - - Tint progress tint color enhancements +- Timer improvements +- Additional assertions +- Added a framework target +- Tint progress tint color enhancements **Version 0.9.1** @ 06.03.15 - - Bug-fixes - - Modernization +- 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. +- 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 From 18127ef046cc0f9c6b5301df4d599676df7b920a Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 06:53:27 +0200 Subject: [PATCH 039/173] Bump version --- MBProgressHUD.h | 2 +- MBProgressHUD.m | 2 +- MBProgressHUD.podspec | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index b3dbff6fe..afa47ef90 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -1,6 +1,6 @@ // // MBProgressHUD.h -// Version 0.9.2 +// Version 1.0.0 // Created by Matej Bukovinski on 2.4.09. // diff --git a/MBProgressHUD.m b/MBProgressHUD.m index ffc5ef167..26f24625b 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -1,6 +1,6 @@ // // MBProgressHUD.m -// Version 0.9.2 +// Version 1.0.0 // Created by Matej Bukovinski on 2.4.09. // diff --git a/MBProgressHUD.podspec b/MBProgressHUD.podspec index 48f237684..f88faa4c3 100644 --- a/MBProgressHUD.podspec +++ b/MBProgressHUD.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "MBProgressHUD" - s.version = "0.9.2" + s.version = "1.0.0" s.summary = "An iOS activity indicator view." s.description = <<-DESC MBProgressHUD is an iOS drop-in class that displays a translucent HUD From ae9dd5f24465f883f1d5b244ad1b4e18c261d8e5 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 06:59:17 +0200 Subject: [PATCH 040/173] Use more manageable unit counts --- Demo/Classes/MBHudDemoViewController.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index 715967260..f470aea0f 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -151,7 +151,7 @@ - (void)determinateNSProgressExample { hud.mode = MBProgressHUDModeDeterminate; hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); - NSProgress *progressObject = [NSProgress progressWithTotalUnitCount:200000]; + NSProgress *progressObject = [NSProgress progressWithTotalUnitCount:100]; hud.progressObject = progressObject; @@ -316,6 +316,7 @@ - (void)doSomeWorkWithProgressObject:(NSProgress *)progressObject { if (self.canceled) break; [progressObject becomeCurrentWithPendingUnitCount:1]; [progressObject resignCurrent]; + usleep(50000); } } From b11d70c22d838b6c9f80969fd97143185c043ec7 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 07:00:47 +0200 Subject: [PATCH 041/173] Format --- Demo/Classes/MBHudDemoViewController.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index f470aea0f..542f6df54 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -33,7 +33,8 @@ + (instancetype)exampleWithTitle:(NSString *)title selector:(SEL)selector { @interface MBHudDemoViewController () @property (nonatomic, strong) NSArray *> *examples; -@property (atomic, assign) BOOL canceled; // atomic, because it may be cancelled from main thread, flag is read on a background thread +// Atomic, because it may be cancelled from main thread, flag is read on a background thread +@property (atomic, assign) BOOL canceled; @end From 1f794f62eba925d5e971afb6f1f83d9bd99ef053 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 07:04:59 +0200 Subject: [PATCH 042/173] Use NSProgress cancelation --- Demo/Classes/MBHudDemoViewController.m | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/Classes/MBHudDemoViewController.m index 542f6df54..458b96c6f 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/Classes/MBHudDemoViewController.m @@ -151,11 +151,15 @@ - (void)determinateNSProgressExample { // Set the determinate mode to show task progress. hud.mode = MBProgressHUDModeDeterminate; hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); - + + // Set up NSPorgress NSProgress *progressObject = [NSProgress progressWithTotalUnitCount:100]; - hud.progressObject = progressObject; - + + // Configure a cacnel button. + [hud.button setTitle:NSLocalizedString(@"Cancel", @"HUD cancel button title") forState:UIControlStateNormal]; + [hud.button addTarget:progressObject action:@selector(cancel) 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 doSomeWorkWithProgressObject:progressObject]; @@ -311,10 +315,9 @@ - (void)doSomeWork { } - (void)doSomeWorkWithProgressObject:(NSProgress *)progressObject { - self.canceled = NO; // This just increases the progress indicator in a loop. while (progressObject.fractionCompleted < 1.0f) { - if (self.canceled) break; + if (progressObject.isCancelled) break; [progressObject becomeCurrentWithPendingUnitCount:1]; [progressObject resignCurrent]; usleep(50000); From 7e1f4b6a335a5aff32a6e38ceac2599e84434d5e Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 07:19:47 +0200 Subject: [PATCH 043/173] Clean up display link management --- MBProgressHUD.m | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 3cadb2e3c..121eb5cb2 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -156,7 +156,6 @@ - (void)showAnimated:(BOOL)animated { - (void)hideAnimated:(BOOL)animated { MBMainThreadAssert(); - self.progressObjectDisplayLink = nil; [self.graceTimer invalidate]; self.useAnimation = animated; self.finished = YES; @@ -217,6 +216,9 @@ - (void)showUsingAnimation:(BOOL)animated { self.showStarted = [NSDate date]; self.alpha = 1.f; + // Needed in case we hide and re-show with the same NSProgress object attached. + [self setUpProgressDidsplayLink]; + if (animated) { [self animateIn:YES withType:self.animationType completion:NULL]; } else { @@ -288,6 +290,7 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple - (void)done { // Cancel any scheduled hideDelayed: calls [self.hideDelayTimer invalidate]; + [self invalidateProgressDisplayLink]; if (self.hasFinished) { self.alpha = 0.0f; @@ -702,19 +705,10 @@ - (void)setProgressObjectDisplayLink:(CADisplayLink *)progressObjectDisplayLink - (void)setProgressObject:(NSProgress *)progressObject { if (progressObject != _progressObject) { _progressObject = progressObject; - - // We're using CADisplayLink, because NSProgress can change very quickly and observing it may starve the main thread, - // so we're refreshing the progress only every frame draw - self.progressObjectDisplayLink = [CADisplayLink displayLinkWithTarget:self - selector:@selector(updateProgressFromProgressObject)]; - + [self setUpProgressDidsplayLink]; } } -- (void)updateProgressFromProgressObject { - self.progress = self.progressObject.fractionCompleted; -} - - (void)setProgress:(float)progress { if (progress != _progress) { _progress = progress; @@ -739,6 +733,24 @@ - (void)setDefaultMotionEffectsEnabled:(BOOL)defaultMotionEffectsEnabled { } } +#pragma mark - NSProgress + +- (void)setUpProgressDidsplayLink { + if (self.progressObject) { + // We're using CADisplayLink, because NSProgress can change very quickly and observing it may starve the main thread, + // so we're refreshing the progress only every frame draw + self.progressObjectDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateProgressFromProgressObject)]; + } +} + +- (void)invalidateProgressDisplayLink { + self.progressObjectDisplayLink = nil; +} + +- (void)updateProgressFromProgressObject { + self.progress = self.progressObject.fractionCompleted; +} + #pragma mark - Notifications - (void)registerForNotifications { From 0416fa6c6f3ff0e445dec32b8311eae55da0dfc8 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 07:29:40 +0200 Subject: [PATCH 044/173] Improve display link creation --- MBProgressHUD.m | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 121eb5cb2..aee2252ee 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -217,7 +217,7 @@ - (void)showUsingAnimation:(BOOL)animated { self.alpha = 1.f; // Needed in case we hide and re-show with the same NSProgress object attached. - [self setUpProgressDidsplayLink]; + [self setNSProgressDisplayLinkEnabled:YES]; if (animated) { [self animateIn:YES withType:self.animationType completion:NULL]; @@ -290,7 +290,7 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple - (void)done { // Cancel any scheduled hideDelayed: calls [self.hideDelayTimer invalidate]; - [self invalidateProgressDisplayLink]; + [self setNSProgressDisplayLinkEnabled:NO]; if (self.hasFinished) { self.alpha = 0.0f; @@ -705,7 +705,7 @@ - (void)setProgressObjectDisplayLink:(CADisplayLink *)progressObjectDisplayLink - (void)setProgressObject:(NSProgress *)progressObject { if (progressObject != _progressObject) { _progressObject = progressObject; - [self setUpProgressDidsplayLink]; + [self setNSProgressDisplayLinkEnabled:YES]; } } @@ -735,18 +735,19 @@ - (void)setDefaultMotionEffectsEnabled:(BOOL)defaultMotionEffectsEnabled { #pragma mark - NSProgress -- (void)setUpProgressDidsplayLink { - if (self.progressObject) { - // We're using CADisplayLink, because NSProgress can change very quickly and observing it may starve the main thread, - // so we're refreshing the progress only every frame draw - self.progressObjectDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateProgressFromProgressObject)]; +- (void)setNSProgressDisplayLinkEnabled:(BOOL)enabled { + // We're using CADisplayLink, because NSProgress can change very quickly and observing it may starve the main thread, + // so we're refreshing the progress only every frame draw + if (enabled && self.progressObject) { + // Only create if not already active. + if (!self.progressObjectDisplayLink) { + self.progressObjectDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateProgressFromProgressObject)]; + } + } else { + self.progressObjectDisplayLink = nil; } } -- (void)invalidateProgressDisplayLink { - self.progressObjectDisplayLink = nil; -} - - (void)updateProgressFromProgressObject { self.progress = self.progressObject.fractionCompleted; } From 406eb5e62f7ad03277ea58084ad9263863755fd5 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 07:40:36 +0200 Subject: [PATCH 045/173] Remove partial test --- Demo/HudTests/HudTests.m | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/Demo/HudTests/HudTests.m b/Demo/HudTests/HudTests.m index 5d66eaad8..58c363610 100644 --- a/Demo/HudTests/HudTests.m +++ b/Demo/HudTests/HudTests.m @@ -226,28 +226,6 @@ - (void)testAnimatedImmediateHudReuse { [self waitForExpectationsWithTimeout:5. handler:nil]; } -- (void)testDoubleHide { - UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; - UIView *rootView = rootViewController.view; - - self.hideExpectation = [self expectationWithDescription:@"The hud should have been hidden."]; - - MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; - [rootView addSubview:hud]; - [hud showAnimated:YES]; - - XCTAssertNotNil(hud, @"A HUD should be created."); - - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - MBTestHUDIsVisible(hud, rootView); - - [hud hideAnimated:YES]; -// [hud hideAnimated:YES]; - }); - - [self waitForExpectationsWithTimeout:5. handler:nil]; -} - #pragma mark - Min show time - (void)testMinShowTime { From 1dc32f2e4dfc23823d38b6bece21b71cbc13bf81 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 07:53:42 +0200 Subject: [PATCH 046/173] Add changelog entry for 1.0 --- CHANGELOG.mdown | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.mdown b/CHANGELOG.mdown index 6cccde8a4..b92e403e9 100644 --- a/CHANGELOG.mdown +++ b/CHANGELOG.mdown @@ -1,6 +1,24 @@ -**master** - - - Added support for `NSProgress` +**Version 1.0.0** @ 14.07.16 + +- Requires ARC and iOS 6+. +- Includes a new default design for iOS 7+. +- Deprecates certain helpers and exposes some more flexible API. +- Removes KVO observing of local properties. +- Migrates layout code to Auto Layout. +- Includes a rewritten demo app. +- Includes a rewritten example app. +- Updates and extends documentation. +- Adds support for `NSProgress` +- Adds a new customizable background view class. +- Adds new assertions. +- Adds basic unit tests. +- Adds support for motion effects. +- Adds nullability. +- Adds basic interface builder support. +- Adds tvOS support. +- Improves behavior when showing and hiding in quick succession. +- Improves support for `UIAppearance `. +- Various smaller bug-fixes **Version 0.9.2** @ 22.12.15 From 740d475fe8efaad7b377f96a193fcdd01cff1b8f Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 07:59:58 +0200 Subject: [PATCH 047/173] Update gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 7aee0c65a..47da675f7 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,6 @@ profile # AppCode noise .idea/ + +# Ruby +.ruby-version From e946b05a9a19480ee8615335e69ff9af3cf81432 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 08:37:26 +0200 Subject: [PATCH 048/173] Fix tvOS build errors --- MBProgressHUD.m | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index aee2252ee..a94f9217a 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -1092,7 +1092,9 @@ @interface MBBackgroundView () #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV @property UIVisualEffectView *effectView; #endif +#if !TARGET_OS_TV @property UIToolbar *toolbar; +#endif @end @@ -1167,12 +1169,14 @@ - (void)updateForBackgroundStyle { self.effectView = effectView; } else { #endif +#if !TARGET_OS_TV UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectInset(self.bounds, -100.f, -100.f)]; toolbar.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; toolbar.barTintColor = self.color; toolbar.translucent = YES; [self addSubview:toolbar]; self.toolbar = toolbar; +#endif #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV } #endif @@ -1183,8 +1187,10 @@ - (void)updateForBackgroundStyle { self.effectView = nil; } else { #endif +#if !TARGET_OS_TV [self.toolbar removeFromSuperview]; self.toolbar = nil; +#endif #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV } #endif @@ -1197,7 +1203,9 @@ - (void)updateViewsForColor:(UIColor *)color { if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0) { self.backgroundColor = self.color; } else { +#if !TARGET_OS_TV self.toolbar.barTintColor = color; +#endif } } else { self.backgroundColor = self.color; From 6cdb787c215372dcd29ebdd2cc1c966f3501412b Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 08:37:57 +0200 Subject: [PATCH 049/173] Add tvOS example and restructure iOS example --- Demo/HudDemo.xcodeproj/project.pbxproj | 249 +++++++++++++++--- Demo/{ => HudDemo}/HudDemo_Prefix.pch | 0 Demo/{ => HudDemo}/Info.plist | 0 .../MBHudDemoAppDelegate.h | 2 +- .../MBHudDemoAppDelegate.m | 2 +- .../MBHudDemoViewController.h | 2 +- .../MBHudDemoViewController.m | 2 +- Demo/{ => HudDemo}/en.lproj/Launch.storyboard | 0 Demo/{ => HudDemo}/en.lproj/Main.storyboard | 0 Demo/{ => HudDemo}/main.m | 2 +- .../Content.imageset/Contents.json | 12 + .../Back.imagestacklayer/Contents.json | 6 + .../App Icon - Large.imagestack/Contents.json | 17 ++ .../Content.imageset/Contents.json | 12 + .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Middle.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Back.imagestacklayer/Contents.json | 6 + .../App Icon - Small.imagestack/Contents.json | 17 ++ .../Content.imageset/Contents.json | 12 + .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Middle.imagestacklayer/Contents.json | 6 + .../Contents.json | 26 ++ .../Top Shelf Image.imageset/Contents.json | 12 + Demo/HudDemoTV/Assets.xcassets/Contents.json | 6 + .../LaunchImage.launchimage/Contents.json | 15 ++ Demo/HudDemoTV/Base.lproj/Main.storyboard | 40 +++ Demo/HudDemoTV/Info.plist | 32 +++ Demo/HudDemoTV/MBHudDemoTVAppDelegate.h | 16 ++ Demo/HudDemoTV/MBHudDemoTVAppDelegate.m | 17 ++ Demo/HudDemoTV/MBHudDemoTVViewController.h | 14 + Demo/HudDemoTV/MBHudDemoTVViewController.m | 47 ++++ Demo/HudDemoTV/main.m | 16 ++ LICENSE | 2 +- MBProgressHUD.h | 2 +- 37 files changed, 603 insertions(+), 43 deletions(-) rename Demo/{ => HudDemo}/HudDemo_Prefix.pch (100%) rename Demo/{ => HudDemo}/Info.plist (100%) rename Demo/{Classes => HudDemo}/MBHudDemoAppDelegate.h (78%) rename Demo/{Classes => HudDemo}/MBHudDemoAppDelegate.m (86%) rename Demo/{Classes => HudDemo}/MBHudDemoViewController.h (73%) rename Demo/{Classes => HudDemo}/MBHudDemoViewController.m (99%) rename Demo/{ => HudDemo}/en.lproj/Launch.storyboard (100%) rename Demo/{ => HudDemo}/en.lproj/Main.storyboard (100%) rename Demo/{ => HudDemo}/main.m (83%) create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/LaunchImage.launchimage/Contents.json create mode 100644 Demo/HudDemoTV/Base.lproj/Main.storyboard create mode 100644 Demo/HudDemoTV/Info.plist create mode 100644 Demo/HudDemoTV/MBHudDemoTVAppDelegate.h create mode 100644 Demo/HudDemoTV/MBHudDemoTVAppDelegate.m create mode 100644 Demo/HudDemoTV/MBHudDemoTVViewController.h create mode 100644 Demo/HudDemoTV/MBHudDemoTVViewController.m create mode 100644 Demo/HudDemoTV/main.m diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index 891457fc4..f2b2c0062 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -7,17 +7,23 @@ objects = { /* Begin PBXBuildFile section */ - 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 /* MBHudDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* MBHudDemoViewController.m */; }; 5BE141EE1CD8C33D0023BC9E /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BE141ED1CD8C33D0023BC9E /* QuartzCore.framework */; }; D22F7D810F85241C00550BB3 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D22F7D800F85241C00550BB3 /* MBProgressHUD.m */; }; + D27F18451D3B5878009D7482 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D27F18441D3B5878009D7482 /* main.m */; }; + D27F18481D3B5878009D7482 /* MBHudDemoTVAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D27F18471D3B5878009D7482 /* MBHudDemoTVAppDelegate.m */; }; + D27F184B1D3B5878009D7482 /* MBHudDemoTVViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D27F184A1D3B5878009D7482 /* MBHudDemoTVViewController.m */; }; + D27F184E1D3B5878009D7482 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D27F184C1D3B5878009D7482 /* Main.storyboard */; }; + D27F18501D3B5878009D7482 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D27F184F1D3B5878009D7482 /* Assets.xcassets */; }; + D27F18551D3B5AAF009D7482 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D22F7D800F85241C00550BB3 /* MBProgressHUD.m */; }; + D27F185A1D3B5DFF009D7482 /* MBHudDemoAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D27F18581D3B5DFF009D7482 /* MBHudDemoAppDelegate.m */; }; + D27F185B1D3B5DFF009D7482 /* MBHudDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D27F18591D3B5DFF009D7482 /* MBHudDemoViewController.m */; }; + D27F185E1D3B5E0D009D7482 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D27F185D1D3B5E0D009D7482 /* main.m */; }; + D27F18631D3B5E21009D7482 /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D27F185F1D3B5E21009D7482 /* Launch.storyboard */; }; + D27F18641D3B5E21009D7482 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D27F18611D3B5E21009D7482 /* Main.storyboard */; }; 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 */ @@ -33,24 +39,33 @@ /* 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 = ""; }; - 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 /* 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 = ""; }; 5BE141ED1CD8C33D0023BC9E /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 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 = ""; }; + D27F18411D3B5878009D7482 /* HudDemoTV.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HudDemoTV.app; sourceTree = BUILT_PRODUCTS_DIR; }; + D27F18441D3B5878009D7482 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + D27F18461D3B5878009D7482 /* MBHudDemoTVAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MBHudDemoTVAppDelegate.h; sourceTree = ""; }; + D27F18471D3B5878009D7482 /* MBHudDemoTVAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MBHudDemoTVAppDelegate.m; sourceTree = ""; }; + D27F18491D3B5878009D7482 /* MBHudDemoTVViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MBHudDemoTVViewController.h; sourceTree = ""; }; + D27F184A1D3B5878009D7482 /* MBHudDemoTVViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MBHudDemoTVViewController.m; sourceTree = ""; }; + D27F184D1D3B5878009D7482 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + D27F184F1D3B5878009D7482 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + D27F18511D3B5878009D7482 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D27F18561D3B5DFF009D7482 /* MBHudDemoAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MBHudDemoAppDelegate.h; path = HudDemo/MBHudDemoAppDelegate.h; sourceTree = SOURCE_ROOT; }; + D27F18571D3B5DFF009D7482 /* MBHudDemoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MBHudDemoViewController.h; path = HudDemo/MBHudDemoViewController.h; sourceTree = SOURCE_ROOT; }; + D27F18581D3B5DFF009D7482 /* MBHudDemoAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MBHudDemoAppDelegate.m; path = HudDemo/MBHudDemoAppDelegate.m; sourceTree = SOURCE_ROOT; }; + D27F18591D3B5DFF009D7482 /* MBHudDemoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MBHudDemoViewController.m; path = HudDemo/MBHudDemoViewController.m; sourceTree = SOURCE_ROOT; }; + D27F185C1D3B5E0D009D7482 /* HudDemo_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HudDemo_Prefix.pch; path = HudDemo/HudDemo_Prefix.pch; sourceTree = ""; }; + D27F185D1D3B5E0D009D7482 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = HudDemo/main.m; sourceTree = ""; }; + D27F18601D3B5E21009D7482 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = HudDemo/en.lproj/Launch.storyboard; sourceTree = ""; }; + D27F18621D3B5E21009D7482 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = HudDemo/en.lproj/Main.storyboard; sourceTree = ""; }; + D27F18651D3B5E2D009D7482 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = HudDemo/Info.plist; sourceTree = ""; }; D286A76C1518CA9F00E13FB8 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 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; }; /* End PBXFileReference section */ @@ -66,6 +81,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + D27F183E1D3B5878009D7482 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; D2B1740C1C5E3A3D00021915 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -79,10 +101,10 @@ 080E96DDFE201D6D7F000001 /* HudDemo */ = { isa = PBXGroup; children = ( - 1D3623240D0F684500981E51 /* MBHudDemoAppDelegate.h */, - 1D3623250D0F684500981E51 /* MBHudDemoAppDelegate.m */, - 28D7ACF60DDB3853001CB0EB /* MBHudDemoViewController.h */, - 28D7ACF70DDB3853001CB0EB /* MBHudDemoViewController.m */, + D27F18561D3B5DFF009D7482 /* MBHudDemoAppDelegate.h */, + D27F18571D3B5DFF009D7482 /* MBHudDemoViewController.h */, + D27F18581D3B5DFF009D7482 /* MBHudDemoAppDelegate.m */, + D27F18591D3B5DFF009D7482 /* MBHudDemoViewController.m */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, ); @@ -95,6 +117,7 @@ children = ( 1D6058910D05DD3D006BFB54 /* HudDemo.app */, D2B1740F1C5E3A3D00021915 /* HudTests.xctest */, + D27F18411D3B5878009D7482 /* HudDemoTV.app */, ); name = Products; sourceTree = ""; @@ -103,6 +126,7 @@ isa = PBXGroup; children = ( 080E96DDFE201D6D7F000001 /* HudDemo */, + D27F18421D3B5878009D7482 /* HudDemoTV */, D2B174101C5E3A3D00021915 /* HudTests */, D28CBB391A87A6B00052DCEC /* MBProgressHUD */, 29B97323FDCFA39411CA2CEA /* Frameworks */, @@ -114,8 +138,8 @@ 29B97315FDCFA39411CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( - 32CA4F630368D1EE00C91783 /* HudDemo_Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main.m */, + D27F185C1D3B5E0D009D7482 /* HudDemo_Prefix.pch */, + D27F185D1D3B5E0D009D7482 /* main.m */, ); name = "Other Sources"; path = ..; @@ -124,9 +148,9 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + D27F18651D3B5E2D009D7482 /* Info.plist */, D277FDBF11FC880100304321 /* UI */, D2EEB3801B55967200F59EC1 /* Images.xcassets */, - 8D1107310486CEB800E47090 /* Info.plist */, ); name = Resources; path = ..; @@ -146,12 +170,43 @@ D277FDBF11FC880100304321 /* UI */ = { isa = PBXGroup; children = ( - D2EEB3791B558F0900F59EC1 /* Launch.storyboard */, - D2BC09311BA587FB00589A7C /* Main.storyboard */, + D27F185F1D3B5E21009D7482 /* Launch.storyboard */, + D27F18611D3B5E21009D7482 /* Main.storyboard */, ); name = UI; sourceTree = ""; }; + D27F18421D3B5878009D7482 /* HudDemoTV */ = { + isa = PBXGroup; + children = ( + D27F18461D3B5878009D7482 /* MBHudDemoTVAppDelegate.h */, + D27F18471D3B5878009D7482 /* MBHudDemoTVAppDelegate.m */, + D27F18491D3B5878009D7482 /* MBHudDemoTVViewController.h */, + D27F184A1D3B5878009D7482 /* MBHudDemoTVViewController.m */, + D27F18431D3B5878009D7482 /* Other Sources */, + D27F18671D3B5E43009D7482 /* Resources */, + ); + path = HudDemoTV; + sourceTree = ""; + }; + D27F18431D3B5878009D7482 /* Other Sources */ = { + isa = PBXGroup; + children = ( + D27F18441D3B5878009D7482 /* main.m */, + ); + name = "Other Sources"; + sourceTree = ""; + }; + D27F18671D3B5E43009D7482 /* Resources */ = { + isa = PBXGroup; + children = ( + D27F184C1D3B5878009D7482 /* Main.storyboard */, + D27F184F1D3B5878009D7482 /* Assets.xcassets */, + D27F18511D3B5878009D7482 /* Info.plist */, + ); + name = Resources; + sourceTree = ""; + }; D28CBB391A87A6B00052DCEC /* MBProgressHUD */ = { isa = PBXGroup; children = ( @@ -190,6 +245,23 @@ productReference = 1D6058910D05DD3D006BFB54 /* HudDemo.app */; productType = "com.apple.product-type.application"; }; + D27F18401D3B5878009D7482 /* HudDemoTV */ = { + isa = PBXNativeTarget; + buildConfigurationList = D27F18541D3B5878009D7482 /* Build configuration list for PBXNativeTarget "HudDemoTV" */; + buildPhases = ( + D27F183D1D3B5878009D7482 /* Sources */, + D27F183E1D3B5878009D7482 /* Frameworks */, + D27F183F1D3B5878009D7482 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = HudDemoTV; + productName = HudDemoTV; + productReference = D27F18411D3B5878009D7482 /* HudDemoTV.app */; + productType = "com.apple.product-type.application"; + }; D2B1740E1C5E3A3D00021915 /* HudTests */ = { isa = PBXNativeTarget; buildConfigurationList = D2B174161C5E3A3D00021915 /* Build configuration list for PBXNativeTarget "HudTests" */; @@ -218,6 +290,9 @@ LastUpgradeCheck = 0720; ORGANIZATIONNAME = "Matej Bukovinski"; TargetAttributes = { + D27F18401D3B5878009D7482 = { + CreatedOnToolsVersion = 7.3.1; + }; D2B1740E1C5E3A3D00021915 = { CreatedOnToolsVersion = 7.2; TestTargetID = 1D6058900D05DD3D006BFB54; @@ -234,12 +309,14 @@ French, German, en, + Base, ); mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; projectDirPath = ""; projectRoot = ""; targets = ( 1D6058900D05DD3D006BFB54 /* HudDemo */, + D27F18401D3B5878009D7482 /* HudDemoTV */, D2B1740E1C5E3A3D00021915 /* HudTests */, ); }; @@ -250,9 +327,18 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - D2BC092F1BA587FB00589A7C /* Main.storyboard in Resources */, + D27F18641D3B5E21009D7482 /* Main.storyboard in Resources */, D2EEB3811B55967200F59EC1 /* Images.xcassets in Resources */, - D2EEB37B1B558F0900F59EC1 /* Launch.storyboard in Resources */, + D27F18631D3B5E21009D7482 /* Launch.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D27F183F1D3B5878009D7482 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D27F18501D3B5878009D7482 /* Assets.xcassets in Resources */, + D27F184E1D3B5878009D7482 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -270,10 +356,21 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1D60589B0D05DD56006BFB54 /* main.m in Sources */, - 1D3623260D0F684500981E51 /* MBHudDemoAppDelegate.m in Sources */, - 28D7ACF80DDB3853001CB0EB /* MBHudDemoViewController.m in Sources */, + D27F185B1D3B5DFF009D7482 /* MBHudDemoViewController.m in Sources */, D22F7D810F85241C00550BB3 /* MBProgressHUD.m in Sources */, + D27F185E1D3B5E0D009D7482 /* main.m in Sources */, + D27F185A1D3B5DFF009D7482 /* MBHudDemoAppDelegate.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D27F183D1D3B5878009D7482 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D27F184B1D3B5878009D7482 /* MBHudDemoTVViewController.m in Sources */, + D27F18481D3B5878009D7482 /* MBHudDemoTVAppDelegate.m in Sources */, + D27F18451D3B5878009D7482 /* main.m in Sources */, + D27F18551D3B5AAF009D7482 /* MBProgressHUD.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -296,22 +393,30 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ - D2BC09311BA587FB00589A7C /* Main.storyboard */ = { + D27F184C1D3B5878009D7482 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - D2BC09301BA587FB00589A7C /* en */, + D27F184D1D3B5878009D7482 /* Base */, ); name = Main.storyboard; sourceTree = ""; }; - D2EEB3791B558F0900F59EC1 /* Launch.storyboard */ = { + D27F185F1D3B5E21009D7482 /* Launch.storyboard */ = { isa = PBXVariantGroup; children = ( - D2EEB37A1B558F0900F59EC1 /* en */, + D27F18601D3B5E21009D7482 /* en */, ); name = Launch.storyboard; sourceTree = ""; }; + D27F18611D3B5E21009D7482 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + D27F18621D3B5E21009D7482 /* en */, + ); + name = Main.storyboard; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ @@ -324,8 +429,8 @@ GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = HudDemo_Prefix.pch; - INFOPLIST_FILE = Info.plist; + GCC_PREFIX_HEADER = HudDemo/HudDemo_Prefix.pch; + INFOPLIST_FILE = HudDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = HudDemo; @@ -340,8 +445,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = HudDemo_Prefix.pch; - INFOPLIST_FILE = Info.plist; + GCC_PREFIX_HEADER = HudDemo/HudDemo_Prefix.pch; + INFOPLIST_FILE = HudDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = HudDemo; @@ -406,6 +511,70 @@ }; name = Release; }; + D27F18521D3B5878009D7482 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ANALYZER_NONNULL = YES; + 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 = HudDemoTV/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.bukovinski.HudDemoTV; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + }; + name = Debug; + }; + D27F18531D3B5878009D7482 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ANALYZER_NONNULL = YES; + 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 = HudDemoTV/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = com.bukovinski.HudDemoTV; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; D2B174171C5E3A3D00021915 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -485,6 +654,14 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + D27F18541D3B5878009D7482 /* Build configuration list for PBXNativeTarget "HudDemoTV" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D27F18521D3B5878009D7482 /* Debug */, + D27F18531D3B5878009D7482 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; D2B174161C5E3A3D00021915 /* Build configuration list for PBXNativeTarget "HudTests" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Demo/HudDemo_Prefix.pch b/Demo/HudDemo/HudDemo_Prefix.pch similarity index 100% rename from Demo/HudDemo_Prefix.pch rename to Demo/HudDemo/HudDemo_Prefix.pch diff --git a/Demo/Info.plist b/Demo/HudDemo/Info.plist similarity index 100% rename from Demo/Info.plist rename to Demo/HudDemo/Info.plist diff --git a/Demo/Classes/MBHudDemoAppDelegate.h b/Demo/HudDemo/MBHudDemoAppDelegate.h similarity index 78% rename from Demo/Classes/MBHudDemoAppDelegate.h rename to Demo/HudDemo/MBHudDemoAppDelegate.h index dc9588e59..5e1c87c29 100644 --- a/Demo/Classes/MBHudDemoAppDelegate.h +++ b/Demo/HudDemo/MBHudDemoAppDelegate.h @@ -3,7 +3,7 @@ // HudDemo // // Created by Matej Bukovinski on 2.4.09. -// Copyright bukovinski.com 2009-2015. All rights reserved. +// Copyright © 2009-2016 Matej Bukovinski. All rights reserved. // #import diff --git a/Demo/Classes/MBHudDemoAppDelegate.m b/Demo/HudDemo/MBHudDemoAppDelegate.m similarity index 86% rename from Demo/Classes/MBHudDemoAppDelegate.m rename to Demo/HudDemo/MBHudDemoAppDelegate.m index 4b4b64b5d..8bc784a6b 100644 --- a/Demo/Classes/MBHudDemoAppDelegate.m +++ b/Demo/HudDemo/MBHudDemoAppDelegate.m @@ -3,7 +3,7 @@ // HudDemo // // Created by Matej Bukovinski on 2.4.09. -// Copyright bukovinski.com 2009-2015. All rights reserved. +// Copyright © 2009-2016 Matej Bukovinski. All rights reserved. // #import "MBHudDemoAppDelegate.h" diff --git a/Demo/Classes/MBHudDemoViewController.h b/Demo/HudDemo/MBHudDemoViewController.h similarity index 73% rename from Demo/Classes/MBHudDemoViewController.h rename to Demo/HudDemo/MBHudDemoViewController.h index 231a84c68..824bb063a 100644 --- a/Demo/Classes/MBHudDemoViewController.h +++ b/Demo/HudDemo/MBHudDemoViewController.h @@ -3,7 +3,7 @@ // HudDemo // // Created by Matej Bukovinski on 30.9.09. -// Copyright bukovinski.com 2009-2015. All rights reserved. +// Copyright © 2009-2016 Matej Bukovinski. All rights reserved. // #import diff --git a/Demo/Classes/MBHudDemoViewController.m b/Demo/HudDemo/MBHudDemoViewController.m similarity index 99% rename from Demo/Classes/MBHudDemoViewController.m rename to Demo/HudDemo/MBHudDemoViewController.m index 458b96c6f..565651a82 100644 --- a/Demo/Classes/MBHudDemoViewController.m +++ b/Demo/HudDemo/MBHudDemoViewController.m @@ -3,7 +3,7 @@ // HudDemo // // Created by Matej Bukovinski on 30.9.09. -// Copyright bukovinski.com 2009-2015. All rights reserved. +// Copyright © 2009-2016 Matej Bukovinski. All rights reserved. // #import "MBHudDemoViewController.h" diff --git a/Demo/en.lproj/Launch.storyboard b/Demo/HudDemo/en.lproj/Launch.storyboard similarity index 100% rename from Demo/en.lproj/Launch.storyboard rename to Demo/HudDemo/en.lproj/Launch.storyboard diff --git a/Demo/en.lproj/Main.storyboard b/Demo/HudDemo/en.lproj/Main.storyboard similarity index 100% rename from Demo/en.lproj/Main.storyboard rename to Demo/HudDemo/en.lproj/Main.storyboard diff --git a/Demo/main.m b/Demo/HudDemo/main.m similarity index 83% rename from Demo/main.m rename to Demo/HudDemo/main.m index ef3472167..ebdd9ec27 100644 --- a/Demo/main.m +++ b/Demo/HudDemo/main.m @@ -3,7 +3,7 @@ // HudDemo // // Created by Matej Bukovinski on 2.4.09. -// Copyright bukovinski.com 2009-2015. All rights reserved. +// Copyright bukovinski.com 2009-2016. All rights reserved. // #import diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000..0564959fb --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json new file mode 100644 index 000000000..8bf75d9f5 --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json @@ -0,0 +1,17 @@ +{ + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Middle.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000..0564959fb --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000..0564959fb --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000..0564959fb --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json new file mode 100644 index 000000000..8bf75d9f5 --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json @@ -0,0 +1,17 @@ +{ + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Middle.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000..0564959fb --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000..0564959fb --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json new file mode 100644 index 000000000..6a3dcfa52 --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json @@ -0,0 +1,26 @@ +{ + "assets" : [ + { + "size" : "1280x768", + "idiom" : "tv", + "filename" : "App Icon - Large.imagestack", + "role" : "primary-app-icon" + }, + { + "size" : "400x240", + "idiom" : "tv", + "filename" : "App Icon - Small.imagestack", + "role" : "primary-app-icon" + }, + { + "size" : "1920x720", + "idiom" : "tv", + "filename" : "Top Shelf Image.imageset", + "role" : "top-shelf-image" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json new file mode 100644 index 000000000..0564959fb --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/Contents.json b/Demo/HudDemoTV/Assets.xcassets/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/LaunchImage.launchimage/Contents.json b/Demo/HudDemoTV/Assets.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 000000000..29d94c787 --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "orientation" : "landscape", + "idiom" : "tv", + "extent" : "full-screen", + "minimum-system-version" : "9.0", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Base.lproj/Main.storyboard b/Demo/HudDemoTV/Base.lproj/Main.storyboard new file mode 100644 index 000000000..5210d6e8a --- /dev/null +++ b/Demo/HudDemoTV/Base.lproj/Main.storyboard @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo/HudDemoTV/Info.plist b/Demo/HudDemoTV/Info.plist new file mode 100644 index 000000000..4f338601b --- /dev/null +++ b/Demo/HudDemoTV/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + arm64 + + + diff --git a/Demo/HudDemoTV/MBHudDemoTVAppDelegate.h b/Demo/HudDemoTV/MBHudDemoTVAppDelegate.h new file mode 100644 index 000000000..a28e110d5 --- /dev/null +++ b/Demo/HudDemoTV/MBHudDemoTVAppDelegate.h @@ -0,0 +1,16 @@ +// +// MBHudDemoTV.h +// HudDemoTV +// +// Created by Matej Bukovinski on 17. 07. 16. +// Copyright © 2016 Matej Bukovinski. All rights reserved. +// + +#import + +@interface MBHudDemoTVAppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + +@end + diff --git a/Demo/HudDemoTV/MBHudDemoTVAppDelegate.m b/Demo/HudDemoTV/MBHudDemoTVAppDelegate.m new file mode 100644 index 000000000..2c3062def --- /dev/null +++ b/Demo/HudDemoTV/MBHudDemoTVAppDelegate.m @@ -0,0 +1,17 @@ +// +// MBHudDemoTV.m +// HudDemoTV +// +// Created by Matej Bukovinski on 17. 07. 16. +// Copyright © 2016 Matej Bukovinski. All rights reserved. +// + +#import "MBHudDemoTVAppDelegate.h" + +@implementation MBHudDemoTVAppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + return YES; +} + +@end diff --git a/Demo/HudDemoTV/MBHudDemoTVViewController.h b/Demo/HudDemoTV/MBHudDemoTVViewController.h new file mode 100644 index 000000000..ba45b1ce2 --- /dev/null +++ b/Demo/HudDemoTV/MBHudDemoTVViewController.h @@ -0,0 +1,14 @@ +// +// MBHudDemoTVViewController.h +// HudDemoTV +// +// Created by Matej Bukovinski on 17. 07. 16. +// Copyright © 2016 Matej Bukovinski. All rights reserved. +// + +#import + +@interface MBHudDemoTVViewController : UIViewController + +@end + diff --git a/Demo/HudDemoTV/MBHudDemoTVViewController.m b/Demo/HudDemoTV/MBHudDemoTVViewController.m new file mode 100644 index 000000000..090b99a55 --- /dev/null +++ b/Demo/HudDemoTV/MBHudDemoTVViewController.m @@ -0,0 +1,47 @@ +// +// MBHudDemoTVViewController.m +// HudDemoTV +// +// Created by Matej Bukovinski on 17. 07. 16. +// Copyright © 2016 Matej Bukovinski. All rights reserved. +// + +#import "MBHudDemoTVViewController.h" +#import "MBProgressHUD.h" + +@implementation MBHudDemoTVViewController + +- (IBAction)showHud:(UIButton *)sender { + sender.enabled = NO; + + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.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]; + sender.enabled = YES; + }); + }); +} + +- (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.view].progress = progress; + }); + usleep(50000); + } +} + +@end diff --git a/Demo/HudDemoTV/main.m b/Demo/HudDemoTV/main.m new file mode 100644 index 000000000..a9598c814 --- /dev/null +++ b/Demo/HudDemoTV/main.m @@ -0,0 +1,16 @@ +// +// main.m +// HudDemoTV +// +// Created by Matej Bukovinski on 17. 07. 16. +// Copyright © 2016 Matej Bukovinski. All rights reserved. +// + +#import +#import "MBHudDemoTVAppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([MBHudDemoTVAppDelegate class])); + } +} diff --git a/LICENSE b/LICENSE index 0e357d1bf..1c0d59bb8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2009-2015 Matej Bukovinski +Copyright © 2009-2016 Matej Bukovinski Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/MBProgressHUD.h b/MBProgressHUD.h index ad46201f2..a10744c0c 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -6,7 +6,7 @@ // This code is distributed under the terms and conditions of the MIT license. -// Copyright (c) 2009-2015 Matej Bukovinski +// Copyright © 2009-2016 Matej Bukovinski // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal From b8e4ad0fcc1d0d0e4c005c41fa96d6f1b08c60c9 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 08:46:35 +0200 Subject: [PATCH 050/173] Configure travis build for the tv-os app --- .travis.yml | 1 + .../xcshareddata/xcschemes/HudDemoTV.xcscheme | 91 +++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemoTV.xcscheme diff --git a/.travis.yml b/.travis.yml index 367c4f282..5decc3416 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,7 @@ language: objective-c osx_image: xcode7.2 script: + - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk iphonesimulator build - 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) diff --git a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemoTV.xcscheme b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemoTV.xcscheme new file mode 100644 index 000000000..9ccbda300 --- /dev/null +++ b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemoTV.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 95ac3cc577c8c9adec77a1fcb47a6e9cd09ed415 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 08:48:35 +0200 Subject: [PATCH 051/173] Configure hud demo build for travis --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5decc3416..9992f6e33 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,8 @@ language: objective-c osx_image: xcode7.2 script: - - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk iphonesimulator build - - 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 + - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemo -sdk iphonesimulator clean build + - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk iphonesimulator clean build + - xctool -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air 2,OS=9.2" clean build test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES after_success: - bash <(curl -s https://codecov.io/bash) From 772efaa7ecf38b51b7068911be2da2c2356120ee Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 09:26:20 +0200 Subject: [PATCH 052/173] Add tv app icons --- .../Back.imagestacklayer/Contents.json | 6 ------ .../App Icon - Large.imagestack/Contents.json | 9 +++------ .../Front.imagestacklayer/Contents.json | 6 ------ .../Middle.imagestacklayer/Contents.json | 6 ------ .../Content.imageset/Contents.json | 1 + .../Content.imageset/gradient-fill-6-copy.png | Bin 0 -> 5857 bytes .../Contents.json | 16 ++++++++++++++++ .../Content.imageset/Contents.json | 1 + .../Content.imageset/vector-smart-object.png | Bin 0 -> 20062 bytes .../Contents.json | 16 ++++++++++++++++ .../Back.imagestacklayer/Contents.json | 6 ------ .../App Icon - Small.imagestack/Contents.json | 9 +++------ .../Content.imageset/Contents.json | 12 ------------ .../Front.imagestacklayer/Contents.json | 6 ------ .../Content.imageset/Contents.json | 12 ------------ .../Middle.imagestacklayer/Contents.json | 6 ------ .../Content.imageset/Contents.json | 1 + .../Content.imageset/gradient-fill-6-copy.png | Bin 0 -> 1131 bytes .../Contents.json | 16 ++++++++++++++++ .../Content.imageset/Contents.json | 1 + .../Content.imageset/vector-smart-object.png | Bin 0 -> 5611 bytes .../Contents.json | 16 ++++++++++++++++ .../Contents.json | 2 +- .../AppleTV-TopShelf-1920x720.png | Bin 0 -> 26817 bytes .../Top Shelf Image.imageset/Contents.json | 1 + 25 files changed, 76 insertions(+), 73 deletions(-) delete mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json delete mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json delete mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json rename Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/{Front.imagestacklayer => gradient-fill-6-copy.imagestacklayer}/Content.imageset/Contents.json (74%) create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/gradient-fill-6-copy.png create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer/Contents.json rename Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/{Back.imagestacklayer => vector-smart-object.imagestacklayer}/Content.imageset/Contents.json (74%) create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/vector-smart-object.imagestacklayer/Content.imageset/vector-smart-object.png create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/vector-smart-object.imagestacklayer/Contents.json delete mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json delete mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json delete mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json delete mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json delete mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json rename Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/{Back.imagestacklayer => gradient-fill-6-copy.imagestacklayer}/Content.imageset/Contents.json (74%) create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/gradient-fill-6-copy.png create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Contents.json rename Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/{App Icon - Large.imagestack/Middle.imagestacklayer => App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer}/Content.imageset/Contents.json (74%) create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Content.imageset/vector-smart-object.png create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Contents.json create mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/AppleTV-TopShelf-1920x720.png diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json deleted file mode 100644 index da4a164c9..000000000 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json index 8bf75d9f5..1c7b37609 100644 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json @@ -1,17 +1,14 @@ { "layers" : [ { - "filename" : "Front.imagestacklayer" + "filename" : "vector-smart-object.imagestacklayer" }, { - "filename" : "Middle.imagestacklayer" - }, - { - "filename" : "Back.imagestacklayer" + "filename" : "gradient-fill-6-copy.imagestacklayer" } ], "info" : { "version" : 1, "author" : "xcode" } -} +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json deleted file mode 100644 index da4a164c9..000000000 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json deleted file mode 100644 index da4a164c9..000000000 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/Contents.json similarity index 74% rename from Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json rename to Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/Contents.json index 0564959fb..b99edd56d 100644 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/Contents.json @@ -2,6 +2,7 @@ "images" : [ { "idiom" : "tv", + "filename" : "gradient-fill-6-copy.png", "scale" : "1x" } ], diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/gradient-fill-6-copy.png b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/gradient-fill-6-copy.png new file mode 100644 index 0000000000000000000000000000000000000000..a30ce1ab4fb35cf873c62b3d4fe652e73da9d290 GIT binary patch literal 5857 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

jq?aV^7{5XbcrH8w!cH_YnmBruT6V z9ta5H&A7EDJJQv}Hsy#0UapA$_>P%dl{M~F1-7jR4kQsHFwwQP#>SnwhT|ie<_l%2 z9DlSUJ1D2$M~A0gt8d`;#!t%V;|5kmz5Efy4IS%&kJ3=3cUbV-ljVYSG%qtJZ`e6r z!d6r`%~~yZs(3G1nY-+DS_y~4!Y{S`ImQ!GWPV=6DPgKMA7?do`@!YgVpdHTdY^*C z-Sse7I8(SzM0UN-(d4eRTG%B=NBIMFt9KCFbq{8w?5452n7xYGR%Q<50FD0`VKfN z%q#%~dRT5~?N5@*?C23vqgOkxVe>UqG!v5JV3~@&8IyIj_z(6e?#i94%ym|s?D8(A zBT?Jw%Dd+3Qonqc;Ue|Dt87f8aWC~Se{Kr4;r~;AkCA%Efy*2MCtW20M8H?55;#kX zs~dj2_FHXJ;b0k^A- zkSg(|%U*sUq=&!fVE~mIm`X|&3gNf5LiM2stRH87eCg;Z;w8lLogg0i z;_aVnVVSVEuyi0*t$StXO83XxGnFE@*&=bZc7sor zZy?9PYMWBgNLiT*?oFc2%B&MeuLyEA-aEO&HaZq{bhbrxcF$$vLVd*pROJrWly^z6 zMjKTkht&sXGr`aj%So06x>J&j1SRKT;P?|f!s`q&_yUa>i^Tekf2vCFcy zs>Ubr#5@;_T)pdaHbZO2X2()+wb~-+DMfN??O lE@4zw%j|(@83Tegn(4A=!H>k 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 literal 0 HcmV?d00001 diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/vector-smart-object.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/vector-smart-object.imagestacklayer/Contents.json new file mode 100644 index 000000000..7e339a670 --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/vector-smart-object.imagestacklayer/Contents.json @@ -0,0 +1,16 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "frame-size" : { + "width" : 573, + "height" : 573 + }, + "frame-center" : { + "x" : 638.5, + "y" : 382.5 + } + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json deleted file mode 100644 index da4a164c9..000000000 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json index 8bf75d9f5..cacb4d3cc 100644 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json @@ -1,17 +1,14 @@ { "layers" : [ { - "filename" : "Front.imagestacklayer" + "filename" : "vector-smart-object-1.imagestacklayer" }, { - "filename" : "Middle.imagestacklayer" - }, - { - "filename" : "Back.imagestacklayer" + "filename" : "gradient-fill-6-copy.imagestacklayer" } ], "info" : { "version" : 1, "author" : "xcode" } -} +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json deleted file mode 100644 index 0564959fb..000000000 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "idiom" : "tv", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json deleted file mode 100644 index da4a164c9..000000000 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json deleted file mode 100644 index 0564959fb..000000000 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "idiom" : "tv", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json deleted file mode 100644 index da4a164c9..000000000 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/Contents.json similarity index 74% rename from Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json rename to Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/Contents.json index 0564959fb..b99edd56d 100644 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/Contents.json @@ -2,6 +2,7 @@ "images" : [ { "idiom" : "tv", + "filename" : "gradient-fill-6-copy.png", "scale" : "1x" } ], diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/gradient-fill-6-copy.png b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/gradient-fill-6-copy.png new file mode 100644 index 0000000000000000000000000000000000000000..bf5e9b8ace999f4baf9c8730b3f5a77be7ab779f GIT binary patch literal 1131 zcmeAS@N?(olHy`uVBq!ia0y~yV4MJCf8byPl6p2qNQK$!8;-MT*v49vNnE{-7;x87bgNb1>-tHmycR(-7x+MU`@{ zy5HG%&s#G*xbVk{p`qSLfI*0vQNeJO8V!QcR6s^XxVds8Yf%2Cf=R&Ks9NG0QIe8a zl4_M)lnSI6j0_CTbPddP4b4LgEUgSItc(n_4UDV|3|!hRZlGw$%}>cptHiCr^j1R( PPy>UftDnm{r-UW|gR+Yt literal 0 HcmV?d00001 diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Contents.json new file mode 100644 index 000000000..176551ed1 --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Contents.json @@ -0,0 +1,16 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "frame-size" : { + "width" : 400, + "height" : 240 + }, + "frame-center" : { + "x" : 200, + "y" : 120 + } + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Content.imageset/Contents.json similarity index 74% rename from Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json rename to Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Content.imageset/Contents.json index 0564959fb..5451a88d1 100644 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Content.imageset/Contents.json @@ -2,6 +2,7 @@ "images" : [ { "idiom" : "tv", + "filename" : "vector-smart-object.png", "scale" : "1x" } ], diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Content.imageset/vector-smart-object.png b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Content.imageset/vector-smart-object.png new file mode 100644 index 0000000000000000000000000000000000000000..a5c1f1fe930c38dc9a7a1b74ad8245a0b33f1651 GIT binary patch literal 5611 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 literal 0 HcmV?d00001 diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Contents.json new file mode 100644 index 000000000..d7d3b8282 --- /dev/null +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Contents.json @@ -0,0 +1,16 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "frame-size" : { + "width" : 179, + "height" : 179 + }, + "frame-center" : { + "x" : 199.5, + "y" : 119.5 + } + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json index 6a3dcfa52..21cebabe0 100644 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json +++ b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json @@ -23,4 +23,4 @@ "version" : 1, "author" : "xcode" } -} +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/AppleTV-TopShelf-1920x720.png b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/AppleTV-TopShelf-1920x720.png new file mode 100644 index 0000000000000000000000000000000000000000..786034c8f54e511b937467b4de59c33effe14d73 GIT binary patch literal 26817 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 t=fD5F;J@qepEdkH|5qMg7k}7Aa+ Date: Sun, 17 Jul 2016 09:38:26 +0200 Subject: [PATCH 053/173] Add launch limage --- .../LaunchImage.launchimage/AppleTV-Launch.png | Bin 0 -> 35441 bytes .../LaunchImage.launchimage/Contents.json | 1 + 2 files changed, 1 insertion(+) create mode 100644 Demo/HudDemoTV/Assets.xcassets/LaunchImage.launchimage/AppleTV-Launch.png diff --git a/Demo/HudDemoTV/Assets.xcassets/LaunchImage.launchimage/AppleTV-Launch.png b/Demo/HudDemoTV/Assets.xcassets/LaunchImage.launchimage/AppleTV-Launch.png new file mode 100644 index 0000000000000000000000000000000000000000..9f49c3a1664305f1edbaa287fb0cdc8485cde47f GIT binary patch literal 35441 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

q`$8n>TN^ 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 Ww2L_&toRWbip&Ffse=0kul^4dgFwju literal 0 HcmV?d00001 diff --git a/Demo/HudDemoTV/Assets.xcassets/LaunchImage.launchimage/Contents.json b/Demo/HudDemoTV/Assets.xcassets/LaunchImage.launchimage/Contents.json index 29d94c787..29931e66f 100644 --- a/Demo/HudDemoTV/Assets.xcassets/LaunchImage.launchimage/Contents.json +++ b/Demo/HudDemoTV/Assets.xcassets/LaunchImage.launchimage/Contents.json @@ -3,6 +3,7 @@ { "orientation" : "landscape", "idiom" : "tv", + "filename" : "AppleTV-Launch.png", "extent" : "full-screen", "minimum-system-version" : "9.0", "scale" : "1x" From bc89f10b9114c8d5da1b0a8a2ee2629fbd3d26b3 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 09:43:21 +0200 Subject: [PATCH 054/173] Reduced size of image assets --- .../Content.imageset/gradient-fill-6-copy.png | Bin 5857 -> 214 bytes .../Content.imageset/vector-smart-object.png | Bin 20062 -> 9799 bytes .../Content.imageset/gradient-fill-6-copy.png | Bin 1131 -> 106 bytes .../Content.imageset/vector-smart-object.png | Bin 5611 -> 3369 bytes .../AppleTV-Launch.png | Bin 35441 -> 12204 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/gradient-fill-6-copy.png b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/gradient-fill-6-copy.png index a30ce1ab4fb35cf873c62b3d4fe652e73da9d290..e5d87ebdf73449729f66f776929939ed8ee01c91 100644 GIT binary patch literal 214 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 literal 20062 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

jq?aV^7{5XbcrH8w!cH_YnmBruT6V z9ta5H&A7EDJJQv}Hsy#0UapA$_>P%dl{M~F1-7jR4kQsHFwwQP#>SnwhT|ie<_l%2 z9DlSUJ1D2$M~A0gt8d`;#!t%V;|5kmz5Efy4IS%&kJ3=3cUbV-ljVYSG%qtJZ`e6r z!d6r`%~~yZs(3G1nY-+DS_y~4!Y{S`ImQ!GWPV=6DPgKMA7?do`@!YgVpdHTdY^*C z-Sse7I8(SzM0UN-(d4eRTG%B=NBIMFt9KCFbq{8w?5452n7xYGR%Q<50FD0`VKfN z%q#%~dRT5~?N5@*?C23vqgOkxVe>UqG!v5JV3~@&8IyIj_z(6e?#i94%ym|s?D8(A zBT?Jw%Dd+3Qonqc;Ue|Dt87f8aWC~Se{Kr4;r~;AkCA%Efy*2MCtW20M8H?55;#kX zs~dj2_FHXJ;b0k^A- zkSg(|%U*sUq=&!fVE~mIm`X|&3gNf5LiM2stRH87eCg;Z;w8lLogg0i z;_aVnVVSVEuyi0*t$StXO83XxGnFE@*&=bZc7sor zZy?9PYMWBgNLiT*?oFc2%B&MeuLyEA-aEO&HaZq{bhbrxcF$$vLVd*pROJrWly^z6 zMjKTkht&sXGr`aj%So06x>J&j1SRKT;P?|f!s`q&_yUa>i^Tekf2vCFcy zs>Ubr#5@;_T)pdaHbZO2X2()+wb~-+DMfN??O lE@4zw%j|(@83Tegn(4A=!H>k zxSr96`{Q!(%|EWB`Ff`GintB2vF2W8H3~HujZeJ#SgDk8fQ;scGVFvq&DkAj!}Dg} zJxFfhtJmilkVFWP8?g!mJ(NVbFo=)MCs16tyBVZ3vL5_Kc5Q@D?Q_|<%@$Y;B{}rh z*lsWN5$%qTl&SZqD5AnMe{VZXbWCf{=2Hn+eVK*^Uw75j4-NJi+ct<@1ke5|GZ$t7 zOHRG=)^uqE!Y}#jCS!WV>Q%-VDKg)j^Jxg=B~1duVSBccvO6wn^YYxxdOt@Dy|a&U zrlED@C8!*whqYqpr$`pO6*uoljY5Q^FJwC;tEZf3&_y98_dj7dlIfKH%}NPsM&B zxBM9zEE2c0oGC7v^A4D5Ni9Eu%>%Fw`WfO+Aq6#trrmrp8Ayqp#O7fsv5VL^*?Z!F zouOWAt&A>=Be1x(*^N#;FP2vRS(*@P#Peg}z-iSk1~oxIBsh1uMJz0*CP*V(E1ZdJ zg5WhZo1m7ZW|k5fjt6JH+ewQ51J6qrkbc+q_8{`GFBTc=b?TofJfT0acwy7gPnMkO z@4gPjPKQtmQLBu9mw#-E-(@Ej0hDn2o}Z5(`2z73NhEj5D2?qB&j4^$v3c~#bmqqC z*9}gsk13wevC*^PX**}iN{Ll_iF&zJiduFpjfO0#lr+@Yv}tJ&K9ZSSihWILak|w8 zJ=(^tXNfy5nh}-Y`>mV)s^KiH!R^UjGNU)bVA_z84`(vdDhxvEGy-iW5}z&s+xycij3Io}f3y=58?Pq=Vm% zv`LeR>qUCPF$f%k zJon1VstQu023z#K30c^|?QE??W~V(j=KhN(7j1eY(SgnX!mJIEOzKR4&)m6)S}Z$! zbojTd?$wVN;sD`;<2^ZIH)_#bqTV1qg`-2ij#kXRtmEBDa;Ed%2+i4|L9*_n&U@=y zxm6Q;tg2VXhbK@T@UR*l-j?;>v2eO#r8xrjK0#DGFyk9w161Rk05xY^@%g$db-#p0 z{lk5s{vH#VcL@OO;2UQ+2;{r5*UwbjrPSt&4F)^yMC-KLvugCH@5spXI>uijJOXiz zYkR-vVs}--F3NJFD)nlnZP(a3W{tiEA$z|h@B;Z4i8YsRn^#~3|74#%RUMmxspSvz zDd{(Fr!)!b48_14OET6}nglMydE7f`4ftg>bko-~w$S@;y=2(ApA1L#yt-U&c5@?%`aIbfCBXq!!>st`fL?CE9-30qt_$w%?QNsph z>-alSQHp0zo=*6vnMv1AE*LmZ0%Y=Wc)pEYZS43&XVf>9FD2UY+PUhZIYO2&81gM<5#Jd_nF`Q0*F-=80{c)_%`<)--IAAo{`cphtmTZ2>X#m+#CgCr3MvCH zIk*GBln&5~%KyQiaiLZ3UIJ*Nys_ zou z5C6fTlCv=RuY%qiSyO6)zFP-rJFr;~+}$8T&f}tIca70`o#Vr2W>XQASYy;f*W3m# zn8IS0tOiOwG<)6nOI+*UbsIw#EG6!(_S$mmO?wjTj9pbU-$830wb8r+b_<0+SnG3L zbYBf5?e}yo!kVP$D_sem<#R!b5VTDv{nrr5#4VhxR0zGM&I zIi^#wHrYf^utNvsXfKO4Gq_}2;)}u?llTuW+h$qJS!hGjCw{KQ6GX$ml0VkB{31z})hguegS`rByWuMK@D6!$M!zUNlwg zU{|{z!}_D*>yk1Y62s`ipjrBdx?xu~uEhT;IgYrZYh8NwXc4Q7jed|UZ<-gS7OrBu z*9p>LwL^mqqTn@eZNQ$en{y^*bn*AF_dJYwom+*Lr5K~k+$0a4D1~2a)jDCaIdR>a z@>C6{BXeVZ%MU%p)}nsjG3EQ=LlnRyOAWE&OONcmk`GFs9Do?KdlDIq|1DL!vq$ME zUNaz0hk5^k6>wzUxBkJp8;p{ zM}$y@iq*Vy5CcKz1VcYGMmcr}mlwf9R#;dw4r(yOu3-B~B57o`aE(?)4b=6g_Ds)$ zTIArUBh?fheD6y6)@`*m#(gJ&YlS6#+GM_A`52Ms2WpRJtD-nEZJa^l`{lH!>TNQ? zp@`xOfaiBD;}}HBu2^4-B+4oFJ8Y%rD@^uILq?gaHab91U5)KS8?96mZq{tXz<(wr zB3MlYBSd$w_J$p(2S1*oe-y@NJ7$AgM`%1?2}o(ahMyMj$Lr5Qm@>EN1Nfn=mo8`V z?z>u8#Ktxm-gnt^_!x@~V{2?T3w5Y?7`jaH%bT>Fvl*n_=IK)Y^Qt-eT63v%Qh$=8 zZn-ux3c;w*9!YJl6VgJ@&0%dG+yQb1=?wKhl}=yX;qd3F&=m;TL`8j-jT?SW3nE?f z&c6aBAt1T299n0$*hJw`CWsmJ(wo${wN|d?t55WdZWE%1h#TEzg{Lbkyz;pL8`!O z(ApN%7NJJ|h%H6e-U9?T1O$L?IaBQZ9MrlTQIy7zM)b;7#j*z^y&_>3+09Np&PKRN z-^$pd{_kQ}YH4w+;H7>-->B$w9#`rRQN9Ymb&#?Kyq#TD)WF4(q?^2Lv^^Y^533q9 z3gbu;pJf=(NtLm<{25)uf0FI%A0n>UlH9Hdus5vD(*m;FwTX-}qsZFlk|5-SeP&&Y zx%DckGP8YsqiF>jkBnwrvkFXD#4>@iVD$ZOr7(rJKKra6=d;AD!VftQnd?6`zpO6R z50Qzh512^xZQz+u5{vU@9lKfU7MYK0m!(GrpU@cLcDEC)xBPjIl|371irNaVrK ztOrD=yY6*c2hj;?za;|a?dP0q_!!?{X@PuaEUp+ZU{sB(3G1eAUaQ~6bt^hT1eRf6_PkkL;#ePKE2|D#v_-z zNe+nY2jn!DhGr0}@GZv>d5QkmftZRJQP(|zIWvsu?*)Eb4yC~PaJ60^=+~MaH zHaoO6Y(9WI&u4R4on+;g*5xX+r2pkD1nRf?sj(lge%kJk(6B-GKOVHgXmToj zq8C@Qq15Wl_kZVsL|Mws-uHO zNi5+yDn*o`BFgX!&a$4}lYwevoHV z?MM<8X5xL!ctH-8;*a)4pJux9ir>*{=qJN#dFxX-x5D~RR2S(R<0NIw8%ZUgjpk=Urt|MP~7=`0d5sIl(eA-^PP4Er4*(+V>Kt4_LoUg}I2D(42ki+Qx zRz*&x{3Pj?boQkr4};dXp0nD!Sw%X&(}Yj?(}4t9kzhd0rp=xJ%PBaXdR}>TX)>KE zD({SV&c?qhaGh49O<*`;R9@P$pU7uqGae_2 zhW_W+D|JCuisrnGLY!v-%d9DGY?xbfdRLmPiXFvKTjjo;1Ba2UID*EhtBLBsHpTm1 zgUw!(cu66+(%|z+;s;B=HMv3%c~cR8uyJtTPq+J5okw$UU)v4Cd|cx2lT4?~cv4Le zFI6*zHcitTyr8LlM_vztBq0=MK4^X64%^{o6kvH4qw~*h#tDW4p0DMc7Vg}2)vpgy zbN&1j$*d9LuWv6@RMGo!JQ~gNhdnm=U^p%VuP#i~T$zU?upiOv^m1+Fr&if}5muQ5>m=!7j zLtz>#@00fF-UFmCr7)n29LI>)FCtj~XeZ8Y+qeHVNa+>Rc<)l3EizNTm~triL^a8X{{gE~_rTfY+g4X!-$VEYktNqNUv;G=WDeAIE- zWc&pIx>r_;#+TQW6#!rwdqa1`bbJ-N`6>zX_%=&K#Nxw`zY3nFAC<|SOB$8ni}&Yv z+WH6AQ0tCci@La@xKJtBKl+){8dA#!voAWbSyFmO0n{eE&pI*w=fVN3ydzCEglA=_ z-=OM8@w&Q!gok|_GzO_=vad(~CEL6}l|}9GQJK*Al(FIi)cB7foc}(7BwuGqgZlGY z2#}$^$gj9sxcR3C2FTs&sAWLu8y0xO$Xvv@&H3(0>N2RCMcKyZhRT$3>?PdWjHrPp zb-S6AW0Km9&jen~QY|o_X2fN=G>gX>IQzf?TT7(_e#ZqGjt@fRMw#)tlmNi^Qa(Vq zIaih5bL6fU?;Ov_rkc0Se$k?8LyfzKR;_0A@0j*-%^i*XinHsM8K;1wJfRzmc0!-e zciKB;3%>?9b1%}>c<<;VvQ^ZfG5qC=G&i$nKd#T?9vPNo+{doq-djoCf;CIlyxa`p zRv3=wJ2<&BVML54h#KV|JW6Kx*-5xy4gIT|@sl%A<|pF_#TVNC)Z!aItK=|;%bM{0 z*MLf>|3-r$=3)eub?rXL@FW)esP|8v6WQrFqQwt(i)+~E-(gG4GL)`g-=O$X0Z?uP zr6-NH<$!T?A#_j=&|WeF#=c=++P}FqRegRB(jvj^Jm%qcn^%Foz2e%qRZz;yuPtGe z3e#Gu8aAV&G(UmoVyZCy-|OAB6lmS_Nj0aC{aX$XiUKjA6wzdy%JoaOAjVIH zqEfW*2~UUhHU4MNqyk>6OVd~2;+u#~t+|@i9}>)ta=uEpHO0j8`Ro4DRHtGmah)?1 z>PwU^(cD_!!mDbd4xmd^+EC5Mf;IXevvb`s;GU=Usm$uN|1viv`3f7u>u&SxT;937 zzqNDjmQLH%ACk+^H%XPBrB|;z+u-OGlScoF*Vpft%-5tWN1h&lLo>d%(x*8Y(DW-d*QdC=;w2qCu&oyhEK# zz9#8%bv(ZN{D<_j^{bDAMk0&;%Tn7Ue!~ge;TWx1D7c>2m0f&AdNqWvYgEGFFJ#0U z<-YKvC-&Y!2y+~!n+b=HXJPkzh9Pj_AD`U+!QT=ilP@e`U55JMVfFc9g1iw5&2n z2}OQQRcgi6Sb4UKHyc7flV|XqNodJft{od^m@#YRbj?0~U?N1UNQzLI$r@lww~v1$h-*TU63{RXi&N4K5wBFOv!Cu10%- z;8tV@xIuN}2-4xXtt9$+d>;redH$vDsC&}DMvXoe7F6JJ2kgAW$k<*0UsVC$n8T|x1K!wa`ms`DNo`7eZo)w0*ZKC{oK2{JG~JU^eqE%ocnW%{yppP-aDzXTTOn%$u7%MWp76elkMe=No2&21|L zih2Hjr;qL4#{E_Hr29N*+xr*}tol0*kH-nAwWhF zL~b`~8a+u5H7omaw`V6=@TdR~1P?^Wh6(MJ8C=+l?fQ4H5d`S<5Hn$Ch?Spg(mxBWQn%Nqvw%NJwFL^4>J_Q+I2E;dmSFGgNBwclvJA*W_rXoqKM->{qT4fpSZoWCHh|Zpe6B z;FB%AI>S*}Zb(R}A^OR*i`2@19AvnL!pMM(#)v2*WJxSD)1^qTX8DUjl<|?@vgGhB zs(#uSjo1Gg5dKc~C(X}F-df8&xKkq>aQVA9E4 zrUiSfqaQ8R?)scx!jz3q1=o)~IuT#4@5zT{L*e^3?O)s**gs$&z}(nK7#v3|Yd$-v zBOi7S111Pfax~y9UJOjm+huJ_|Mde5TW;8r1!i#yLX$%#p3#OdIj4&noB;K zeYe7RVlLA1fZcFR3eBI(6t~sJ8Y4XY<-gz>p{k6?;6lnlll_-GT7dc|n7^YG$GM~X z*}<4yW3RBkOSj;bX!E%nsLE->PQTCIs9D-QX8293ThHC=%>m~_BVwqhBtVYFU26TXE=MJ)Aa@lMAE9Bn@OI{yZ|z1bve=j& zK8{1Jt~C6BHj6M{8tcq+iHNi~;LjypAu1k;5CSRl@k>q_P6q=flTj+83m~6X+D^&Z zCm{cU8Gl}iO-q8X&?0Fx5BMaeOhCsH(t#>ZDh<`aD;3u>#Ka!(Qg3e_SW<=UvCDlkRuP0FBP$FS_xn(+v+BKMaZ%Cv|y+--ek`5}QlI%nD{K`#Kap zHxWpMP?0g(klv1e(2qqA%h-$lSKL@M%fYvEnYFF@7GVPbU)>x9+O$sgo_~rq1mzMC z)?pSIK@!RqIT@Pq~#=96Y4;chHokG~`Tx!}W#$bVk&Pp-%n zhq4uV<&2)}sCMe%)3IiqTs@!1XaLNY0>hMAvi0yc$3Ka;gS&5>k;+4Cv6)EK!LlsWnh$3#95^Y?l% zmVxULB#R;%jGR~#3;=_+NC~VtaMBW>;}q;jQT;b`tYl?3yQZ<MoA zu<~K58EI1+FpeJJL_yi`^N6%`P|tHOpsPJ&ajR|K8ni`WA`duYgZ58BxZ@v2;y|Y# zsbBA_g3H2bWfGl2Yd^fa{U9a&azw+dl6wy)d?~RUCa-rs@tg7pkMfx^CpL3qVb-x* zw=b9IWScCL_!LD6S0w=>nA_mo9k@IOsrk}4vGla>TN^G$9S>FZ)`OP34@ErDKz}1~ zH5#t1&&DBk;zs~&rh_$sg?juMxUM|x*f~D?m|5%kV#Zajm==yh-^B;8k1Y1Y?9j`} zxl`7UA42c$FvF{M&JK9+NJB0Q3Qpmgq58s0uTwt16&|%TIoPKGAAXd}(}zxPX4_f1 z`dG-KP81}Q-w1g%(BpOM<1gEaD%)qG%Z*M+!LAH$hqBIg74T3PZgEk=NPXvVQL}g2ML3F*;w0 zc&dHW)_i8C4Zx?^N~{$)j`$ze{#TrP*Dp{9bEt!;bO0-ek~y13bc*;X7pGZ6C)3vW z-jM^#0%w$TZf(9u8z{@U#9jO6)}h;b{N@ZO%Rv$it}Ed5shebGItka0gvVk=YdeI!nz36=H(L1mOII3?Ioj!S##s$oV@ww)2`ahu-PoBUx-y%9q z=4GN80s_jsZ83;BQXNei`=sHil*IGUmK01Wv4jcPT>##n4>K7Zl7sv>r(IlaSS(}> zffL7kIV7`F!hTok86YIWPYrOLwX>>~E)oDeSK(TFVw$eG}vyGe*fxtJn0}qED7U ze5clLqd8=r$sYTKldktMsk`z1_uEq#BWQukP&zR$byLOHKK+hvJu!gxQFT@{ejAJe zWkpV>ZuULHP~wkzx5?J zD5TKj3kE%C_j$G-0b<{n!e}aj}g-9ccw|IjroH`$c zu2<{q=yL`;g~Ivnf=~CftFRkez^EYV&XRiq9r<1q;Kk$UFY_mJ+j%-O9R+3(>p9vO zz=v-peoRU4)@66@E^G4oY$38a_3ASWGP`9&y=3fi(xJpHkYQoTRqq+fYgvu`Jx9wlD!JN)XnBGRd zF}6W`<)4ikC!dN8uEltu`6_GaNRvou!O+1sHt!%U(Ov#f*IWkiVdM;A z2H9GsEiS^0+2@4(2-IevLO~b0Oo7df2H>n4tw6Z0$3wY3JGERyZk!%FVsfzy!(2-3o<)1tap0b<#AC%TWq1*JA2k^G|Ds@j~M zK7VmlVi&(XQFTyqOde<>OVRI+f;KbEklZ)5cxA3hb=~9dE;~G@hTPo3S!j~bkM+kE zc^VRP@z%gm`ITl;(Be0fe6b<#adKgGuAk#cn%OAt4@qQ$Lg%t*Zooe%byDs`#_z+Gos<-{e>BwWQzMu*gFP6LtZKQVq%uEDe zQ?heo{)&tZY*kiWkH{tGJUtew++UF){|X0&7)X^nrxCt|i?^mZXim%IfCPxzBas2+ zgLof&uRQst#5f!h!pV*li#LESu_u>!EYw_rr8DWLHHC-ykW>n`BLWvYx|?)Q>$JlG z$WIRiGbPF(56)l?V-|toVU4c7;g8ZJ#?hMdQNLwS6rj+Pr5}2BoIFG2!aki9I?)Q* zQ`R*8MFjHr!o<5KErN7QowX*eQ*vfKhYK`8T7~+R!V)BSQmehF4{`fUElRrCWxjZv zd^fRcuRyQniuIXgdB`n#PM*SVcU9Xin1k(*fH1ZvP>~yrLd!DS6+z%*aPC8!h;6DO zgErQHquvXd)7KNUg+`^)@HYF&2ofe%YnzlFV!MUg3*g%@XOh{y7Km-2f+>|IZ-$%S z19m1#tRC=-3OD){ABWq*ZxNWwH8 z0yy)~^}>_^#0Ghc2&`6U?$|yhO~nS8YiLgV^=>(PWP*XMyVSdH?^5#S@z{O0bXV(i zcW`sQ#75aVr}Y{}K{=CDsd?6(vGvB!g&EMZ-ADHa2NWozF7afGE6I0XepigssBlst zJuU$QHr*I!znGANF`>4>(V_5yF*h}{GB%|en^C<@ZEVe`wx*_AOwHl1m3|}my8Tyy csAD1FVJH880cHZ;8wy}p&bt|vPJ!qD0!3A*%>V!Z diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/gradient-fill-6-copy.png b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/gradient-fill-6-copy.png index bf5e9b8ace999f4baf9c8730b3f5a77be7ab779f..d8ab6bbdb988e83f491f8ce1d3e0f0cb7ad01095 100644 GIT binary patch delta 88 zcmaFOku^agh>@9rfkEWcfQK$!8;-MT*v49vNnE{-7;x87bgNb1>-tHmycR(-7x+MU`@{ zy5HG%&s#G*xbVk{p`qSLfI*0vQNeJO8V!QcR6s^XxVds8Yf%2Cf=R&Ks9NG0QIe8a zl4_M)lnSI6j0_CTbPddP4b4LgEUgSItc(n_4UDV|3|!hRZlGw$%}>cptHiCr^j1R( PPy>UftDnm{r-UW|gR+Yt diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Content.imageset/vector-smart-object.png b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Content.imageset/vector-smart-object.png index a5c1f1fe930c38dc9a7a1b74ad8245a0b33f1651..e4323dab18955657533dcc12ed211517c3dcaed9 100644 GIT binary patch literal 3369 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 literal 5611 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 diff --git a/Demo/HudDemoTV/Assets.xcassets/LaunchImage.launchimage/AppleTV-Launch.png b/Demo/HudDemoTV/Assets.xcassets/LaunchImage.launchimage/AppleTV-Launch.png index 9f49c3a1664305f1edbaa287fb0cdc8485cde47f..f66765c302aaf51ec7e7fe73556f6df1865270b3 100644 GIT binary patch literal 12204 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 FzW@h)^j81? literal 35441 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

q`$8n>TN^ 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 Ww2L_&toRWbip&Ffse=0kul^4dgFwju From 5a5e8b1b129ebe5f53603bf14a98460605d63551 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 10:13:48 +0200 Subject: [PATCH 055/173] Restructured assets --- Demo/HudDemo.xcodeproj/project.pbxproj | 13 +++++++------ .../App Icon - Large.imagestack/Contents.json | 14 -------------- .../Contents.json | 16 ---------------- .../Contents.json | 16 ---------------- .../App Icon - Small.imagestack/Contents.json | 14 -------------- .../Contents.json | 16 ---------------- .../Contents.json | 16 ---------------- .../Contents.json | 0 .../Content.imageset/Contents.json | 0 .../Content.imageset/gradient-fill-6-copy.png | Bin .../Back.imagestacklayer/Contents.json | 6 ++++++ .../App Icon - Large.imagestack/Contents.json | 14 ++++++++++++++ .../Content.imageset/Contents.json | 0 .../Content.imageset/vector-smart-object.png | Bin .../Front.imagestacklayer/Contents.json | 6 ++++++ .../Content.imageset/Contents.json | 0 .../Content.imageset/gradient-fill-6-copy.png | Bin .../Back.imagestacklayer/Contents.json | 6 ++++++ .../App Icon - Small.imagestack/Contents.json | 14 ++++++++++++++ .../Content.imageset/Contents.json | 0 .../Content.imageset/vector-smart-object.png | Bin .../Front.imagestacklayer/Contents.json | 6 ++++++ .../Icons.brandassets}/Contents.json | 0 .../AppleTV-TopShelf-1920x720.png | Bin .../Top Shelf Image.imageset/Contents.json | 0 .../LaunchImage.launchimage/AppleTV-Launch.png | Bin .../LaunchImage.launchimage/Contents.json | 0 Demo/HudDemoTV/Info.plist | 4 ++++ 28 files changed, 63 insertions(+), 98 deletions(-) delete mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json delete mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer/Contents.json delete mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/vector-smart-object.imagestacklayer/Contents.json delete mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json delete mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Contents.json delete mode 100644 Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Contents.json rename Demo/HudDemoTV/{Assets.xcassets => Images.xcassets}/Contents.json (100%) rename Demo/HudDemoTV/{Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer => Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Back.imagestacklayer}/Content.imageset/Contents.json (100%) rename Demo/HudDemoTV/{Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer => Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Back.imagestacklayer}/Content.imageset/gradient-fill-6-copy.png (100%) create mode 100644 Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json create mode 100644 Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Contents.json rename Demo/HudDemoTV/{Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/vector-smart-object.imagestacklayer => Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Front.imagestacklayer}/Content.imageset/Contents.json (100%) rename Demo/HudDemoTV/{Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/vector-smart-object.imagestacklayer => Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Front.imagestacklayer}/Content.imageset/vector-smart-object.png (100%) create mode 100644 Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json rename Demo/HudDemoTV/{Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer => Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Back.imagestacklayer}/Content.imageset/Contents.json (100%) rename Demo/HudDemoTV/{Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer => Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Back.imagestacklayer}/Content.imageset/gradient-fill-6-copy.png (100%) create mode 100644 Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json create mode 100644 Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Contents.json rename Demo/HudDemoTV/{Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer => Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Front.imagestacklayer}/Content.imageset/Contents.json (100%) rename Demo/HudDemoTV/{Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer => Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Front.imagestacklayer}/Content.imageset/vector-smart-object.png (100%) create mode 100644 Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json rename Demo/HudDemoTV/{Assets.xcassets/App Icon & Top Shelf Image.brandassets => Images.xcassets/Icons.brandassets}/Contents.json (100%) rename Demo/HudDemoTV/{Assets.xcassets/App Icon & Top Shelf Image.brandassets => Images.xcassets/Icons.brandassets}/Top Shelf Image.imageset/AppleTV-TopShelf-1920x720.png (100%) rename Demo/HudDemoTV/{Assets.xcassets/App Icon & Top Shelf Image.brandassets => Images.xcassets/Icons.brandassets}/Top Shelf Image.imageset/Contents.json (100%) rename Demo/HudDemoTV/{Assets.xcassets => Images.xcassets}/LaunchImage.launchimage/AppleTV-Launch.png (100%) rename Demo/HudDemoTV/{Assets.xcassets => Images.xcassets}/LaunchImage.launchimage/Contents.json (100%) diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index f2b2c0062..d5b7e2c6b 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -11,11 +11,11 @@ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 5BE141EE1CD8C33D0023BC9E /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BE141ED1CD8C33D0023BC9E /* QuartzCore.framework */; }; D22F7D810F85241C00550BB3 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D22F7D800F85241C00550BB3 /* MBProgressHUD.m */; }; + D274948B1D3B74AA00ABEB66 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D274948A1D3B74AA00ABEB66 /* Images.xcassets */; }; D27F18451D3B5878009D7482 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D27F18441D3B5878009D7482 /* main.m */; }; D27F18481D3B5878009D7482 /* MBHudDemoTVAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D27F18471D3B5878009D7482 /* MBHudDemoTVAppDelegate.m */; }; D27F184B1D3B5878009D7482 /* MBHudDemoTVViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D27F184A1D3B5878009D7482 /* MBHudDemoTVViewController.m */; }; D27F184E1D3B5878009D7482 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D27F184C1D3B5878009D7482 /* Main.storyboard */; }; - D27F18501D3B5878009D7482 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D27F184F1D3B5878009D7482 /* Assets.xcassets */; }; D27F18551D3B5AAF009D7482 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D22F7D800F85241C00550BB3 /* MBProgressHUD.m */; }; D27F185A1D3B5DFF009D7482 /* MBHudDemoAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D27F18581D3B5DFF009D7482 /* MBHudDemoAppDelegate.m */; }; D27F185B1D3B5DFF009D7482 /* MBHudDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D27F18591D3B5DFF009D7482 /* MBHudDemoViewController.m */; }; @@ -44,6 +44,7 @@ 5BE141ED1CD8C33D0023BC9E /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 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 = ""; }; + D274948A1D3B74AA00ABEB66 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; D27F18411D3B5878009D7482 /* HudDemoTV.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HudDemoTV.app; sourceTree = BUILT_PRODUCTS_DIR; }; D27F18441D3B5878009D7482 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; D27F18461D3B5878009D7482 /* MBHudDemoTVAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MBHudDemoTVAppDelegate.h; sourceTree = ""; }; @@ -51,7 +52,6 @@ D27F18491D3B5878009D7482 /* MBHudDemoTVViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MBHudDemoTVViewController.h; sourceTree = ""; }; D27F184A1D3B5878009D7482 /* MBHudDemoTVViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MBHudDemoTVViewController.m; sourceTree = ""; }; D27F184D1D3B5878009D7482 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - D27F184F1D3B5878009D7482 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; D27F18511D3B5878009D7482 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; D27F18561D3B5DFF009D7482 /* MBHudDemoAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MBHudDemoAppDelegate.h; path = HudDemo/MBHudDemoAppDelegate.h; sourceTree = SOURCE_ROOT; }; D27F18571D3B5DFF009D7482 /* MBHudDemoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MBHudDemoViewController.h; path = HudDemo/MBHudDemoViewController.h; sourceTree = SOURCE_ROOT; }; @@ -201,8 +201,8 @@ isa = PBXGroup; children = ( D27F184C1D3B5878009D7482 /* Main.storyboard */, - D27F184F1D3B5878009D7482 /* Assets.xcassets */, D27F18511D3B5878009D7482 /* Info.plist */, + D274948A1D3B74AA00ABEB66 /* Images.xcassets */, ); name = Resources; sourceTree = ""; @@ -337,8 +337,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - D27F18501D3B5878009D7482 /* Assets.xcassets in Resources */, D27F184E1D3B5878009D7482 /* Main.storyboard in Resources */, + D274948B1D3B74AA00ABEB66 /* Images.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -515,7 +515,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_APPICON_NAME = Icons; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -549,7 +549,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_APPICON_NAME = Icons; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -661,6 +661,7 @@ D27F18531D3B5878009D7482 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; D2B174161C5E3A3D00021915 /* Build configuration list for PBXNativeTarget "HudTests" */ = { isa = XCConfigurationList; diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json deleted file mode 100644 index 1c7b37609..000000000 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "layers" : [ - { - "filename" : "vector-smart-object.imagestacklayer" - }, - { - "filename" : "gradient-fill-6-copy.imagestacklayer" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer/Contents.json deleted file mode 100644 index 754bf0342..000000000 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "frame-size" : { - "width" : 1280, - "height" : 768 - }, - "frame-center" : { - "x" : 640, - "y" : 384 - } - } -} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/vector-smart-object.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/vector-smart-object.imagestacklayer/Contents.json deleted file mode 100644 index 7e339a670..000000000 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/vector-smart-object.imagestacklayer/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "frame-size" : { - "width" : 573, - "height" : 573 - }, - "frame-center" : { - "x" : 638.5, - "y" : 382.5 - } - } -} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json deleted file mode 100644 index cacb4d3cc..000000000 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "layers" : [ - { - "filename" : "vector-smart-object-1.imagestacklayer" - }, - { - "filename" : "gradient-fill-6-copy.imagestacklayer" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Contents.json deleted file mode 100644 index 176551ed1..000000000 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "frame-size" : { - "width" : 400, - "height" : 240 - }, - "frame-center" : { - "x" : 200, - "y" : 120 - } - } -} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Contents.json b/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Contents.json deleted file mode 100644 index d7d3b8282..000000000 --- a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "frame-size" : { - "width" : 179, - "height" : 179 - }, - "frame-center" : { - "x" : 199.5, - "y" : 119.5 - } - } -} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/Contents.json b/Demo/HudDemoTV/Images.xcassets/Contents.json similarity index 100% rename from Demo/HudDemoTV/Assets.xcassets/Contents.json rename to Demo/HudDemoTV/Images.xcassets/Contents.json diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/Contents.json b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json similarity index 100% rename from Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/Contents.json rename to Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/gradient-fill-6-copy.png b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/gradient-fill-6-copy.png similarity index 100% rename from Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/gradient-fill-6-copy.png rename to Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/gradient-fill-6-copy.png diff --git a/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Contents.json b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Contents.json new file mode 100644 index 000000000..cf8282aa5 --- /dev/null +++ b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Contents.json @@ -0,0 +1,14 @@ +{ + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/vector-smart-object.imagestacklayer/Content.imageset/Contents.json b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json similarity index 100% rename from Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/vector-smart-object.imagestacklayer/Content.imageset/Contents.json rename to Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/vector-smart-object.imagestacklayer/Content.imageset/vector-smart-object.png b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/vector-smart-object.png similarity index 100% rename from Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/vector-smart-object.imagestacklayer/Content.imageset/vector-smart-object.png rename to Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/vector-smart-object.png diff --git a/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/Contents.json b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json similarity index 100% rename from Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/Contents.json rename to Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/gradient-fill-6-copy.png b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/gradient-fill-6-copy.png similarity index 100% rename from Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gradient-fill-6-copy.imagestacklayer/Content.imageset/gradient-fill-6-copy.png rename to Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/gradient-fill-6-copy.png diff --git a/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Contents.json b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Contents.json new file mode 100644 index 000000000..cf8282aa5 --- /dev/null +++ b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Contents.json @@ -0,0 +1,14 @@ +{ + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Content.imageset/Contents.json b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json similarity index 100% rename from Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Content.imageset/Contents.json rename to Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Content.imageset/vector-smart-object.png b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/vector-smart-object.png similarity index 100% rename from Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/vector-smart-object-1.imagestacklayer/Content.imageset/vector-smart-object.png rename to Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/vector-smart-object.png diff --git a/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/Contents.json similarity index 100% rename from Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json rename to Demo/HudDemoTV/Images.xcassets/Icons.brandassets/Contents.json diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/AppleTV-TopShelf-1920x720.png b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/Top Shelf Image.imageset/AppleTV-TopShelf-1920x720.png similarity index 100% rename from Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/AppleTV-TopShelf-1920x720.png rename to Demo/HudDemoTV/Images.xcassets/Icons.brandassets/Top Shelf Image.imageset/AppleTV-TopShelf-1920x720.png diff --git a/Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json b/Demo/HudDemoTV/Images.xcassets/Icons.brandassets/Top Shelf Image.imageset/Contents.json similarity index 100% rename from Demo/HudDemoTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json rename to Demo/HudDemoTV/Images.xcassets/Icons.brandassets/Top Shelf Image.imageset/Contents.json diff --git a/Demo/HudDemoTV/Assets.xcassets/LaunchImage.launchimage/AppleTV-Launch.png b/Demo/HudDemoTV/Images.xcassets/LaunchImage.launchimage/AppleTV-Launch.png similarity index 100% rename from Demo/HudDemoTV/Assets.xcassets/LaunchImage.launchimage/AppleTV-Launch.png rename to Demo/HudDemoTV/Images.xcassets/LaunchImage.launchimage/AppleTV-Launch.png diff --git a/Demo/HudDemoTV/Assets.xcassets/LaunchImage.launchimage/Contents.json b/Demo/HudDemoTV/Images.xcassets/LaunchImage.launchimage/Contents.json similarity index 100% rename from Demo/HudDemoTV/Assets.xcassets/LaunchImage.launchimage/Contents.json rename to Demo/HudDemoTV/Images.xcassets/LaunchImage.launchimage/Contents.json diff --git a/Demo/HudDemoTV/Info.plist b/Demo/HudDemoTV/Info.plist index 4f338601b..9eb047c1d 100644 --- a/Demo/HudDemoTV/Info.plist +++ b/Demo/HudDemoTV/Info.plist @@ -6,6 +6,10 @@ en CFBundleExecutable $(EXECUTABLE_NAME) + CFBundleIcons + + CFBundleIcons~ipad + CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion From 6d8aabcb3553516a54474310ce62c419954db777 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 10:21:25 +0200 Subject: [PATCH 056/173] Disables launch images an icons on tvOS Works around asset catalog compilation issues --- Demo/HudDemo.xcodeproj/project.pbxproj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index d5b7e2c6b..fa5e31e12 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -515,8 +515,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = Icons; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -549,8 +547,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = Icons; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; From 0f0686cc18be287d584209a5f924d704385e786b Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 10:23:28 +0200 Subject: [PATCH 057/173] Update changelog --- CHANGELOG.mdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.mdown b/CHANGELOG.mdown index b92e403e9..e41d0a9ca 100644 --- a/CHANGELOG.mdown +++ b/CHANGELOG.mdown @@ -6,7 +6,7 @@ - Removes KVO observing of local properties. - Migrates layout code to Auto Layout. - Includes a rewritten demo app. -- Includes a rewritten example app. +- Includes a rewritten iOS example app. - Updates and extends documentation. - Adds support for `NSProgress` - Adds a new customizable background view class. @@ -16,6 +16,7 @@ - Adds nullability. - Adds basic interface builder support. - Adds tvOS support. +- Adds a simple tvOS example app. - Improves behavior when showing and hiding in quick succession. - Improves support for `UIAppearance `. - Various smaller bug-fixes From 9365cb42e84485f6d67618b3f29bbbb4e243681b Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 10:30:12 +0200 Subject: [PATCH 058/173] Removes demo Travis CI builds xctool appears unreliable --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9992f6e33..b6fa695e3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,6 @@ language: objective-c osx_image: xcode7.2 script: - - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemo -sdk iphonesimulator clean build - - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk iphonesimulator clean build - xctool -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air 2,OS=9.2" clean build test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES after_success: - bash <(curl -s https://codecov.io/bash) From dbbb9e7b0837f398052c7c3f5e1e7c9e1fe725e2 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 10:31:04 +0200 Subject: [PATCH 059/173] Revert "Disables launch images an icons on tvOS" This reverts commit 6d8aabcb3553516a54474310ce62c419954db777. --- Demo/HudDemo.xcodeproj/project.pbxproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index fa5e31e12..d5b7e2c6b 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -515,6 +515,8 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = Icons; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -547,6 +549,8 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = Icons; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; From 302e56caa4fe599314e327c0fea777544d43c10e Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 10:43:25 +0200 Subject: [PATCH 060/173] Revert "Removes demo Travis CI builds " This reverts commit 9365cb42e84485f6d67618b3f29bbbb4e243681b. --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index b6fa695e3..9992f6e33 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,8 @@ language: objective-c osx_image: xcode7.2 script: + - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemo -sdk iphonesimulator clean build + - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk iphonesimulator clean build - xctool -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air 2,OS=9.2" clean build test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES after_success: - bash <(curl -s https://codecov.io/bash) From bb8e454998af643acd8d6eefb0635a35f9ea92c6 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 10:43:49 +0200 Subject: [PATCH 061/173] Disable launch images an icons on tvOS This reverts commit dbbb9e7b0837f398052c7c3f5e1e7c9e1fe725e2. --- Demo/HudDemo.xcodeproj/project.pbxproj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index d5b7e2c6b..fa5e31e12 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -515,8 +515,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = Icons; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -549,8 +547,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = Icons; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; From dffe0e276342a7294796441b0678f8870554c489 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 11:11:19 +0200 Subject: [PATCH 062/173] Update version in the readme --- README.mdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.mdown b/README.mdown index 00199c64b..1c8d10506 100644 --- a/README.mdown +++ b/README.mdown @@ -31,13 +31,13 @@ You will need the latest developer tools in order to build `MBProgressHUD`. Old [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.2'` +1. Add a pod entry for MBProgressHUD to your Podfile `pod 'MBProgressHUD', '~> 1.0.0'` 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` +1. Add MBProgressHUD to your Cartfile. e.g., `github "jdg/MBProgressHUD" ~> 1.0.0` 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. From 59a8240da67a8c98ac7e77da2fa198d21b1ab03c Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 11:27:30 +0200 Subject: [PATCH 063/173] Update CHANGELOG.mdown Mentioning the new button API --- CHANGELOG.mdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.mdown b/CHANGELOG.mdown index e41d0a9ca..fea8717fb 100644 --- a/CHANGELOG.mdown +++ b/CHANGELOG.mdown @@ -8,6 +8,7 @@ - Includes a rewritten demo app. - Includes a rewritten iOS example app. - Updates and extends documentation. +- Adds a new button property (cancellation support). - Adds support for `NSProgress` - Adds a new customizable background view class. - Adds new assertions. @@ -114,4 +115,4 @@ IMPORTANT: Requires LLVM 3+. **Version 0.1** @ 2.4.09 -- Initial release. \ No newline at end of file +- Initial release. From 374a708c7cd72e44aa166ca7305614689bab4c25 Mon Sep 17 00:00:00 2001 From: molon Date: Sat, 20 Aug 2016 18:00:53 +0800 Subject: [PATCH 064/173] Keep bounds.origin is always CGPointZero --- MBProgressHUD.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index a94f9217a..56f7e211c 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -784,7 +784,7 @@ - (void)statusBarOrientationDidChange:(NSNotification *)notification { - (void)updateForCurrentOrientationAnimated:(BOOL)animated { // Stay in sync with the superview in any case if (self.superview) { - self.bounds = self.superview.bounds; + self.frame = self.superview.bounds; } // Not needed on iOS 8+, compile out when the deployment target allows, From 489a91eeda0a7cc6cafe31e06f8d60bed79f840a Mon Sep 17 00:00:00 2001 From: Florian Morello Date: Tue, 30 Aug 2016 10:33:45 +0200 Subject: [PATCH 065/173] create tvos target --- Framework-tvOS-Info.plist | 24 ++++ MBProgressHUD.xcodeproj/project.pbxproj | 142 ++++++++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100644 Framework-tvOS-Info.plist diff --git a/Framework-tvOS-Info.plist b/Framework-tvOS-Info.plist new file mode 100644 index 000000000..fbe1e6b31 --- /dev/null +++ b/Framework-tvOS-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index fb4911a3e..587e5b6ea 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 */; }; + 1777D3E71D757B690037C7F1 /* MBProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = D286A7511518C70F00E13FB8 /* MBProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1777D3E81D757B6E0037C7F1 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D286A7521518C70F00E13FB8 /* MBProgressHUD.m */; }; 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 */; }; @@ -31,6 +33,8 @@ /* Begin PBXFileReference section */ 1315DD73178045000032507D /* MBProgressHUD-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MBProgressHUD-Prefix.pch"; sourceTree = SOURCE_ROOT; }; + 1777D3DF1D757AF50037C7F1 /* MBProgressHUD.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MBProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1777D3E21D757AF50037C7F1 /* Framework-tvOS-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Framework-tvOS-Info.plist"; 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; }; @@ -42,6 +46,13 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 1777D3DB1D757AF50037C7F1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1D104D761ACA36CC00973364 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -66,6 +77,7 @@ isa = PBXGroup; children = ( 1D104D951ACA376200973364 /* Framework-Info.plist */, + 1777D3E21D757AF50037C7F1 /* Framework-tvOS-Info.plist */, 1315DD73178045000032507D /* MBProgressHUD-Prefix.pch */, ); name = "Supporting Files"; @@ -85,6 +97,7 @@ children = ( D286A7491518C70F00E13FB8 /* libMBProgressHUD.a */, 1D104D7A1ACA36CC00973364 /* MBProgressHUD.framework */, + 1777D3DF1D757AF50037C7F1 /* MBProgressHUD.framework */, ); name = Products; sourceTree = ""; @@ -112,6 +125,14 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + 1777D3DC1D757AF50037C7F1 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 1777D3E71D757B690037C7F1 /* MBProgressHUD.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1D104D771ACA36CC00973364 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -123,6 +144,24 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 1777D3DE1D757AF50037C7F1 /* MBProgressHUD Framework tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1777D3E61D757AF50037C7F1 /* Build configuration list for PBXNativeTarget "MBProgressHUD Framework tvOS" */; + buildPhases = ( + 1777D3DA1D757AF50037C7F1 /* Sources */, + 1777D3DB1D757AF50037C7F1 /* Frameworks */, + 1777D3DC1D757AF50037C7F1 /* Headers */, + 1777D3DD1D757AF50037C7F1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "MBProgressHUD Framework tvOS"; + productName = "MBProgressHUD Framework tvOS"; + productReference = 1777D3DF1D757AF50037C7F1 /* MBProgressHUD.framework */; + productType = "com.apple.product-type.framework"; + }; 1D104D791ACA36CC00973364 /* MBProgressHUD Framework */ = { isa = PBXNativeTarget; buildConfigurationList = 1D104D8D1ACA36CC00973364 /* Build configuration list for PBXNativeTarget "MBProgressHUD Framework" */; @@ -168,6 +207,11 @@ LastUpgradeCheck = 0700; ORGANIZATIONNAME = "Matej Bukovinski"; TargetAttributes = { + 1777D3DE1D757AF50037C7F1 = { + CreatedOnToolsVersion = 8.0; + DevelopmentTeam = RW4GJT4298; + ProvisioningStyle = Automatic; + }; 1D104D791ACA36CC00973364 = { CreatedOnToolsVersion = 6.2; }; @@ -187,11 +231,19 @@ targets = ( D286A7481518C70F00E13FB8 /* MBProgressHUD Static Library */, 1D104D791ACA36CC00973364 /* MBProgressHUD Framework */, + 1777D3DE1D757AF50037C7F1 /* MBProgressHUD Framework tvOS */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 1777D3DD1D757AF50037C7F1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1D104D781ACA36CC00973364 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -202,6 +254,14 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 1777D3DA1D757AF50037C7F1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1777D3E81D757B6E0037C7F1 /* MBProgressHUD.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1D104D751ACA36CC00973364 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -221,6 +281,80 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ + 1777D3E41D757AF50037C7F1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = RW4GJT4298; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = "Framework-tvOS-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.matej.MBProgressHUD-Framework-tvOS"; + PRODUCT_NAME = MBProgressHUD; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 1777D3E51D757AF50037C7F1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = ""; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = RW4GJT4298; + 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-tvOS-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.matej.MBProgressHUD-Framework-tvOS"; + PRODUCT_NAME = MBProgressHUD; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; 1D104D8E1ACA36CC00973364 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -384,6 +518,14 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 1777D3E61D757AF50037C7F1 /* Build configuration list for PBXNativeTarget "MBProgressHUD Framework tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1777D3E41D757AF50037C7F1 /* Debug */, + 1777D3E51D757AF50037C7F1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; 1D104D8D1ACA36CC00973364 /* Build configuration list for PBXNativeTarget "MBProgressHUD Framework" */ = { isa = XCConfigurationList; buildConfigurations = ( From 93dac913fa1e6fdba46b1148ad9a8b3ff56bdfc6 Mon Sep 17 00:00:00 2001 From: Florian Morello Date: Tue, 30 Aug 2016 10:34:50 +0200 Subject: [PATCH 066/173] sharing scheme tvos --- .../MBProgressHUD Framework tvOS.xcscheme | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework tvOS.xcscheme diff --git a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework tvOS.xcscheme b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework tvOS.xcscheme new file mode 100644 index 000000000..97074a39e --- /dev/null +++ b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework tvOS.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 89f63d0f1f9c2f61ac409d101f42ae8ca367b945 Mon Sep 17 00:00:00 2001 From: Florian Morello Date: Tue, 30 Aug 2016 10:58:32 +0200 Subject: [PATCH 067/173] cleanup --- MBProgressHUD.xcodeproj/project.pbxproj | 12 +++++++----- .../xcschemes/MBProgressHUD Framework tvOS.xcscheme | 6 +++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index 587e5b6ea..9c5a1ce7e 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -209,7 +209,6 @@ TargetAttributes = { 1777D3DE1D757AF50037C7F1 = { CreatedOnToolsVersion = 8.0; - DevelopmentTeam = RW4GJT4298; ProvisioningStyle = Automatic; }; 1D104D791ACA36CC00973364 = { @@ -296,7 +295,7 @@ CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = RW4GJT4298; + DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -306,7 +305,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "com.matej.MBProgressHUD-Framework-tvOS"; + PRODUCT_BUNDLE_IDENTIFIER = com.matej.MBProgressHUD; PRODUCT_NAME = MBProgressHUD; SDKROOT = appletvos; SKIP_INSTALL = YES; @@ -333,7 +332,7 @@ CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = RW4GJT4298; + DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -344,7 +343,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "com.matej.MBProgressHUD-Framework-tvOS"; + PRODUCT_BUNDLE_IDENTIFIER = com.matej.MBProgressHUD; PRODUCT_NAME = MBProgressHUD; SDKROOT = appletvos; SKIP_INSTALL = YES; @@ -366,6 +365,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -401,6 +401,7 @@ COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -525,6 +526,7 @@ 1777D3E51D757AF50037C7F1 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 1D104D8D1ACA36CC00973364 /* Build configuration list for PBXNativeTarget "MBProgressHUD Framework" */ = { isa = XCConfigurationList; diff --git a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework tvOS.xcscheme b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework tvOS.xcscheme index 97074a39e..13450f273 100644 --- a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework tvOS.xcscheme +++ b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework tvOS.xcscheme @@ -15,7 +15,7 @@ @@ -46,7 +46,7 @@ @@ -64,7 +64,7 @@ From e5ff0eb91bfaf105e880ea84a1a99b921fa9f199 Mon Sep 17 00:00:00 2001 From: Bhargav Mogra Date: Wed, 14 Sep 2016 15:12:54 +0530 Subject: [PATCH 068/173] Fixed a couple of typos in the comments. --- Demo/HudDemo/MBHudDemoViewController.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Demo/HudDemo/MBHudDemoViewController.m b/Demo/HudDemo/MBHudDemoViewController.m index 565651a82..88053b1fd 100644 --- a/Demo/HudDemo/MBHudDemoViewController.m +++ b/Demo/HudDemo/MBHudDemoViewController.m @@ -152,11 +152,11 @@ - (void)determinateNSProgressExample { hud.mode = MBProgressHUDModeDeterminate; hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title"); - // Set up NSPorgress + // Set up NSProgress NSProgress *progressObject = [NSProgress progressWithTotalUnitCount:100]; hud.progressObject = progressObject; - // Configure a cacnel button. + // Configure a cancel button. [hud.button setTitle:NSLocalizedString(@"Cancel", @"HUD cancel button title") forState:UIControlStateNormal]; [hud.button addTarget:progressObject action:@selector(cancel) forControlEvents:UIControlEventTouchUpInside]; From 117d524029b3c2e9bdb2e592bc739a4a4ef704c4 Mon Sep 17 00:00:00 2001 From: Bhargav Mogra Date: Wed, 14 Sep 2016 16:44:30 +0530 Subject: [PATCH 069/173] Fixed a wrong comment, for MBProgressHUDModeText usage. --- Demo/HudDemo/MBHudDemoViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Demo/HudDemo/MBHudDemoViewController.m b/Demo/HudDemo/MBHudDemoViewController.m index 88053b1fd..0f469807b 100644 --- a/Demo/HudDemo/MBHudDemoViewController.m +++ b/Demo/HudDemo/MBHudDemoViewController.m @@ -220,7 +220,7 @@ - (void)customViewExample { - (void)textExample { MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; - // Set the annular determinate mode to show task progress. + // Set the text mode to show only text. hud.mode = MBProgressHUDModeText; hud.label.text = NSLocalizedString(@"Message here!", @"HUD message title"); // Move to bottm center. From e52e83e428e00dd26a90cabc17d3b294d62d8f52 Mon Sep 17 00:00:00 2001 From: Ethan Setnik Date: Mon, 19 Sep 2016 12:31:58 -0400 Subject: [PATCH 070/173] update gitignore for carthage submodules support --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 47da675f7..e09f6d68a 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,6 @@ profile # Ruby .ruby-version + +# Carthage +Carthage/Build From 0088039ee730e1b00fbef7c20f194b4045d1ed24 Mon Sep 17 00:00:00 2001 From: "qiang.shen" Date: Tue, 27 Sep 2016 09:05:46 +0800 Subject: [PATCH 071/173] when bounds origin is not zero --- MBProgressHUD.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index a94f9217a..56f7e211c 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -784,7 +784,7 @@ - (void)statusBarOrientationDidChange:(NSNotification *)notification { - (void)updateForCurrentOrientationAnimated:(BOOL)animated { // Stay in sync with the superview in any case if (self.superview) { - self.bounds = self.superview.bounds; + self.frame = self.superview.bounds; } // Not needed on iOS 8+, compile out when the deployment target allows, From 93ed629c62c8ed4358a3458792177df06a87ad5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A5=9E=E7=A7=98de=E8=B7=AF=E4=BA=BA=E7=94=B2?= <290907999@qq.com> Date: Thu, 3 Nov 2016 18:57:38 +0800 Subject: [PATCH 072/173] Cancel any scheduled hideDelayed Cancel any scheduled hideDelayed --- MBProgressHUD.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 56f7e211c..10a39745a 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -175,6 +175,9 @@ - (void)hideAnimated:(BOOL)animated { } - (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay { + // Cancel any scheduled hideDelayed: calls + [self.hideDelayTimer invalidate]; + NSTimer *timer = [NSTimer timerWithTimeInterval:delay target:self selector:@selector(handleHideTimer:) userInfo:@(animated) repeats:NO]; [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; self.hideDelayTimer = timer; From e1e60529668c695d8cd0ac413c9dc3ace8fac91b Mon Sep 17 00:00:00 2001 From: Johannes Marbach Date: Fri, 4 Nov 2016 14:17:04 +0100 Subject: [PATCH 073/173] Restrict framework to extension-safe API This allows the HUD to be used e.g. in iMessage app extension --- MBProgressHUD.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index fb4911a3e..118371d61 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -224,6 +224,7 @@ 1D104D8E1ACA36CC00973364 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -258,6 +259,7 @@ 1D104D8F1ACA36CC00973364 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; From ec7d1e4aca6eea04a4ccf937510ae28306c560ca Mon Sep 17 00:00:00 2001 From: Bruno Coelho <4brunu@gmail.com> Date: Thu, 9 Feb 2017 12:05:18 +0000 Subject: [PATCH 074/173] =?UTF-8?q?Fix=20show=20multiple=20Hud=E2=80=99s?= =?UTF-8?q?=20and=20them=20to=20hide=20them?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MBProgressHUD.h | 4 ++-- MBProgressHUD.m | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index a10744c0c..78b8b2a01 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -105,7 +105,7 @@ NS_ASSUME_NONNULL_BEGIN /// @name Showing and hiding /** - * Finds the top-most HUD subview and hides it. The counterpart to this method is showHUDAddedTo:animated:. + * Finds the top-most HUD subview that hasn't finished and hides it. The counterpart to this method is showHUDAddedTo:animated:. * * @note This method sets removeFromSuperViewOnHide. The HUD will automatically be removed from the view hierarchy when hidden. * @@ -120,7 +120,7 @@ NS_ASSUME_NONNULL_BEGIN + (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated; /** - * Finds the top-most HUD subview and returns it. + * Finds the top-most HUD subview that hasn't finished and returns it. * * @param view The view that is going to be searched. * @return A reference to the last HUD subview discovered. diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 56f7e211c..1e60b1904 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -80,7 +80,10 @@ + (MBProgressHUD *)HUDForView:(UIView *)view { NSEnumerator *subviewsEnum = [view.subviews reverseObjectEnumerator]; for (UIView *subview in subviewsEnum) { if ([subview isKindOfClass:self]) { - return (MBProgressHUD *)subview; + MBProgressHUD *hud = (MBProgressHUD *)subview; + if (hud.hasFinished == NO) { + return hud; + } } } return nil; From ea0d907fff23b1ccaf80e5e004dcd358deb9eb1c Mon Sep 17 00:00:00 2001 From: Jason Gavris Date: Thu, 16 Mar 2017 15:49:33 -0400 Subject: [PATCH 075/173] Add support for configuring blur effect style --- MBProgressHUD.h | 8 ++++++++ MBProgressHUD.m | 19 ++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index a10744c0c..5e726708d 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -388,6 +388,14 @@ NS_ASSUME_NONNULL_BEGIN */ @property (nonatomic) MBProgressHUDBackgroundStyle style; +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV +/** + * The blur effect style, when using MBProgressHUDBackgroundStyleBlur. + * Defaults to UIBlurEffectStyleLight. + */ +@property (nonatomic) UIBlurEffectStyle blurEffectStyle; +#endif + /** * 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. diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 56f7e211c..1548de1f1 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -1107,6 +1107,9 @@ - (instancetype)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0) { _style = MBProgressHUDBackgroundStyleBlur; +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV + _blurEffectStyle = UIBlurEffectStyleLight; +#endif if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0) { _color = [UIColor colorWithWhite:0.8f alpha:0.6f]; } else { @@ -1151,6 +1154,20 @@ - (void)setColor:(UIColor *)color { } } +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV + +- (void)setBlurEffectStyle:(UIBlurEffectStyle)blurEffectStyle { + if (_blurEffectStyle == blurEffectStyle) { + return; + } + + _blurEffectStyle = blurEffectStyle; + + [self updateForBackgroundStyle]; +} + +#endif + /////////////////////////////////////////////////////////////////////////////////////////// #pragma mark - Views @@ -1159,7 +1176,7 @@ - (void)updateForBackgroundStyle { if (style == MBProgressHUDBackgroundStyleBlur) { #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0) { - UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; + UIBlurEffect *effect = [UIBlurEffect effectWithStyle:self.blurEffectStyle]; UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect]; [self addSubview:effectView]; effectView.frame = self.bounds; From 4fc565d856e99eee8499976f695371b8638aa29b Mon Sep 17 00:00:00 2001 From: Sushant Verma Date: Thu, 18 May 2017 11:24:32 +1000 Subject: [PATCH 076/173] Fixing example --- Demo/HudDemo/MBHudDemoViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Demo/HudDemo/MBHudDemoViewController.m b/Demo/HudDemo/MBHudDemoViewController.m index 565651a82..5f4c0aec0 100644 --- a/Demo/HudDemo/MBHudDemoViewController.m +++ b/Demo/HudDemo/MBHudDemoViewController.m @@ -56,7 +56,7 @@ - (void)awakeFromNib { [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:@"On window" selector:@selector(windowExample)], [MBExample exampleWithTitle:@"NSURLSession" selector:@selector(networkingExample)], [MBExample exampleWithTitle:@"Determinate with NSProgress" selector:@selector(determinateNSProgressExample)], [MBExample exampleWithTitle:@"Dim background" selector:@selector(dimBackgroundExample)], From 546b96ddb0102278c048d3d514de7f4333fb2594 Mon Sep 17 00:00:00 2001 From: Wolfgang Lutz Date: Sat, 20 May 2017 12:01:50 +0200 Subject: [PATCH 077/173] fix typos using misspell --- Demo/HudDemo/MBHudDemoViewController.m | 2 +- MBProgressHUD.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Demo/HudDemo/MBHudDemoViewController.m b/Demo/HudDemo/MBHudDemoViewController.m index 0f469807b..fe0fe2bf5 100644 --- a/Demo/HudDemo/MBHudDemoViewController.m +++ b/Demo/HudDemo/MBHudDemoViewController.m @@ -33,7 +33,7 @@ + (instancetype)exampleWithTitle:(NSString *)title selector:(SEL)selector { @interface MBHudDemoViewController () @property (nonatomic, strong) NSArray *> *examples; -// Atomic, because it may be cancelled from main thread, flag is read on a background thread +// Atomic, because it may be canceled from main thread, flag is read on a background thread @property (atomic, assign) BOOL canceled; @end diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 1e60b1904..3a2b76602 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -937,7 +937,7 @@ - (void)drawRect:(CGRect)rect { 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. + // Ensure that we don't get color overlapping when _progressTintColor alpha < 1.f. CGContextSetBlendMode(context, kCGBlendModeCopy); [_progressTintColor set]; [processPath stroke]; From 66c322e23929cd6a5bd7cebd63556f2107fa6ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=93=E3=81=B4=E3=81=AA=E3=81=9F=E3=81=BF=E3=81=BD?= Date: Tue, 23 May 2017 19:12:58 +0900 Subject: [PATCH 078/173] Update README.mdown --- README.mdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.mdown b/README.mdown index 1c8d10506..36f3ab09e 100644 --- a/README.mdown +++ b/README.mdown @@ -13,7 +13,7 @@ [![](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. +**NOTE:** The class has recently undergone a major rewrite. The old version is available in the [legacy](https://github.com/jdg/MBProgressHUD/tree/legacy) branch, should you need it. ## Requirements From a7c3601fbd58946c9dc0892ab9394f2e1f3c4d89 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Fri, 2 Jun 2017 10:43:23 -0700 Subject: [PATCH 079/173] Switch image location --- README.mdown | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.mdown b/README.mdown index 1c8d10506..c5b262b1c 100644 --- a/README.mdown +++ b/README.mdown @@ -5,13 +5,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/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) +[![](https://cloud.githubusercontent.com/assets/91322/26737574/95128ef6-477f-11e7-8b3a-456b2b585e75.png)](https://cloud.githubusercontent.com/assets/91322/26737572/94a137a6-477f-11e7-9778-6266006f2dba.png) +[![](https://cloud.githubusercontent.com/assets/91322/26737576/951cc0c4-477f-11e7-9bc4-891cbbe70f80.png)](https://cloud.githubusercontent.com/assets/91322/26737575/95178c6c-477f-11e7-8df9-03aeeca5d39d.png) +[![](https://cloud.githubusercontent.com/assets/91322/26737577/9523169a-477f-11e7-83d9-c1a55b724c0a.png)](https://cloud.githubusercontent.com/assets/91322/26737578/95235920-477f-11e7-9968-9ecf506aba06.png) +[![](https://cloud.githubusercontent.com/assets/91322/26737579/954371ce-477f-11e7-85f8-660807a7f35e.png)](https://cloud.githubusercontent.com/assets/91322/26737573/95048432-477f-11e7-8f1d-4d5736b10488.) +[![](https://cloud.githubusercontent.com/assets/91322/26737581/954e3c9e-477f-11e7-93d9-2a8e2e0e7dd0.png)](https://cloud.githubusercontent.com/assets/91322/26737580/954aff70-477f-11e7-9634-5802daea2dee.png) +[![](https://cloud.githubusercontent.com/assets/91322/26737583/955ba17c-477f-11e7-93aa-d952fb0bbce3.png)](https://cloud.githubusercontent.com/assets/91322/26737582/9552886c-477f-11e7-8e90-46acd9a8527c.png) +[![](https://cloud.githubusercontent.com/assets/91322/26737585/95a31822-477f-11e7-9ca6-b33ceb3a3f49.png)](https://cloud.githubusercontent.com/assets/91322/26737584/956392f6-477f-11e7-918f-717a42758156.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. From 93b904c8d8e7f381f50107580152268eec2d75f4 Mon Sep 17 00:00:00 2001 From: Dwayne Coussement Date: Mon, 14 Aug 2017 14:36:35 +0200 Subject: [PATCH 080/173] CLANG_WARN_STRICT_PROTOTYPES: Yes please! --- MBProgressHUD.h | 2 +- MBProgressHUD.m | 2 +- MBProgressHUD.xcodeproj/project.pbxproj | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 78b8b2a01..f6f421e4d 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -69,7 +69,7 @@ typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) { MBProgressHUDBackgroundStyleBlur }; -typedef void (^MBProgressHUDCompletionBlock)(); +typedef void (^MBProgressHUDCompletionBlock)(void); NS_ASSUME_NONNULL_BEGIN diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 1e60b1904..da3a5394c 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -1279,7 +1279,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 completionBlock:(void (^)())completion { +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(void (^)(void))completion { dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:completion]; } diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index 118371d61..28ea399c3 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -230,6 +230,7 @@ CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_STRICT_PROTOTYPES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -265,6 +266,7 @@ CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_STRICT_PROTOTYPES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; From 2926f383dc64556143250a2e96581b64a44e6db3 Mon Sep 17 00:00:00 2001 From: Jonghyun Kim Date: Tue, 22 Aug 2017 11:18:09 +0200 Subject: [PATCH 081/173] Fix broken image link. in README.md --- README.mdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.mdown b/README.mdown index c5b262b1c..86f0b1320 100644 --- a/README.mdown +++ b/README.mdown @@ -8,7 +8,7 @@ [![](https://cloud.githubusercontent.com/assets/91322/26737574/95128ef6-477f-11e7-8b3a-456b2b585e75.png)](https://cloud.githubusercontent.com/assets/91322/26737572/94a137a6-477f-11e7-9778-6266006f2dba.png) [![](https://cloud.githubusercontent.com/assets/91322/26737576/951cc0c4-477f-11e7-9bc4-891cbbe70f80.png)](https://cloud.githubusercontent.com/assets/91322/26737575/95178c6c-477f-11e7-8df9-03aeeca5d39d.png) [![](https://cloud.githubusercontent.com/assets/91322/26737577/9523169a-477f-11e7-83d9-c1a55b724c0a.png)](https://cloud.githubusercontent.com/assets/91322/26737578/95235920-477f-11e7-9968-9ecf506aba06.png) -[![](https://cloud.githubusercontent.com/assets/91322/26737579/954371ce-477f-11e7-85f8-660807a7f35e.png)](https://cloud.githubusercontent.com/assets/91322/26737573/95048432-477f-11e7-8f1d-4d5736b10488.) +[![](https://cloud.githubusercontent.com/assets/91322/26737579/954371ce-477f-11e7-85f8-660807a7f35e.png)](https://cloud.githubusercontent.com/assets/91322/26737573/95048432-477f-11e7-8f1d-4d5736b10488.png) [![](https://cloud.githubusercontent.com/assets/91322/26737581/954e3c9e-477f-11e7-93d9-2a8e2e0e7dd0.png)](https://cloud.githubusercontent.com/assets/91322/26737580/954aff70-477f-11e7-9634-5802daea2dee.png) [![](https://cloud.githubusercontent.com/assets/91322/26737583/955ba17c-477f-11e7-93aa-d952fb0bbce3.png)](https://cloud.githubusercontent.com/assets/91322/26737582/9552886c-477f-11e7-8e90-46acd9a8527c.png) [![](https://cloud.githubusercontent.com/assets/91322/26737585/95a31822-477f-11e7-9ca6-b33ceb3a3f49.png)](https://cloud.githubusercontent.com/assets/91322/26737584/956392f6-477f-11e7-918f-717a42758156.png) From af1f2ba839f5a771ffe3bc134a8c34d7a537b001 Mon Sep 17 00:00:00 2001 From: "jasonwu127@gmail.com" Date: Mon, 28 Aug 2017 11:26:34 +0530 Subject: [PATCH 082/173] for MBBarProgressView: 1.use CGContextDrawPath with kCGPathFillStroke instead of CGContextFillPath and CGContextStokePath; 2. delete redundant CGContextAddLineToPoint --- MBProgressHUD.m | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 56f7e211c..ac0e9c2ca 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -1007,26 +1007,14 @@ - (void)drawRect:(CGRect)rect { CGContextSetStrokeColorWithColor(context,[_lineColor CGColor]); CGContextSetFillColorWithColor(context, [_progressRemainingColor CGColor]); - // Draw background + // Draw background and Border 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); + CGContextDrawPath(context, kCGPathFillStroke); CGContextSetFillColorWithColor(context, [_progressColor CGColor]); radius = radius - 2; From b6b64697d5557178dc4c5f5d960463ca81573314 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Thu, 19 Oct 2017 19:04:36 +0200 Subject: [PATCH 083/173] Apply project modernization --- Demo/HudDemo.xcodeproj/project.pbxproj | 24 ++++++++++++++--- .../xcshareddata/xcschemes/HudDemo.xcscheme | 4 ++- .../xcshareddata/xcschemes/HudDemoTV.xcscheme | 4 ++- .../xcshareddata/xcschemes/HudTests.xcscheme | 4 ++- MBProgressHUD.xcodeproj/project.pbxproj | 26 +++++++++++++++---- .../MBProgressHUD Framework.xcscheme | 4 ++- .../xcschemes/MBProgressHUD.xcscheme | 4 ++- 7 files changed, 57 insertions(+), 13 deletions(-) diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index fa5e31e12..7222e1057 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -287,7 +287,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = MB; - LastUpgradeCheck = 0720; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = "Matej Bukovinski"; TargetAttributes = { D27F18401D3B5878009D7482 = { @@ -458,12 +458,21 @@ C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; 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_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -478,7 +487,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -487,12 +496,21 @@ C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; 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_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -506,7 +524,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; SDKROOT = iphoneos; }; name = Release; diff --git a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme index 36992107c..490e95fef 100644 --- a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme +++ b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme @@ -1,6 +1,6 @@ @@ -61,6 +62,7 @@ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" displayScaleIsEnabled = "NO" displayScale = "1.00" + language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemoTV.xcscheme b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemoTV.xcscheme index 9ccbda300..03e88b3f4 100644 --- a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemoTV.xcscheme +++ b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemoTV.xcscheme @@ -1,6 +1,6 @@ @@ -45,6 +46,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudTests.xcscheme b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudTests.xcscheme index 9ecd5ba5f..e2ded2f05 100644 --- a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudTests.xcscheme +++ b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudTests.xcscheme @@ -1,6 +1,6 @@ @@ -36,6 +37,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme index e22b7ad4a..1c8052674 100644 --- a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme +++ b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme @@ -1,6 +1,6 @@ @@ -36,6 +37,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" From 3e2e49ea5817467aa4dce0037f7e975617e3e4a5 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Thu, 19 Oct 2017 19:09:38 +0200 Subject: [PATCH 084/173] Update travis to Xcode 9 --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9992f6e33..82b04a329 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,8 @@ language: objective-c -osx_image: xcode7.2 +osx_image: xcode9 script: - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemo -sdk iphonesimulator clean build - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk iphonesimulator clean build - - xctool -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air 2,OS=9.2" clean 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=11.0" clean build test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES after_success: - bash <(curl -s https://codecov.io/bash) From dc9257d448c7d6cb1a077eac25ffcb4d03d01a87 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Thu, 19 Oct 2017 20:30:03 +0200 Subject: [PATCH 085/173] Don't clean --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 82b04a329..8438ee2ae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,8 @@ language: objective-c osx_image: xcode9 script: - - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemo -sdk iphonesimulator clean build - - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk iphonesimulator clean build - - xctool -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air 2,OS=11.0" clean build test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES + - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemo -sdk iphonesimulator build + - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk iphonesimulator build + - xctool -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air 2,OS=11.0" build test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES after_success: - bash <(curl -s https://codecov.io/bash) From 809662b2a8f41cbfa80be340153f6a1b48298c63 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Thu, 19 Oct 2017 21:47:08 +0200 Subject: [PATCH 086/173] Revert "Don't clean" This reverts commit dc9257d448c7d6cb1a077eac25ffcb4d03d01a87. --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8438ee2ae..82b04a329 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,8 @@ language: objective-c osx_image: xcode9 script: - - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemo -sdk iphonesimulator build - - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk iphonesimulator build - - xctool -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air 2,OS=11.0" build test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES + - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemo -sdk iphonesimulator clean build + - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk iphonesimulator clean build + - xctool -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air 2,OS=11.0" clean build test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES after_success: - bash <(curl -s https://codecov.io/bash) From bb26c1046df0b62245e133fbc53c4a65fc7080be Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Fri, 27 Oct 2017 11:27:52 +0200 Subject: [PATCH 087/173] Move to xcodebuild --- .travis.yml | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 82b04a329..c512b0904 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,20 @@ language: objective-c osx_image: xcode9 -script: - - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemo -sdk iphonesimulator clean build - - xctool -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk iphonesimulator clean build - - xctool -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air 2,OS=11.0" clean build test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES + +before_install: + - env + - locale + - gem install xcpretty --no-rdoc --no-ri --no-document --quiet + - xcpretty --version + - xcodebuild -version + - xcodebuild -showsdks + +script: + - set -o pipefail + + - xcodebuild clean build -workspace MBProgressHUD.xcworkspace -scheme HudDemo -sdk iphonesimulator -configuration Debug | xcpretty -c + - xcodebuild clean build -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk iphonesimulator -configuration Debug | xcpretty -c + - xcodebuild clean build test -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air 2,OS=11.0" -configuration Debug GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES | xcpretty -c + after_success: - bash <(curl -s https://codecov.io/bash) From b508641808a507a804b16c651dfdbb15ccb77ce4 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Fri, 3 Nov 2017 18:42:07 +0100 Subject: [PATCH 088/173] Reference new API. --- README.mdown | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.mdown b/README.mdown index 86f0b1320..104f75255 100644 --- a/README.mdown +++ b/README.mdown @@ -79,11 +79,11 @@ If you need to configure the HUD you can do this by using the MBProgressHUD refe ```objective-c MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; hud.mode = MBProgressHUDModeAnnularDeterminate; -hud.labelText = @"Loading"; +hud.label.text = @"Loading"; [self doSomethingInBackgroundWithProgressCallback:^(float progress) { hud.progress = progress; } completionCallback:^{ - [hud hide:YES]; + [hud hideAnimated:YES]; }]; ``` @@ -92,14 +92,14 @@ You can also use a `NSProgress` object and MBProgressHUD will update itself when ```objective-c MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; hud.mode = MBProgressHUDModeAnnularDeterminate; -hud.labelText = @"Loading"; +hud.label.text = @"Loading"; NSProgress *progress = [self doSomethingInBackgroundCompletion:^{ - [hud hide:YES]; + [hud hideAnimated:YES]; }]; hud.progressObject = progress; ``` -UI updates should always be done on the main thread. Some MBProgressHUD setters are however considered "thread safe" and can be called from background threads. Those also include `setMode:`, `setCustomView:`, `setLabelText:`, `setLabelFont:`, `setDetailsLabelText:`, `setDetailsLabelFont:` and `setProgress:`. +Keep in mind that UI updates, inclining calls to MBProgressHUD should always be done on the main thread. If you need to run your long-running task in the main thread, you should perform it with a slight delay, so UIKit will have enough time to update the UI (i.e., draw the HUD) before you block the main thread with your task. From 63f5e9ec5e7f76020510b2d2815bdf7df74a2743 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Fri, 3 Nov 2017 19:47:26 +0100 Subject: [PATCH 089/173] Fix group references --- Demo/HudDemo.xcodeproj/project.pbxproj | 3 +-- MBProgressHUD.xcodeproj/project.pbxproj | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index 7222e1057..81c600267 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -108,8 +108,7 @@ 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, ); - name = HudDemo; - path = Classes; + path = HudDemo; sourceTree = ""; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index 86d3904d2..a12707baa 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -106,7 +106,7 @@ D286A7521518C70F00E13FB8 /* MBProgressHUD.m */, 1315DD72178044770032507D /* Supporting Files */, ); - path = MBProgressHUD; + name = MBProgressHUD; sourceTree = ""; }; /* End PBXGroup section */ From 1afb2dce67503a73407cf2bd83dcbced5ba2e5a0 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Fri, 3 Nov 2017 19:56:21 +0100 Subject: [PATCH 090/173] Add missing icons --- .../AppIcon.appiconset/AppStore.png | Bin 0 -> 31379 bytes .../AppIcon.appiconset/Contents.json | 30 ++++++++++++++++++ .../AppIcon.appiconset/Icon-20.png | Bin 0 -> 1124 bytes .../AppIcon.appiconset/Icon-40.png | Bin 0 -> 1757 bytes .../AppIcon.appiconset/Icon-41.png | Bin 0 -> 1757 bytes .../AppIcon.appiconset/Icon-60.png | Bin 0 -> 2499 bytes 6 files changed, 30 insertions(+) create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/AppStore.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-20.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-40.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-41.png create mode 100644 Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-60.png diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/AppStore.png b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/AppStore.png new file mode 100644 index 0000000000000000000000000000000000000000..d2516f1a06372df3007bf30e18909273c82790e3 GIT binary patch literal 31379 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 literal 0 HcmV?d00001 diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Contents.json b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Contents.json index 7110beb82..f9f57c9c7 100644 --- a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,17 @@ { "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-40.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-60.png", + "scale" : "3x" + }, { "size" : "29x29", "idiom" : "iphone", @@ -54,6 +66,18 @@ "filename" : "Icon-60@3x.png", "scale" : "3x" }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-20.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-41.png", + "scale" : "2x" + }, { "size" : "29x29", "idiom" : "ipad", @@ -119,6 +143,12 @@ "idiom" : "ipad", "filename" : "Icon-167.png", "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "AppStore.png", + "scale" : "1x" } ], "info" : { diff --git a/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-20.png b/Demo/HudDemo/Images.xcassets/AppIcon.appiconset/Icon-20.png new file mode 100644 index 0000000000000000000000000000000000000000..34e7ffc41981369b47de3994fce9179d5e83169a GIT binary patch literal 1124 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSSKUFiK~JM3hAM`dB6B=jtV<?;Zqle1Gx6p~WYGxKbf-tXS8q>!0ns}yePYv5bpoSKp8QB{;0T;&&% zT$P<{nWAKG$7NGt1vDTxwIorYA~z?m*s8)-32d$vkPQ;nS5g2gDap1~itr6kaLzAE zRWQ{v)iY4C<5I9GN=dT{a&d!d2J&o`GD=Dctn~HE%ggo3jrH=2()A53EiLs8jP#9+ zbb%^#i!1X=5-W7`ij_e|K+JGSElw`VEGWs$&r<-InV6JcT4JlDqz|%0A8HHGx%zPT z0y%IWr{)2@Sp@Wtl-KH4z+h_1baoCX4sv%=@N{)HGqf}_(>2mFWMI&kSUPdHH?yNa zyS=dMN5`h9hzOQI?Wq!q8Ok#hv^qR`9<27%+v#%R@ec0^3EDTfxEA%Uclyti%bM*N zAmYeko$V^k`+SbLhk)_vH#NU+&rK{BlX*C0l3CW?3Fn@Cx!`hO^M)NyR@N`%RA0;U zuur4S%*@)_H}viNH|%OdUsELi4P5pwa%oDWMre2MbgT;aYW*3&KN zQ2L?TT`>Va&Rtq;wm)jlhM%{SY-PBb4(q=03@O;sGD5MVTUOlKoPGRry8l(vt$y=u^4`BVboAuON?pLUB&Utjz5;lsj$5=Sv{ z0g*pHKmTt2{k`trpH7`~O@|T_pFMf>2Wasu-v9sqrYEK)CZqttk<85-I#zVAK7PDk z-fyl=n@-*DZ)d~x~?XM?4Kd1lx_GZ$A z2~Qq8srdIta#qq8hUSK|($|fRjW+{zZQlI%*U#C_lP}-8#uqI4tzz2L$;E}A6H*d@ zHg4KjE+8s=coom?vjQJ}URGCAQ_GW+i{XkW@H8+m`0(lD!-=U9Ya%BpFfed*HY_{f S^^F%)IC#4HxvX0H97H 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 literal 0 HcmV?d00001 From 8919a1014695aad9b42a525ed2f81f1098b714b8 Mon Sep 17 00:00:00 2001 From: Jason Gavris Date: Thu, 16 Mar 2017 15:49:33 -0400 Subject: [PATCH 091/173] Add support for configuring blur effect style --- MBProgressHUD.h | 8 ++++++++ MBProgressHUD.m | 19 ++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index f6f421e4d..2e2adf45a 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -388,6 +388,14 @@ NS_ASSUME_NONNULL_BEGIN */ @property (nonatomic) MBProgressHUDBackgroundStyle style; +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV +/** + * The blur effect style, when using MBProgressHUDBackgroundStyleBlur. + * Defaults to UIBlurEffectStyleLight. + */ +@property (nonatomic) UIBlurEffectStyle blurEffectStyle; +#endif + /** * 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. diff --git a/MBProgressHUD.m b/MBProgressHUD.m index da3a5394c..ea515b711 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -1110,6 +1110,9 @@ - (instancetype)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0) { _style = MBProgressHUDBackgroundStyleBlur; +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV + _blurEffectStyle = UIBlurEffectStyleLight; +#endif if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0) { _color = [UIColor colorWithWhite:0.8f alpha:0.6f]; } else { @@ -1154,6 +1157,20 @@ - (void)setColor:(UIColor *)color { } } +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV + +- (void)setBlurEffectStyle:(UIBlurEffectStyle)blurEffectStyle { + if (_blurEffectStyle == blurEffectStyle) { + return; + } + + _blurEffectStyle = blurEffectStyle; + + [self updateForBackgroundStyle]; +} + +#endif + /////////////////////////////////////////////////////////////////////////////////////////// #pragma mark - Views @@ -1162,7 +1179,7 @@ - (void)updateForBackgroundStyle { if (style == MBProgressHUDBackgroundStyleBlur) { #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0) { - UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; + UIBlurEffect *effect = [UIBlurEffect effectWithStyle:self.blurEffectStyle]; UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect]; [self addSubview:effectView]; effectView.frame = self.bounds; From 2d0b0e054063bc5fc7721025763fb1ea9c618c1b Mon Sep 17 00:00:00 2001 From: Wolfgang Lutz Date: Sat, 20 May 2017 12:01:50 +0200 Subject: [PATCH 092/173] fix typos using misspell --- Demo/HudDemo/MBHudDemoViewController.m | 2 +- MBProgressHUD.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Demo/HudDemo/MBHudDemoViewController.m b/Demo/HudDemo/MBHudDemoViewController.m index 98b3b68cf..f08ac222a 100644 --- a/Demo/HudDemo/MBHudDemoViewController.m +++ b/Demo/HudDemo/MBHudDemoViewController.m @@ -33,7 +33,7 @@ + (instancetype)exampleWithTitle:(NSString *)title selector:(SEL)selector { @interface MBHudDemoViewController () @property (nonatomic, strong) NSArray *> *examples; -// Atomic, because it may be cancelled from main thread, flag is read on a background thread +// Atomic, because it may be canceled from main thread, flag is read on a background thread @property (atomic, assign) BOOL canceled; @end diff --git a/MBProgressHUD.m b/MBProgressHUD.m index ea515b711..f727a2605 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -937,7 +937,7 @@ - (void)drawRect:(CGRect)rect { 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. + // Ensure that we don't get color overlapping when _progressTintColor alpha < 1.f. CGContextSetBlendMode(context, kCGBlendModeCopy); [_progressTintColor set]; [processPath stroke]; From 60853bb7c3c30118c231cdfa46adea867aa295fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=93=E3=81=B4=E3=81=AA=E3=81=9F=E3=81=BF=E3=81=BD?= Date: Tue, 23 May 2017 19:12:58 +0900 Subject: [PATCH 093/173] Update README.mdown --- README.mdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.mdown b/README.mdown index 104f75255..d6deaa3fb 100644 --- a/README.mdown +++ b/README.mdown @@ -13,7 +13,7 @@ [![](https://cloud.githubusercontent.com/assets/91322/26737583/955ba17c-477f-11e7-93aa-d952fb0bbce3.png)](https://cloud.githubusercontent.com/assets/91322/26737582/9552886c-477f-11e7-8e90-46acd9a8527c.png) [![](https://cloud.githubusercontent.com/assets/91322/26737585/95a31822-477f-11e7-9ca6-b33ceb3a3f49.png)](https://cloud.githubusercontent.com/assets/91322/26737584/956392f6-477f-11e7-918f-717a42758156.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. +**NOTE:** The class has recently undergone a major rewrite. The old version is available in the [legacy](https://github.com/jdg/MBProgressHUD/tree/legacy) branch, should you need it. ## Requirements From 4f620828d8c612e157575ce7fc05c10170ecd6b8 Mon Sep 17 00:00:00 2001 From: "jasonwu127@gmail.com" Date: Mon, 28 Aug 2017 11:26:34 +0530 Subject: [PATCH 094/173] for MBBarProgressView: 1.use CGContextDrawPath with kCGPathFillStroke instead of CGContextFillPath and CGContextStokePath; 2. delete redundant CGContextAddLineToPoint --- MBProgressHUD.m | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index f727a2605..cd84c03c1 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -1010,26 +1010,14 @@ - (void)drawRect:(CGRect)rect { CGContextSetStrokeColorWithColor(context,[_lineColor CGColor]); CGContextSetFillColorWithColor(context, [_progressRemainingColor CGColor]); - // Draw background + // Draw background and Border 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); + CGContextDrawPath(context, kCGPathFillStroke); CGContextSetFillColorWithColor(context, [_progressColor CGColor]); radius = radius - 2; From 2de9404fffe9949ea8c4abb763c2bcef15ad79cc Mon Sep 17 00:00:00 2001 From: Florian Morello Date: Tue, 30 Aug 2016 10:33:45 +0200 Subject: [PATCH 095/173] create tvos target --- Framework-tvOS-Info.plist | 24 ++++ MBProgressHUD.xcodeproj/project.pbxproj | 142 ++++++++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100644 Framework-tvOS-Info.plist diff --git a/Framework-tvOS-Info.plist b/Framework-tvOS-Info.plist new file mode 100644 index 000000000..fbe1e6b31 --- /dev/null +++ b/Framework-tvOS-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index a12707baa..9c593a315 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 */; }; + 1777D3E71D757B690037C7F1 /* MBProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = D286A7511518C70F00E13FB8 /* MBProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1777D3E81D757B6E0037C7F1 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D286A7521518C70F00E13FB8 /* MBProgressHUD.m */; }; 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 */; }; @@ -31,6 +33,8 @@ /* Begin PBXFileReference section */ 1315DD73178045000032507D /* MBProgressHUD-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MBProgressHUD-Prefix.pch"; sourceTree = SOURCE_ROOT; }; + 1777D3DF1D757AF50037C7F1 /* MBProgressHUD.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MBProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1777D3E21D757AF50037C7F1 /* Framework-tvOS-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Framework-tvOS-Info.plist"; 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; }; @@ -42,6 +46,13 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 1777D3DB1D757AF50037C7F1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1D104D761ACA36CC00973364 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -66,6 +77,7 @@ isa = PBXGroup; children = ( 1D104D951ACA376200973364 /* Framework-Info.plist */, + 1777D3E21D757AF50037C7F1 /* Framework-tvOS-Info.plist */, 1315DD73178045000032507D /* MBProgressHUD-Prefix.pch */, ); name = "Supporting Files"; @@ -85,6 +97,7 @@ children = ( D286A7491518C70F00E13FB8 /* libMBProgressHUD.a */, 1D104D7A1ACA36CC00973364 /* MBProgressHUD.framework */, + 1777D3DF1D757AF50037C7F1 /* MBProgressHUD.framework */, ); name = Products; sourceTree = ""; @@ -112,6 +125,14 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + 1777D3DC1D757AF50037C7F1 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 1777D3E71D757B690037C7F1 /* MBProgressHUD.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1D104D771ACA36CC00973364 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -123,6 +144,24 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 1777D3DE1D757AF50037C7F1 /* MBProgressHUD Framework tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1777D3E61D757AF50037C7F1 /* Build configuration list for PBXNativeTarget "MBProgressHUD Framework tvOS" */; + buildPhases = ( + 1777D3DA1D757AF50037C7F1 /* Sources */, + 1777D3DB1D757AF50037C7F1 /* Frameworks */, + 1777D3DC1D757AF50037C7F1 /* Headers */, + 1777D3DD1D757AF50037C7F1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "MBProgressHUD Framework tvOS"; + productName = "MBProgressHUD Framework tvOS"; + productReference = 1777D3DF1D757AF50037C7F1 /* MBProgressHUD.framework */; + productType = "com.apple.product-type.framework"; + }; 1D104D791ACA36CC00973364 /* MBProgressHUD Framework */ = { isa = PBXNativeTarget; buildConfigurationList = 1D104D8D1ACA36CC00973364 /* Build configuration list for PBXNativeTarget "MBProgressHUD Framework" */; @@ -168,6 +207,11 @@ LastUpgradeCheck = 0900; ORGANIZATIONNAME = "Matej Bukovinski"; TargetAttributes = { + 1777D3DE1D757AF50037C7F1 = { + CreatedOnToolsVersion = 8.0; + DevelopmentTeam = RW4GJT4298; + ProvisioningStyle = Automatic; + }; 1D104D791ACA36CC00973364 = { CreatedOnToolsVersion = 6.2; }; @@ -187,11 +231,19 @@ targets = ( D286A7481518C70F00E13FB8 /* MBProgressHUD Static Library */, 1D104D791ACA36CC00973364 /* MBProgressHUD Framework */, + 1777D3DE1D757AF50037C7F1 /* MBProgressHUD Framework tvOS */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 1777D3DD1D757AF50037C7F1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1D104D781ACA36CC00973364 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -202,6 +254,14 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 1777D3DA1D757AF50037C7F1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1777D3E81D757B6E0037C7F1 /* MBProgressHUD.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1D104D751ACA36CC00973364 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -221,6 +281,80 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ + 1777D3E41D757AF50037C7F1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = RW4GJT4298; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = "Framework-tvOS-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.matej.MBProgressHUD-Framework-tvOS"; + PRODUCT_NAME = MBProgressHUD; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 1777D3E51D757AF50037C7F1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = ""; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = RW4GJT4298; + 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-tvOS-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.matej.MBProgressHUD-Framework-tvOS"; + PRODUCT_NAME = MBProgressHUD; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; 1D104D8E1ACA36CC00973364 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -404,6 +538,14 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 1777D3E61D757AF50037C7F1 /* Build configuration list for PBXNativeTarget "MBProgressHUD Framework tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1777D3E41D757AF50037C7F1 /* Debug */, + 1777D3E51D757AF50037C7F1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; 1D104D8D1ACA36CC00973364 /* Build configuration list for PBXNativeTarget "MBProgressHUD Framework" */ = { isa = XCConfigurationList; buildConfigurations = ( From 7777e6dec80c8984a117d07ea425f1977b755954 Mon Sep 17 00:00:00 2001 From: Florian Morello Date: Tue, 30 Aug 2016 10:34:50 +0200 Subject: [PATCH 096/173] sharing scheme tvos --- .../MBProgressHUD Framework tvOS.xcscheme | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework tvOS.xcscheme diff --git a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework tvOS.xcscheme b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework tvOS.xcscheme new file mode 100644 index 000000000..97074a39e --- /dev/null +++ b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework tvOS.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 4131642c82a50a5aa43cb6710037b1bd44723b99 Mon Sep 17 00:00:00 2001 From: Florian Morello Date: Tue, 30 Aug 2016 10:58:32 +0200 Subject: [PATCH 097/173] cleanup --- MBProgressHUD.xcodeproj/project.pbxproj | 12 +++++++----- .../xcschemes/MBProgressHUD Framework tvOS.xcscheme | 6 +++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index 9c593a315..6f35ac63a 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -209,7 +209,6 @@ TargetAttributes = { 1777D3DE1D757AF50037C7F1 = { CreatedOnToolsVersion = 8.0; - DevelopmentTeam = RW4GJT4298; ProvisioningStyle = Automatic; }; 1D104D791ACA36CC00973364 = { @@ -296,7 +295,7 @@ CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = RW4GJT4298; + DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -306,7 +305,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "com.matej.MBProgressHUD-Framework-tvOS"; + PRODUCT_BUNDLE_IDENTIFIER = com.matej.MBProgressHUD; PRODUCT_NAME = MBProgressHUD; SDKROOT = appletvos; SKIP_INSTALL = YES; @@ -333,7 +332,7 @@ CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = RW4GJT4298; + DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -344,7 +343,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "com.matej.MBProgressHUD-Framework-tvOS"; + PRODUCT_BUNDLE_IDENTIFIER = com.matej.MBProgressHUD; PRODUCT_NAME = MBProgressHUD; SDKROOT = appletvos; SKIP_INSTALL = YES; @@ -368,6 +367,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -405,6 +405,7 @@ COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -545,6 +546,7 @@ 1777D3E51D757AF50037C7F1 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 1D104D8D1ACA36CC00973364 /* Build configuration list for PBXNativeTarget "MBProgressHUD Framework" */ = { isa = XCConfigurationList; diff --git a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework tvOS.xcscheme b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework tvOS.xcscheme index 97074a39e..13450f273 100644 --- a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework tvOS.xcscheme +++ b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD Framework tvOS.xcscheme @@ -15,7 +15,7 @@ @@ -46,7 +46,7 @@ @@ -64,7 +64,7 @@ From 17ac00a076e4749c2c839a56d27542c56d3d7e93 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 5 Nov 2017 19:29:51 +0100 Subject: [PATCH 098/173] Update screenshot references --- README.mdown | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.mdown b/README.mdown index d6deaa3fb..1737beb02 100644 --- a/README.mdown +++ b/README.mdown @@ -5,13 +5,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. -[![](https://cloud.githubusercontent.com/assets/91322/26737574/95128ef6-477f-11e7-8b3a-456b2b585e75.png)](https://cloud.githubusercontent.com/assets/91322/26737572/94a137a6-477f-11e7-9778-6266006f2dba.png) -[![](https://cloud.githubusercontent.com/assets/91322/26737576/951cc0c4-477f-11e7-9bc4-891cbbe70f80.png)](https://cloud.githubusercontent.com/assets/91322/26737575/95178c6c-477f-11e7-8df9-03aeeca5d39d.png) -[![](https://cloud.githubusercontent.com/assets/91322/26737577/9523169a-477f-11e7-83d9-c1a55b724c0a.png)](https://cloud.githubusercontent.com/assets/91322/26737578/95235920-477f-11e7-9968-9ecf506aba06.png) -[![](https://cloud.githubusercontent.com/assets/91322/26737579/954371ce-477f-11e7-85f8-660807a7f35e.png)](https://cloud.githubusercontent.com/assets/91322/26737573/95048432-477f-11e7-8f1d-4d5736b10488.png) -[![](https://cloud.githubusercontent.com/assets/91322/26737581/954e3c9e-477f-11e7-93d9-2a8e2e0e7dd0.png)](https://cloud.githubusercontent.com/assets/91322/26737580/954aff70-477f-11e7-9634-5802daea2dee.png) -[![](https://cloud.githubusercontent.com/assets/91322/26737583/955ba17c-477f-11e7-93aa-d952fb0bbce3.png)](https://cloud.githubusercontent.com/assets/91322/26737582/9552886c-477f-11e7-8e90-46acd9a8527c.png) -[![](https://cloud.githubusercontent.com/assets/91322/26737585/95a31822-477f-11e7-9ca6-b33ceb3a3f49.png)](https://cloud.githubusercontent.com/assets/91322/26737584/956392f6-477f-11e7-918f-717a42758156.png) +[![](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/1-small.png)](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/1.png) +[![](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/2-small.png)](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/2.png) +[![](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/3-small.png)](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/3.png) +[![](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/4-small.png)](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/4.png) +[![](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/5-small.png)](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/5.png) +[![](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/6-small.png)](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/6.png) +[![](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/7-small.png)](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/7.png) **NOTE:** The class has recently undergone a major rewrite. The old version is available in the [legacy](https://github.com/jdg/MBProgressHUD/tree/legacy) branch, should you need it. From ec887003cccd08ab9fedab7cc341ef6e0b73f1c2 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 12 Nov 2017 09:51:07 +0100 Subject: [PATCH 099/173] Release 1.1 --- Framework-Info.plist | 2 +- Framework-tvOS-Info.plist | 2 +- MBProgressHUD.h | 2 +- MBProgressHUD.m | 2 +- MBProgressHUD.podspec | 2 +- README.mdown | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Framework-Info.plist b/Framework-Info.plist index d3de8eefb..a6f720ec9 100644 --- a/Framework-Info.plist +++ b/Framework-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.0 + 1.1 CFBundleSignature ???? CFBundleVersion diff --git a/Framework-tvOS-Info.plist b/Framework-tvOS-Info.plist index fbe1e6b31..d63d29010 100644 --- a/Framework-tvOS-Info.plist +++ b/Framework-tvOS-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.0 + 1.1 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPrincipalClass diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 2e2adf45a..a7b54ee97 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -1,6 +1,6 @@ // // MBProgressHUD.h -// Version 1.0.0 +// Version 1.1.0 // Created by Matej Bukovinski on 2.4.09. // diff --git a/MBProgressHUD.m b/MBProgressHUD.m index a076200f7..1bcf9e99d 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -1,6 +1,6 @@ // // MBProgressHUD.m -// Version 1.0.0 +// Version 1.1.0 // Created by Matej Bukovinski on 2.4.09. // diff --git a/MBProgressHUD.podspec b/MBProgressHUD.podspec index 9f6d9d801..0cb96d743 100644 --- a/MBProgressHUD.podspec +++ b/MBProgressHUD.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "MBProgressHUD" - s.version = "1.0.0" + s.version = "1.1.0" 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 1737beb02..21ba843bb 100644 --- a/README.mdown +++ b/README.mdown @@ -31,13 +31,13 @@ You will need the latest developer tools in order to build `MBProgressHUD`. Old [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', '~> 1.0.0'` +1. Add a pod entry for MBProgressHUD to your Podfile `pod 'MBProgressHUD', '~> 1.1.0'` 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" ~> 1.0.0` +1. Add MBProgressHUD to your Cartfile. e.g., `github "jdg/MBProgressHUD" ~> 1.1.0` 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. From 7e02366094d7ce95b716dda735e4cdfc4368eb2f Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 12 Nov 2017 11:28:10 +0100 Subject: [PATCH 100/173] Bump deployment target --- MBProgressHUD.podspec | 2 +- MBProgressHUD.xcodeproj/project.pbxproj | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/MBProgressHUD.podspec b/MBProgressHUD.podspec index 0cb96d743..9196f4d03 100644 --- a/MBProgressHUD.podspec +++ b/MBProgressHUD.podspec @@ -12,7 +12,7 @@ Pod::Spec.new do |s| s.license = { :type => 'MIT', :file => 'LICENSE' } s.author = { 'Matej Bukovinski' => 'matej@bukovinski.com' } s.source = { :git => "https://github.com/matej/MBProgressHUD.git", :tag => s.version.to_s } - s.ios.deployment_target = '6.0' + s.ios.deployment_target = '8.0' s.tvos.deployment_target = '9.0' s.source_files = '*.{h,m}' s.frameworks = "CoreGraphics", "QuartzCore" diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index 6f35ac63a..cff9333cc 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -379,7 +379,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)"; @@ -414,7 +413,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)"; From 8839e5798751dda301b0256a18da541d65aecbf9 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 12 Nov 2017 16:11:49 +0100 Subject: [PATCH 101/173] Prevent calling UI code on background threads --- Demo/HudDemo/MBHudDemoViewController.m | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Demo/HudDemo/MBHudDemoViewController.m b/Demo/HudDemo/MBHudDemoViewController.m index f08ac222a..7f890579d 100644 --- a/Demo/HudDemo/MBHudDemoViewController.m +++ b/Demo/HudDemo/MBHudDemoViewController.m @@ -259,7 +259,7 @@ - (void)modeSwitchingExample { dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ // Do something useful in the background and update the HUD periodically. - [self doSomeWorkWithMixedProgress]; + [self doSomeWorkWithMixedProgress:hud]; dispatch_async(dispatch_get_main_queue(), ^{ [hud hideAnimated:YES]; }); @@ -340,8 +340,7 @@ - (void)doSomeWorkWithProgress { } } -- (void)doSomeWorkWithMixedProgress { - MBProgressHUD *hud = [MBProgressHUD HUDForView:self.navigationController.view]; +- (void)doSomeWorkWithMixedProgress:(MBProgressHUD *)hud { // Indeterminate mode sleep(2); // Switch to determinate mode From 643b58c62f5083a61780dcdc3c4c87a20413f199 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 12 Nov 2017 16:25:27 +0100 Subject: [PATCH 102/173] Remove deprecated code --- MBProgressHUD.h | 36 -------- MBProgressHUD.m | 240 +----------------------------------------------- 2 files changed, 4 insertions(+), 272 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index a7b54ee97..f7793b797 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -404,40 +404,4 @@ NS_ASSUME_NONNULL_BEGIN @end -@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."))); - -- (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."))); - -- (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:(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:(nullable MBProgressHUDCompletionBlock)completion __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."))); -@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."))); -@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."))); -@property (assign, nonatomic) BOOL dimBackground __attribute__((deprecated("Customize HUD background properties instead."))); -@property (strong, nonatomic) UIColor *activityIndicatorColor __attribute__((deprecated("Use UIAppearance to customize UIActivityIndicatorView. E.g.: [UIActivityIndicatorView appearanceWhenContainedIn:[MBProgressHUD class], nil].color = [UIColor redColor];"))); -@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 1bcf9e99d..036198d2a 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -228,10 +228,7 @@ - (void)showUsingAnimation:(BOOL)animated { if (animated) { [self animateIn:YES withType:self.animationType completion:NULL]; } else { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - self.bezelView.alpha = self.opacity; -#pragma clang diagnostic pop + self.bezelView.alpha = 1.f; self.backgroundView.alpha = 1.f; } } @@ -276,11 +273,9 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple } else if (!animatingIn && type == MBProgressHUDAnimationZoomOut) { bezelView.transform = small; } -#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; + CGFloat alpha = animatingIn ? 1.f : 0.f; + bezelView.alpha = alpha; + self.backgroundView.alpha = alpha; }; // Spring animations are nicer, but only available on iOS 7+ @@ -443,13 +438,6 @@ - (void)updateViewsForColor:(UIColor *)color { self.detailsLabel.textColor = color; [self.button setTitleColor:color forState:UIControlStateNormal]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - if (self.activityIndicatorColor) { - color = self.activityIndicatorColor; - } -#pragma clang diagnostic pop - // UIAppearance settings are prioritized. If they are preset the set color is ignored. UIView *indicator = self.indicator; @@ -1226,226 +1214,6 @@ - (void)updateViewsForColor:(UIColor *)color { @end -@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 hideAnimated: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 { - 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 - 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 (^)(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:(nullable 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 { - return self.label.text; -} - -- (void)setLabelText:(NSString *)labelText { - MBMainThreadAssert(); - self.label.text = labelText; -} - -- (UIFont *)labelFont { - return self.label.font; -} - -- (void)setLabelFont:(UIFont *)labelFont { - MBMainThreadAssert(); - self.label.font = labelFont; -} - -- (UIColor *)labelColor { - return self.label.textColor; -} - -- (void)setLabelColor:(UIColor *)labelColor { - MBMainThreadAssert(); - self.label.textColor = labelColor; -} - -- (NSString *)detailsLabelText { - return self.detailsLabel.text; -} - -- (void)setDetailsLabelText:(NSString *)detailsLabelText { - MBMainThreadAssert(); - self.detailsLabel.text = detailsLabelText; -} - -- (UIFont *)detailsLabelFont { - return self.detailsLabel.font; -} - -- (void)setDetailsLabelFont:(UIFont *)detailsLabelFont { - MBMainThreadAssert(); - self.detailsLabel.font = detailsLabelFont; -} - -- (UIColor *)detailsLabelColor { - return self.detailsLabel.textColor; -} - -- (void)setDetailsLabelColor:(UIColor *)detailsLabelColor { - MBMainThreadAssert(); - self.detailsLabel.textColor = detailsLabelColor; -} - -- (CGFloat)opacity { - return _opacity; -} - -- (void)setOpacity:(CGFloat)opacity { - MBMainThreadAssert(); - _opacity = opacity; -} - -- (UIColor *)color { - return self.bezelView.color; -} - -- (void)setColor:(UIColor *)color { - MBMainThreadAssert(); - self.bezelView.color = color; -} - -- (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 { - 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(); - self.backgroundView.style = MBProgressHUDBackgroundStyleSolidColor; - self.backgroundView.color = dimBackground ? [UIColor colorWithWhite:0.f alpha:.2f] : [UIColor clearColor]; -} - -- (CGSize)size { - return self.bezelView.frame.size; -} - -- (UIColor *)activityIndicatorColor { - return _activityIndicatorColor; -} - -- (void)setActivityIndicatorColor:(UIColor *)activityIndicatorColor { - if (activityIndicatorColor != _activityIndicatorColor) { - _activityIndicatorColor = activityIndicatorColor; - UIActivityIndicatorView *indicator = (UIActivityIndicatorView *)self.indicator; - if ([indicator isKindOfClass:[UIActivityIndicatorView class]]) { - [indicator setColor:activityIndicatorColor]; - } - } -} - -@end - @implementation MBProgressHUDRoundedButton #pragma mark - Lifecycle From d4166737ca921777255e85ad222e9020d9eaa3a9 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 12 Nov 2017 16:35:32 +0100 Subject: [PATCH 103/173] Improve documentation --- MBProgressHUD.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index f7793b797..c17611583 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -189,6 +189,8 @@ NS_ASSUME_NONNULL_BEGIN * not be shown at all. * This may be used to prevent HUD display for very short tasks. * Defaults to 0 (no grace time). + * @note The graceTime needs to be set before the hud is shown. You thus can't use `showHUDAddedTo:animated:`, + * but instead need to alloc / init the HUD, configure the grace time and than show it manually. */ @property (assign, nonatomic) NSTimeInterval graceTime; From 364a0fad0b38d926ec7267ffae3e0462d770d257 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 12 Nov 2017 16:57:56 +0100 Subject: [PATCH 104/173] Remove a deprecated property --- MBProgressHUD.m | 3 --- 1 file changed, 3 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 036198d2a..f7807fb55 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -44,9 +44,6 @@ @interface MBProgressHUD () { @property (nonatomic, weak) NSTimer *hideDelayTimer; @property (nonatomic, weak) CADisplayLink *progressObjectDisplayLink; -// Deprecated -@property (assign) BOOL taskInProgress; - @end From d34d348a6ac49585914aef10b510a3b299242429 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 12 Nov 2017 17:04:42 +0100 Subject: [PATCH 105/173] Test initializers --- Demo/HudTests/HudTests.m | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Demo/HudTests/HudTests.m b/Demo/HudTests/HudTests.m index 58c363610..68f79bab3 100644 --- a/Demo/HudTests/HudTests.m +++ b/Demo/HudTests/HudTests.m @@ -43,6 +43,17 @@ @interface HudTests : XCTestCase @implementation HudTests +#pragma mark - Initialization + +- (void)testInitializers { + XCTAssertNotNil([[MBProgressHUD alloc] initWithView:[UIView new]]); + UIView *nilView = nil; + XCTAssertThrows([[MBProgressHUD alloc] initWithView:nilView]); + XCTAssertNotNil([[MBProgressHUD alloc] initWithFrame:CGRectZero]); + NSKeyedUnarchiver *dummyUnarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:[NSData data]]; + XCTAssertNotNil([[MBProgressHUD alloc] initWithCoder:dummyUnarchiver]); +} + #pragma mark - Convenience - (void)testNonAnimatedConvenienceHUDPresentation { From ef9bd9679f0d38c170fb1e850731177bc5ba08e6 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 12 Nov 2017 18:17:33 +0100 Subject: [PATCH 106/173] Test some HUD modes --- Demo/HudTests/HudTests.m | 69 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/Demo/HudTests/HudTests.m b/Demo/HudTests/HudTests.m index 68f79bab3..ec3676659 100644 --- a/Demo/HudTests/HudTests.m +++ b/Demo/HudTests/HudTests.m @@ -131,6 +131,58 @@ - (void)testCompletionBlock { [self waitForExpectationsWithTimeout:5. handler:nil]; } +/////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - Modes + +- (void)testRoundDeterminate { + UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIView *rootView = rootViewController.view; + + MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; + hud.mode = MBProgressHUDModeDeterminate; + [rootView addSubview:hud]; + [hud showAnimated:NO]; + + MBTestHUDIsVisible(hud, rootView); + XCTAssertNotNil([self view:hud firstSubviewOfClass:[MBRoundProgressView class]]); + + XCTAssertTrue([MBProgressHUD hideHUDForView:rootView animated:NO], @"The HUD should be found and removed."); + MBTestHUDIsHidenAndRemoved(hud, rootView); +} + +- (void)testRoundAnnularDeterminate { + UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIView *rootView = rootViewController.view; + + MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; + hud.mode = MBProgressHUDModeAnnularDeterminate; + [rootView addSubview:hud]; + [hud showAnimated:NO]; + + MBTestHUDIsVisible(hud, rootView); + XCTAssertNotNil([self view:hud firstSubviewOfClass:[MBRoundProgressView class]]); + + XCTAssertTrue([MBProgressHUD hideHUDForView:rootView animated:NO], @"The HUD should be found and removed."); + MBTestHUDIsHidenAndRemoved(hud, rootView); +} + +- (void)testDeterminateHorizontalBar { + UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIView *rootView = rootViewController.view; + + MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; + hud.mode = MBProgressHUDModeDeterminateHorizontalBar; + [rootView addSubview:hud]; + [hud showAnimated:NO]; + + MBTestHUDIsVisible(hud, rootView); + XCTAssertNotNil([self view:hud firstSubviewOfClass:[MBBarProgressView class]]); + + XCTAssertTrue([MBProgressHUD hideHUDForView:rootView animated:NO], @"The HUD should be found and removed."); + MBTestHUDIsHidenAndRemoved(hud, rootView); + +} + #pragma mark - Delay - (void)testDelayedHide { @@ -369,4 +421,21 @@ - (void)hudWasHidden:(MBProgressHUD *)hud { self.hideExpectation = nil; } +/////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - Helpers + +- (nullable UIView *)view:(UIView *)view firstSubviewOfClass:(Class)clazz { + for (__unsafe_unretained UIView *subview in view.subviews) { + if ([subview isKindOfClass:clazz]) { + return subview; + } + } + __unsafe_unretained UIView *theView; + for (__unsafe_unretained UIView *subview in view.subviews) { + theView = [self view:subview firstSubviewOfClass:clazz]; + if (theView) { break; } + } + return theView; +} + @end From f851a0bde0a17271b2dac9c85ef8377f58fe3ed6 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Tue, 14 Nov 2017 09:11:12 +0100 Subject: [PATCH 107/173] Add CONTRIBUTING guidelines --- CONTRIBUTING.md | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..9412ac707 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,64 @@ +Please take a moment to review this document in order to make the contribution +process easy and effective for everyone involved. + + +# Using the issue tracker + +The issue tracker is the preferred channel for [bug reports](#bugs) and +[features requests](#features), but please respect the following restriction: + +* Please **do not** use the issue tracker for personal support requests (use + a service like [Stack Overflow](http://stackoverflow.com) instead). + + +## Bug reports + +A bug is a _demonstrable problem_ that is caused by the code in the repository. +Good bug reports are extremely helpful - thank you! + +Guidelines for bug reports: + +1. **Use the GitHub issue search** — check if the issue has already been + reported. + +2. **Check if the issue has been fixed** — try to reproduce it using the + latest `master` branch in the repository. + +3. **Isolate the problem** — provide exact reporduction steps, preferably + in form of a failing test case or by providing modification steps in the + `MBProgressHUD` Demo application. + +A good bug report shouldn't leave others needing to chase you up for more +information. Please try to be as detailed as possible in your report. What is +your environment? What steps will reproduce the issue? What iOS version did +you use? What would you expect to be the outcome? + + + +## Feature requests + +Feature requests are welcome. But take a moment to find out whether your idea +fits with the scope and aims of the project. It's up to *you* to make a strong +case to convince the project's developers of the merits of this feature. Please +provide as much detail and context as possible. + + + +# Pull requests + +Good pull requests - patches, improvements, new features - are a fantastic +help. They should remain focused in scope and avoid containing unrelated +commits. + +**Please ask first** before embarking on any significant pull request (e.g. +implementing features, refactoring code, porting to a different language), +otherwise you risk spending a lot of time working on something that the +project's developers might not want to merge into the project. + +Please adhere to the coding conventions used throughout a project (indentation, +accurate comments, etc.) and any other requirements (such as test coverage). + +**IMPORTANT**: By submitting a patch, you agree to allow the project owner to +license your work under the same license as that used by the project. + +This document is based on https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md. \ No newline at end of file From 16e8622f52d08bc6d2d4a47e7b01d756ba2ef4f7 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Wed, 29 Nov 2017 09:27:03 +0100 Subject: [PATCH 108/173] Prevent a race when invalidating the hide timer --- MBProgressHUD.m | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index f7807fb55..d821b30a9 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -197,6 +197,7 @@ - (void)handleMinShowTimer:(NSTimer *)theTimer { } - (void)handleHideTimer:(NSTimer *)timer { + NSLog(@"Handle hide timer!"); [self hideAnimated:[timer.userInfo boolValue]]; } @@ -231,6 +232,12 @@ - (void)showUsingAnimation:(BOOL)animated { } - (void)hideUsingAnimation:(BOOL)animated { + // Cancel any scheduled hideDelayed: calls. + // This needs to happen here instead of in done, + // to avoid races if another hideAnimated:afterDelay: + // call comes in while the HUD is animating out. + [self.hideDelayTimer invalidate]; + if (animated && self.showStarted) { self.showStarted = nil; [self animateIn:NO withType:self.animationType completion:^(BOOL finished) { @@ -286,8 +293,6 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple } - (void)done { - // Cancel any scheduled hideDelayed: calls - [self.hideDelayTimer invalidate]; [self setNSProgressDisplayLinkEnabled:NO]; if (self.hasFinished) { From 1f1d7ce8bdb6a82d9275163323d503c221cdfe65 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Wed, 29 Nov 2017 09:28:36 +0100 Subject: [PATCH 109/173] Use the new method signature in comments --- MBProgressHUD.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index d821b30a9..d0777a746 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -175,7 +175,7 @@ - (void)hideAnimated:(BOOL)animated { } - (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay { - // Cancel any scheduled hideDelayed: calls + // Cancel any scheduled hideAnimated:afterDelay: calls [self.hideDelayTimer invalidate]; NSTimer *timer = [NSTimer timerWithTimeInterval:delay target:self selector:@selector(handleHideTimer:) userInfo:@(animated) repeats:NO]; @@ -214,7 +214,7 @@ - (void)showUsingAnimation:(BOOL)animated { [self.bezelView.layer removeAllAnimations]; [self.backgroundView.layer removeAllAnimations]; - // Cancel any scheduled hideDelayed: calls + // Cancel any scheduled hideAnimated:afterDelay: calls [self.hideDelayTimer invalidate]; self.showStarted = [NSDate date]; @@ -232,7 +232,7 @@ - (void)showUsingAnimation:(BOOL)animated { } - (void)hideUsingAnimation:(BOOL)animated { - // Cancel any scheduled hideDelayed: calls. + // Cancel any scheduled hideAnimated:afterDelay: calls. // This needs to happen here instead of in done, // to avoid races if another hideAnimated:afterDelay: // call comes in while the HUD is animating out. From 549fa2854636d00225819a7b120c505b324b5dd9 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Wed, 29 Nov 2017 10:00:37 +0100 Subject: [PATCH 110/173] Add a test case for the hide delayed race --- Demo/HudTests/HudTests.m | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/Demo/HudTests/HudTests.m b/Demo/HudTests/HudTests.m index ec3676659..330538e2d 100644 --- a/Demo/HudTests/HudTests.m +++ b/Demo/HudTests/HudTests.m @@ -26,10 +26,15 @@ XCTAssertEqual(hud.bezelView.alpha, 1.f, @"The HUD should be visible."); \ } while (0) +#define MBTestHUDIsHiden(hud, rootView) \ +do { \ +XCTAssertEqual(hud.alpha, 0.f, @"The hud should be faded out."); \ +} while (0) + #define MBTestHUDIsHidenAndRemoved(hud, rootView) \ do { \ XCTAssertFalse([rootView.subviews containsObject:hud], @"The HUD should not be part of the view hierarchy."); \ -XCTAssertEqual(hud.alpha, 0.f, @"The hud should be faded out."); \ +MBTestHUDIsHiden(hud, rootView); \ XCTAssertNil(hud.superview, @"The HUD should not have a superview."); \ } while (0) @@ -216,6 +221,34 @@ - (void)testDelayedHide { MBTestHUDIsHidenAndRemoved(hud, rootView); } +- (void)testDelayedHideDoesNotRace { + // https://github.com/jdg/MBProgressHUD/issues/503 + UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIView *rootView = rootViewController.view; + + MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; + [rootView addSubview:hud]; + + [hud showAnimated:YES]; + [hud hideAnimated:YES afterDelay:0.3]; + MBTestHUDIsVisible(hud, rootView); + + XCTestExpectation *hideCheckExpectation = [self expectationWithDescription:@"Hide check"]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.3 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ + [hud showAnimated:YES]; + [hud hideAnimated:YES afterDelay:0.3]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + MBTestHUDIsHiden(hud, rootView); + [hideCheckExpectation fulfill]; + }); + }); + + [self waitForExpectationsWithTimeout:5. handler:nil]; + + [hud removeFromSuperview]; + MBTestHUDIsHidenAndRemoved(hud, rootView); +} + #pragma mark - Ruse - (void)testNonAnimatedHudReuse { From c63cf1840e70f2980e9fae992866945389fa07f1 Mon Sep 17 00:00:00 2001 From: jason Date: Thu, 30 Nov 2017 09:52:15 -0800 Subject: [PATCH 111/173] Remove NSLog --- MBProgressHUD.m | 1 - 1 file changed, 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index d0777a746..a70030373 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -197,7 +197,6 @@ - (void)handleMinShowTimer:(NSTimer *)theTimer { } - (void)handleHideTimer:(NSTimer *)timer { - NSLog(@"Handle hide timer!"); [self hideAnimated:[timer.userInfo boolValue]]; } From b74d8e890e02a60bb36163820990429a1126582e Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Wed, 7 Feb 2018 18:39:05 +0100 Subject: [PATCH 112/173] Add HUD shape test --- Demo/HudTests/HudTests.m | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/Demo/HudTests/HudTests.m b/Demo/HudTests/HudTests.m index 330538e2d..b94cf2e58 100644 --- a/Demo/HudTests/HudTests.m +++ b/Demo/HudTests/HudTests.m @@ -136,7 +136,6 @@ - (void)testCompletionBlock { [self waitForExpectationsWithTimeout:5. handler:nil]; } -/////////////////////////////////////////////////////////////////////////////////////////// #pragma mark - Modes - (void)testRoundDeterminate { @@ -444,6 +443,31 @@ - (void)testHideBeforeGraceTimeElapsed { MBTestHUDIsHidenAndRemoved(hud, rootView); } +#pragma mark - Customization + +- (void)testShape { + UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIView *rootView = rootViewController.view; + + MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; + hud.removeFromSuperViewOnHide = YES; + hud.offset = CGPointMake(50, 50); + hud.square = YES; + hud.label.text = @"Some long text..."; + [rootView addSubview:hud]; + [hud showAnimated:NO]; + + [hud setNeedsLayout]; + [hud layoutIfNeeded]; + + CGRect frame = hud.bezelView.frame; + XCTAssertEqual(frame.size.width, frame.size.height); + + [hud hideAnimated:NO]; + + MBTestHUDIsHidenAndRemoved(hud, rootView); +} + #pragma mark - MBProgressHUDDelegate - (void)hudWasHidden:(MBProgressHUD *)hud { @@ -454,7 +478,6 @@ - (void)hudWasHidden:(MBProgressHUD *)hud { self.hideExpectation = nil; } -/////////////////////////////////////////////////////////////////////////////////////////// #pragma mark - Helpers - (nullable UIView *)view:(UIView *)view firstSubviewOfClass:(Class)clazz { From 56fe3e6a87e06979476306e71112e937a034b6a1 Mon Sep 17 00:00:00 2001 From: Nicolas Gomollon Date: Mon, 19 Feb 2018 16:02:43 -0800 Subject: [PATCH 113/173] Fixed bug with subview ordering. Fixed bugs jdg/MBProgressHUD#516 and jdg/MBProgressHUD#509 --- MBProgressHUD.m | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index a70030373..336e838c5 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -1155,13 +1155,26 @@ - (void)setBlurEffectStyle:(UIBlurEffectStyle)blurEffectStyle { #pragma mark - Views - (void)updateForBackgroundStyle { +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV + if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0) { + [self.effectView removeFromSuperview]; + self.effectView = nil; + } else { +#endif +#if !TARGET_OS_TV + [self.toolbar removeFromSuperview]; + self.toolbar = nil; +#endif +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV + } +#endif MBProgressHUDBackgroundStyle style = self.style; if (style == MBProgressHUDBackgroundStyleBlur) { #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0) { UIBlurEffect *effect = [UIBlurEffect effectWithStyle:self.blurEffectStyle]; UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect]; - [self addSubview:effectView]; + [self insertSubview:effectView atIndex:0]; effectView.frame = self.bounds; effectView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; self.backgroundColor = self.color; @@ -1181,19 +1194,6 @@ - (void)updateForBackgroundStyle { } #endif } else { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV - if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0) { - [self.effectView removeFromSuperview]; - self.effectView = nil; - } else { -#endif -#if !TARGET_OS_TV - [self.toolbar removeFromSuperview]; - self.toolbar = nil; -#endif -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV - } -#endif self.backgroundColor = self.color; } } From e23fad1476ce61d66016d2e2cd720368add857b3 Mon Sep 17 00:00:00 2001 From: Liu Peng Date: Tue, 6 Mar 2018 22:43:05 +0800 Subject: [PATCH 114/173] Remove deprecated code --- MBProgressHUD.m | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index a70030373..11aaef854 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -25,11 +25,7 @@ static const CGFloat MBDefaultDetailsLabelFontSize = 12.f; -@interface MBProgressHUD () { - // Deprecated - UIColor *_activityIndicatorColor; - CGFloat _opacity; -} +@interface MBProgressHUD () @property (nonatomic, assign) BOOL useAnimation; @property (nonatomic, assign, getter=hasFinished) BOOL finished; @@ -93,7 +89,6 @@ - (void)commonInit { _animationType = MBProgressHUDAnimationFade; _mode = MBProgressHUDModeIndeterminate; _margin = 20.0f; - _opacity = 1.f; _defaultMotionEffectsEnabled = YES; // Default color, depending on the current iOS version From d591e1a8e2e54cd488de09f017d989e47f187016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoine=20C=C5=93ur?= Date: Mon, 23 Apr 2018 13:24:28 +0800 Subject: [PATCH 115/173] Updating project for Xcode 9.3 recommended settings. --- Demo/HudDemo.xcodeproj/project.pbxproj | 8 +++++++- .../xcshareddata/xcschemes/HudDemo.xcscheme | 4 +--- .../xcshareddata/xcschemes/HudDemoTV.xcscheme | 4 +--- .../xcshareddata/xcschemes/HudTests.xcscheme | 4 +--- MBProgressHUD.xcodeproj/project.pbxproj | 6 +++++- .../xcschemes/MBProgressHUD Framework tvOS.xcscheme | 2 +- .../xcschemes/MBProgressHUD Framework.xcscheme | 4 +--- .../xcshareddata/xcschemes/MBProgressHUD.xcscheme | 4 +--- .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ 9 files changed, 26 insertions(+), 18 deletions(-) create mode 100644 MBProgressHUD.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index 81c600267..58adbe665 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -286,7 +286,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = MB; - LastUpgradeCheck = 0900; + LastUpgradeCheck = 0930; ORGANIZATIONNAME = "Matej Bukovinski"; TargetAttributes = { D27F18401D3B5878009D7482 = { @@ -463,11 +463,13 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; @@ -501,11 +503,13 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; @@ -538,6 +542,7 @@ CLANG_ENABLE_MODULES = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -570,6 +575,7 @@ CLANG_ENABLE_MODULES = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; diff --git a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme index 490e95fef..b10f26091 100644 --- a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme +++ b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme @@ -1,6 +1,6 @@ @@ -62,7 +61,6 @@ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" displayScaleIsEnabled = "NO" displayScale = "1.00" - language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemoTV.xcscheme b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemoTV.xcscheme index 03e88b3f4..ed9b534d5 100644 --- a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemoTV.xcscheme +++ b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemoTV.xcscheme @@ -1,6 +1,6 @@ @@ -46,7 +45,6 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudTests.xcscheme b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudTests.xcscheme index e2ded2f05..3c34a922d 100644 --- a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudTests.xcscheme +++ b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudTests.xcscheme @@ -1,6 +1,6 @@ @@ -37,7 +36,6 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme index 1c8052674..415ed7d69 100644 --- a/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme +++ b/MBProgressHUD.xcodeproj/xcshareddata/xcschemes/MBProgressHUD.xcscheme @@ -1,6 +1,6 @@ @@ -37,7 +36,6 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/MBProgressHUD.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/MBProgressHUD.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/MBProgressHUD.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + From 27c21b2907a96eff8780ce45f16a6f18334b917b Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 4 Nov 2018 18:36:27 +0100 Subject: [PATCH 116/173] Remove whitespace --- MBProgressHUD.podspec | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.podspec b/MBProgressHUD.podspec index 9196f4d03..29153e9e9 100644 --- a/MBProgressHUD.podspec +++ b/MBProgressHUD.podspec @@ -3,9 +3,9 @@ Pod::Spec.new do |s| s.version = "1.1.0" s.summary = "An iOS activity indicator view." s.description = <<-DESC - 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 + 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. DESC s.homepage = "http://www.bukovinski.com" From 257ec88cbc207fc7a55baefc1b1c129d354d8bd7 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 4 Nov 2018 18:53:31 +0100 Subject: [PATCH 117/173] Remove legacy checks (deployment target is already >= iOS 8) --- MBProgressHUD.m | 144 ++++++++++-------------------------------------- 1 file changed, 30 insertions(+), 114 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index a11cb5e44..b96d99a0e 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -7,15 +7,6 @@ #import "MBProgressHUD.h" #import - -#ifndef kCFCoreFoundationVersionNumber_iOS_7_0 - #define kCFCoreFoundationVersionNumber_iOS_7_0 847.20 -#endif - -#ifndef kCFCoreFoundationVersionNumber_iOS_8_0 - #define kCFCoreFoundationVersionNumber_iOS_8_0 1129.15 -#endif - #define MBMainThreadAssert() NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); CGFloat const MBProgressMaxOffset = 1000000.f; @@ -90,10 +81,8 @@ - (void)commonInit { _mode = MBProgressHUDModeIndeterminate; _margin = 20.0f; _defaultMotionEffectsEnabled = YES; + _contentColor = [UIColor colorWithWhite:0.f alpha:0.7f]; - // 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]; @@ -275,15 +264,7 @@ - (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type comple bezelView.alpha = alpha; self.backgroundView.alpha = alpha; }; - - // Spring animations are nicer, but only available on iOS 7+ -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 || TARGET_OS_TV - if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0) { - [UIView animateWithDuration:0.3 delay:0. usingSpringWithDamping:1.f initialSpringVelocity:0.f options:UIViewAnimationOptionBeginFromCurrentState animations:animations completion:completion]; - return; - } -#endif - [UIView animateWithDuration:0.3 delay:0. options:UIViewAnimationOptionBeginFromCurrentState animations:animations completion:completion]; + [UIView animateWithDuration:0.3 delay:0. usingSpringWithDamping:1.f initialSpringVelocity:0.f options:UIViewAnimationOptionBeginFromCurrentState animations:animations completion:completion]; } - (void)done { @@ -870,11 +851,10 @@ - (void)setBackgroundTintColor:(UIColor *)backgroundTintColor { - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); - BOOL isPreiOS7 = kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0; if (_annular) { // Draw background - CGFloat lineWidth = isPreiOS7 ? 5.f : 2.f; + CGFloat lineWidth = 2.f; UIBezierPath *processBackgroundPath = [UIBezierPath bezierPath]; processBackgroundPath.lineWidth = lineWidth; processBackgroundPath.lineCapStyle = kCGLineCapButt; @@ -887,7 +867,7 @@ - (void)drawRect:(CGRect)rect { [processBackgroundPath stroke]; // Draw progress UIBezierPath *processPath = [UIBezierPath bezierPath]; - processPath.lineCapStyle = isPreiOS7 ? kCGLineCapRound : kCGLineCapSquare; + processPath.lineCapStyle = kCGLineCapSquare; processPath.lineWidth = lineWidth; endAngle = (self.progress * 2 * (float)M_PI) + startAngle; [processPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; @@ -902,33 +882,20 @@ - (void)drawRect:(CGRect)rect { [_progressTintColor setStroke]; [_backgroundTintColor setFill]; CGContextSetLineWidth(context, lineWidth); - if (isPreiOS7) { - CGContextFillEllipseInRect(context, circleRect); - } CGContextStrokeEllipseInRect(context, circleRect); // 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); - 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 overlapping when _progressTintColor alpha < 1.f. - CGContextSetBlendMode(context, kCGBlendModeCopy); - [_progressTintColor set]; - [processPath stroke]; - } + UIBezierPath *processPath = [UIBezierPath bezierPath]; + processPath.lineCapStyle = kCGLineCapButt; + processPath.lineWidth = lineWidth * 2.f; + 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 overlapping when _progressTintColor alpha < 1.f. + CGContextSetBlendMode(context, kCGBlendModeCopy); + [_progressTintColor set]; + [processPath stroke]; } } @@ -959,8 +926,7 @@ - (id)initWithFrame:(CGRect)frame { #pragma mark - Layout - (CGSize)intrinsicContentSize { - BOOL isPreiOS7 = kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0; - return CGSizeMake(120.f, isPreiOS7 ? 20.f : 10.f); + return CGSizeMake(120.f, 10.f); } #pragma mark - Properties @@ -1067,12 +1033,7 @@ - (void)drawRect:(CGRect)rect { @interface MBBackgroundView () -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV @property UIVisualEffectView *effectView; -#endif -#if !TARGET_OS_TV -@property UIToolbar *toolbar; -#endif @end @@ -1083,20 +1044,9 @@ @implementation MBBackgroundView - (instancetype)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { - if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0) { - _style = MBProgressHUDBackgroundStyleBlur; -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV - _blurEffectStyle = UIBlurEffectStyleLight; -#endif - if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0) { - _color = [UIColor colorWithWhite:0.8f alpha:0.6f]; - } else { - _color = [UIColor colorWithWhite:0.95f alpha:0.6f]; - } - } else { - _style = MBProgressHUDBackgroundStyleSolidColor; - _color = [[UIColor blackColor] colorWithAlphaComponent:0.8]; - } + _style = MBProgressHUDBackgroundStyleBlur; + _blurEffectStyle = UIBlurEffectStyleLight; + _color = [UIColor colorWithWhite:0.8f alpha:0.6f]; self.clipsToBounds = YES; @@ -1115,9 +1065,6 @@ - (CGSize)intrinsicContentSize { #pragma mark - Appearance - (void)setStyle:(MBProgressHUDBackgroundStyle)style { - if (style == MBProgressHUDBackgroundStyleBlur && kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0) { - style = MBProgressHUDBackgroundStyleSolidColor; - } if (_style != style) { _style = style; [self updateForBackgroundStyle]; @@ -1150,44 +1097,19 @@ - (void)setBlurEffectStyle:(UIBlurEffectStyle)blurEffectStyle { #pragma mark - Views - (void)updateForBackgroundStyle { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV - if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0) { - [self.effectView removeFromSuperview]; - self.effectView = nil; - } else { -#endif -#if !TARGET_OS_TV - [self.toolbar removeFromSuperview]; - self.toolbar = nil; -#endif -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV - } -#endif + [self.effectView removeFromSuperview]; + self.effectView = nil; + MBProgressHUDBackgroundStyle style = self.style; if (style == MBProgressHUDBackgroundStyleBlur) { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV - if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0) { - UIBlurEffect *effect = [UIBlurEffect effectWithStyle:self.blurEffectStyle]; - UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect]; - [self insertSubview:effectView atIndex:0]; - effectView.frame = self.bounds; - effectView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; - self.backgroundColor = self.color; - self.layer.allowsGroupOpacity = NO; - self.effectView = effectView; - } else { -#endif -#if !TARGET_OS_TV - UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectInset(self.bounds, -100.f, -100.f)]; - toolbar.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; - toolbar.barTintColor = self.color; - toolbar.translucent = YES; - [self addSubview:toolbar]; - self.toolbar = toolbar; -#endif -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV - } -#endif + UIBlurEffect *effect = [UIBlurEffect effectWithStyle:self.blurEffectStyle]; + UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect]; + [self insertSubview:effectView atIndex:0]; + effectView.frame = self.bounds; + effectView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; + self.backgroundColor = self.color; + self.layer.allowsGroupOpacity = NO; + self.effectView = effectView; } else { self.backgroundColor = self.color; } @@ -1195,13 +1117,7 @@ - (void)updateForBackgroundStyle { - (void)updateViewsForColor:(UIColor *)color { if (self.style == MBProgressHUDBackgroundStyleBlur) { - if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0) { - self.backgroundColor = self.color; - } else { -#if !TARGET_OS_TV - self.toolbar.barTintColor = color; -#endif - } + self.backgroundColor = self.color; } else { self.backgroundColor = self.color; } From 80f66aa5e7d62a9de7dff8893ee743b5f82da650 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 4 Nov 2018 19:00:17 +0100 Subject: [PATCH 118/173] Remove iOS 7 header code --- MBProgressHUD.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index c17611583..e9de43a89 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -385,22 +385,18 @@ NS_ASSUME_NONNULL_BEGIN /** * 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. + * Defaults to MBProgressHUDBackgroundStyleBlur. */ @property (nonatomic) MBProgressHUDBackgroundStyle style; -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV /** * The blur effect style, when using MBProgressHUDBackgroundStyleBlur. * Defaults to UIBlurEffectStyleLight. */ @property (nonatomic) UIBlurEffectStyle blurEffectStyle; -#endif /** * 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; From 04747f8b3da0583de2782c932af5579f446d959f Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 4 Nov 2018 19:19:20 +0100 Subject: [PATCH 119/173] Add test for https://github.com/jdg/MBProgressHUD/pull/525 --- Demo/HudTests/HudTests.m | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Demo/HudTests/HudTests.m b/Demo/HudTests/HudTests.m index 330538e2d..bda254d06 100644 --- a/Demo/HudTests/HudTests.m +++ b/Demo/HudTests/HudTests.m @@ -188,6 +188,25 @@ - (void)testDeterminateHorizontalBar { } +#pragma mark - Customization + +- (void)testEffectViewOrderAfterSettingBlurStyle { + UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIView *rootView = rootViewController.view; + + MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; + + [hud.bezelView.subviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) { + XCTAssert(![view isKindOfClass:UIVisualEffectView.class] || idx == 0, @"Just the first subview should be a visual effect view."); + }]; + + hud.bezelView.blurEffectStyle = UIBlurEffectStyleDark; + + [hud.bezelView.subviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) { + XCTAssert(![view isKindOfClass:UIVisualEffectView.class] || idx == 0, @"Just the first subview should be a visual effect view even after changing the blurEffectStyle."); + }]; +} + #pragma mark - Delay - (void)testDelayedHide { From 29b8447b9cb3613b2ad3aecb77b2111f40408865 Mon Sep 17 00:00:00 2001 From: Andy Ron Date: Sat, 5 Jan 2019 11:44:24 +0800 Subject: [PATCH 120/173] Update MBProgressHUD.h --- MBProgressHUD.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index e9de43a89..fb8647cfb 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -183,7 +183,7 @@ NS_ASSUME_NONNULL_BEGIN */ @property (copy, nullable) MBProgressHUDCompletionBlock completionBlock; -/* +/** * 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. From 3c410dd1ff53d97801febed4cf1e3e46776be78f Mon Sep 17 00:00:00 2001 From: Jim Hildensperger Date: Thu, 2 May 2019 14:21:28 +0200 Subject: [PATCH 121/173] Fix typo in comment --- MBProgressHUD.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index e9de43a89..b3854b668 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -179,7 +179,7 @@ NS_ASSUME_NONNULL_BEGIN @property (weak, nonatomic) id delegate; /** - * Called after the HUD is hiden. + * Called after the HUD is hidden. */ @property (copy, nullable) MBProgressHUDCompletionBlock completionBlock; From dcd72533c86cbedce6ff159555a616dda5dd2638 Mon Sep 17 00:00:00 2001 From: Andrey Yurkevivch Date: Fri, 14 Jun 2019 12:15:42 +0300 Subject: [PATCH 122/173] Fix swift compiler error Swift compiler treats `MBProgressHUD.HUDForView(_ view:)` as erroneous method, suggesting a fix-it that replaces the call with `.init(with view:)` Adding an NS_SWIFT_NAME with non-capitalized function name solves the issue (and makes swift API more intuitive) --- MBProgressHUD.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index e9de43a89..473eb8fcf 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -125,7 +125,7 @@ NS_ASSUME_NONNULL_BEGIN * @param view The view that is going to be searched. * @return A reference to the last HUD subview discovered. */ -+ (nullable MBProgressHUD *)HUDForView:(UIView *)view; ++ (nullable MBProgressHUD *)HUDForView:(UIView *)view NS_SWIFT_NAME(forView(_:)); /** * A convenience constructor that initializes the HUD with the view's bounds. Calls the designated constructor with From bdd4ca327252f32ae6e3acab0510933ceb74cfd1 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 14 Jul 2019 21:27:10 +0200 Subject: [PATCH 123/173] Remove obsolete SDK checks --- MBProgressHUD.m | 8 -------- 1 file changed, 8 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index b96d99a0e..d32bec375 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -457,16 +457,13 @@ - (void)updateViewsForColor:(UIColor *)color { ((MBBarProgressView *)indicator).lineColor = color; } } else { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 || TARGET_OS_TV if ([indicator respondsToSelector:@selector(setTintColor:)]) { [indicator setTintColor:color]; } -#endif } } - (void)updateBezelMotionEffects { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 || TARGET_OS_TV MBBackgroundView *bezelView = self.bezelView; if (![bezelView respondsToSelector:@selector(addMotionEffect:)]) return; @@ -490,7 +487,6 @@ - (void)updateBezelMotionEffects { [bezelView removeMotionEffect:effect]; } } -#endif } #pragma mark - Layout @@ -1079,8 +1075,6 @@ - (void)setColor:(UIColor *)color { } } -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 || TARGET_OS_TV - - (void)setBlurEffectStyle:(UIBlurEffectStyle)blurEffectStyle { if (_blurEffectStyle == blurEffectStyle) { return; @@ -1091,8 +1085,6 @@ - (void)setBlurEffectStyle:(UIBlurEffectStyle)blurEffectStyle { [self updateForBackgroundStyle]; } -#endif - /////////////////////////////////////////////////////////////////////////////////////////// #pragma mark - Views From df1a29bfa86fa4ad65bd5fc67fe55ef8de09ee99 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 14 Jul 2019 21:27:29 +0200 Subject: [PATCH 124/173] Update for iOS 8 --- MBProgressHUD-Prefix.pch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MBProgressHUD-Prefix.pch b/MBProgressHUD-Prefix.pch index e81c6697b..98b63cd3e 100644 --- a/MBProgressHUD-Prefix.pch +++ b/MBProgressHUD-Prefix.pch @@ -4,8 +4,8 @@ #import -#ifndef __IPHONE_3_0 -#warning "This project uses features only available in iOS SDK 3.0 and later." +#ifndef __IPHONE_8_0 +#warning "This project uses features only available in iOS SDK 8.0 and later." #endif #ifdef __OBJC__ From 4d90a04699d410b7bc30da0c55b949e61a2cd03f Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 14 Jul 2019 21:28:40 +0200 Subject: [PATCH 125/173] Remove runtime checks They are not needed on iOS 8 and later. --- MBProgressHUD.m | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index d32bec375..2c3b9b10a 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -457,15 +457,12 @@ - (void)updateViewsForColor:(UIColor *)color { ((MBBarProgressView *)indicator).lineColor = color; } } else { - if ([indicator respondsToSelector:@selector(setTintColor:)]) { - [indicator setTintColor:color]; - } + [indicator setTintColor:color]; } } - (void)updateBezelMotionEffects { MBBackgroundView *bezelView = self.bezelView; - if (![bezelView respondsToSelector:@selector(addMotionEffect:)]) return; if (self.defaultMotionEffectsEnabled) { CGFloat effectOffset = 10.f; From f25d9697f2bf6bbf0c9af085e6fcc7be0359e0fe Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 14 Jul 2019 21:57:39 +0200 Subject: [PATCH 126/173] Modify motion effect initialization to ensure the motion effects are not instantiated needlessly. --- MBProgressHUD.m | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 2c3b9b10a..0be35b020 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -26,6 +26,7 @@ @interface MBProgressHUD () @property (nonatomic, strong) NSArray *bezelConstraints; @property (nonatomic, strong) UIView *topSpacer; @property (nonatomic, strong) UIView *bottomSpacer; +@property (nonatomic, strong) UIMotionEffectGroup *bezelMotionEffects; @property (nonatomic, weak) NSTimer *graceTimer; @property (nonatomic, weak) NSTimer *minShowTimer; @property (nonatomic, weak) NSTimer *hideDelayTimer; @@ -44,6 +45,7 @@ @implementation MBProgressHUD + (instancetype)showHUDAddedTo:(UIView *)view animated:(BOOL)animated { MBProgressHUD *hud = [[self alloc] initWithView:view]; + hud.defaultMotionEffectsEnabled = NO; hud.removeFromSuperViewOnHide = YES; [view addSubview:hud]; [hud showAnimated:animated]; @@ -206,6 +208,10 @@ - (void)showUsingAnimation:(BOOL)animated { // Needed in case we hide and re-show with the same NSProgress object attached. [self setNSProgressDisplayLinkEnabled:YES]; + // Set up motion effects only at this point to avoid needlessly + // creating the effect if it was disabled after initialization. + [self updateBezelMotionEffects]; + if (animated) { [self animateIn:YES withType:self.animationType completion:NULL]; } else { @@ -305,7 +311,6 @@ - (void)setupViews { bezelView.alpha = 0.f; [self addSubview:bezelView]; _bezelView = bezelView; - [self updateBezelMotionEffects]; UILabel *label = [UILabel new]; label.adjustsFontSizeToFitWidth = NO; @@ -463,8 +468,9 @@ - (void)updateViewsForColor:(UIColor *)color { - (void)updateBezelMotionEffects { MBBackgroundView *bezelView = self.bezelView; + UIMotionEffectGroup *bezelMotionEffects = self.bezelMotionEffects; - if (self.defaultMotionEffectsEnabled) { + if (self.defaultMotionEffectsEnabled && !bezelMotionEffects) { CGFloat effectOffset = 10.f; UIInterpolatingMotionEffect *effectX = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis]; effectX.maximumRelativeValue = @(effectOffset); @@ -477,12 +483,11 @@ - (void)updateBezelMotionEffects { UIMotionEffectGroup *group = [[UIMotionEffectGroup alloc] init]; group.motionEffects = @[effectX, effectY]; + self.bezelMotionEffects = group; [bezelView addMotionEffect:group]; - } else { - NSArray *effects = [bezelView motionEffects]; - for (UIMotionEffect *effect in effects) { - [bezelView removeMotionEffect:effect]; - } + } else if (bezelMotionEffects) { + self.bezelMotionEffects = nil; + [bezelView removeMotionEffect:bezelMotionEffects]; } } From 71ab8c0b529776be46b5965767e3d7bdfb5f60c5 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 14 Jul 2019 22:10:56 +0200 Subject: [PATCH 127/173] Remove debug code --- MBProgressHUD.m | 1 - 1 file changed, 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 0be35b020..247eaf166 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -45,7 +45,6 @@ @implementation MBProgressHUD + (instancetype)showHUDAddedTo:(UIView *)view animated:(BOOL)animated { MBProgressHUD *hud = [[self alloc] initWithView:view]; - hud.defaultMotionEffectsEnabled = NO; hud.removeFromSuperViewOnHide = YES; [view addSubview:hud]; [hud showAnimated:animated]; From 9a0d8e288df21958be225418d5b7791d42d97b20 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 14 Jul 2019 22:12:49 +0200 Subject: [PATCH 128/173] Disable motion effects by default --- MBProgressHUD.h | 4 +++- MBProgressHUD.m | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index e9de43a89..b3433b63e 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -252,7 +252,9 @@ NS_ASSUME_NONNULL_BEGIN /** * When enabled, the bezel center gets slightly affected by the device accelerometer data. - * Has no effect on iOS < 7.0. Defaults to YES. + * Defaults to NO. + * + * @note This can cause main thread checker assertions on certain devices. https://github.com/jdg/MBProgressHUD/issues/552 */ @property (assign, nonatomic, getter=areDefaultMotionEffectsEnabled) BOOL defaultMotionEffectsEnabled UI_APPEARANCE_SELECTOR; diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 247eaf166..13d4ab756 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -81,7 +81,7 @@ - (void)commonInit { _animationType = MBProgressHUDAnimationFade; _mode = MBProgressHUDModeIndeterminate; _margin = 20.0f; - _defaultMotionEffectsEnabled = YES; + _defaultMotionEffectsEnabled = NO; _contentColor = [UIColor colorWithWhite:0.f alpha:0.7f]; // Transparent background From e2d8b33d03d1431b41227c9bdb89bbbedc0a4c71 Mon Sep 17 00:00:00 2001 From: Lars Schwegmann Date: Thu, 8 Aug 2019 15:27:33 +0200 Subject: [PATCH 129/173] Add iOS 13 Dark Mode support --- MBProgressHUD.m | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 13d4ab756..4e251e2d5 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -82,7 +82,12 @@ - (void)commonInit { _mode = MBProgressHUDModeIndeterminate; _margin = 20.0f; _defaultMotionEffectsEnabled = NO; - _contentColor = [UIColor colorWithWhite:0.f alpha:0.7f]; + + if (@available(iOS 13.0, *)) { + _contentColor = [[UIColor labelColor] colorWithAlphaComponent:0.7f]; + } else { + _contentColor = [UIColor colorWithWhite:0.f alpha:0.7f]; + } // Transparent background self.opaque = NO; @@ -1042,8 +1047,13 @@ @implementation MBBackgroundView - (instancetype)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { _style = MBProgressHUDBackgroundStyleBlur; - _blurEffectStyle = UIBlurEffectStyleLight; - _color = [UIColor colorWithWhite:0.8f alpha:0.6f]; + if (@available(iOS 13.0, *)) { + _blurEffectStyle = UIBlurEffectStyleSystemMaterial; + _color = [[UIColor secondarySystemBackgroundColor] colorWithAlphaComponent:0.8f]; + } else { + _blurEffectStyle = UIBlurEffectStyleLight; + _color = [UIColor colorWithWhite:0.8f alpha:0.6f]; + } self.clipsToBounds = YES; From 0a86894703e869aa5e825c5813113eb9de5b0698 Mon Sep 17 00:00:00 2001 From: Lars Schwegmann Date: Thu, 8 Aug 2019 17:06:15 +0200 Subject: [PATCH 130/173] Change UIBlurEffectStyle --- MBProgressHUD.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 4e251e2d5..52ed40094 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -1048,7 +1048,7 @@ - (instancetype)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { _style = MBProgressHUDBackgroundStyleBlur; if (@available(iOS 13.0, *)) { - _blurEffectStyle = UIBlurEffectStyleSystemMaterial; + _blurEffectStyle = UIBlurEffectStyleRegular; _color = [[UIColor secondarySystemBackgroundColor] colorWithAlphaComponent:0.8f]; } else { _blurEffectStyle = UIBlurEffectStyleLight; From 60983ca46cc7ea5220637ae2974c418217d8d2db Mon Sep 17 00:00:00 2001 From: Emre Berge Ergenekon Date: Wed, 28 Aug 2019 12:48:58 -0400 Subject: [PATCH 131/173] Handle deprecated UIActivityIndicatorViewStyleWhiteLarge when building with iOS 13 SDK --- MBProgressHUD.m | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 13d4ab756..1d874f9c9 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -365,9 +365,16 @@ - (void)updateIndicators { if (mode == MBProgressHUDModeIndeterminate) { if (!isActivityIndicator) { // Update to indeterminate indicator + UIActivityIndicatorView *activityIndicator; [indicator removeFromSuperview]; - indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; - [(UIActivityIndicatorView *)indicator startAnimating]; + if (@available(iOS 13.0, *)) { + activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleLarge]; + activityIndicator.color = [UIColor whiteColor]; + } else { + activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:0 /* UIActivityIndicatorViewStyleWhiteLarge */]; + } + [activityIndicator startAnimating]; + indicator = activityIndicator; [self.bezelView addSubview:indicator]; } } From a570ddafc4504ed41e205cf6ee98b3fb4ae69738 Mon Sep 17 00:00:00 2001 From: Emre Berge Ergenekon Date: Wed, 28 Aug 2019 12:50:00 -0400 Subject: [PATCH 132/173] Don't track status bar orientation on mac catalyst --- MBProgressHUD.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 1d874f9c9..363e58778 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -730,7 +730,7 @@ - (void)updateProgressFromProgressObject { #pragma mark - Notifications - (void)registerForNotifications { -#if !TARGET_OS_TV +#if !TARGET_OS_TV && !TARGET_OS_MACCATALYST NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc addObserver:self selector:@selector(statusBarOrientationDidChange:) @@ -739,13 +739,13 @@ - (void)registerForNotifications { } - (void)unregisterFromNotifications { -#if !TARGET_OS_TV +#if !TARGET_OS_TV && !TARGET_OS_MACCATALYST NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc removeObserver:self name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; #endif } -#if !TARGET_OS_TV +#if !TARGET_OS_TV && !TARGET_OS_MACCATALYST - (void)statusBarOrientationDidChange:(NSNotification *)notification { UIView *superview = self.superview; if (!superview) { From f0e2b694b06b4c543adac69b0dde1a508560d50a Mon Sep 17 00:00:00 2001 From: Daniel Shelley Date: Wed, 20 Nov 2019 10:36:11 -0700 Subject: [PATCH 133/173] fix Xcode 11 warnings, default localization --- .../xcshareddata/xcschemes/HudDemo.xcscheme | 10 +++----- .../xcshareddata/xcschemes/HudDemoTV.xcscheme | 10 +++----- .../xcshareddata/xcschemes/HudTests.xcscheme | 24 ++++++++----------- MBProgressHUD.xcodeproj/project.pbxproj | 7 ++++-- .../MBProgressHUD Framework tvOS.xcscheme | 6 +---- .../MBProgressHUD Framework.xcscheme | 6 +---- .../xcschemes/MBProgressHUD.xcscheme | 6 +---- 7 files changed, 24 insertions(+), 45 deletions(-) diff --git a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme index b10f26091..7bbf185a6 100644 --- a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme +++ b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme @@ -1,6 +1,6 @@ - - - - + + - - - - - - + + - - + + + + @@ -23,17 +32,6 @@ - - - - - - - - - - - - - - - - - - - - Date: Tue, 10 Dec 2019 14:53:32 +0100 Subject: [PATCH 134/173] Only display button if it has no targets and no title. Latest version of Facebook SDK add targets to most buttons in order to track conversions (I guess). --- MBProgressHUD.h | 2 +- MBProgressHUD.m | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index efc3cdd14..eecde54e8 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -302,7 +302,7 @@ NS_ASSUME_NONNULL_BEGIN @property (strong, nonatomic, readonly) UILabel *detailsLabel; /** - * A button that is placed below the labels. Visible only if a target / action is added. + * A button that is placed below the labels. Visible only if a target / action is added and a title is assigned.. */ @property (strong, nonatomic, readonly) UIButton *button; diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 13d4ab756..f666ede9c 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -1142,8 +1142,9 @@ - (void)layoutSubviews { } - (CGSize)intrinsicContentSize { - // Only show if we have associated control events - if (self.allControlEvents == 0) return CGSizeZero; + // Only show if we have associated control events and a title + if ((self.allControlEvents == 0) && ([self titleForState:UIControlStateNormal].length == 0)) + return CGSizeZero; CGSize size = [super intrinsicContentSize]; // Add some side padding size.width += 20.f; From 25aed45cc8aac276219dadd0a53d7a8160865b50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roger=20Jo=CC=88nsson?= Date: Tue, 10 Dec 2019 15:12:11 +0100 Subject: [PATCH 135/173] Changed to an "or" statement. --- MBProgressHUD.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index f666ede9c..e1b0a98bf 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -1143,7 +1143,7 @@ - (void)layoutSubviews { - (CGSize)intrinsicContentSize { // Only show if we have associated control events and a title - if ((self.allControlEvents == 0) && ([self titleForState:UIControlStateNormal].length == 0)) + if ((self.allControlEvents == 0) || ([self titleForState:UIControlStateNormal].length == 0)) return CGSizeZero; CGSize size = [super intrinsicContentSize]; // Add some side padding From 1ec0e9cf81ba94bba1e61e9875fcd335183bc0b1 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 16 Dec 2019 15:33:06 +0100 Subject: [PATCH 136/173] Resolve Xcode warnings --- Demo/HudDemo.xcodeproj/project.pbxproj | 6 +----- .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ 2 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 MBProgressHUD.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index 58adbe665..2c7c4cf2e 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -300,13 +300,9 @@ }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "HudDemo" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 1; knownRegions = ( - English, - Japanese, - French, - German, en, Base, ); diff --git a/MBProgressHUD.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/MBProgressHUD.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/MBProgressHUD.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + From 27d9ade6eaa55032d0fcd7c225264f166539ce7d Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 16 Dec 2019 15:37:39 +0100 Subject: [PATCH 137/173] Bump Xcode on CI --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c512b0904..0dddb3e1f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: objective-c -osx_image: xcode9 +osx_image: xcode11.2 before_install: - env From b0db9a82c423964e4fc9766f1f7520dff26a12ec Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 16 Dec 2019 15:53:56 +0100 Subject: [PATCH 138/173] Fix tvOS build and use better defaults for the background view --- MBProgressHUD.h | 6 +++++- MBProgressHUD.m | 8 ++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index eecde54e8..4f459f26b 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -399,8 +399,12 @@ NS_ASSUME_NONNULL_BEGIN /** * The background color or the blur tint color. + * + * Defaults to nil on iOS 13 and later and + * `[UIColor colorWithWhite:0.8f alpha:0.6f]` + * on older systems. */ -@property (nonatomic, strong) UIColor *color; +@property (nonatomic, strong, nullable) UIColor *color; @end diff --git a/MBProgressHUD.m b/MBProgressHUD.m index e472b912c..3157cadda 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -83,7 +83,7 @@ - (void)commonInit { _margin = 20.0f; _defaultMotionEffectsEnabled = NO; - if (@available(iOS 13.0, *)) { + if (@available(iOS 13.0, tvOS 13.0, *)) { _contentColor = [[UIColor labelColor] colorWithAlphaComponent:0.7f]; } else { _contentColor = [UIColor colorWithWhite:0.f alpha:0.7f]; @@ -1047,9 +1047,9 @@ @implementation MBBackgroundView - (instancetype)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { _style = MBProgressHUDBackgroundStyleBlur; - if (@available(iOS 13.0, *)) { - _blurEffectStyle = UIBlurEffectStyleRegular; - _color = [[UIColor secondarySystemBackgroundColor] colorWithAlphaComponent:0.8f]; + if (@available(iOS 13.0, tvOS 13.0, *)) { + _blurEffectStyle = UIBlurEffectStyleSystemChromeMaterial; + // Leaving the color unassigned yields best results. } else { _blurEffectStyle = UIBlurEffectStyleLight; _color = [UIColor colorWithWhite:0.8f alpha:0.6f]; From 48f79c8e20e1501020c3c5e49f191689ade5633a Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 16 Dec 2019 15:57:28 +0100 Subject: [PATCH 139/173] Remove explicit xcpretty setup --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0dddb3e1f..184f7bf8e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,6 @@ osx_image: xcode11.2 before_install: - env - locale - - gem install xcpretty --no-rdoc --no-ri --no-document --quiet - xcpretty --version - xcodebuild -version - xcodebuild -showsdks From 7bedf36884c4c0c0c5af3df3ef7ab649eb37f014 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 16 Dec 2019 17:33:54 +0100 Subject: [PATCH 140/173] Update simulator version --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 184f7bf8e..6b0ac9106 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ script: - xcodebuild clean build -workspace MBProgressHUD.xcworkspace -scheme HudDemo -sdk iphonesimulator -configuration Debug | xcpretty -c - xcodebuild clean build -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk iphonesimulator -configuration Debug | xcpretty -c - - xcodebuild clean build test -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air 2,OS=11.0" -configuration Debug GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES | xcpretty -c + - xcodebuild clean build test -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air (3rd generation),OS=13.2" -configuration Debug GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES | xcpretty -c after_success: - bash <(curl -s https://codecov.io/bash) From d0669df7455c89c0e9011f0ace5dea06f9bd8bff Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 16 Dec 2019 18:08:40 +0100 Subject: [PATCH 141/173] Adjust tvOS compatibility --- MBProgressHUD.m | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 3157cadda..9a6f3c8a5 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -83,7 +83,7 @@ - (void)commonInit { _margin = 20.0f; _defaultMotionEffectsEnabled = NO; - if (@available(iOS 13.0, tvOS 13.0, *)) { + if (@available(iOS 13.0, *)) { _contentColor = [[UIColor labelColor] colorWithAlphaComponent:0.7f]; } else { _contentColor = [UIColor colorWithWhite:0.f alpha:0.7f]; @@ -1047,8 +1047,12 @@ @implementation MBBackgroundView - (instancetype)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { _style = MBProgressHUDBackgroundStyleBlur; - if (@available(iOS 13.0, tvOS 13.0, *)) { + if (@available(iOS 13.0, *)) { + #if TARGET_OS_TV + _blurEffectStyle = UIBlurEffectStyleRegular; + #else _blurEffectStyle = UIBlurEffectStyleSystemChromeMaterial; + #endif // Leaving the color unassigned yields best results. } else { _blurEffectStyle = UIBlurEffectStyleLight; From ace36f8aa2193a1926c15f916727443d9258fa0c Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 16 Dec 2019 18:12:40 +0100 Subject: [PATCH 142/173] Clean up code code sign config --- Demo/HudDemo.xcodeproj/project.pbxproj | 2 -- 1 file changed, 2 deletions(-) diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index 2c7c4cf2e..331e0cac0 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -472,7 +472,6 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; 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; @@ -512,7 +511,6 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; From cb9d028f2a7bd9e74834a004fe18dcb442be1988 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 16 Dec 2019 20:40:06 +0100 Subject: [PATCH 143/173] Bump simulator version --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6b0ac9106..c44cdf692 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ script: - xcodebuild clean build -workspace MBProgressHUD.xcworkspace -scheme HudDemo -sdk iphonesimulator -configuration Debug | xcpretty -c - xcodebuild clean build -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk iphonesimulator -configuration Debug | xcpretty -c - - xcodebuild clean build test -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air (3rd generation),OS=13.2" -configuration Debug GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES | xcpretty -c + - xcodebuild clean build test -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air (3rd generation),OS=13.2.2" -configuration Debug GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES | xcpretty -c after_success: - bash <(curl -s https://codecov.io/bash) From bf31ebe9e67055dd1def6c18ad79f37cdf940a36 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 16 Dec 2019 21:15:24 +0100 Subject: [PATCH 144/173] Address more tvOS issues --- Demo/HudDemo.xcodeproj/project.pbxproj | 12 +++++++++ Demo/HudDemoTV/Base.lproj/Launch.storyboard | 29 +++++++++++++++++++++ Demo/HudDemoTV/Info.plist | 2 ++ MBProgressHUD.m | 2 +- 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 Demo/HudDemoTV/Base.lproj/Launch.storyboard diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index 331e0cac0..ee1cff216 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ D27F18641D3B5E21009D7482 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D27F18611D3B5E21009D7482 /* Main.storyboard */; }; D286A76D1518CA9F00E13FB8 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D286A76C1518CA9F00E13FB8 /* CoreGraphics.framework */; }; D2B174121C5E3A3D00021915 /* HudTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D2B174111C5E3A3D00021915 /* HudTests.m */; }; + D2D75D5323A8193100485497 /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D2D75D5123A8193000485497 /* Launch.storyboard */; }; D2EEB3811B55967200F59EC1 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D2EEB3801B55967200F59EC1 /* Images.xcassets */; }; /* End PBXBuildFile section */ @@ -66,6 +67,7 @@ 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 = ""; }; + D2D75D5223A8193000485497 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.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 */ @@ -199,6 +201,7 @@ D27F18671D3B5E43009D7482 /* Resources */ = { isa = PBXGroup; children = ( + D2D75D5123A8193000485497 /* Launch.storyboard */, D27F184C1D3B5878009D7482 /* Main.storyboard */, D27F18511D3B5878009D7482 /* Info.plist */, D274948A1D3B74AA00ABEB66 /* Images.xcassets */, @@ -334,6 +337,7 @@ files = ( D27F184E1D3B5878009D7482 /* Main.storyboard in Resources */, D274948B1D3B74AA00ABEB66 /* Images.xcassets in Resources */, + D2D75D5323A8193100485497 /* Launch.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -412,6 +416,14 @@ name = Main.storyboard; sourceTree = ""; }; + D2D75D5123A8193000485497 /* Launch.storyboard */ = { + isa = PBXVariantGroup; + children = ( + D2D75D5223A8193000485497 /* Base */, + ); + name = Launch.storyboard; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ diff --git a/Demo/HudDemoTV/Base.lproj/Launch.storyboard b/Demo/HudDemoTV/Base.lproj/Launch.storyboard new file mode 100644 index 000000000..ec7facac7 --- /dev/null +++ b/Demo/HudDemoTV/Base.lproj/Launch.storyboard @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo/HudDemoTV/Info.plist b/Demo/HudDemoTV/Info.plist index 9eb047c1d..53aa4528e 100644 --- a/Demo/HudDemoTV/Info.plist +++ b/Demo/HudDemoTV/Info.plist @@ -26,6 +26,8 @@ 1 LSRequiresIPhoneOS + UILaunchStoryboardName + Launch UIMainStoryboardFile Main UIRequiredDeviceCapabilities diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 9a6f3c8a5..fe41c4650 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -83,7 +83,7 @@ - (void)commonInit { _margin = 20.0f; _defaultMotionEffectsEnabled = NO; - if (@available(iOS 13.0, *)) { + if (@available(iOS 13.0, tvOS 13, *)) { _contentColor = [[UIColor labelColor] colorWithAlphaComponent:0.7f]; } else { _contentColor = [UIColor colorWithWhite:0.f alpha:0.7f]; From 998d32df352ff05db4f7d8e200346361e4415f66 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 16 Dec 2019 21:15:37 +0100 Subject: [PATCH 145/173] Disable code signing --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index c44cdf692..559d83d63 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,9 +11,9 @@ before_install: script: - set -o pipefail - - xcodebuild clean build -workspace MBProgressHUD.xcworkspace -scheme HudDemo -sdk iphonesimulator -configuration Debug | xcpretty -c - - xcodebuild clean build -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk iphonesimulator -configuration Debug | xcpretty -c - - xcodebuild clean build test -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air (3rd generation),OS=13.2.2" -configuration Debug GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES | xcpretty -c + - xcodebuild clean build -workspace MBProgressHUD.xcworkspace -scheme HudDemo -sdk iphonesimulator -configuration Debug CODE_SIGNING_REQUIRED=NO | xcpretty -c + - xcodebuild clean build -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk iphonesimulator -configuration Debug CODE_SIGNING_REQUIRED=NO | xcpretty -c + - xcodebuild clean build test -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air (3rd generation),OS=13.2.2" -configuration Debug GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES CODE_SIGNING_REQUIRED=NO | xcpretty -c after_success: - bash <(curl -s https://codecov.io/bash) From 3aa49153e1cc36bd1dc612ce89ce2b84d4b0140b Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 16 Dec 2019 21:31:34 +0100 Subject: [PATCH 146/173] Switch to appletvsimulator sdk --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 559d83d63..47c3b3b4a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,9 +11,9 @@ before_install: script: - set -o pipefail - - xcodebuild clean build -workspace MBProgressHUD.xcworkspace -scheme HudDemo -sdk iphonesimulator -configuration Debug CODE_SIGNING_REQUIRED=NO | xcpretty -c - - xcodebuild clean build -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk iphonesimulator -configuration Debug CODE_SIGNING_REQUIRED=NO | xcpretty -c - - xcodebuild clean build test -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air (3rd generation),OS=13.2.2" -configuration Debug GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES CODE_SIGNING_REQUIRED=NO | xcpretty -c + - xcodebuild clean build -workspace MBProgressHUD.xcworkspace -scheme HudDemo -sdk iphonesimulator -configuration Debug | xcpretty -c + - xcodebuild clean build -workspace MBProgressHUD.xcworkspace -scheme HudDemoTV -sdk appletvsimulator -configuration Debug | xcpretty -c + - xcodebuild clean build test -workspace MBProgressHUD.xcworkspace -scheme HudTests -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air (3rd generation),OS=13.2.2" -configuration Debug GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES | xcpretty -c after_success: - bash <(curl -s https://codecov.io/bash) From 9ba89d33f75d3ec23e0af4e1c72dde10a9607f33 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 16 Dec 2019 21:53:38 +0100 Subject: [PATCH 147/173] Use a thicker material --- MBProgressHUD.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index fe41c4650..869bb1c51 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -1051,7 +1051,7 @@ - (instancetype)initWithFrame:(CGRect)frame { #if TARGET_OS_TV _blurEffectStyle = UIBlurEffectStyleRegular; #else - _blurEffectStyle = UIBlurEffectStyleSystemChromeMaterial; + _blurEffectStyle = UIBlurEffectStyleSystemThickMaterial; #endif // Leaving the color unassigned yields best results. } else { From 0581fc848d0ad188c6cc18e96a9fe16fe4592e67 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 16 Dec 2019 22:00:55 +0100 Subject: [PATCH 148/173] Tweak example UI for Dark Mode --- Demo/HudDemo/en.lproj/Launch.storyboard | 16 ++++++++-------- Demo/HudDemo/en.lproj/Main.storyboard | 18 ++++++++++-------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/Demo/HudDemo/en.lproj/Launch.storyboard b/Demo/HudDemo/en.lproj/Launch.storyboard index d232745a9..4dd9af96f 100644 --- a/Demo/HudDemo/en.lproj/Launch.storyboard +++ b/Demo/HudDemo/en.lproj/Launch.storyboard @@ -1,8 +1,10 @@ - - + + + - + + @@ -10,9 +12,8 @@ - + - @@ -31,10 +32,9 @@ - + - - + diff --git a/Demo/HudDemo/en.lproj/Main.storyboard b/Demo/HudDemo/en.lproj/Main.storyboard index ce0a44e20..4126a4d02 100644 --- a/Demo/HudDemo/en.lproj/Main.storyboard +++ b/Demo/HudDemo/en.lproj/Main.storyboard @@ -1,8 +1,10 @@ - - + + + - + + @@ -10,16 +12,16 @@ - + - + - + - + @@ -41,7 +43,7 @@ - + From 3fdde685bc07066733378dab48245b7d360663e7 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 16 Dec 2019 22:04:16 +0100 Subject: [PATCH 149/173] Remove UILaunchImages --- Demo/HudDemo/Info.plist | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/Demo/HudDemo/Info.plist b/Demo/HudDemo/Info.plist index d11b218f8..3e5176a01 100644 --- a/Demo/HudDemo/Info.plist +++ b/Demo/HudDemo/Info.plist @@ -28,29 +28,6 @@ 1.0 LSRequiresIPhoneOS - UILaunchImages - - - UILaunchImageMinimumOSVersion - 7.0 - UILaunchImageName - Default-iOS7 - UILaunchImageOrientation - Portrait - UILaunchImageSize - {320, 568} - - - UILaunchImageMinimumOSVersion - 7.0 - UILaunchImageName - Default-iOS7 - UILaunchImageOrientation - Portrait - UILaunchImageSize - {320, 480} - - UILaunchStoryboardName Launch UIMainStoryboardFile From 915134629f8b552eb0c3c0936c1fd76827b5e3b7 Mon Sep 17 00:00:00 2001 From: Elffin Farnon-Turner Date: Thu, 11 Apr 2019 01:14:32 +0100 Subject: [PATCH 150/173] Update Contributing docs --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9412ac707..1cff2a6bc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,8 +24,8 @@ Guidelines for bug reports: 2. **Check if the issue has been fixed** — try to reproduce it using the latest `master` branch in the repository. -3. **Isolate the problem** — provide exact reporduction steps, preferably - in form of a failing test case or by providing modification steps in the +3. **Isolate the problem** — provide exact reproduction steps, preferably + in the form of a failing test case or by providing modification steps in the `MBProgressHUD` Demo application. A good bug report shouldn't leave others needing to chase you up for more @@ -61,4 +61,4 @@ accurate comments, etc.) and any other requirements (such as test coverage). **IMPORTANT**: By submitting a patch, you agree to allow the project owner to license your work under the same license as that used by the project. -This document is based on https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md. \ No newline at end of file +This document is based on https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md. From 5dcbf5b191017068a6592d1b7a17a1d0bd8ef5d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cihat=20G=C3=BCnd=C3=BCz?= Date: Tue, 9 Apr 2019 16:46:24 +0200 Subject: [PATCH 151/173] Add basic SwiftPM manifest file --- Package.swift | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Package.swift diff --git a/Package.swift b/Package.swift new file mode 100644 index 000000000..744002359 --- /dev/null +++ b/Package.swift @@ -0,0 +1,17 @@ +// swift-tools-version:4.2 +import PackageDescription + +let package = Package( + name: "MBProgressHUD", + products: [ + .library(name: "MBProgressHUD", targets: ["MBProgressHUD"]) + ], + targets: [ + .target( + name: "MBProgressHUD", + path: ".", + exclude: ["Demo"], + sources: ["MBProgressHUD.h", "MBProgressHUD.m"] + ) + ] +) From d18733fef4c1312458e53bbb5e511cb570b0c53a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cihat=20G=C3=BCnd=C3=BCz?= Date: Tue, 9 Apr 2019 17:26:48 +0200 Subject: [PATCH 152/173] [README] Document support & installation via Accio --- README.mdown | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.mdown b/README.mdown index 21ba843bb..c9013b145 100644 --- a/README.mdown +++ b/README.mdown @@ -1,7 +1,7 @@ # MBProgressHUD [![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) + [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application) [![Accio supported](https://img.shields.io/badge/Accio-supported-0A7CF5.svg?style=flat)](https://github.com/JamitLabs/Accio) [![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. @@ -41,6 +41,18 @@ You will need the latest developer tools in order to build `MBProgressHUD`. Old 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. +### Accio + +1. Add the following to your `Package.swift`: + ```swift + .package(url: "https://github.com/jdg/MBProgressHUD.git", .upToNextMajor(from: "1.1.0")), + ``` +2. Next, add `MBProgressHUD` to your App targets dependencies like so: + ```swift + .target(name: "App", dependencies: ["MBProgressHUD"]), + ``` +3. Then run `accio update`. + ### Source files Alternatively you can directly add the `MBProgressHUD.h` and `MBProgressHUD.m` source files to your project. From 75673fdecc60cc9ce1860ca428e0a7b73f51770f Mon Sep 17 00:00:00 2001 From: Bruno Coelho <4brunu@gmail.com> Date: Fri, 27 Dec 2019 16:04:52 +0000 Subject: [PATCH 153/173] Fix SwiftPM naming issue using modulemap # Conflicts: # Package.swift --- Package.swift | 4 +++- include/MBProgressHUD/MBProgressHUD.h | 1 + include/module.modulemap | 5 +++++ 3 files changed, 9 insertions(+), 1 deletion(-) create mode 120000 include/MBProgressHUD/MBProgressHUD.h create mode 100644 include/module.modulemap diff --git a/Package.swift b/Package.swift index 744002359..82f237252 100644 --- a/Package.swift +++ b/Package.swift @@ -9,9 +9,11 @@ let package = Package( targets: [ .target( name: "MBProgressHUD", + dependencies: [], path: ".", exclude: ["Demo"], - sources: ["MBProgressHUD.h", "MBProgressHUD.m"] + sources: ["MBProgressHUD.h", "MBProgressHUD.m"], + publicHeadersPath: "include" ) ] ) diff --git a/include/MBProgressHUD/MBProgressHUD.h b/include/MBProgressHUD/MBProgressHUD.h new file mode 120000 index 000000000..3aa3ae7f3 --- /dev/null +++ b/include/MBProgressHUD/MBProgressHUD.h @@ -0,0 +1 @@ +../../MBProgressHUD.h \ No newline at end of file diff --git a/include/module.modulemap b/include/module.modulemap new file mode 100644 index 000000000..e90bf2a8e --- /dev/null +++ b/include/module.modulemap @@ -0,0 +1,5 @@ +module MBProgressHUD { + umbrella header "MBProgressHUD/MBProgressHUD.h" + export * + module * { export * } + } From 8c7f89a5b9063190efb194ee89a9bff7d98a1caa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cihat=20Gu=CC=88ndu=CC=88z?= Date: Tue, 31 Dec 2019 09:34:02 +0100 Subject: [PATCH 154/173] [README] Add badge for SwiftPM support --- README.mdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.mdown b/README.mdown index c9013b145..a23cb5c7b 100644 --- a/README.mdown +++ b/README.mdown @@ -1,7 +1,7 @@ # MBProgressHUD [![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) [![Accio supported](https://img.shields.io/badge/Accio-supported-0A7CF5.svg?style=flat)](https://github.com/JamitLabs/Accio) [![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) + [![SwiftPM compatible](https://img.shields.io/badge/SwiftPM-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application) [![Accio supported](https://img.shields.io/badge/Accio-supported-0A7CF5.svg?style=flat)](https://github.com/JamitLabs/Accio) [![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. @@ -13,7 +13,7 @@ [![](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/6-small.png)](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/6.png) [![](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/7-small.png)](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/7.png) -**NOTE:** The class has recently undergone a major rewrite. The old version is available in the [legacy](https://github.com/jdg/MBProgressHUD/tree/legacy) branch, should you need it. +**NOTE:** The class has recently undergone a major rewrite. The old version is available in the [legacy](https://github.com/jdg/MBProgressHUD/tree/legacy) branch, should you need it. ## Requirements @@ -84,7 +84,7 @@ dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ }); ``` -You can add the HUD on any view or window. It is however a good idea to avoid adding the HUD to certain `UIKit` views with complex view hierarchies - like `UITableView` or `UICollectionView`. Those can mutate their subviews in unexpected ways and thereby break HUD display. +You can add the HUD on any view or window. It is however a good idea to avoid adding the HUD to certain `UIKit` views with complex view hierarchies - like `UITableView` or `UICollectionView`. Those can mutate their subviews in unexpected ways and thereby break HUD display. If you need to configure the HUD you can do this by using the MBProgressHUD reference that showHUDAddedTo:animated: returns. @@ -135,4 +135,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 in the [CHANGELOG](CHANGELOG.mdown). +A brief summary of each MBProgressHUD release can be found in the [CHANGELOG](CHANGELOG.mdown). From be98d2d1cb0f20060563c2044073e0b9a85f0422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cihat=20Gu=CC=88ndu=CC=88z?= Date: Tue, 31 Dec 2019 09:57:39 +0100 Subject: [PATCH 155/173] [README] Add installation documentation for SwiftPM --- README.mdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.mdown b/README.mdown index a23cb5c7b..3f3768bb9 100644 --- a/README.mdown +++ b/README.mdown @@ -41,7 +41,7 @@ You will need the latest developer tools in order to build `MBProgressHUD`. Old 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. -### Accio +### SwiftPM / Accio 1. Add the following to your `Package.swift`: ```swift @@ -51,7 +51,7 @@ You will need the latest developer tools in order to build `MBProgressHUD`. Old ```swift .target(name: "App", dependencies: ["MBProgressHUD"]), ``` -3. Then run `accio update`. +3. Then open your project in Xcode 11+ (SwiftPM) or run `accio update` (Accio). ### Source files From 501fb0d0bcc577fe38509a9b138ae142dc3c9263 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 13 Jan 2020 20:19:56 +0100 Subject: [PATCH 156/173] Enable testing from HudDemo --- .../xcshareddata/xcschemes/HudDemo.xcscheme | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme index 7bbf185a6..2c3423710 100644 --- a/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme +++ b/Demo/HudDemo.xcodeproj/xcshareddata/xcschemes/HudDemo.xcscheme @@ -51,6 +51,16 @@ + + + + Date: Mon, 13 Jan 2020 20:38:48 +0100 Subject: [PATCH 157/173] Add conditionals to avoid warnings with UIActivityIndicatorViewStyleWhiteLarge --- MBProgressHUD.m | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 5b47c80a0..b67e49571 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -372,12 +372,16 @@ - (void)updateIndicators { // Update to indeterminate indicator UIActivityIndicatorView *activityIndicator; [indicator removeFromSuperview]; +#if !TARGET_OS_MACCATALYST if (@available(iOS 13.0, *)) { +#endif activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleLarge]; activityIndicator.color = [UIColor whiteColor]; +#if !TARGET_OS_MACCATALYST } else { - activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:0 /* UIActivityIndicatorViewStyleWhiteLarge */]; + activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; } +#endif [activityIndicator startAnimating]; indicator = activityIndicator; [self.bezelView addSubview:indicator]; From bf145ece964bd328e4aa8810b84f20aaa06d6cad Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 13 Jan 2020 20:39:19 +0100 Subject: [PATCH 158/173] Fix warnings on Mac Catalyst --- Demo/HudTests/HudTests.m | 43 ++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/Demo/HudTests/HudTests.m b/Demo/HudTests/HudTests.m index db4afda57..8f7884d70 100644 --- a/Demo/HudTests/HudTests.m +++ b/Demo/HudTests/HudTests.m @@ -55,14 +55,23 @@ - (void)testInitializers { UIView *nilView = nil; XCTAssertThrows([[MBProgressHUD alloc] initWithView:nilView]); XCTAssertNotNil([[MBProgressHUD alloc] initWithFrame:CGRectZero]); - NSKeyedUnarchiver *dummyUnarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:[NSData data]]; + NSKeyedUnarchiver *dummyUnarchiver; +#if !TARGET_OS_MACCATALYST + if (@available(iOS 11.0, *)) { +#endif + dummyUnarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:[NSData data] error:nil]; +#if !TARGET_OS_MACCATALYST + } else { + dummyUnarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:[NSData data]]; + } +#endif XCTAssertNotNil([[MBProgressHUD alloc] initWithCoder:dummyUnarchiver]); } #pragma mark - Convenience - (void)testNonAnimatedConvenienceHUDPresentation { - UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIViewController *rootViewController = UIApplication.sharedApplication.windows.firstObject.rootViewController; UIView *rootView = rootViewController.view; MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:rootView animated:NO]; @@ -83,7 +92,7 @@ - (void)testNonAnimatedConvenienceHUDPresentation { } - (void)testAnimatedConvenienceHUDPresentation { - UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIViewController *rootViewController = UIApplication.sharedApplication.windows.firstObject.rootViewController; UIView *rootView = rootViewController.view; self.hideExpectation = [self expectationWithDescription:@"The hudWasHidden: delegate should have been called."]; @@ -119,7 +128,7 @@ - (void)testAnimatedConvenienceHUDPresentation { } - (void)testCompletionBlock { - UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIViewController *rootViewController = UIApplication.sharedApplication.windows.firstObject.rootViewController; UIView *rootView = rootViewController.view; self.hideExpectation = [self expectationWithDescription:@"The hudWasHidden: delegate should have been called."]; @@ -139,7 +148,7 @@ - (void)testCompletionBlock { #pragma mark - Modes - (void)testRoundDeterminate { - UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIViewController *rootViewController = UIApplication.sharedApplication.windows.firstObject.rootViewController; UIView *rootView = rootViewController.view; MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; @@ -155,7 +164,7 @@ - (void)testRoundDeterminate { } - (void)testRoundAnnularDeterminate { - UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIViewController *rootViewController = UIApplication.sharedApplication.windows.firstObject.rootViewController; UIView *rootView = rootViewController.view; MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; @@ -171,7 +180,7 @@ - (void)testRoundAnnularDeterminate { } - (void)testDeterminateHorizontalBar { - UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIViewController *rootViewController = UIApplication.sharedApplication.windows.firstObject.rootViewController; UIView *rootView = rootViewController.view; MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; @@ -190,7 +199,7 @@ - (void)testDeterminateHorizontalBar { #pragma mark - Customization - (void)testEffectViewOrderAfterSettingBlurStyle { - UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIViewController *rootViewController = UIApplication.sharedApplication.windows.firstObject.rootViewController; UIView *rootView = rootViewController.view; MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; @@ -209,7 +218,7 @@ - (void)testEffectViewOrderAfterSettingBlurStyle { #pragma mark - Delay - (void)testDelayedHide { - UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIViewController *rootViewController = UIApplication.sharedApplication.windows.firstObject.rootViewController; UIView *rootView = rootViewController.view; self.hideExpectation = [self expectationWithDescription:@"The hudWasHidden: delegate should have been called."]; @@ -241,7 +250,7 @@ - (void)testDelayedHide { - (void)testDelayedHideDoesNotRace { // https://github.com/jdg/MBProgressHUD/issues/503 - UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIViewController *rootViewController = UIApplication.sharedApplication.windows.firstObject.rootViewController; UIView *rootView = rootViewController.view; MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; @@ -270,7 +279,7 @@ - (void)testDelayedHideDoesNotRace { #pragma mark - Ruse - (void)testNonAnimatedHudReuse { - UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIViewController *rootViewController = UIApplication.sharedApplication.windows.firstObject.rootViewController; UIView *rootView = rootViewController.view; MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; @@ -289,7 +298,7 @@ - (void)testNonAnimatedHudReuse { } - (void)testUnfinishedHidingAnimation { - UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIViewController *rootViewController = UIApplication.sharedApplication.windows.firstObject.rootViewController; UIView *rootView = rootViewController.view; MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:rootView animated:NO]; @@ -314,7 +323,7 @@ - (void)testUnfinishedHidingAnimation { } - (void)testAnimatedImmediateHudReuse { - UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIViewController *rootViewController = UIApplication.sharedApplication.windows.firstObject.rootViewController; UIView *rootView = rootViewController.view; XCTestExpectation *hideExpectation = [self expectationWithDescription:@"The hud should have been hidden."]; @@ -343,7 +352,7 @@ - (void)testAnimatedImmediateHudReuse { #pragma mark - Min show time - (void)testMinShowTime { - UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIViewController *rootViewController = UIApplication.sharedApplication.windows.firstObject.rootViewController; UIView *rootView = rootViewController.view; self.hideExpectation = [self expectationWithDescription:@"The hudWasHidden: delegate should have been called."]; @@ -380,7 +389,7 @@ - (void)testMinShowTime { #pragma mark - Grace time - (void)testGraceTime { - UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIViewController *rootViewController = UIApplication.sharedApplication.windows.firstObject.rootViewController; UIView *rootView = rootViewController.view; self.hideExpectation = [self expectationWithDescription:@"The hudWasHidden: delegate should have been called."]; @@ -421,7 +430,7 @@ - (void)testGraceTime { } - (void)testHideBeforeGraceTimeElapsed { - UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIViewController *rootViewController = UIApplication.sharedApplication.windows.firstObject.rootViewController; UIView *rootView = rootViewController.view; self.hideExpectation = [self expectationWithDescription:@"The hudWasHidden: delegate should have been called."]; @@ -465,7 +474,7 @@ - (void)testHideBeforeGraceTimeElapsed { #pragma mark - Customization - (void)testShape { - UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; + UIViewController *rootViewController = UIApplication.sharedApplication.windows.firstObject.rootViewController; UIView *rootView = rootViewController.view; MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:rootView]; From 3958dc56bfdf544155cfd078e7696c11c7fbab76 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 13 Jan 2020 20:43:49 +0100 Subject: [PATCH 159/173] Add Catalyst support in the demo --- Demo/HudDemo.xcodeproj/project.pbxproj | 10 ++++++++++ Demo/HudDemo/HudDemo.entitlements | 10 ++++++++++ 2 files changed, 20 insertions(+) create mode 100644 Demo/HudDemo/HudDemo.entitlements diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index ee1cff216..e86fd7ea7 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -64,6 +64,7 @@ D27F18621D3B5E21009D7482 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = HudDemo/en.lproj/Main.storyboard; sourceTree = ""; }; D27F18651D3B5E2D009D7482 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = HudDemo/Info.plist; sourceTree = ""; }; D286A76C1518CA9F00E13FB8 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + D2B1269B23CB8D9C00A01F4C /* HudDemo.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = HudDemo.entitlements; 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 = ""; }; @@ -103,6 +104,7 @@ 080E96DDFE201D6D7F000001 /* HudDemo */ = { isa = PBXGroup; children = ( + D2B1269B23CB8D9C00A01F4C /* HudDemo.entitlements */, D27F18561D3B5DFF009D7482 /* MBHudDemoAppDelegate.h */, D27F18571D3B5DFF009D7482 /* MBHudDemoViewController.h */, D27F18581D3B5DFF009D7482 /* MBHudDemoAppDelegate.m */, @@ -432,7 +434,9 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = HudDemo/HudDemo.entitlements; COPY_PHASE_STRIP = NO; + DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER = YES; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -441,6 +445,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = HudDemo; + SUPPORTS_MACCATALYST = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -450,7 +455,9 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = HudDemo/HudDemo.entitlements; COPY_PHASE_STRIP = YES; + DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = HudDemo/HudDemo_Prefix.pch; INFOPLIST_FILE = HudDemo/Info.plist; @@ -458,6 +465,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = HudDemo; SDKROOT = iphoneos; + SUPPORTS_MACCATALYST = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; @@ -627,6 +635,7 @@ MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = com.bukovinski.HudTests; PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HudDemo.app/HudDemo"; }; name = Debug; @@ -653,6 +662,7 @@ MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = com.bukovinski.HudTests; PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HudDemo.app/HudDemo"; VALIDATE_PRODUCT = YES; }; diff --git a/Demo/HudDemo/HudDemo.entitlements b/Demo/HudDemo/HudDemo.entitlements new file mode 100644 index 000000000..ee95ab7e5 --- /dev/null +++ b/Demo/HudDemo/HudDemo.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.network.client + + + From 049b2f4dbdb882d915e60855b318165c21027566 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 13 Jan 2020 21:28:11 +0100 Subject: [PATCH 160/173] Update iOS version support note --- README.mdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.mdown b/README.mdown index 3f3768bb9..3e413e769 100644 --- a/README.mdown +++ b/README.mdown @@ -17,7 +17,7 @@ ## 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: +`MBProgressHUD` works on iOS 9.0+. It depends on the following Apple frameworks, which should already be included with most Xcode templates: * Foundation.framework * UIKit.framework From 794de3587a325e635be9353cb8d8a3793b6c8ac8 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 13 Jan 2020 21:34:03 +0100 Subject: [PATCH 161/173] Bump version --- Framework-Info.plist | 2 +- Framework-tvOS-Info.plist | 2 +- LICENSE | 2 +- MBProgressHUD.h | 30 +++++++++---------- MBProgressHUD.m | 40 ++++++++++++------------- MBProgressHUD.podspec | 2 +- MBProgressHUD.xcodeproj/project.pbxproj | 4 +++ README.mdown | 6 ++-- 8 files changed, 46 insertions(+), 42 deletions(-) diff --git a/Framework-Info.plist b/Framework-Info.plist index a6f720ec9..ca23c84f4 100644 --- a/Framework-Info.plist +++ b/Framework-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.1 + $(MARKETING_VERSION) CFBundleSignature ???? CFBundleVersion diff --git a/Framework-tvOS-Info.plist b/Framework-tvOS-Info.plist index d63d29010..ec0cc7b0c 100644 --- a/Framework-tvOS-Info.plist +++ b/Framework-tvOS-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.1 + $(MARKETING_VERSION) CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPrincipalClass diff --git a/LICENSE b/LICENSE index 1c0d59bb8..d7f0647bc 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright © 2009-2016 Matej Bukovinski +Copyright © 2009-2020 Matej Bukovinski Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 4f459f26b..38b500490 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -1,10 +1,10 @@ // // MBProgressHUD.h -// Version 1.1.0 +// Version 1.2.0 // Created by Matej Bukovinski on 2.4.09. // -// This code is distributed under the terms and conditions of the MIT license. +// This code is distributed under the terms and conditions of the MIT license. // Copyright © 2009-2016 Matej Bukovinski // @@ -75,7 +75,7 @@ typedef void (^MBProgressHUDCompletionBlock)(void); NS_ASSUME_NONNULL_BEGIN -/** +/** * 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. @@ -136,8 +136,8 @@ NS_ASSUME_NONNULL_BEGIN */ - (instancetype)initWithView:(UIView *)view; -/** - * Displays the HUD. +/** + * Displays the HUD. * * @note You need to make sure that the main thread completes its run loop soon after this method call so that * the user interface can be updated. Call this method when your task is already set up to be executed in a new thread @@ -150,7 +150,7 @@ NS_ASSUME_NONNULL_BEGIN */ - (void)showAnimated:(BOOL)animated; -/** +/** * 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. * @@ -161,7 +161,7 @@ NS_ASSUME_NONNULL_BEGIN */ - (void)hideAnimated:(BOOL)animated; -/** +/** * 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. * @@ -209,7 +209,7 @@ NS_ASSUME_NONNULL_BEGIN /// @name Appearance -/** +/** * MBProgressHUD operation mode. The default is MBProgressHUDModeIndeterminate. */ @property (assign, nonatomic) MBProgressHUDMode mode; @@ -302,7 +302,7 @@ NS_ASSUME_NONNULL_BEGIN @property (strong, nonatomic, readonly) UILabel *detailsLabel; /** - * A button that is placed below the labels. Visible only if a target / action is added and a title is assigned.. + * A button that is placed below the labels. Visible only if a target / action is added and a title is assigned.. */ @property (strong, nonatomic, readonly) UIButton *button; @@ -313,8 +313,8 @@ NS_ASSUME_NONNULL_BEGIN @optional -/** - * Called after the HUD was fully hidden from the screen. +/** + * Called after the HUD was fully hidden from the screen. */ - (void)hudWasHidden:(MBProgressHUD *)hud; @@ -324,7 +324,7 @@ NS_ASSUME_NONNULL_BEGIN /** * A progress view for showing definite progress by filling up a circle (pie chart). */ -@interface MBRoundProgressView : UIView +@interface MBRoundProgressView : UIView /** * Progress (0.0 to 1.0) @@ -338,7 +338,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, strong) UIColor *progressTintColor; /** - * Indicator background (non-progress) color. + * Indicator background (non-progress) color. * Only applicable on iOS versions older than iOS 7. * Defaults to translucent white (alpha 0.1). */ @@ -353,7 +353,7 @@ NS_ASSUME_NONNULL_BEGIN /** - * A flat bar progress view. + * A flat bar progress view. */ @interface MBBarProgressView : UIView @@ -386,7 +386,7 @@ NS_ASSUME_NONNULL_BEGIN @interface MBBackgroundView : UIView /** - * The background style. + * The background style. * Defaults to MBProgressHUDBackgroundStyleBlur. */ @property (nonatomic) MBProgressHUDBackgroundStyle style; diff --git a/MBProgressHUD.m b/MBProgressHUD.m index b67e49571..6460e1a70 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -1,6 +1,6 @@ // // MBProgressHUD.m -// Version 1.1.0 +// Version 1.2.0 // Created by Matej Bukovinski on 2.4.09. // @@ -137,7 +137,7 @@ - (void)showAnimated:(BOOL)animated { 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 immediately else { [self showUsingAnimation:self.useAnimation]; @@ -158,7 +158,7 @@ - (void)hideAnimated:(BOOL)animated { [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; self.minShowTimer = timer; return; - } + } } // ... otherwise hide the HUD immediately [self hideUsingAnimation:self.useAnimation]; @@ -403,7 +403,7 @@ - (void)updateIndicators { if (mode == MBProgressHUDModeAnnularDeterminate) { [(MBRoundProgressView *)indicator setAnnular:YES]; } - } + } else if (mode == MBProgressHUDModeCustomView && self.customView != indicator) { // Update custom view indicator [indicator removeFromSuperview]; @@ -446,7 +446,7 @@ - (void)updateViewsForColor:(UIColor *)color { // For iOS 9+ appearance = [UIActivityIndicatorView appearanceWhenContainedInInstancesOfClasses:@[[MBProgressHUD class]]]; #endif - + if (appearance.color == nil) { ((UIActivityIndicatorView *)indicator).color = color; } @@ -591,10 +591,10 @@ - (void)updateConstraints { [bezel addConstraints:bezelConstraints]; self.bezelConstraints = bezelConstraints; - + self.paddingConstraints = [paddingConstraints copy]; [self updatePaddingConstraints]; - + [super updateConstraints]; } @@ -679,9 +679,9 @@ - (void)setSquare:(BOOL)square { - (void)setProgressObjectDisplayLink:(CADisplayLink *)progressObjectDisplayLink { if (progressObjectDisplayLink != _progressObjectDisplayLink) { [_progressObjectDisplayLink invalidate]; - + _progressObjectDisplayLink = progressObjectDisplayLink; - + [_progressObjectDisplayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; } } @@ -786,7 +786,7 @@ - (void)updateForCurrentOrientationAnimated:(BOOL)animated { UIApplication *application = [UIApplication performSelector:@selector(sharedApplication)]; UIInterfaceOrientation orientation = application.statusBarOrientation; CGFloat radians = 0; - + if (UIInterfaceOrientationIsLandscape(orientation)) { radians = orientation == UIInterfaceOrientationLandscapeLeft ? -(CGFloat)M_PI_2 : (CGFloat)M_PI_2; // Window coordinates differ! @@ -971,11 +971,11 @@ - (void)setProgressRemainingColor:(UIColor *)progressRemainingColor { - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); - + CGContextSetLineWidth(context, 2); CGContextSetStrokeColorWithColor(context,[_lineColor CGColor]); CGContextSetFillColorWithColor(context, [_progressRemainingColor CGColor]); - + // Draw background and Border CGFloat radius = (rect.size.height / 2) - 2; CGContextMoveToPoint(context, 2, rect.size.height/2); @@ -984,26 +984,26 @@ - (void)drawRect:(CGRect)rect { CGContextAddArcToPoint(context, rect.size.width - 2, rect.size.height - 2, rect.size.width - radius - 2, rect.size.height - 2, radius); CGContextAddArcToPoint(context, 2, rect.size.height - 2, 2, rect.size.height/2, radius); CGContextDrawPath(context, kCGPathFillStroke); - + 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); @@ -1023,10 +1023,10 @@ - (void)drawRect:(CGRect)rect { 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); @@ -1036,7 +1036,7 @@ - (void)drawRect:(CGRect)rect { 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); } } diff --git a/MBProgressHUD.podspec b/MBProgressHUD.podspec index 29153e9e9..b2c7ed067 100644 --- a/MBProgressHUD.podspec +++ b/MBProgressHUD.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "MBProgressHUD" - s.version = "1.1.0" + s.version = "1.2.0" 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/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index fe176f337..1c3ed2338 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -305,6 +305,7 @@ INFOPLIST_FILE = "Framework-tvOS-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MARKETING_VERSION = 1.2; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = com.matej.MBProgressHUD; PRODUCT_NAME = MBProgressHUD; @@ -343,6 +344,7 @@ INFOPLIST_FILE = "Framework-tvOS-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MARKETING_VERSION = 1.2; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = com.matej.MBProgressHUD; PRODUCT_NAME = MBProgressHUD; @@ -381,6 +383,7 @@ INFOPLIST_FILE = "Framework-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MARKETING_VERSION = 1.2; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.matej.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = MBProgressHUD; @@ -415,6 +418,7 @@ INFOPLIST_FILE = "Framework-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MARKETING_VERSION = 1.2; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "com.matej.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = MBProgressHUD; diff --git a/README.mdown b/README.mdown index 3e413e769..c90f5c6a6 100644 --- a/README.mdown +++ b/README.mdown @@ -31,13 +31,13 @@ You will need the latest developer tools in order to build `MBProgressHUD`. Old [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', '~> 1.1.0'` +1. Add a pod entry for MBProgressHUD to your Podfile `pod 'MBProgressHUD', '~> 1.2.0'` 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" ~> 1.1.0` +1. Add MBProgressHUD to your Cartfile. e.g., `github "jdg/MBProgressHUD" ~> 1.2.0` 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. @@ -45,7 +45,7 @@ You will need the latest developer tools in order to build `MBProgressHUD`. Old 1. Add the following to your `Package.swift`: ```swift - .package(url: "https://github.com/jdg/MBProgressHUD.git", .upToNextMajor(from: "1.1.0")), + .package(url: "https://github.com/jdg/MBProgressHUD.git", .upToNextMajor(from: "1.2.0")), ``` 2. Next, add `MBProgressHUD` to your App targets dependencies like so: ```swift From 24ff51d11d14df649f234b99258d9b06013ffb7f Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 13 Jan 2020 23:19:30 +0100 Subject: [PATCH 162/173] Remove the note about the not-so-recent rewrite --- README.mdown | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.mdown b/README.mdown index c90f5c6a6..3a019e6e2 100644 --- a/README.mdown +++ b/README.mdown @@ -13,8 +13,6 @@ [![](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/6-small.png)](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/6.png) [![](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/7-small.png)](https://raw.githubusercontent.com/wiki/matej/MBProgressHUD/Screenshots/7.png) -**NOTE:** The class has recently undergone 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 9.0+. It depends on the following Apple frameworks, which should already be included with most Xcode templates: From 5097c9c14f29e98c0f09a999667a7ae2b56a2b08 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Mon, 13 Jan 2020 21:44:52 +0100 Subject: [PATCH 163/173] Silence tvOS warning --- MBProgressHUD.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 6460e1a70..a2829a390 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -373,7 +373,7 @@ - (void)updateIndicators { UIActivityIndicatorView *activityIndicator; [indicator removeFromSuperview]; #if !TARGET_OS_MACCATALYST - if (@available(iOS 13.0, *)) { + if (@available(iOS 13.0, tvOS 13.0, *)) { #endif activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleLarge]; activityIndicator.color = [UIColor whiteColor]; From 61fb89ce30d42f403ce53cde65883dc8cea6d02a Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Wed, 19 Feb 2020 12:54:40 +0100 Subject: [PATCH 164/173] Update copyright year --- MBProgressHUD.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MBProgressHUD.h b/MBProgressHUD.h index 38b500490..bf7133fb2 100644 --- a/MBProgressHUD.h +++ b/MBProgressHUD.h @@ -6,7 +6,7 @@ // This code is distributed under the terms and conditions of the MIT license. -// Copyright © 2009-2016 Matej Bukovinski +// Copyright © 2009-2020 Matej Bukovinski // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal From 11fc6023b4f0288e357cd84852aed61fd1da8c76 Mon Sep 17 00:00:00 2001 From: Alex Shepard Date: Thu, 21 May 2020 11:41:41 -0700 Subject: [PATCH 165/173] fix typo --- README.mdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.mdown b/README.mdown index 3a019e6e2..d81e45e67 100644 --- a/README.mdown +++ b/README.mdown @@ -109,7 +109,7 @@ NSProgress *progress = [self doSomethingInBackgroundCompletion:^{ hud.progressObject = progress; ``` -Keep in mind that UI updates, inclining calls to MBProgressHUD should always be done on the main thread. +Keep in mind that UI updates, including calls to MBProgressHUD should always be done on the main thread. If you need to run your long-running task in the main thread, you should perform it with a slight delay, so UIKit will have enough time to update the UI (i.e., draw the HUD) before you block the main thread with your task. From 71b7092441b4d903e011d4039be9ec202003cf5e Mon Sep 17 00:00:00 2001 From: Daniel Shelley Date: Fri, 17 Jul 2020 16:30:33 -0600 Subject: [PATCH 166/173] change deployment target to iOS 9 to fix Archiving with Xcode 12 --- Demo/HudDemo.xcodeproj/project.pbxproj | 8 ++++---- MBProgressHUD.xcodeproj/project.pbxproj | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Demo/HudDemo.xcodeproj/project.pbxproj b/Demo/HudDemo.xcodeproj/project.pbxproj index e86fd7ea7..d68e8beeb 100644 --- a/Demo/HudDemo.xcodeproj/project.pbxproj +++ b/Demo/HudDemo.xcodeproj/project.pbxproj @@ -442,7 +442,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = HudDemo/HudDemo_Prefix.pch; INFOPLIST_FILE = HudDemo/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = HudDemo; SUPPORTS_MACCATALYST = YES; @@ -461,7 +461,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = HudDemo/HudDemo_Prefix.pch; INFOPLIST_FILE = HudDemo/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; PRODUCT_BUNDLE_IDENTIFIER = "com.bukovinski.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = HudDemo; SDKROOT = iphoneos; @@ -503,7 +503,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -541,7 +541,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; SDKROOT = iphoneos; }; name = Release; diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index 1c3ed2338..a9dc64dd4 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -473,7 +473,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -515,7 +515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; From 73cc7ba023f575ff945e628f3df91e32ba3525a3 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Fri, 6 Nov 2020 16:31:57 +0100 Subject: [PATCH 167/173] Add link to SDK Privacy Practices --- README.mdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.mdown b/README.mdown index d81e45e67..9e1e50061 100644 --- a/README.mdown +++ b/README.mdown @@ -134,3 +134,7 @@ 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 in the [CHANGELOG](CHANGELOG.mdown). + +## Privacy + +MBProgressHUD does not collecty any data. See [SDK Privacy Practices](https://bukovinski.com/sdk-privacy/mbprogresshud/) for more infromation. From 38dc9aa471e26e82744bb84b3f3fa2db86f1b4ca Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Fri, 6 Nov 2020 16:48:40 +0100 Subject: [PATCH 168/173] Fix typos --- README.mdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.mdown b/README.mdown index 9e1e50061..e146bd178 100644 --- a/README.mdown +++ b/README.mdown @@ -137,4 +137,4 @@ A brief summary of each MBProgressHUD release can be found in the [CHANGELOG](CH ## Privacy -MBProgressHUD does not collecty any data. See [SDK Privacy Practices](https://bukovinski.com/sdk-privacy/mbprogresshud/) for more infromation. +MBProgressHUD does not collect any data. See [SDK Privacy Practices](https://bukovinski.com/sdk-privacy/mbprogresshud/) for more information. From c843e4c86d320a11552898646effa8000042ab16 Mon Sep 17 00:00:00 2001 From: Owen Thomas <46360363+tinder-owenthomas@users.noreply.github.com> Date: Wed, 25 Nov 2020 07:57:02 -0500 Subject: [PATCH 169/173] Update minimum deployment target to iOS 9.0 (#616) --- MBProgressHUD.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MBProgressHUD.podspec b/MBProgressHUD.podspec index b2c7ed067..d76245104 100644 --- a/MBProgressHUD.podspec +++ b/MBProgressHUD.podspec @@ -12,7 +12,7 @@ Pod::Spec.new do |s| s.license = { :type => 'MIT', :file => 'LICENSE' } s.author = { 'Matej Bukovinski' => 'matej@bukovinski.com' } s.source = { :git => "https://github.com/matej/MBProgressHUD.git", :tag => s.version.to_s } - s.ios.deployment_target = '8.0' + s.ios.deployment_target = '9.0' s.tvos.deployment_target = '9.0' s.source_files = '*.{h,m}' s.frameworks = "CoreGraphics", "QuartzCore" From 684e5b7160cce175542aee09d40c7b120cb54f07 Mon Sep 17 00:00:00 2001 From: Kenji Wada Date: Fri, 12 Jan 2024 21:14:41 +0900 Subject: [PATCH 170/173] Add Privacy Info --- MBProgressHUD.podspec | 1 + MBProgressHUD.xcodeproj/project.pbxproj | 6 ++++++ PrivacyInfo.xcprivacy | 14 ++++++++++++++ 3 files changed, 21 insertions(+) create mode 100644 PrivacyInfo.xcprivacy diff --git a/MBProgressHUD.podspec b/MBProgressHUD.podspec index d76245104..70098b845 100644 --- a/MBProgressHUD.podspec +++ b/MBProgressHUD.podspec @@ -15,6 +15,7 @@ Pod::Spec.new do |s| s.ios.deployment_target = '9.0' s.tvos.deployment_target = '9.0' s.source_files = '*.{h,m}' + s.resources = ['PrivacyInfo.xcprivacy'] s.frameworks = "CoreGraphics", "QuartzCore" s.requires_arc = true end diff --git a/MBProgressHUD.xcodeproj/project.pbxproj b/MBProgressHUD.xcodeproj/project.pbxproj index a9dc64dd4..d4741b11e 100644 --- a/MBProgressHUD.xcodeproj/project.pbxproj +++ b/MBProgressHUD.xcodeproj/project.pbxproj @@ -12,6 +12,8 @@ 1777D3E81D757B6E0037C7F1 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D286A7521518C70F00E13FB8 /* MBProgressHUD.m */; }; 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, ); }; }; + AAD69D522B51630200BE0369 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = AAD69D512B5162AE00BE0369 /* PrivacyInfo.xcprivacy */; }; + AAD69D532B51630200BE0369 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = AAD69D512B5162AE00BE0369 /* PrivacyInfo.xcprivacy */; }; 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 */; }; @@ -37,6 +39,7 @@ 1777D3E21D757AF50037C7F1 /* Framework-tvOS-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Framework-tvOS-Info.plist"; 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; }; + AAD69D512B5162AE00BE0369 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; 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; }; @@ -117,6 +120,7 @@ children = ( D286A7511518C70F00E13FB8 /* MBProgressHUD.h */, D286A7521518C70F00E13FB8 /* MBProgressHUD.m */, + AAD69D512B5162AE00BE0369 /* PrivacyInfo.xcprivacy */, 1315DD72178044770032507D /* Supporting Files */, ); name = MBProgressHUD; @@ -241,6 +245,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + AAD69D532B51630200BE0369 /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -248,6 +253,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + AAD69D522B51630200BE0369 /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/PrivacyInfo.xcprivacy b/PrivacyInfo.xcprivacy new file mode 100644 index 000000000..d75908da0 --- /dev/null +++ b/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyTracking + + NSPrivacyCollectedDataTypes + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + From 9682b564467cb978dc38a08b085df87a0417cbf9 Mon Sep 17 00:00:00 2001 From: Kenji Wada Date: Fri, 15 Mar 2024 17:26:09 +0900 Subject: [PATCH 171/173] Update MBProgressHUD.podspec --- MBProgressHUD.podspec | 2 +- Package.swift | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/MBProgressHUD.podspec b/MBProgressHUD.podspec index 70098b845..9c72071ba 100644 --- a/MBProgressHUD.podspec +++ b/MBProgressHUD.podspec @@ -15,7 +15,7 @@ Pod::Spec.new do |s| s.ios.deployment_target = '9.0' s.tvos.deployment_target = '9.0' s.source_files = '*.{h,m}' - s.resources = ['PrivacyInfo.xcprivacy'] + s.resource_bundles = {'MBProgressHUD' => ['PrivacyInfo.xcprivacy']} s.frameworks = "CoreGraphics", "QuartzCore" s.requires_arc = true end diff --git a/Package.swift b/Package.swift index 82f237252..427faefee 100644 --- a/Package.swift +++ b/Package.swift @@ -13,6 +13,9 @@ let package = Package( path: ".", exclude: ["Demo"], sources: ["MBProgressHUD.h", "MBProgressHUD.m"], + resources: [ + .copy("PrivacyInfo.xcprivacy") + ], publicHeadersPath: "include" ) ] From 2c62462e38f768d8c4da12dc5babbccbe3ead714 Mon Sep 17 00:00:00 2001 From: Kenji Wada Date: Fri, 15 Mar 2024 17:37:50 +0900 Subject: [PATCH 172/173] Update MBProgressHUD.podspec --- Package.swift | 3 --- 1 file changed, 3 deletions(-) diff --git a/Package.swift b/Package.swift index 427faefee..82f237252 100644 --- a/Package.swift +++ b/Package.swift @@ -13,9 +13,6 @@ let package = Package( path: ".", exclude: ["Demo"], sources: ["MBProgressHUD.h", "MBProgressHUD.m"], - resources: [ - .copy("PrivacyInfo.xcprivacy") - ], publicHeadersPath: "include" ) ] From 4a7c5f3e53cdea77c5dcb8578c2ee5acacdf6781 Mon Sep 17 00:00:00 2001 From: Mateusz Matrejek Date: Fri, 10 May 2024 09:52:44 +0200 Subject: [PATCH 173/173] #647: Adds Privacy Manifest as Package.swift resource (#653) * #647: Adds Privacy Manifest as Package.swift resource * #647: Bumps swift-tools-version in Package.swift --- Package.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 82f237252..3689b7424 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:4.2 +// swift-tools-version:5.9 import PackageDescription let package = Package( @@ -13,6 +13,7 @@ let package = Package( path: ".", exclude: ["Demo"], sources: ["MBProgressHUD.h", "MBProgressHUD.m"], + resources: [.copy("PrivacyInfo.xcprivacy")], publicHeadersPath: "include" ) ]