讀秒倒計時

前些日子宦赠,項目中用到一個倒計時讀秒的功能胸嘴。其實實現(xiàn)起來很簡單券犁,就是通過改變 label 的transform埠对。經(jīng)過封裝一句代碼就可以引入項目中苛茂。

/**
 @param number       倒計時起始時間
 @param endTitle     倒計時結(jié)束字符串
 @param beginCount   倒計時開始回調(diào)
 @param finishCount  倒計時結(jié)束回調(diào)
 */
[GGCountDownLabel gg_countDownWithBeginNumber:5 endTitle:@"第一個控制器" begin:nil finished:nil];

Demo下載地址:https://github.com/Gunial/GGCountDownLabel

先看下效果:


讀秒倒計時.gif

因為代碼很簡單已烤,所以就直接貼出來了
.h 文件中的代碼

#import <UIKit/UIKit.h>

typedef void(^countDownBeginCallBack)();
typedef void(^countDownFinishedCallBack)();

@interface GGCountDownLabel : UILabel

/**
 開始倒計時

 @param number   倒計時起始時間
 @param endTitle 倒計時結(jié)束字符串
 @param beginCount    倒計時開始回調(diào)
 @param finishCount 倒計時結(jié)束回調(diào)
 */
+ (instancetype)gg_countDownWithBeginNumber:(NSInteger)number
                                   endTitle:(NSString *)endTitle
                                      begin:(countDownBeginCallBack)beginCount
                                   finished:(countDownFinishedCallBack)finishCount;

/**
 隱藏
 */
+ (void)gg_hidden;

@end

.m文件中的代碼

#import "GGCountDownLabel.h"
#import "AppDelegate.h"

#define GGScreenWith [UIScreen mainScreen].bounds.size.width
#define GGScreenHeight [UIScreen mainScreen].bounds.size.height
#define GGAppDelegate ((AppDelegate *)([UIApplication sharedApplication].delegate))

@interface GGCountDownLabel ()

@property (nonatomic, assign) NSInteger number;
@property (nonatomic, copy) NSString *endTitle;
@property (nonatomic, copy) countDownBeginCallBack beginCount;
@property (nonatomic, copy) countDownFinishedCallBack finishCount;

@end

@implementation GGCountDownLabel
BOOL isAnimating;

/** 單例初始化 */
+ (instancetype)shareCountDownLabel
{
    static GGCountDownLabel *_instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[GGCountDownLabel alloc] init];
    });
    return _instance;
}

+ (instancetype)gg_countDownWithBeginNumber:(NSInteger)number endTitle:(NSString *)endTitle begin:(countDownBeginCallBack)beginCount finished:(countDownFinishedCallBack)finishCount
{
    GGCountDownLabel *countDownLabel = [GGCountDownLabel shareCountDownLabel];
    
    //** 防止重疊動畫 */
    if (isAnimating) return nil;
    
    //默認(rèn)倒計時為三秒
    countDownLabel.number = 3;
    
    if (number && number > 0) countDownLabel.number = number;
    if (endTitle && endTitle.length > 0) countDownLabel.endTitle = endTitle;
    if (beginCount) countDownLabel.beginCount = beginCount;
    if (finishCount) countDownLabel.finishCount = finishCount;
    
    [self gg_configLabel:countDownLabel];
    [self gg_scaleActionWithLabel:countDownLabel beginBlock:beginCount finishedBlock:finishCount];
    
    return countDownLabel;
}

/** 配置 label 的基本屬性 */
+ (void)gg_configLabel:(GGCountDownLabel *)label
{
    label.hidden = NO;
    label.frame = CGRectMake(0, 0, GGScreenWith, GGScreenHeight/2);
    label.center = CGPointMake(GGScreenWith/2, GGScreenHeight/2);
    label.transform = CGAffineTransformScale(label.transform, 15, 15);
    label.alpha = 0;
    label.text = [NSString stringWithFormat:@"%zd",label.number];
    label.textColor = [UIColor whiteColor];
    label.font = [UIFont boldSystemFontOfSize:12];
    label.textAlignment = NSTextAlignmentCenter;
    
    [[label gg_getCurrentSuperView] addSubview:label];
}

// 獲取當(dāng)前顯示的控制器的View
- (UIView *)gg_getCurrentSuperView
{
    return [self gg_getVisibleViewControllerFrom:(UIViewController *)GGAppDelegate.window.rootViewController].view;
}

- (UIViewController *)gg_getVisibleViewControllerFrom:(UIViewController*)vc
{
    if ([vc isKindOfClass:[UINavigationController class]]) {
        return [self gg_getVisibleViewControllerFrom:[((UINavigationController*) vc) visibleViewController]];
    }else if ([vc isKindOfClass:[UITabBarController class]]){
        return [self gg_getVisibleViewControllerFrom:[((UITabBarController*) vc) selectedViewController]];
    } else {
        if (vc.presentedViewController) {
            return [self gg_getVisibleViewControllerFrom:vc.presentedViewController];
        } else {
            return vc;
        }
    }
}

/** 倒計時動畫 */
+ (void)gg_scaleActionWithLabel:(GGCountDownLabel *)label beginBlock:(countDownBeginCallBack)beginCount finishedBlock:(countDownFinishedCallBack)finishCount
{
    if (!isAnimating) {
        if (label.beginCount) {
            label.beginCount();
        }
    }
    
    if (label.number >= (label.endTitle.length ? 0 : 1 )) {
        isAnimating = YES;
        label.text = label.number == 0 ? label.endTitle : [NSString stringWithFormat:@"%zd",label.number];

        [UIView animateWithDuration:1.0 animations:^{
            label.alpha = 1;
            label.transform = CGAffineTransformIdentity;
        } completion:^(BOOL finished) {
            if (finished) {
                label.number --;
                label.alpha = 0;
                label.transform = CGAffineTransformScale(label.transform, 15, 15);
                [self gg_scaleActionWithLabel:label beginBlock:beginCount finishedBlock:finishCount];
            }
        }];
    }else {
        if (label.finishCount) label.finishCount();
        [self gg_hidden];
    }
}

/** 隱藏 */
+ (void)gg_hidden
{
    isAnimating = NO;
    [GGCountDownLabel shareCountDownLabel].transform = CGAffineTransformIdentity;
    [GGCountDownLabel shareCountDownLabel].hidden = YES;
    [[GGCountDownLabel shareCountDownLabel] removeFromSuperview];
}

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市妓羊,隨后出現(xiàn)的幾起案子胯究,更是在濱河造成了極大的恐慌,老刑警劉巖躁绸,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裕循,死亡現(xiàn)場離奇詭異,居然都是意外死亡净刮,警方通過查閱死者的電腦和手機(jī)剥哑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淹父,“玉大人株婴,你說我怎么就攤上這事∈钊希” “怎么了困介?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蘸际。 經(jīng)常有香客問我座哩,道長,這世上最難降的妖魔是什么粮彤? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任根穷,我火速辦了婚禮,結(jié)果婚禮上导坟,老公的妹妹穿的比我還像新娘崩侠。我一直安慰自己封寞,他們只是感情好茂嗓,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布闸迷。 她就那樣靜靜地躺著,像睡著了一般闯两。 火紅的嫁衣襯著肌膚如雪褥伴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天漾狼,我揣著相機(jī)與錄音重慢,去河邊找鬼。 笑死逊躁,一個胖子當(dāng)著我的面吹牛似踱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼核芽,長吁一口氣:“原來是場噩夢啊……” “哼囚戚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起轧简,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤驰坊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哮独,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拳芙,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年皮璧,在試婚紗的時候發(fā)現(xiàn)自己被綠了舟扎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡悴务,死狀恐怖睹限,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情讯檐,我是刑警寧澤羡疗,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站裂垦,受9級特大地震影響顺囊,放射性物質(zhì)發(fā)生泄漏肌索。R本人自食惡果不足惜蕉拢,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诚亚。 院中可真熱鬧晕换,春花似錦、人聲如沸站宗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梢灭。三九已至夷家,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間敏释,已是汗流浹背库快。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留钥顽,地道東北人义屏。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闽铐。 傳聞我的和親對象是個殘疾皇子蝶怔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,777評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)兄墅,斷路器踢星,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件察迟、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,065評論 4 62
  • 腳本來源:鄒肉肉 主人公:婷斩狱、辣辣、鄒肉肉 在搖搖晃晃的火車上扎瓶。 睡醒了一覺所踊,醒來覺得無事可干,長達(dá)二十幾個小時的...
    西柚和檸檬閱讀 206評論 0 2
  • 看完了蝸居概荷,想了很多秕岛,宋思明喜歡海藻,可是不愛她误证,如果愛她继薛,不會繼續(xù)經(jīng)營20年的局,而把自己卷進(jìn)去愈捅,也傷害到海藻和...
    林馨兒_d1d3閱讀 144評論 0 0