Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/ios.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarino Faggiana <m.faggiana@twsweb.it>2018-11-12 14:14:58 +0300
committerMarino Faggiana <marinofaggiana@MacBook-Pro-di-Marino.local>2018-11-12 14:14:58 +0300
commit0340358c1dcbf936803b226583034213c8c20449 (patch)
tree4a90c262205b4bc42e99d1ef5a772401ba819d7a /Libraries external
parent6e2561ed812052af04008c7b7576d8e9f373f701 (diff)
update project
Diffstat (limited to 'Libraries external')
-rw-r--r--Libraries external/MBProgressHUD/MBProgressHUD.h435
-rw-r--r--Libraries external/MBProgressHUD/MBProgressHUD.m1484
2 files changed, 0 insertions, 1919 deletions
diff --git a/Libraries external/MBProgressHUD/MBProgressHUD.h b/Libraries external/MBProgressHUD/MBProgressHUD.h
deleted file mode 100644
index a10744c0c..000000000
--- a/Libraries external/MBProgressHUD/MBProgressHUD.h
+++ /dev/null
@@ -1,435 +0,0 @@
-//
-// MBProgressHUD.h
-// Version 1.0.0
-// Created by Matej Bukovinski on 2.4.09.
-//
-
-// This code is distributed under the terms and conditions of the MIT license.
-
-// 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
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-#import <Foundation/Foundation.h>
-#import <UIKit/UIKit.h>
-#import <CoreGraphics/CoreGraphics.h>
-
-@class MBBackgroundView;
-@protocol MBProgressHUDDelegate;
-
-
-extern CGFloat const MBProgressMaxOffset;
-
-typedef NS_ENUM(NSInteger, MBProgressHUDMode) {
- /// UIActivityIndicatorView.
- MBProgressHUDModeIndeterminate,
- /// A round, pie-chart like, progress view.
- MBProgressHUDModeDeterminate,
- /// Horizontal progress bar.
- MBProgressHUDModeDeterminateHorizontalBar,
- /// Ring-shaped progress view.
- MBProgressHUDModeAnnularDeterminate,
- /// Shows a custom view.
- MBProgressHUDModeCustomView,
- /// Shows only labels.
- MBProgressHUDModeText
-};
-
-typedef NS_ENUM(NSInteger, MBProgressHUDAnimation) {
- /// Opacity animation
- MBProgressHUDAnimationFade,
- /// Opacity + scale animation (zoom in when appearing zoom out when disappearing)
- MBProgressHUDAnimationZoom,
- /// Opacity + scale animation (zoom out style)
- MBProgressHUDAnimationZoomOut,
- /// Opacity + scale animation (zoom in style)
- MBProgressHUDAnimationZoomIn
-};
-
-typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) {
- /// Solid color background
- MBProgressHUDBackgroundStyleSolidColor,
- /// UIVisualEffectView or UIToolbar.layer background view
- MBProgressHUDBackgroundStyleBlur
-};
-
-typedef void (^MBProgressHUDCompletionBlock)();
-
-
-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.
- * The MBProgressHUD window spans over the entire space given to it by the initWithFrame: constructor and catches all
- * user input on this region, thereby preventing the user operations on components below the view.
- *
- * @note To still allow touches to pass through the HUD, you can set hud.userInteractionEnabled = NO.
- * @attention MBProgressHUD is a UI class and should therefore only be accessed on the main thread.
- */
-@interface MBProgressHUD : UIView
-
-/**
- * Creates a new HUD, adds it to provided view and shows it. The counterpart to this method is hideHUDForView:animated:.
- *
- * @note This method sets removeFromSuperViewOnHide. The HUD will automatically be removed from the view hierarchy when hidden.
- *
- * @param view The view that the HUD will be added to
- * @param animated If set to YES the HUD will appear using the current animationType. If set to NO the HUD will not use
- * animations while appearing.
- * @return A reference to the created HUD.
- *
- * @see hideHUDForView:animated:
- * @see animationType
- */
-+ (instancetype)showHUDAddedTo:(UIView *)view animated:(BOOL)animated;
-
-/// @name Showing and hiding
-
-/**
- * Finds the top-most HUD subview and hides it. The counterpart to this method is showHUDAddedTo:animated:.
- *
- * @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
- * animations while disappearing.
- * @return YES if a HUD was found and removed, NO otherwise.
- *
- * @see showHUDAddedTo:animated:
- * @see animationType
- */
-+ (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated;
-
-/**
- * Finds the top-most HUD subview and returns it.
- *
- * @param view The view that is going to be searched.
- * @return A reference to the last HUD subview discovered.
- */
-+ (nullable MBProgressHUD *)HUDForView:(UIView *)view;
-
-/**
- * A convenience constructor that initializes the HUD with the view's bounds. Calls the designated constructor with
- * 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).
- */
-- (instancetype)initWithView:(UIView *)view;
-
-/**
- * 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
- * (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.
- *
- * @see animationType
- */
-- (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.
- *
- * @param animated If set to YES the HUD will disappear using the current animationType. If set to NO the HUD will not use
- * animations while disappearing.
- *
- * @see animationType
- */
-- (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.
- *
- * @param animated If set to YES the HUD will disappear using the current animationType. If set to NO the HUD will not use
- * animations while disappearing.
- * @param delay Delay in seconds until the HUD is hidden.
- *
- * @see animationType
- */
-- (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay;
-
-/**
- * The HUD delegate object. Receives HUD state notifications.
- */
-@property (weak, nonatomic) id<MBProgressHUDDelegate> 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
- * not be shown at all.
- * This may be used to prevent HUD display for very short tasks.
- * Defaults to 0 (no grace time).
- */
-@property (assign, nonatomic) NSTimeInterval graceTime;
-
-/**
- * The minimum time (in seconds) that the HUD is shown.
- * This avoids the problem of the HUD being shown and than instantly hidden.
- * Defaults to 0 (no minimum show time).
- */
-@property (assign, nonatomic) NSTimeInterval minShowTime;
-
-/**
- * Removes the HUD from its parent view when hidden.
- * Defaults to NO.
- */
-@property (assign, nonatomic) BOOL removeFromSuperViewOnHide;
-
-/// @name Appearance
-
-/**
- * MBProgressHUD operation mode. The default is MBProgressHUDModeIndeterminate.
- */
-@property (assign, nonatomic) MBProgressHUDMode mode;
-
-/**
- * A color that gets forwarded to all labels and supported indicators. Also sets the tintColor
- * for custom views on iOS 7+. Set to nil to manage color individually.
- * Defaults to semi-translucent black on iOS 7 and later and white on earlier iOS versions.
- */
-@property (strong, nonatomic, nullable) UIColor *contentColor UI_APPEARANCE_SELECTOR;
-
-/**
- * The animation type that should be used when the HUD is shown and hidden.
- */
-@property (assign, nonatomic) MBProgressHUDAnimation animationType UI_APPEARANCE_SELECTOR;
-
-/**
- * The bezel offset relative to the center of the view. You can use MBProgressMaxOffset
- * and -MBProgressMaxOffset to move the HUD all the way to the screen edge in each direction.
- * E.g., CGPointMake(0.f, MBProgressMaxOffset) would position the HUD centered on the bottom edge.
- */
-@property (assign, nonatomic) CGPoint offset UI_APPEARANCE_SELECTOR;
-
-/**
- * The amount of space between the HUD edge and the HUD elements (labels, indicators or custom views).
- * This also represents the minimum bezel distance to the edge of the HUD view.
- * Defaults to 20.f
- */
-@property (assign, nonatomic) CGFloat margin UI_APPEARANCE_SELECTOR;
-
-/**
- * The minimum size of the HUD bezel. Defaults to CGSizeZero (no minimum size).
- */
-@property (assign, nonatomic) CGSize minSize UI_APPEARANCE_SELECTOR;
-
-/**
- * Force the HUD dimensions to be equal if possible.
- */
-@property (assign, nonatomic, getter = isSquare) BOOL square UI_APPEARANCE_SELECTOR;
-
-/**
- * When enabled, the bezel center gets slightly affected by the device accelerometer data.
- * Has no effect on iOS < 7.0. Defaults to YES.
- */
-@property (assign, nonatomic, getter=areDefaultMotionEffectsEnabled) BOOL defaultMotionEffectsEnabled UI_APPEARANCE_SELECTOR;
-
-/// @name Progress
-
-/**
- * The progress of the progress indicator, from 0.0 to 1.0. Defaults to 0.0.
- */
-@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
-
-/**
- * The view containing the labels and indicator (or customView).
- */
-@property (strong, nonatomic, readonly) MBBackgroundView *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 pixels.
- */
-@property (strong, nonatomic, nullable) UIView *customView;
-
-/**
- * A label that holds an optional short message to be displayed below the activity indicator. The HUD is automatically resized to fit
- * the entire text.
- */
-@property (strong, nonatomic, readonly) UILabel *label;
-
-/**
- * A label that holds an optional details message displayed below the labelText message. The details text can span multiple lines.
- */
-@property (strong, nonatomic, readonly) UILabel *detailsLabel;
-
-/**
- * A button that is placed below the labels. Visible only if a target / action is added.
- */
-@property (strong, nonatomic, readonly) UIButton *button;
-
-@end
-
-
-@protocol MBProgressHUDDelegate <NSObject>
-
-@optional
-
-/**
- * Called after the HUD was fully hidden from the screen.
- */
-- (void)hudWasHidden:(MBProgressHUD *)hud;
-
-@end
-
-
-/**
- * A progress view for showing definite progress by filling up a circle (pie chart).
- */
-@interface MBRoundProgressView : UIView
-
-/**
- * Progress (0.0 to 1.0)
- */
-@property (nonatomic, assign) float progress;
-
-/**
- * Indicator progress color.
- * Defaults to white [UIColor whiteColor].
- */
-@property (nonatomic, strong) UIColor *progressTintColor;
-
-/**
- * Indicator background (non-progress) color.
- * 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. Defaults to round.
- */
-@property (nonatomic, assign, getter = isAnnular) BOOL annular;
-
-@end
-
-
-/**
- * A flat bar progress view.
- */
-@interface MBBarProgressView : UIView
-
-/**
- * Progress (0.0 to 1.0)
- */
-@property (nonatomic, assign) float progress;
-
-/**
- * Bar border line color.
- * Defaults to white [UIColor whiteColor].
- */
-@property (nonatomic, strong) UIColor *lineColor;
-
-/**
- * Bar background color.
- * Defaults to clear [UIColor clearColor];
- */
-@property (nonatomic, strong) UIColor *progressRemainingColor;
-
-/**
- * Bar progress color.
- * Defaults to white [UIColor whiteColor].
- */
-@property (nonatomic, strong) UIColor *progressColor;
-
-@end
-
-
-@interface MBBackgroundView : UIView
-
-/**
- * The background style.
- * Defaults to MBProgressHUDBackgroundStyleBlur on iOS 7 or later and MBProgressHUDBackgroundStyleSolidColor otherwise.
- * @note Due to iOS 7 not supporting UIVisualEffectView, the blur effect differs slightly between iOS 7 and later versions.
- */
-@property (nonatomic) MBProgressHUDBackgroundStyle style;
-
-/**
- * The background color or the blur tint color.
- * @note Due to iOS 7 not supporting UIVisualEffectView, the blur effect differs slightly between iOS 7 and later versions.
- */
-@property (nonatomic, strong) UIColor *color;
-
-@end
-
-@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/Libraries external/MBProgressHUD/MBProgressHUD.m b/Libraries external/MBProgressHUD/MBProgressHUD.m
deleted file mode 100644
index a94f9217a..000000000
--- a/Libraries external/MBProgressHUD/MBProgressHUD.m
+++ /dev/null
@@ -1,1484 +0,0 @@
-//
-// MBProgressHUD.m
-// Version 1.0.0
-// Created by Matej Bukovinski on 2.4.09.
-//
-
-#import "MBProgressHUD.h"
-#import <tgmath.h>
-
-
-#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;
-
-static const CGFloat MBDefaultPadding = 4.f;
-static const CGFloat MBDefaultLabelFontSize = 16.f;
-static const CGFloat MBDefaultDetailsLabelFontSize = 12.f;
-
-
-@interface MBProgressHUD () {
- // Deprecated
- UIColor *_activityIndicatorColor;
- CGFloat _opacity;
-}
-
-@property (nonatomic, assign) BOOL useAnimation;
-@property (nonatomic, assign, getter=hasFinished) BOOL finished;
-@property (nonatomic, strong) UIView *indicator;
-@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;
-@property (nonatomic, weak) CADisplayLink *progressObjectDisplayLink;
-
-// Deprecated
-@property (assign) BOOL taskInProgress;
-
-@end
-
-
-@interface MBProgressHUDRoundedButton : UIButton
-@end
-
-
-@implementation MBProgressHUD
-
-#pragma mark - Class methods
-
-+ (instancetype)showHUDAddedTo:(UIView *)view animated:(BOOL)animated {
- MBProgressHUD *hud = [[self alloc] initWithView:view];
- hud.removeFromSuperViewOnHide = YES;
- [view addSubview:hud];
- [hud showAnimated:animated];
- return hud;
-}
-
-+ (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated {
- MBProgressHUD *hud = [self HUDForView:view];
- if (hud != nil) {
- hud.removeFromSuperViewOnHide = YES;
- [hud hideAnimated:animated];
- return YES;
- }
- return NO;
-}
-
-+ (MBProgressHUD *)HUDForView:(UIView *)view {
- NSEnumerator *subviewsEnum = [view.subviews reverseObjectEnumerator];
- for (UIView *subview in subviewsEnum) {
- if ([subview isKindOfClass:self]) {
- return (MBProgressHUD *)subview;
- }
- }
- return nil;
-}
-
-#pragma mark - Lifecycle
-
-- (void)commonInit {
- // Set default values for properties
- _animationType = MBProgressHUDAnimationFade;
- _mode = MBProgressHUDModeIndeterminate;
- _margin = 20.0f;
- _opacity = 1.f;
- _defaultMotionEffectsEnabled = YES;
-
- // Default color, depending on the current iOS version
- BOOL isLegacy = kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0;
- _contentColor = isLegacy ? [UIColor whiteColor] : [UIColor colorWithWhite:0.f alpha:0.7f];
- // Transparent background
- self.opaque = NO;
- self.backgroundColor = [UIColor clearColor];
- // Make it invisible for now
- self.alpha = 0.0f;
- self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
- self.layer.allowsGroupOpacity = NO;
-
- [self setupViews];
- [self updateIndicators];
- [self registerForNotifications];
-}
-
-- (instancetype)initWithFrame:(CGRect)frame {
- if ((self = [super initWithFrame:frame])) {
- [self commonInit];
- }
- return self;
-}
-
-- (instancetype)initWithCoder:(NSCoder *)aDecoder {
- if ((self = [super initWithCoder:aDecoder])) {
- [self commonInit];
- }
- return self;
-}
-
-- (id)initWithView:(UIView *)view {
- NSAssert(view, @"View must not be nil.");
- return [self initWithFrame:view.bounds];
-}
-
-- (void)dealloc {
- [self unregisterFromNotifications];
-}
-
-#pragma mark - Show & hide
-
-- (void)showAnimated:(BOOL)animated {
- MBMainThreadAssert();
- [self.minShowTimer invalidate];
- self.useAnimation = animated;
- self.finished = NO;
- // If the grace time is set, postpone the HUD display
- if (self.graceTime > 0.0) {
- NSTimer *timer = [NSTimer timerWithTimeInterval:self.graceTime target:self selector:@selector(handleGraceTimer:) userInfo:nil repeats:NO];
- [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
- self.graceTimer = timer;
- }
- // ... otherwise show the HUD immediately
- else {
- [self showUsingAnimation:self.useAnimation];
- }
-}
-
-- (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,
- // 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) {
- NSTimer *timer = [NSTimer timerWithTimeInterval:(self.minShowTime - interv) target:self selector:@selector(handleMinShowTimer:) userInfo:nil repeats:NO];
- [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
- self.minShowTimer = timer;
- return;
- }
- }
- // ... otherwise hide the HUD immediately
- [self hideUsingAnimation:self.useAnimation];
-}
-
-- (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay {
- NSTimer *timer = [NSTimer timerWithTimeInterval:delay target:self selector:@selector(handleHideTimer:) userInfo:@(animated) repeats:NO];
- [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
- self.hideDelayTimer = timer;
-}
-
-#pragma mark - Timer callbacks
-
-- (void)handleGraceTimer:(NSTimer *)theTimer {
- // Show the HUD only if the task is still running
- if (!self.hasFinished) {
- [self showUsingAnimation:self.useAnimation];
- }
-}
-
-- (void)handleMinShowTimer:(NSTimer *)theTimer {
- [self hideUsingAnimation:self.useAnimation];
-}
-
-- (void)handleHideTimer:(NSTimer *)timer {
- [self hideAnimated:[timer.userInfo boolValue]];
-}
-
-#pragma mark - View Hierrarchy
-
-- (void)didMoveToSuperview {
- [self updateForCurrentOrientationAnimated:NO];
-}
-
-#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];
-
- self.showStarted = [NSDate date];
- self.alpha = 1.f;
-
- // Needed in case we hide and re-show with the same NSProgress object attached.
- [self setNSProgressDisplayLinkEnabled:YES];
-
- 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.backgroundView.alpha = 1.f;
- }
-}
-
-- (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];
- }
-}
-
-- (void)animateIn:(BOOL)animatingIn withType:(MBProgressHUDAnimation)type completion:(void(^)(BOOL finished))completion {
- // Automatically determine the correct zoom animation type
- if (type == MBProgressHUDAnimationZoom) {
- type = animatingIn ? MBProgressHUDAnimationZoomIn : MBProgressHUDAnimationZoomOut;
- }
-
- CGAffineTransform small = CGAffineTransformMakeScale(0.5f, 0.5f);
- CGAffineTransform large = CGAffineTransformMakeScale(1.5f, 1.5f);
-
- // Set starting state
- UIView *bezelView = self.bezelView;
- if (animatingIn && bezelView.alpha == 0.f && type == MBProgressHUDAnimationZoomIn) {
- bezelView.transform = small;
- } else if (animatingIn && bezelView.alpha == 0.f && type == MBProgressHUDAnimationZoomOut) {
- bezelView.transform = large;
- }
-
- // Perform animations
- dispatch_block_t animations = ^{
- if (animatingIn) {
- bezelView.transform = CGAffineTransformIdentity;
- } else if (!animatingIn && type == MBProgressHUDAnimationZoomIn) {
- bezelView.transform = large;
- } 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;
- };
-
- // 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];
-}
-
-- (void)done {
- // Cancel any scheduled hideDelayed: calls
- [self.hideDelayTimer invalidate];
- [self setNSProgressDisplayLinkEnabled:NO];
-
- if (self.hasFinished) {
- self.alpha = 0.0f;
- if (self.removeFromSuperViewOnHide) {
- [self removeFromSuperview];
- }
- }
- MBProgressHUDCompletionBlock completionBlock = self.completionBlock;
- if (completionBlock) {
- completionBlock();
- }
- id<MBProgressHUDDelegate> delegate = self.delegate;
- if ([delegate respondsToSelector:@selector(hudWasHidden:)]) {
- [delegate performSelector:@selector(hudWasHidden:) withObject:self];
- }
-}
-
-#pragma mark - UI
-
-- (void)setupViews {
- UIColor *defaultColor = self.contentColor;
-
- MBBackgroundView *backgroundView = [[MBBackgroundView alloc] initWithFrame:self.bounds];
- backgroundView.style = MBProgressHUDBackgroundStyleSolidColor;
- backgroundView.backgroundColor = [UIColor clearColor];
- backgroundView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
- backgroundView.alpha = 0.f;
- [self addSubview:backgroundView];
- _backgroundView = backgroundView;
-
- MBBackgroundView *bezelView = [MBBackgroundView new];
- bezelView.translatesAutoresizingMaskIntoConstraints = NO;
- bezelView.layer.cornerRadius = 5.f;
- bezelView.alpha = 0.f;
- [self addSubview:bezelView];
- _bezelView = bezelView;
- [self updateBezelMotionEffects];
-
- UILabel *label = [UILabel new];
- label.adjustsFontSizeToFitWidth = NO;
- label.textAlignment = NSTextAlignmentCenter;
- label.textColor = defaultColor;
- label.font = [UIFont boldSystemFontOfSize:MBDefaultLabelFontSize];
- label.opaque = NO;
- label.backgroundColor = [UIColor clearColor];
- _label = label;
-
- UILabel *detailsLabel = [UILabel new];
- detailsLabel.adjustsFontSizeToFitWidth = NO;
- detailsLabel.textAlignment = NSTextAlignmentCenter;
- 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];
- button.titleLabel.textAlignment = NSTextAlignmentCenter;
- button.titleLabel.font = [UIFont boldSystemFontOfSize:MBDefaultDetailsLabelFontSize];
- [button setTitleColor:defaultColor forState:UIControlStateNormal];
- _button = button;
-
- for (UIView *view in @[label, detailsLabel, button]) {
- view.translatesAutoresizingMaskIntoConstraints = NO;
- [view setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisHorizontal];
- [view setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisVertical];
- [bezelView addSubview:view];
- }
-
- UIView *topSpacer = [UIView new];
- topSpacer.translatesAutoresizingMaskIntoConstraints = NO;
- topSpacer.hidden = YES;
- [bezelView addSubview:topSpacer];
- _topSpacer = topSpacer;
-
- UIView *bottomSpacer = [UIView new];
- bottomSpacer.translatesAutoresizingMaskIntoConstraints = NO;
- bottomSpacer.hidden = YES;
- [bezelView addSubview:bottomSpacer];
- _bottomSpacer = bottomSpacer;
-}
-
-- (void)updateIndicators {
- UIView *indicator = self.indicator;
- BOOL isActivityIndicator = [indicator isKindOfClass:[UIActivityIndicatorView class]];
- BOOL isRoundIndicator = [indicator isKindOfClass:[MBRoundProgressView class]];
-
- MBProgressHUDMode mode = self.mode;
- if (mode == MBProgressHUDModeIndeterminate) {
- if (!isActivityIndicator) {
- // Update to indeterminate indicator
- [indicator removeFromSuperview];
- indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
- [(UIActivityIndicatorView *)indicator startAnimating];
- [self.bezelView addSubview:indicator];
- }
- }
- else if (mode == MBProgressHUDModeDeterminateHorizontalBar) {
- // Update to bar determinate indicator
- [indicator removeFromSuperview];
- indicator = [[MBBarProgressView alloc] init];
- [self.bezelView addSubview:indicator];
- }
- else if (mode == MBProgressHUDModeDeterminate || mode == MBProgressHUDModeAnnularDeterminate) {
- if (!isRoundIndicator) {
- // Update to determinante indicator
- [indicator removeFromSuperview];
- indicator = [[MBRoundProgressView alloc] init];
- [self.bezelView addSubview:indicator];
- }
- if (mode == MBProgressHUDModeAnnularDeterminate) {
- [(MBRoundProgressView *)indicator setAnnular:YES];
- }
- }
- else if (mode == MBProgressHUDModeCustomView && self.customView != indicator) {
- // Update custom view indicator
- [indicator removeFromSuperview];
- indicator = self.customView;
- [self.bezelView addSubview:indicator];
- }
- else if (mode == MBProgressHUDModeText) {
- [indicator removeFromSuperview];
- indicator = nil;
- }
- indicator.translatesAutoresizingMaskIntoConstraints = NO;
- self.indicator = indicator;
-
- if ([indicator respondsToSelector:@selector(setProgress:)]) {
- [(id)indicator setValue:@(self.progress) forKey:@"progress"];
- }
-
- [indicator setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisHorizontal];
- [indicator setContentCompressionResistancePriority:998.f forAxis:UILayoutConstraintAxisVertical];
-
- [self updateViewsForColor:self.contentColor];
- [self setNeedsUpdateConstraints];
-}
-
-- (void)updateViewsForColor:(UIColor *)color {
- if (!color) return;
-
- self.label.textColor = 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;
- if ([indicator isKindOfClass:[UIActivityIndicatorView class]]) {
- UIActivityIndicatorView *appearance = nil;
-#if __IPHONE_OS_VERSION_MIN_REQUIRED < 90000
- appearance = [UIActivityIndicatorView appearanceWhenContainedIn:[MBProgressHUD class], nil];
-#else
- // For iOS 9+
- appearance = [UIActivityIndicatorView appearanceWhenContainedInInstancesOfClasses:@[[MBProgressHUD class]]];
-#endif
-
- if (appearance.color == nil) {
- ((UIActivityIndicatorView *)indicator).color = color;
- }
- } else if ([indicator isKindOfClass:[MBRoundProgressView class]]) {
- MBRoundProgressView *appearance = nil;
-#if __IPHONE_OS_VERSION_MIN_REQUIRED < 90000
- appearance = [MBRoundProgressView appearanceWhenContainedIn:[MBProgressHUD class], nil];
-#else
- appearance = [MBRoundProgressView appearanceWhenContainedInInstancesOfClasses:@[[MBProgressHUD class]]];
-#endif
- 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 *appearance = nil;
-#if __IPHONE_OS_VERSION_MIN_REQUIRED < 90000
- appearance = [MBBarProgressView appearanceWhenContainedIn:[MBProgressHUD class], nil];
-#else
- appearance = [MBBarProgressView appearanceWhenContainedInInstancesOfClasses:@[[MBProgressHUD class]]];
-#endif
- 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:)]) {
- [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;
-
- if (self.defaultMotionEffectsEnabled) {
- CGFloat effectOffset = 10.f;
- UIInterpolatingMotionEffect *effectX = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
- effectX.maximumRelativeValue = @(effectOffset);
- effectX.minimumRelativeValue = @(-effectOffset);
-
- UIInterpolatingMotionEffect *effectY = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y" type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis];
- effectY.maximumRelativeValue = @(effectOffset);
- effectY.minimumRelativeValue = @(-effectOffset);
-
- UIMotionEffectGroup *group = [[UIMotionEffectGroup alloc] init];
- group.motionEffects = @[effectX, effectY];
-
- [bezelView addMotionEffect:group];
- } else {
- NSArray *effects = [bezelView motionEffects];
- for (UIMotionEffect *effect in effects) {
- [bezelView removeMotionEffect:effect];
- }
- }
-#endif
-}
-
-#pragma mark - Layout
-
-- (void)updateConstraints {
- UIView *bezel = self.bezelView;
- UIView *topSpacer = self.topSpacer;
- UIView *bottomSpacer = self.bottomSpacer;
- CGFloat margin = self.margin;
- NSMutableArray *bezelConstraints = [NSMutableArray array];
- NSDictionary *metrics = @{@"margin": @(margin)};
-
- 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 constraints
- [self removeConstraints:self.constraints];
- [topSpacer removeConstraints:topSpacer.constraints];
- [bottomSpacer removeConstraints:bottomSpacer.constraints];
- if (self.bezelConstraints) {
- [bezel removeConstraints:self.bezelConstraints];
- self.bezelConstraints = nil;
- }
-
- // Center bezel in container (self), applying the offset if set
- CGPoint offset = self.offset;
- NSMutableArray *centeringConstraints = [NSMutableArray array];
- [centeringConstraints addObject:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.f constant:offset.x]];
- [centeringConstraints addObject:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.f constant:offset.y]];
- [self applyPriority:998.f toConstraints:centeringConstraints];
- [self addConstraints:centeringConstraints];
-
- // Ensure minimum side margin is kept
- NSMutableArray *sideConstraints = [NSMutableArray array];
- [sideConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=margin)-[bezel]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(bezel)]];
- [sideConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=margin)-[bezel]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(bezel)]];
- [self applyPriority:999.f toConstraints:sideConstraints];
- [self addConstraints:sideConstraints];
-
- // Minimum bezel size, if set
- CGSize minimumSize = self.minSize;
- if (!CGSizeEqualToSize(minimumSize, CGSizeZero)) {
- NSMutableArray *minSizeConstraints = [NSMutableArray array];
- [minSizeConstraints addObject:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.f constant:minimumSize.width]];
- [minSizeConstraints addObject:[NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.f constant:minimumSize.height]];
- [self applyPriority:997.f toConstraints:minSizeConstraints];
- [bezelConstraints addObjectsFromArray:minSizeConstraints];
- }
-
- // Square aspect ratio, if set
- if (self.square) {
- NSLayoutConstraint *square = [NSLayoutConstraint constraintWithItem:bezel attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeWidth multiplier:1.f constant:0];
- square.priority = 997.f;
- [bezelConstraints addObject:square];
- }
-
- // Top and bottom spacing
- [topSpacer addConstraint:[NSLayoutConstraint constraintWithItem:topSpacer attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.f constant:margin]];
- [bottomSpacer addConstraint:[NSLayoutConstraint constraintWithItem:bottomSpacer attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.f constant:margin]];
- // Top and bottom spaces should be equal
- [bezelConstraints addObject:[NSLayoutConstraint constraintWithItem:topSpacer attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:bottomSpacer attribute:NSLayoutAttributeHeight multiplier:1.f constant:0.f]];
-
- // Layout subviews in bezel
- NSMutableArray *paddingConstraints = [NSMutableArray new];
- [subviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) {
- // Center in bezel
- [bezelConstraints addObject:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:bezel attribute:NSLayoutAttributeCenterX multiplier:1.f constant:0.f]];
- // Ensure the minimum edge margin is kept
- [bezelConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=margin)-[view]-(>=margin)-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(view)]];
- // Element spacing
- if (idx == 0) {
- // 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 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) {
- // Has previous
- NSLayoutConstraint *padding = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:subviews[idx - 1] attribute:NSLayoutAttributeBottom multiplier:1.f constant:0.f];
- [bezelConstraints addObject:padding];
- [paddingConstraints addObject:padding];
- }
- }];
-
- [bezel addConstraints:bezelConstraints];
- self.bezelConstraints = bezelConstraints;
-
- self.paddingConstraints = [paddingConstraints copy];
- [self updatePaddingConstraints];
-
- [super updateConstraints];
-}
-
-- (void)layoutSubviews {
- // 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];
-}
-
-- (void)updatePaddingConstraints {
- // Set padding dynamically, depending on whether the view is visible or not
- __block BOOL hasVisibleAncestors = NO;
- [self.paddingConstraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *padding, NSUInteger idx, BOOL *stop) {
- UIView *firstView = (UIView *)padding.firstItem;
- 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 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;
- }];
-}
-
-- (void)applyPriority:(UILayoutPriority)priority toConstraints:(NSArray *)constraints {
- for (NSLayoutConstraint *constraint in constraints) {
- constraint.priority = priority;
- }
-}
-
-#pragma mark - Properties
-
-- (void)setMode:(MBProgressHUDMode)mode {
- if (mode != _mode) {
- _mode = mode;
- [self updateIndicators];
- }
-}
-
-- (void)setCustomView:(UIView *)customView {
- if (customView != _customView) {
- _customView = customView;
- if (self.mode == MBProgressHUDModeCustomView) {
- [self updateIndicators];
- }
- }
-}
-
-- (void)setOffset:(CGPoint)offset {
- if (!CGPointEqualToPoint(offset, _offset)) {
- _offset = offset;
- [self setNeedsUpdateConstraints];
- }
-}
-
-- (void)setMargin:(CGFloat)margin {
- if (margin != _margin) {
- _margin = margin;
- [self setNeedsUpdateConstraints];
- }
-}
-
-- (void)setMinSize:(CGSize)minSize {
- if (!CGSizeEqualToSize(minSize, _minSize)) {
- _minSize = minSize;
- [self setNeedsUpdateConstraints];
- }
-}
-
-- (void)setSquare:(BOOL)square {
- if (square != _square) {
- _square = square;
- [self setNeedsUpdateConstraints];
- }
-}
-
-- (void)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;
- [self setNSProgressDisplayLinkEnabled:YES];
- }
-}
-
-- (void)setProgress:(float)progress {
- if (progress != _progress) {
- _progress = progress;
- UIView *indicator = self.indicator;
- if ([indicator respondsToSelector:@selector(setProgress:)]) {
- [(id)indicator setValue:@(self.progress) forKey:@"progress"];
- }
- }
-}
-
-- (void)setContentColor:(UIColor *)contentColor {
- if (contentColor != _contentColor && ![contentColor isEqual:_contentColor]) {
- _contentColor = contentColor;
- [self updateViewsForColor:contentColor];
- }
-}
-
-- (void)setDefaultMotionEffectsEnabled:(BOOL)defaultMotionEffectsEnabled {
- if (defaultMotionEffectsEnabled != _defaultMotionEffectsEnabled) {
- _defaultMotionEffectsEnabled = defaultMotionEffectsEnabled;
- [self updateBezelMotionEffects];
- }
-}
-
-#pragma mark - NSProgress
-
-- (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)updateProgressFromProgressObject {
- self.progress = self.progressObject.fractionCompleted;
-}
-
-#pragma mark - Notifications
-
-- (void)registerForNotifications {
-#if !TARGET_OS_TV
- NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
-
- [nc addObserver:self selector:@selector(statusBarOrientationDidChange:)
- name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
-#endif
-}
-
-- (void)unregisterFromNotifications {
-#if !TARGET_OS_TV
- NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
- [nc removeObserver:self name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
-#endif
-}
-
-#if !TARGET_OS_TV
-- (void)statusBarOrientationDidChange:(NSNotification *)notification {
- UIView *superview = self.superview;
- if (!superview) {
- return;
- } else {
- [self updateForCurrentOrientationAnimated:YES];
- }
-}
-#endif
-
-- (void)updateForCurrentOrientationAnimated:(BOOL)animated {
- // Stay in sync with the superview in any case
- 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;
-
- // 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)]) 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
-}
-
-@end
-
-
-@implementation MBRoundProgressView
-
-#pragma mark - Lifecycle
-
-- (id)init {
- return [self initWithFrame:CGRectMake(0.f, 0.f, 37.f, 37.f)];
-}
-
-- (id)initWithFrame:(CGRect)frame {
- self = [super initWithFrame:frame];
- if (self) {
- self.backgroundColor = [UIColor clearColor];
- self.opaque = NO;
- _progress = 0.f;
- _annular = NO;
- _progressTintColor = [[UIColor alloc] initWithWhite:1.f alpha:1.f];
- _backgroundTintColor = [[UIColor alloc] initWithWhite:1.f alpha:.1f];
- }
- return self;
-}
-
-#pragma mark - Layout
-
-- (CGSize)intrinsicContentSize {
- return CGSizeMake(37.f, 37.f);
-}
-
-#pragma mark - Properties
-
-- (void)setProgress:(float)progress {
- if (progress != _progress) {
- _progress = progress;
- [self setNeedsDisplay];
- }
-}
-
-- (void)setProgressTintColor:(UIColor *)progressTintColor {
- NSAssert(progressTintColor, @"The color should not be nil.");
- if (progressTintColor != _progressTintColor && ![progressTintColor isEqual:_progressTintColor]) {
- _progressTintColor = progressTintColor;
- [self setNeedsDisplay];
- }
-}
-
-- (void)setBackgroundTintColor:(UIColor *)backgroundTintColor {
- NSAssert(backgroundTintColor, @"The color should not be nil.");
- if (backgroundTintColor != _backgroundTintColor && ![backgroundTintColor isEqual:_backgroundTintColor]) {
- _backgroundTintColor = backgroundTintColor;
- [self setNeedsDisplay];
- }
-}
-
-#pragma mark - Drawing
-
-- (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;
- UIBezierPath *processBackgroundPath = [UIBezierPath bezierPath];
- processBackgroundPath.lineWidth = lineWidth;
- processBackgroundPath.lineCapStyle = kCGLineCapButt;
- CGPoint center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
- CGFloat radius = (self.bounds.size.width - lineWidth)/2;
- CGFloat startAngle = - ((float)M_PI / 2); // 90 degrees
- CGFloat endAngle = (2 * (float)M_PI) + startAngle;
- [processBackgroundPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES];
- [_backgroundTintColor set];
- [processBackgroundPath stroke];
- // Draw progress
- UIBezierPath *processPath = [UIBezierPath bezierPath];
- processPath.lineCapStyle = isPreiOS7 ? kCGLineCapRound : kCGLineCapSquare;
- processPath.lineWidth = lineWidth;
- endAngle = (self.progress * 2 * (float)M_PI) + startAngle;
- [processPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES];
- [_progressTintColor set];
- [processPath stroke];
- } else {
- // Draw background
- CGFloat lineWidth = 2.f;
- CGRect allRect = self.bounds;
- CGRect circleRect = CGRectInset(allRect, lineWidth/2.f, lineWidth/2.f);
- CGPoint center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
- [_progressTintColor setStroke];
- [_backgroundTintColor setFill];
- CGContextSetLineWidth(context, lineWidth);
- 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 overlaping when _progressTintColor alpha < 1.f.
- CGContextSetBlendMode(context, kCGBlendModeCopy);
- [_progressTintColor set];
- [processPath stroke];
- }
- }
-}
-
-@end
-
-
-@implementation MBBarProgressView
-
-#pragma mark - Lifecycle
-
-- (id)init {
- return [self initWithFrame:CGRectMake(.0f, .0f, 120.0f, 20.0f)];
-}
-
-- (id)initWithFrame:(CGRect)frame {
- self = [super initWithFrame:frame];
- if (self) {
- _progress = 0.f;
- _lineColor = [UIColor whiteColor];
- _progressColor = [UIColor whiteColor];
- _progressRemainingColor = [UIColor clearColor];
- self.backgroundColor = [UIColor clearColor];
- self.opaque = NO;
- }
- return self;
-}
-
-#pragma mark - Layout
-
-- (CGSize)intrinsicContentSize {
- BOOL isPreiOS7 = kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0;
- return CGSizeMake(120.f, isPreiOS7 ? 20.f : 10.f);
-}
-
-#pragma mark - Properties
-
-- (void)setProgress:(float)progress {
- if (progress != _progress) {
- _progress = progress;
- [self setNeedsDisplay];
- }
-}
-
-- (void)setProgressColor:(UIColor *)progressColor {
- NSAssert(progressColor, @"The color should not be nil.");
- if (progressColor != _progressColor && ![progressColor isEqual:_progressColor]) {
- _progressColor = progressColor;
- [self setNeedsDisplay];
- }
-}
-
-- (void)setProgressRemainingColor:(UIColor *)progressRemainingColor {
- NSAssert(progressRemainingColor, @"The color should not be nil.");
- if (progressRemainingColor != _progressRemainingColor && ![progressRemainingColor isEqual:_progressRemainingColor]) {
- _progressRemainingColor = progressRemainingColor;
- [self setNeedsDisplay];
- }
-}
-
-#pragma mark - Drawing
-
-- (void)drawRect:(CGRect)rect {
- CGContextRef context = UIGraphicsGetCurrentContext();
-
- CGContextSetLineWidth(context, 2);
- CGContextSetStrokeColorWithColor(context,[_lineColor CGColor]);
- CGContextSetFillColorWithColor(context, [_progressRemainingColor CGColor]);
-
- // Draw background
- CGFloat radius = (rect.size.height / 2) - 2;
- CGContextMoveToPoint(context, 2, rect.size.height/2);
- CGContextAddArcToPoint(context, 2, 2, radius + 2, 2, radius);
- CGContextAddLineToPoint(context, rect.size.width - radius - 2, 2);
- CGContextAddArcToPoint(context, rect.size.width - 2, 2, rect.size.width - 2, rect.size.height / 2, radius);
- CGContextAddArcToPoint(context, rect.size.width - 2, rect.size.height - 2, rect.size.width - radius - 2, rect.size.height - 2, radius);
- CGContextAddLineToPoint(context, radius + 2, rect.size.height - 2);
- CGContextAddArcToPoint(context, 2, rect.size.height - 2, 2, rect.size.height/2, radius);
- CGContextFillPath(context);
-
- // Draw border
- CGContextMoveToPoint(context, 2, rect.size.height/2);
- CGContextAddArcToPoint(context, 2, 2, radius + 2, 2, radius);
- CGContextAddLineToPoint(context, rect.size.width - radius - 2, 2);
- CGContextAddArcToPoint(context, rect.size.width - 2, 2, rect.size.width - 2, rect.size.height / 2, radius);
- CGContextAddArcToPoint(context, rect.size.width - 2, rect.size.height - 2, rect.size.width - radius - 2, rect.size.height - 2, radius);
- CGContextAddLineToPoint(context, radius + 2, rect.size.height - 2);
- CGContextAddArcToPoint(context, 2, rect.size.height - 2, 2, rect.size.height/2, radius);
- CGContextStrokePath(context);
-
- CGContextSetFillColorWithColor(context, [_progressColor CGColor]);
- radius = radius - 2;
- CGFloat amount = self.progress * rect.size.width;
-
- // Progress in the middle area
- if (amount >= radius + 4 && amount <= (rect.size.width - radius - 4)) {
- CGContextMoveToPoint(context, 4, rect.size.height/2);
- CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius);
- CGContextAddLineToPoint(context, amount, 4);
- CGContextAddLineToPoint(context, amount, radius + 4);
-
- CGContextMoveToPoint(context, 4, rect.size.height/2);
- CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius);
- CGContextAddLineToPoint(context, amount, rect.size.height - 4);
- CGContextAddLineToPoint(context, amount, radius + 4);
-
- CGContextFillPath(context);
- }
-
- // Progress in the right arc
- else if (amount > radius + 4) {
- CGFloat x = amount - (rect.size.width - radius - 4);
-
- CGContextMoveToPoint(context, 4, rect.size.height/2);
- CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius);
- CGContextAddLineToPoint(context, rect.size.width - radius - 4, 4);
- CGFloat angle = -acos(x/radius);
- if (isnan(angle)) angle = 0;
- CGContextAddArc(context, rect.size.width - radius - 4, rect.size.height/2, radius, M_PI, angle, 0);
- CGContextAddLineToPoint(context, amount, rect.size.height/2);
-
- CGContextMoveToPoint(context, 4, rect.size.height/2);
- CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius);
- CGContextAddLineToPoint(context, rect.size.width - radius - 4, rect.size.height - 4);
- angle = acos(x/radius);
- if (isnan(angle)) angle = 0;
- CGContextAddArc(context, rect.size.width - radius - 4, rect.size.height/2, radius, -M_PI, angle, 1);
- CGContextAddLineToPoint(context, amount, rect.size.height/2);
-
- CGContextFillPath(context);
- }
-
- // Progress is in the left arc
- else if (amount < radius + 4 && amount > 0) {
- CGContextMoveToPoint(context, 4, rect.size.height/2);
- CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius);
- CGContextAddLineToPoint(context, radius + 4, rect.size.height/2);
-
- CGContextMoveToPoint(context, 4, rect.size.height/2);
- CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius);
- CGContextAddLineToPoint(context, radius + 4, rect.size.height/2);
-
- CGContextFillPath(context);
- }
-}
-
-@end
-
-
-@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
-
-
-@implementation MBBackgroundView
-
-#pragma mark - Lifecycle
-
-- (instancetype)initWithFrame:(CGRect)frame {
- if ((self = [super initWithFrame:frame])) {
- if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0) {
- _style = MBProgressHUDBackgroundStyleBlur;
- 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];
- }
-
- self.clipsToBounds = YES;
-
- [self updateForBackgroundStyle];
- }
- return self;
-}
-
-#pragma mark - Layout
-
-- (CGSize)intrinsicContentSize {
- // Smallest size possible. Content pushes against this.
- return CGSizeZero;
-}
-
-#pragma mark - Appearance
-
-- (void)setStyle:(MBProgressHUDBackgroundStyle)style {
- if (style == MBProgressHUDBackgroundStyleBlur && kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0) {
- style = MBProgressHUDBackgroundStyleSolidColor;
- }
- if (_style != style) {
- _style = style;
- [self updateForBackgroundStyle];
- }
-}
-
-- (void)setColor:(UIColor *)color {
- NSAssert(color, @"The color should not be nil.");
- if (color != _color && ![color isEqual:_color]) {
- _color = color;
- [self updateViewsForColor:color];
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark - Views
-
-- (void)updateForBackgroundStyle {
- 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: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
-#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
- } 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;
- }
-}
-
-- (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
- }
- } else {
- self.backgroundColor = self.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 (^)())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
-
-- (instancetype)initWithFrame:(CGRect)frame {
- self = [super initWithFrame:frame];
- if (self) {
- CALayer *layer = self.layer;
- layer.borderWidth = 1.f;
- }
- return self;
-}
-
-#pragma mark - Layout
-
-- (void)layoutSubviews {
- [super layoutSubviews];
- // Fully rounded corners
- CGFloat height = CGRectGetHeight(self.bounds);
- self.layer.cornerRadius = ceil(height / 2.f);
-}
-
-- (CGSize)intrinsicContentSize {
- // Only show if we have associated control events
- if (self.allControlEvents == 0) return CGSizeZero;
- CGSize size = [super intrinsicContentSize];
- // Add some side padding
- size.width += 20.f;
- return size;
-}
-
-#pragma mark - Color
-
-- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state {
- [super setTitleColor:color forState:state];
- // Update related colors
- [self setHighlighted:self.highlighted];
- self.layer.borderColor = color.CGColor;
-}
-
-- (void)setHighlighted:(BOOL)highlighted {
- [super setHighlighted:highlighted];
- UIColor *baseColor = [self titleColorForState:UIControlStateSelected];
- self.backgroundColor = highlighted ? [baseColor colorWithAlphaComponent:0.1f] : [UIColor clearColor];
-}
-
-@end