iOS-SVProgressHUD進(jìn)度框

iOS項(xiàng)目開發(fā)中SVProgressHUD出現(xiàn)的場景比較高頻,上手快墓臭,使用簡單方便森逮,Show和Dismiss基本上解決了絕大多數(shù)的問題.

FlyElephant.png

官方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)行了一下梳理淮摔,如有遺漏私沮,歡迎指教~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末始赎,一起剝皮案震驚了整個(gè)濱河市和橙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌造垛,老刑警劉巖魔招,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異五辽,居然都是意外死亡办斑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門杆逗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乡翅,“玉大人,你說我怎么就攤上這事罪郊∪溲粒” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵悔橄,是天一觀的道長靶累。 經(jīng)常有香客問我腺毫,道長,這世上最難降的妖魔是什么挣柬? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任潮酒,我火速辦了婚禮,結(jié)果婚禮上邪蛔,老公的妹妹穿的比我還像新娘急黎。我一直安慰自己,他們只是感情好侧到,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布叁熔。 她就那樣靜靜地躺著,像睡著了一般床牧。 火紅的嫁衣襯著肌膚如雪荣回。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天戈咳,我揣著相機(jī)與錄音心软,去河邊找鬼。 笑死著蛙,一個(gè)胖子當(dāng)著我的面吹牛删铃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播踏堡,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼猎唁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了顷蟆?” 一聲冷哼從身側(cè)響起诫隅,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帐偎,沒想到半個(gè)月后逐纬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡削樊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年豁生,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漫贞。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甸箱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迅脐,到底是詐尸還是另有隱情芍殖,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布仪际,位于F島的核電站围小,受9級特大地震影響昵骤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肯适,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一变秦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧框舔,春花似錦蹦玫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纬凤,卻和暖如春福贞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挖帘。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工拇舀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜻底,地道東北人薄辅。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓长搀,卻偏偏與公主長得像鸡典,于是被迫代替她去往敵國和親彻况。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容