讀 MBProgressHUD 感

話說(shuō),MBProgressHUD 是我接觸iOS的第一個(gè)第三方的輪子属划,感覺還是很有感情的诅蝶,一直一來(lái)也沒好好看看里面,下面是大致看完后記錄的幾個(gè)點(diǎn)桑包。

  • 利用KVO 刷新
  • 各種宏的巧用
  • 永遠(yuǎn)保證UIView 在主線程中進(jìn)行動(dòng)作

同時(shí)在想南蓬,MBProgressHUD 也有一個(gè)使用上的不方便是,彈出短時(shí)間內(nèi)的提示框的時(shí)候哑了,不能點(diǎn)擊其他操作赘方,這個(gè)很多時(shí)候是很不方便的。

一弱左、利用 KVO 刷新
#pragma mark - KVO
- (void)registerForKVO {
    for (NSString *keyPath in [self observableKeypaths]) {
        [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:NULL];
    }
}

- (void)unregisterFromKVO {
    for (NSString *keyPath in [self observableKeypaths]) {
        [self removeObserver:self forKeyPath:keyPath];
    }
}

- (NSArray *)observableKeypaths {
    return [NSArray arrayWithObjects:@"mode", @"customView", @"labelText", @"labelFont", @"labelColor",
            @"detailsLabelText", @"detailsLabelFont", @"detailsLabelColor", @"progress", @"activityIndicatorColor", nil];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:@selector(updateUIForKeypath:) withObject:keyPath waitUntilDone:NO];
    } else {
        [self updateUIForKeypath:keyPath];
    }
}

- (void)updateUIForKeypath:(NSString *)keyPath {
    if ([keyPath isEqualToString:@"mode"] || [keyPath isEqualToString:@"customView"] ||
        [keyPath isEqualToString:@"activityIndicatorColor"]) {
        [self updateIndicators];
    } else if ([keyPath isEqualToString:@"labelText"]) {
        label.text = self.labelText;
    } else if ([keyPath isEqualToString:@"labelFont"]) {
        label.font = self.labelFont;
    } else if ([keyPath isEqualToString:@"labelColor"]) {
        label.textColor = self.labelColor;
    } else if ([keyPath isEqualToString:@"detailsLabelText"]) {
        detailsLabel.text = self.detailsLabelText;
    } else if ([keyPath isEqualToString:@"detailsLabelFont"]) {
        detailsLabel.font = self.detailsLabelFont;
    } else if ([keyPath isEqualToString:@"detailsLabelColor"]) {
        detailsLabel.textColor = self.detailsLabelColor;
    } else if ([keyPath isEqualToString:@"progress"]) {
        if ([indicator respondsToSelector:@selector(setProgress:)]) {
            [(id)indicator setValue:@(progress) forKey:@"progress"];
        }
        return;
    }
    [self setNeedsLayout];
    [self setNeedsDisplay];
}

獲取屬性,用KVO刷新窄陡,很巧妙,很直接拆火,這個(gè)可以學(xué)習(xí)跳夭。

- (NSArray *)observableKeypaths涂圆;
二、 各種宏的巧用

區(qū)分ARC 的情況

#ifndef MB_INSTANCETYPE
#if __has_feature(objc_instancetype)
    #define MB_INSTANCETYPE instancetype
#else
    #define MB_INSTANCETYPE id
#endif
#endif

#ifndef MB_STRONG
#if __has_feature(objc_arc)
    #define MB_STRONG strong
#else
    #define MB_STRONG retain
#endif
#endif

#ifndef MB_WEAK
#if __has_feature(objc_arc_weak)
    #define MB_WEAK weak
#elif __has_feature(objc_arc)
    #define MB_WEAK unsafe_unretained
#else
    #define MB_WEAK assign
#endif
#endif

區(qū)分不同版本的

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 60000
    #define MBLabelAlignmentCenter NSTextAlignmentCenter
#else
    #define MBLabelAlignmentCenter UITextAlignmentCenter
#endif

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000
    #define MB_TEXTSIZE(text, font) [text length] > 0 ? [text \
        sizeWithAttributes:@{NSFontAttributeName:font}] : CGSizeZero;
#else
    #define MB_TEXTSIZE(text, font) [text length] > 0 ? [text sizeWithFont:font] : CGSizeZero;
#endif

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000
    #define MB_MULTILINE_TEXTSIZE(text, font, maxSize, mode) [text length] > 0 ? [text \
        boundingRectWithSize:maxSize options:(NSStringDrawingUsesLineFragmentOrigin) \
        attributes:@{NSFontAttributeName:font} context:nil].size : CGSizeZero;
#else
    #define MB_MULTILINE_TEXTSIZE(text, font, maxSize, mode) [text length] > 0 ? [text \
        sizeWithFont:font constrainedToSize:maxSize lineBreakMode:mode] : CGSizeZero;
#endif

哎币叹,想想還是順便放到我另一個(gè)筆記中iOS 中常用宏润歉,判斷文字寬度不同版本的兩者還是很實(shí)用的。

三颈抚、 永遠(yuǎn)保證UIView 在主線程中進(jìn)行動(dòng)作

  • show 時(shí)的判斷
 NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread.");

  • KVO 刷新時(shí)的判斷
 if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:@selector(updateUIForKeypath:) withObject:keyPath waitUntilDone:NO];
    } else {
        [self updateUIForKeypath:keyPath];
    }

另外注意, 直接取消一個(gè)對(duì)象在當(dāng)前Run Loop中的所有未執(zhí)行的performSelector:withObject:afterDelay:方法所產(chǎn)生的Selector Sources踩衩。

[NSObject cancelPreviousPerformRequestsWithTarget:self];

總的來(lái)說(shuō),其實(shí)在里面還是有多細(xì)節(jié)可以挖掘的贩汉,看我們的關(guān)注點(diǎn)吧

- (void)layoutSubviews;
- (void)drawRect:(CGRect)rect;

像上述兩個(gè)方法中有很多可以去發(fā)現(xiàn)驱富,同時(shí)要進(jìn)行一些額外的操作也可以在這里面進(jìn)行添加或修改。

像之前想的問(wèn)題雾鬼,彈出短時(shí)間內(nèi)的提示框的時(shí)候萌朱,不能點(diǎn)擊其他操作, 也許一個(gè)簡(jiǎn)單的交互就可以實(shí)現(xiàn):

hud.userInteractionEnabled = NO;

又或是通過(guò)設(shè)置添加一個(gè)取消按鈕也可以宴树,當(dāng)然這樣更好策菜。

而真正使用MBProgressHUD 還是很簡(jiǎn)單的,直接看一個(gè)github中的源碼的Demo 基本都會(huì)啦酒贬。

備注下:以上是 Version 0.9.2中的一些點(diǎn)又憨,而最新版本中已經(jīng)有很多不同啦,可以再次學(xué)習(xí)锭吨,??
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蠢莺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子零如,更是在濱河造成了極大的恐慌躏将,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件考蕾,死亡現(xiàn)場(chǎng)離奇詭異祸憋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)肖卧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門蚯窥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人塞帐,你說(shuō)我怎么就攤上這事拦赠。” “怎么了葵姥?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵荷鼠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我榔幸,道長(zhǎng)颊咬,這世上最難降的妖魔是什么务甥? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮喳篇,結(jié)果婚禮上敞临,老公的妹妹穿的比我還像新娘。我一直安慰自己麸澜,他們只是感情好挺尿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著炊邦,像睡著了一般编矾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上馁害,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天窄俏,我揣著相機(jī)與錄音,去河邊找鬼碘菜。 笑死凹蜈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忍啸。 我是一名探鬼主播仰坦,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼计雌!你這毒婦竟也來(lái)了悄晃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凿滤,失蹤者是張志新(化名)和其女友劉穎妈橄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翁脆,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡眷蚓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鹃祖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溪椎。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖恬口,靈堂內(nèi)的尸體忽然破棺而出校读,到底是詐尸還是另有隱情,我是刑警寧澤祖能,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布歉秫,位于F島的核電站,受9級(jí)特大地震影響养铸,放射性物質(zhì)發(fā)生泄漏雁芙。R本人自食惡果不足惜轧膘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兔甘。 院中可真熱鬧谎碍,春花似錦、人聲如沸洞焙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)澡匪。三九已至熔任,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唁情,已是汗流浹背疑苔。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甸鸟,地道東北人惦费。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像哀墓,于是被迫代替她去往敵國(guó)和親趁餐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喷兼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)篮绰、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,059評(píng)論 4 62
  • 1.OC里用到集合類是什么季惯? 基本類型為:NSArray吠各,NSSet以及NSDictionary 可變類型為:NS...
    輕皺眉頭淺憂思閱讀 1,366評(píng)論 0 3
  • 1、引言 計(jì)算機(jī)網(wǎng)絡(luò)中的帶寬勉抓、交換結(jié)點(diǎn)中的緩存和處理機(jī)等贾漏,都是網(wǎng)絡(luò)的資源。在某段時(shí)間藕筋,若對(duì)網(wǎng)絡(luò)中某一資源的需求超過(guò)...
    SinX竟然被占用了閱讀 389評(píng)論 0 1
  • 你們都走了纵散,又只剩下我一個(gè)人了。是時(shí)候要學(xué)會(huì)適應(yīng)孤單了隐圾!沒有你們的日子里伍掀,我想哭,沒有一個(gè)肩膀可以讓我依靠暇藏。所以想...
    鄧熙熙閱讀 139評(píng)論 0 0
  • “生命的真正意義是什么盐碱?這一生什么才是自己最在乎的把兔?萬(wàn)一在死后才明白了這些問(wèn)題怎么辦沪伙?” 這是昨晚不停地、反復(fù)地出...
    銥漩娜閱讀 303評(píng)論 0 0