IOS 定時器封裝--倒的正的都可以(Swift版)

最近項目中用到了不少定時器匆篓,不管是訂單確認、訂單支付以及驗證碼等都會用到倒計時胖秒,所以就重新的封裝了一個比較好用的缎患,方便使用。天生愚鈍的我可能寫的沒有那么完美阎肝,希望各位大神看后能給出指導的建議挤渔,包括有什么新的需求可以添加的,我好加以修改风题。

說多了都是廢話判导,直接上圖,你能用到并且能夠看上才是真理沛硅。
Timer.gif

下面我來簡單的說一下如何使用這個定時器:

1.0 創(chuàng)建

@objc enum TYCountDownLabelType: Int {
    case defaultType // 倒計時
    case incrementTimeType // 遞增時間
}
// 方式一
let timerL = TYTimerLabel(label: timerLabel) // 默認倒計時
// 方式二 
let timerL = TYTimerLabel(label: timerLabel, type: .defaultType) // .defaultType為倒計時
// 方式三
let timerL = TYTimerLabel(frame: .zero, label: timerLabel, type: .incrementTimeType) // .incrementTimeType遞增時間

2.0 屬性

    // 是否開始倒計時
    var counting: Bool = false
    // 倒計時結束是否重置時間
    var isResetTime: Bool = false
    // 時間格式類型
    fileprivate var _timeFormat: String?
    var timeFormat: String? {
        get {
            if _timeFormat == nil || (_timeFormat?.count ?? 0) == 0 {
                _timeFormat = defaultTimeFormatter
            }
            return _timeFormat
        } set {
            _timeFormat = newValue
            self.dateFormatter?.dateFormat = _timeFormat
            self.renewalLabel()
        }
    }
    // dateFormatter
    fileprivate var _dateFormatter: DateFormatter?
    fileprivate var dateFormatter: DateFormatter? {
        get {
            if _dateFormatter == nil {
                
                _dateFormatter = DateFormatter.init()
                /**
                 **不同地區(qū)有不同的日期格式眼刃。使用這個方法的目的:得到指定地區(qū)指定日期字段的一個合適的格式
                 **en_US(United States) : MM/dd/YYYY, HH:mm:ss;  en_GB(United Kingdom): dd/MM/YYYY, HH:mm:ss;  zh_CN(中國): YYYY/MM/dd HH:mm:ss
                 **/
                _dateFormatter?.locale = Locale(identifier: "en_GB")
                /**
                 **時區(qū):  任何時區(qū)都以GMT為準
                 ** iOS中的時間類NSDate所獲取到的時間, 都是相對于GMT的
                 **/
                _dateFormatter?.timeZone = TimeZone(identifier: "GMT")
                _dateFormatter?.dateFormat = self.timeFormat
            }
            return _dateFormatter
        } set {
            _dateFormatter = newValue
        }
    }

3.0 方法

// 開啟定時器
timerL.start() 
// 暫停定時器
timerL.pause() 
// 重置定時器
timerL.reset()
// 通過傳入時間間隔來設定倒計時的具體時間
timerL.countDownTimeWithTimeInterval(timeInterval: 60) // 設計倒計時一分鐘
// 通過傳入的Date來設定倒計時的具體時間
timerL.countDownTimeWithDate(date: dateTime ?? Date())
// 通過傳入的時間間隔設置遞增時間的初始時間,默認是0:0:0
timerL.incrementTimeWithTimeInterval(interval: 60) // 從一分鐘開始 
// 獲取已經過去的時間
let consumeTime = timerL.etConsumeTime()
// 獲取剩余的倒計時時間
let countDownResidueTime = timerL.residueTime()
// 獲取倒計時的總時間
let countDownTime = timerL.getCountDownTime()

3.0 代理

/// 自定義代理

@objc protocol TYCountDownLabelTypeDelegate: NSObjectProtocol {
    /**
     ** 方法: 根據參數的判斷, 更改label的樣式等(根據自己的需求)
     ** 參數label: 用來展示定時器輸出文字的label
     ** 參數time: 對于倒計時來說就是當前剩余的時間間隔, 對于遞增時間來說就是當前增加到的時間間隔
     **/
    @objc optional func changeTimerLabelAttrAtTime(label: UILabel, time: TimeInterval, type: TYCountDownLabelType)
    
    /**
     ** 方法: 自定義label文字的輸出格式
     ** 參數label: 用來展示定時器輸出文字的label
     ** 參數time: 對于倒計時來說就是當前剩余的時間間隔, 對于遞增時間來說就是當前增加到的時間間隔
     ** 返回值: 自定義的字符串
    **/
    @objc optional func customTextToDisplayAtTime(label: UILabel, time: TimeInterval) -> String?
    /**
     ** 方法: 自定義label文字的輸出格式
     ** 參數label: 用來展示定時器輸出文字的label
     ** 參數time: 倒計時的總時間間隔
     **/
    @objc optional func countDownTimeOver(label: UILabel, time: TimeInterval)
}

使用起來也是非常的方便稽鞭,你可以根據你們產品的具體的需求來自定義定時器的樣式,根據后臺給你們返回的數據的類型來具體的使用引镊。我寫一個簡單的使用例子:

a. 創(chuàng)建定時器
    //    MARK: 創(chuàng)建定時器Label
    func createTimerLabel() {
        let dateFormatter = DateFormatter()
        let time = "2018-11-29 12:32:25" // 這里自定義
        dateFormatter.dateFormat = "yyy-MM-dd HH:mm:ss"
        let dateTime = dateFormatter.date(from: time)
        
        timer = TYTimerLabel.init(label: timerLabel, type: .defaultType)
        timer?.countDownTimeWithDate(date: dateTime ?? Date())
//        timer?.countDownTimeWithTimeInterval(timeInterval: 60)
        timer?.timeFormat = "HH:mm:ss"
        timer?.isResetTime = true
        timer?.delegate = self
        
        incrementTimer = TYTimerLabel.init(label: incrementTimerLabel, type: .incrementTimeType)
        incrementTimer?.incrementTimeWithTimeInterval(interval: 0)
        incrementTimer?.timeFormat = "HH:mm:ss SS"
        incrementTimer?.delegate = self
    }
b. 開始朦蕴、暫停、重置按鈕的實現(xiàn)(不需要按鈕的話直接start()開啟)
    //    MARK: 開啟定時器
    @objc private func startBtnAction(btn: UIButton) {
        if btn.tag == 1 {
            timer?.start()
        } else {
            incrementTimer?.start()
        }
    }
    //    MARK: 暫停定時器
    @objc private func stopBtnAction(btn: UIButton) {
        if btn.tag == 2 {
            timer?.pause()
        } else {
            incrementTimer?.pause()
        }
    }
    //    MARK: 重置定時器
    @objc private func resetBtnAction(btn: UIButton) {
        if btn.tag == 3 {
            timer?.reset()
        } else {
            incrementTimer?.reset()
        }
    }
c.代理方法的實現(xiàn)(產品有特殊的需求)
extension TYTimerViewController: TYCountDownLabelTypeDelegate {
    //    MARK: 自定義label的樣式
    func changeTimerLabelAttrAtTime(label: UILabel, time: TimeInterval, type: TYCountDownLabelType) {
        if label == timerLabel {
            if time < 55 {
                label.textColor = .red
            } else {
                label.textColor = .white
            }
        }
    }
    //    MARK: 自定義文字輸出內容
    func customTextToDisplayAtTime(label: UILabel, time: TimeInterval) -> String? {
        if type == "custom" {
            let hours = Int(time / 3600)
            let minutes = Int((time - Double(hours * 3600)) / 60)
            let seconds = Int(time - Double(hours * 3600) - Double(minutes * 60))
            return "\(hours)" + "h" + "\(minutes)" + "min" + "\(  seconds)" + "s"
        } else {
            return nil
        }
    }
    //    MARK: 倒計時結束
    func countDownTimeOver(label: UILabel, time: TimeInterval) {
        label.text = "game over"
    }
}
屏幕快照 2018-11-29 下午3.25.18.png
屏幕快照 2018-11-29 下午3.26.24.png
使用只需要把TYTimerLabel.swift拖入自己的項目即可弟头。如有不足吩抓,歡迎指正。

Demo地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末赴恨,一起剝皮案震驚了整個濱河市疹娶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伦连,老刑警劉巖雨饺,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異惑淳,居然都是意外死亡额港,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門歧焦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來移斩,“玉大人,你說我怎么就攤上這事∠虼桑” “怎么了肠套?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長猖任。 經常有香客問我你稚,道長,這世上最難降的妖魔是什么超升? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任入宦,我火速辦了婚禮,結果婚禮上室琢,老公的妹妹穿的比我還像新娘乾闰。我一直安慰自己,他們只是感情好盈滴,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布涯肩。 她就那樣靜靜地躺著,像睡著了一般巢钓。 火紅的嫁衣襯著肌膚如雪病苗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天症汹,我揣著相機與錄音硫朦,去河邊找鬼。 笑死背镇,一個胖子當著我的面吹牛咬展,可吹牛的內容都是我干的。 我是一名探鬼主播瞒斩,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼破婆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了胸囱?” 一聲冷哼從身側響起祷舀,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烹笔,沒想到半個月后裳扯,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡谤职,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年嚎朽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柬帕。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡哟忍,死狀恐怖狡门,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情锅很,我是刑警寧澤其馏,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站爆安,受9級特大地震影響叛复,放射性物質發(fā)生泄漏。R本人自食惡果不足惜扔仓,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一褐奥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧翘簇,春花似錦撬码、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至彻犁,卻和暖如春叫胁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背汞幢。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工驼鹅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人森篷。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓输钩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疾宏。 傳聞我的和親對象是個殘疾皇子张足,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內容

  • 1触创、通過CocoaPods安裝項目名稱項目信息 AFNetworking網絡請求組件 FMDB本地數據庫組件 SD...
    陽明先生_X自主閱讀 15,988評論 3 119
  • 那天的天空 正如你的臉龐 清澈透明 在微風的拂動下 河邊的垂柳 和你一起 美麗了我的心
    中正恩澤閱讀 246評論 6 6
  • 涂磊犀利的一段話哼绑,值得思索:“太善良岩馍,得不到幸福,反會得到背叛抖韩!太現(xiàn)實蛀恩,體會不到幸福,但不會太受傷茂浮!誰更悲哀...
    肥兜er閱讀 218評論 0 0
  • 家是心靈的港灣,人生的驛站顽馋;是感情的歸宿谓厘,靈魂的延續(xù)! 好長時間不回老家了寸谜,很是想念竟稳!雖然離得不遠,但是帶著孩子也...
    成麗crystal閱讀 883評論 2 4