News Digest(雅虎新聞)模仿秀第四彈

最近得空做了一個小的新聞類APP查牌,基本上都是照著News Digest的模子刻出來的事期,之所以這個為參考,是因為覺得News Digest這個APP做得真的很酷炫纸颜!


猛戳這里獲取整個項目源代碼
項目前端主要由swift編寫兽泣,本地數(shù)據(jù)用CoreData,后端由Node.js編寫胁孙,后臺數(shù)據(jù)庫用MongoDB唠倦。

News Digest(雅虎新聞)模仿秀第一彈
News Digest(雅虎新聞)模仿秀第二彈
News Digest(雅虎新聞)模仿秀第三彈

這期我們來說一下倒計時動畫的實現(xiàn),先上效果圖:


倒計時效果圖

這里要分兩部分來講涮较,一部分是圓圈動畫的填充稠鼻,一部分是時間的快速滾動,位于項目CustomView/MenuView和CustomView/CountdownView

  1. 圓圈動畫的執(zhí)行
    init(timeType: TimeType) {
        super.init(frame: defaultFrame)
        type = timeType
        self.backgroundColor = UIColor.clearColor()
        
        // CAShaperLayer Setting
        circleShadowLayer.frame = self.bounds
        circleShadowLayer.fillColor = UIColor.clearColor().CGColor
        circleShadowLayer.lineWidth = 2.0
        circleShadowLayer.strokeEnd = 1.0
        circleShadowLayer.strokeColor = UIColor.RGBColor(255, green: 255, blue: 255, alpha: 0.2).CGColor
        
        circleLayer.frame = self.bounds
        circleLayer.fillColor = UIColor.clearColor().CGColor
        circleLayer.lineWidth = 2.0
        circleLayer.strokeEnd = 0
        circleLayer.strokeColor = UIColor.RGBColor(0, green: 121, blue: 166, alpha: 1).CGColor
        
        self.layer.addSublayer(circleShadowLayer)
        self.layer.addSublayer(circleLayer)
    }

這里的circleShadowLayer狂票,就是動圖底層那一個灰色的圈候齿,我們設置strokeEnd = 1.0(就是說完全填充,形成一個閉環(huán))闺属,這個strokeEnd是從0.0-1.0范圍

    override func layoutSubviews() {
        super.layoutSubviews()
        
        defaultCircleRadius = (WIDTH - 100) < (self.bounds.height - 32) ? (WIDTH - 100)/2.0 : defaultCircleRadius
        circleShadowLayer.frame = self.bounds
        circleShadowLayer.path = circlePath().CGPath
        circleLayer.frame = self.bounds
        circleLayer.path = circlePath().CGPath
    }
    
    //MARK: - CirclePath
    func circlePath() -> UIBezierPath {
        return UIBezierPath.init(ovalInRect: circleFrame())
    }
    
    func circleFrame() -> CGRect {
        var circleFrame = CGRect(x: 0, y: 0, width: 2*defaultCircleRadius, height: 2*defaultCircleRadius)
        circleFrame.origin.x = CGRectGetMidX(circleShadowLayer.bounds) - CGRectGetMidX(circleFrame)
        circleFrame.origin.y = CGRectGetMidY(circleShadowLayer.bounds) - CGRectGetMidY(circleFrame)
        return circleFrame
    }

circleFrame方法是設置圓圈的frame慌盯,讓它形成位于圓心的,半徑為defaultCircleRadius的圓掂器,然后用UIBezierPath繪制路徑亚皂,每次調用layoutSubviews方法把路徑賦值給circleLayer
layoutSubviews調用時機:

  - 直接調用setLayoutSubviews。
  - addSubview的時候国瓮。
  - 當view的frame發(fā)生改變的時候灭必。
  - 滑動UIScrollView的時候。
  - 旋轉Screen會觸發(fā)父UIView上的layoutSubviews事件巍膘。
  - 改變一個UIView大小的時候也會觸發(fā)父UIView上的layoutSubviews事件厂财。

期初我打算用UIView.animateWithDuration來賦值circleLayer的strokeEnd參數(shù),然后發(fā)現(xiàn)無論我設置duration是多少峡懈,動畫執(zhí)行時間都是一樣的璃饱,后來查了一下資料才發(fā)現(xiàn)UIView.animateWithDuration只能動畫改變這幾個參數(shù)

        /*
         *   UIView.animateWithDuration(13.2, animations: {
         *       self.circleLayer.strokeEnd = CGFloat(interval/43200)
         *   })
         *   這里執(zhí)行方式不可以使用UIView.animateWithDuration,只能用CAAnimations
         *   UIView動畫執(zhí)行只能改變一下幾個參數(shù)
         *
         *   The following properties of the UIView class are animatable:
         *   @property frame
         *   @property bounds
         *   @property center
         *   @property transform
         *   @property alpha
         *   @property backgroundColor
         *   @property contentStretch
         */

所以動畫執(zhí)行strokeEnd的改變只能使用CAAnimations肪康,只需要把strokeEnd的數(shù)值賦值給toValue荚恶,然后設置執(zhí)行時間即可

    func animationExecute() {
       circleLayer.addAnimation(self.circleAnimationImplement(1.6, delay: 0.3, toValue: interval!/43200.0), forKey: nil)
    }
    
    // Animation Implement
    private func circleAnimationImplement(duration: NSTimeInterval, delay: Double, toValue: Double) -> CABasicAnimation {
        let animation = CABasicAnimation.init(keyPath: "strokeEnd")
        animation.duration = duration < 0.8 ? 0.8 : duration
        animation.beginTime = CACurrentMediaTime() + delay
        animation.fromValue = 0.0
        animation.toValue = toValue
        animation.removedOnCompletion = false // 這里如果不是false fillMode屬性不起作用
        animation.fillMode = kCAFillModeForwards; // 保留動畫后的樣子
        // 設置Delegate
        animation.delegate = self
        return animation
    }
  1. 時間的快速滾動效果
    其實中間就是一個UILabel,然后動態(tài)修改它的attributedText即可
    這個數(shù)字快速滾動效果磷支,我是模仿下面這位大大的代碼寫的
    滾動的數(shù)字:FlickerNumber
    如果需要詳細了解谒撼,戳上面這個鏈接就可以詳細了解.
    總的來說,大概實現(xiàn)思路就是:
  • 設定起始數(shù)字/終止數(shù)字/執(zhí)行時間等
  • 設定數(shù)字滾動的頻率雾狈,比如說1/30等等
  • 然后根據(jù)終止數(shù)字*頻率/執(zhí)行時間廓潜,就獲得每次數(shù)字變化的值
  • 最后一個NSTimer以頻率來執(zhí)行改變UILabel的值
  1. 滾動圈圈下面那個日期選擇
    具體就不細說了,就一個UICollectionView

今天就到這里了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末辩蛋,一起剝皮案震驚了整個濱河市呻畸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悼院,老刑警劉巖伤为,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異据途,居然都是意外死亡绞愚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門颖医,熙熙樓的掌柜王于貴愁眉苦臉地迎上來位衩,“玉大人,你說我怎么就攤上這事熔萧÷焖模” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵哪痰,是天一觀的道長。 經(jīng)常有香客問我久妆,道長晌杰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任筷弦,我火速辦了婚禮肋演,結果婚禮上,老公的妹妹穿的比我還像新娘烂琴。我一直安慰自己爹殊,他們只是感情好,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布奸绷。 她就那樣靜靜地躺著梗夸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪号醉。 梳的紋絲不亂的頭發(fā)上反症,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天垒迂,我揣著相機與錄音簿透,去河邊找鬼。 笑死捌治,一個胖子當著我的面吹牛线椰,可吹牛的內容都是我干的胞谈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼烦绳!你這毒婦竟也來了卿捎?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤爵嗅,失蹤者是張志新(化名)和其女友劉穎娇澎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體睹晒,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡趟庄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了伪很。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戚啥。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖锉试,靈堂內的尸體忽然破棺而出猫十,到底是詐尸還是另有隱情,我是刑警寧澤呆盖,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布拖云,位于F島的核電站,受9級特大地震影響应又,放射性物質發(fā)生泄漏宙项。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一株扛、第九天 我趴在偏房一處隱蔽的房頂上張望尤筐。 院中可真熱鬧,春花似錦洞就、人聲如沸盆繁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽油昂。三九已至,卻和暖如春倾贰,著一層夾襖步出監(jiān)牢的瞬間秕狰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工躁染, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鸣哀,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓吞彤,卻偏偏與公主長得像我衬,于是被迫代替她去往敵國和親叹放。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內容

  • 最近得空做了一個小的新聞類APP挠羔,基本上都是照著News Digest的模子刻出來的井仰,之所以這個為參考,是因為覺得...
    月詠蝴蝶閱讀 726評論 0 0
  • 在iOS中隨處都可以看到絢麗的動畫效果破加,實現(xiàn)這些動畫的過程并不復雜俱恶,今天將帶大家一窺ios動畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,471評論 6 30
  • 先看看CAAnimation動畫的繼承結構 CAAnimation{ CAPropertyAnimation { ...
    時間不會倒著走閱讀 1,642評論 0 1
  • 在iOS實際開發(fā)中常用的動畫無非是以下四種:UIView動畫范舀,核心動畫合是,幀動畫,自定義轉場動畫锭环。 1.UIView...
    請叫我周小帥閱讀 3,082評論 1 23
  • 折線圖能用到的地方并不是太多聪全,這兒測試了一個簡單的雙折線圖,要用到的可以看看辅辩。 動態(tài)效果圖 再看看iphone5和...
    44767758099b閱讀 952評論 0 0