iOS項(xiàng)目開發(fā)中SVProgressHUD出現(xiàn)的場景比較高頻,上手快墓臭,使用簡單方便森逮,Show和Dismiss基本上解決了絕大多數(shù)的問題.
官方Demo中有三個(gè)重要的設(shè)置選項(xiàng),彈出框背景色(Style)簿煌,動畫類型(AnimationType)及遮罩層顏色(MaskType).
<pre><code>`typedef NS_ENUM(NSInteger, SVProgressHUDStyle) {
SVProgressHUDStyleLight, // default style, white HUD with black text, HUD background will be blurred on iOS 8 and above
SVProgressHUDStyleDark, // black HUD and white text, HUD background will be blurred on iOS 8 and above
SVProgressHUDStyleCustom // uses the fore- and background color properties
};
typedef NS_ENUM(NSUInteger, SVProgressHUDMaskType) {
SVProgressHUDMaskTypeNone = 1, // default mask type, allow user interactions while HUD is displayed
SVProgressHUDMaskTypeClear, // don't allow user interactions
SVProgressHUDMaskTypeBlack, // don't allow user interactions and dim the UI in the back of the HUD, as on iOS 7 and above
SVProgressHUDMaskTypeGradient, // don't allow user interactions and dim the UI with a a-la UIAlertView background gradient, as on iOS 6
SVProgressHUDMaskTypeCustom // don't allow user interactions and dim the UI in the back of the HUD with a custom color
};
typedef NS_ENUM(NSUInteger, SVProgressHUDAnimationType) {
SVProgressHUDAnimationTypeFlat, // default animation type, custom flat animation (indefinite animated ring)
SVProgressHUDAnimationTypeNative // iOS native UIActivityIndicatorView
};`</code></pre>
背景色和動畫類型設(shè)置:
<pre><code> [SVProgressHUD setDefaultStyle:SVProgressHUDStyleDark]; [SVProgressHUD setDefaultAnimationType:SVProgressHUDAnimationTypeFlat];
</code></pre>
SVProgressHUDMaskType中默認(rèn)設(shè)置的SVProgressHUDMaskTypeNone用戶是可以通過遮罩層對視圖中的其他進(jìn)行點(diǎn)擊操作的氮唯,剩余的四種類型都是不允許進(jìn)行其他操作.
SVProgressHUDMaskTypeCustom允許用戶自定義顯示遮罩層的背景顏色:
<pre><code>[SVProgressHUD setBackgroundLayerColor:[[UIColor redColor] colorWithAlphaComponent:0.4]]; [SVProgressHUD setDefaultMaskType:SVProgressHUDMaskTypeCustom];
</code></pre>
SVProgressHUD顯示的Show方法:
<pre><code>`+ (void)show;
(void)showWithMaskType:(SVProgressHUDMaskType)maskType attribute((deprecated("Use show and setDefaultMaskType: instead.")));
(void)showWithStatus:(NSString*)status;
(void)showWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType attribute((deprecated("Use showWithStatus: and setDefaultMaskType: instead.")));
(void)showProgress:(float)progress;
(void)showProgress:(float)progress maskType:(SVProgressHUDMaskType)maskType attribute((deprecated("Use showProgress: and setDefaultMaskType: instead.")));
(void)showProgress:(float)progress status:(NSString*)status;
(void)showProgress:(float)progress status:(NSString*)status maskType:(SVProgressHUDMaskType)maskType attribute((deprecated("Use showProgress:status: and setDefaultMaskType: instead.")));
(void)setStatus:(NSString*)status; // change the HUD loading status while it's showing
// stops the activity indicator, shows a glyph + status, and dismisses the HUD a little bit later
- (void)showInfoWithStatus:(NSString*)status;
- (void)showInfoWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType attribute((deprecated("Use showInfoWithStatus: and setDefaultMaskType: instead.")));
- (void)showSuccessWithStatus:(NSString*)status;
- (void)showSuccessWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType attribute((deprecated("Use showSuccessWithStatus: and setDefaultMaskType: instead.")));
- (void)showErrorWithStatus:(NSString*)status;
- (void)showErrorWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType attribute((deprecated("Use showErrorWithStatus: and setDefaultMaskType: instead.")));
// shows a image + status, use 28x28 white PNGs
- (void)showImage:(UIImage)image status:(NSString)status;
- (void)showImage:(UIImage)image status:(NSString)status maskType:(SVProgressHUDMaskType)maskType attribute((deprecated("Use showImage:status: and setDefaultMaskType: instead.")));`</code></pre>
如果項(xiàng)目中發(fā)現(xiàn)SVProgressHUD默認(rèn)的圖片不滿足需求,可以通過ShowImage自定義圖片實(shí)現(xiàn):
<pre><code>`// shows a image + status, use 28x28 white PNGs
- (void)showImage:(UIImage)image status:(NSString)status;`</code></pre>
關(guān)于彈出框背景顏色姨伟,文字顏色惩琉,字體大小,偏移量都可以自定義設(shè)置:
<pre><code>`+ (void)setDefaultStyle:(SVProgressHUDStyle)style; // default is SVProgressHUDStyleLight
- (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType; // default is SVProgressHUDMaskTypeNone
- (void)setDefaultAnimationType:(SVProgressHUDAnimationType)type; // default is SVProgressHUDAnimationTypeFlat
- (void)setContainerView:(UIView*)containerView; // default is window level
- (void)setMinimumSize:(CGSize)minimumSize; // default is CGSizeZero, can be used to avoid resizing for a larger message
- (void)setRingThickness:(CGFloat)ringThickness; // default is 2 pt
- (void)setRingRadius:(CGFloat)radius; // default is 18 pt
- (void)setRingNoTextRadius:(CGFloat)radius; // default is 24 pt
- (void)setCornerRadius:(CGFloat)cornerRadius; // default is 14 pt
- (void)setFont:(UIFont*)font; // default is [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]
- (void)setForegroundColor:(UIColor*)color; // default is [UIColor blackColor], only used for SVProgressHUDStyleCustom
- (void)setBackgroundColor:(UIColor*)color; // default is [UIColor whiteColor], only used for SVProgressHUDStyleCustom
- (void)setBackgroundLayerColor:(UIColor*)color; // default is [UIColor colorWithWhite:0 alpha:0.5], only used for SVProgressHUDMaskTypeBlack
- (void)setInfoImage:(UIImage*)image; // default is the bundled info image provided by Freepik
- (void)setSuccessImage:(UIImage*)image; // default is the bundled success image provided by Freepik
- (void)setErrorImage:(UIImage*)image; // default is the bundled error image provided by Freepik
- (void)setViewForExtension:(UIView*)view; // default is nil, only used if #define SV_APP_EXTENSIONS is set
- (void)setMinimumDismissTimeInterval:(NSTimeInterval)interval; // default is 5.0 seconds
- (void)setMaximumDismissTimeInterval:(NSTimeInterval)interval; // default is infinite
- (void)setFadeInAnimationDuration:(NSTimeInterval)duration; // default is 0.15 seconds
- (void)setFadeOutAnimationDuration:(NSTimeInterval)duration; // default is 0.15 seconds
- (void)setMaxSupportedWindowLevel:(UIWindowLevel)windowLevel; // default is UIWindowLevelNormal`</code></pre>
SVProgressHUD實(shí)現(xiàn)原理也不難夺荒,主要通過單例實(shí)現(xiàn):
<pre><code>`+ (SVProgressHUD*)sharedView {
static dispatch_once_t once;
static SVProgressHUD *sharedView;
if !defined(SV_APP_EXTENSIONS)
dispatch_once(&once, ^{ sharedView = [[self alloc] initWithFrame:[[[UIApplication sharedApplication] delegate] window].bounds]; });
else
dispatch_once(&once, ^{ sharedView = [[self alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; });
endif
return sharedView;
}`</code></pre>
通常主線程更新UI的方法如下:
<pre><code>` dispatch_async(dispatch_get_main_queue(), ^{
});`</code></pre>
SVProgressHUD中的的更新方法如下:
<pre><code>`- (void)showImage:(UIImage)image status:(NSString)status duration:(NSTimeInterval)duration {
__weak SVProgressHUD *weakSelf = self;
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
__strong SVProgressHUD *strongSelf = weakSelf;
if(strongSelf){
// Update / Check view hierarchy to ensure the HUD is visible
[strongSelf updateViewHierarchy];
// Reset progress and cancel any running animation
strongSelf.progress = SVProgressHUDUndefinedProgress;
[strongSelf cancelRingLayerAnimation];
[strongSelf cancelIndefiniteAnimatedViewAnimation];
// Update imageView
UIColor *tintColor = strongSelf.foregroundColorForStyle;
UIImage *tintedImage = image;
if (image.renderingMode != UIImageRenderingModeAlwaysTemplate) {
tintedImage = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
}
strongSelf.imageView.tintColor = tintColor;
strongSelf.imageView.image = tintedImage;
strongSelf.imageView.hidden = NO;
// Update text
strongSelf.statusLabel.text = status;
// Show
[strongSelf showStatus:status];
// An image will dismissed automatically. Therefore we start a timer
// which then will call dismiss after the predefined duration
strongSelf.fadeOutTimer = [NSTimer timerWithTimeInterval:duration target:strongSelf selector:@selector(dismiss) userInfo:nil repeats:NO];
[[NSRunLoop mainRunLoop] addTimer:strongSelf.fadeOutTimer forMode:NSRunLoopCommonModes];
}
}];
}`</code></pre>
SVProgressHUD消失除了常用的dismiss方法瞒渠,還有popActivity,實(shí)現(xiàn)代碼:
<pre><code>+ (void)popActivity { if([self sharedView].activityCount > 0) { [self sharedView].activityCount--; } if([self sharedView].activityCount == 0) { [[self sharedView] dismiss]; } }
</code></pre>
SVProgressHUD內(nèi)部定義幾種常用的視圖出現(xiàn),點(diǎn)擊技扼,消失的通知事件:
<pre><code>extern NSString * const SVProgressHUDDidReceiveTouchEventNotification; extern NSString * const SVProgressHUDDidTouchDownInsideNotification; extern NSString * const SVProgressHUDWillDisappearNotification; extern NSString * const SVProgressHUDDidDisappearNotification; extern NSString * const SVProgressHUDWillAppearNotification; extern NSString * const SVProgressHUDDidAppearNotification;
</code></pre>
SVProgressHUD中的幾種動畫效果有單獨(dú)的文件伍玖,有興趣的可以自己看一下,關(guān)于SVProgressHUD的常用時(shí)間進(jìn)行了一下梳理淮摔,如有遺漏私沮,歡迎指教~