Swift4.0--弱網時辕录,酷炫的占位動畫實現(xiàn)思路詳解

loading.jpeg

概要:

很多時候睦霎,我們都可以看到一些應用,會在加載數(shù)據時踏拜,顯示一個好看的占位動畫。那么這個好看的占位動畫是咋樣實現(xiàn)的呢低剔,這里給出了我自己的方案速梗,僅供學習探討。

先看效果圖

windlessGif1

實現(xiàn)思路

一襟齿、首先我們根據設計圖布局視圖姻锁,為view(cell)中的每一個子空間設置約束,特別注意的是控件的寬度是必須限制的(給固定值或左右約束)猜欺;

二位隶、再為剛才視圖中的每一個子控件覆蓋一層弱網視圖view(這里稱它windlessView),并為windlessView添加動畫开皿,效果如圖涧黄;這一步我直接為UIView添加了一個擴展方法,凡是繼承view的都可調用赋荆;

三笋妥、在下拉加載數(shù)據之前,我們已經把一屏幕的view(cell)都創(chuàng)建好并顯示(即帶弱網效果的視圖)窄潭,當我們的數(shù)據返回時春宣,重新刷新界面,并移除windlessView嫉你。

注意:

  • 在我的項目中使用的是MVVM框架月帝,所以我在ViewModel中添加了一個isWindless的屬性,加載數(shù)據時幽污,默認為true顯示弱網效果嚷辅,當數(shù)據成功返回時,值設為false距误,移除windlessView潦蝇。

  • 弱網狀態(tài)禁止交互款熬。

添加弱網效果的核心代碼如下:

為當前view添加弱網視圖和動畫

import UIKit

let kWindlessViewTag = 91997

extension UIView {
    /// 為視圖添加弱網效果
    ///
    /// - Parameter isWindless: 是否為弱網狀態(tài)
    func windless(isWindless: Bool) {
        var windLessView: UIView? = self.viewWithTag(kWindlessViewTag)
        if isWindless {
            if windLessView == nil {
                // 添加弱網視圖
                windLessView = UIView(frame: self.bounds)
                windLessView!.backgroundColor = UIColor(red: 247.0/255.0, green: 247.0/255.0, blue: 247.0/255.0, alpha: 1.0)
                windLessView?.layer.position    = CGPoint(x: 0, y: 0)
                windLessView?.layer.anchorPoint = CGPoint(x: 0, y: 0)
                windLessView!.tag = kWindlessViewTag
                self.addSubview(windLessView!)
            }
            // 添加動畫
            let random = CGFloat(self.randomNum(start: 4, end: 6)) / 10.0
            let minW = self.bounds.size.width * random
            let maxW = self.bounds.size.width * 1.0
            let animation = CABasicAnimation(keyPath: "bounds.size.width")
            animation.duration      = 1
            animation.repeatCount   = MAXFLOAT
            animation.autoreverses  = true
            animation.fromValue     = CGFloat(minW)
            animation.toValue       = CGFloat(maxW)
            animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
            windLessView!.layer.add(animation, forKey: "WindlessAnimation")
            
        } else {
            guard windLessView != nil else {
                return
            }
            // 移除弱網視圖
            windLessView?.removeFromSuperview()
        }
    }

    /// 獲取(start~end)的隨機數(shù)(為了讓動畫更好看)
    func randomNum(start: Int, end: Int) -> Int {
        var temp = Int(arc4random_uniform(UInt32(end))) + 1
        if temp < start {
            temp = self.randomNum(start: start, end: end)
        }
        return temp
    }
}

案例:

下面是我重寫setupContent為基類方法攘乒,刷新某個cell的數(shù)據贤牛,cell的顯示樣式根據ViewModel的具體值來展示。

override func setupContent<T>(model: T) where T: HomeResearchInfoViewModel {
        updateContenView(isWindless: model.isWindless)
        isUserInteractionEnabled = !model.isWindless
        guard !model.isWindless else {
            return
        }
        // TODO: 根據數(shù)據更新視圖则酝。殉簸。。
    }

    func updateContenView(isWindless: Bool) {
        titleLabel.windless(isWindless: isWindless)
        detailLabel.windless(isWindless: isWindless)
    }

最后來一張完整的效果圖

windlessGif

這里沒有再提供demo沽讹。

這是我的GitHub歡迎交流學習

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末般卑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子爽雄,更是在濱河造成了極大的恐慌蝠检,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挚瘟,死亡現(xiàn)場離奇詭異叹谁,居然都是意外死亡,警方通過查閱死者的電腦和手機乘盖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門焰檩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人订框,你說我怎么就攤上這事析苫。” “怎么了穿扳?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵衩侥,是天一觀的道長。 經常有香客問我矛物,道長顿乒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任泽谨,我火速辦了婚禮璧榄,結果婚禮上,老公的妹妹穿的比我還像新娘吧雹。我一直安慰自己骨杂,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布雄卷。 她就那樣靜靜地躺著搓蚪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丁鹉。 梳的紋絲不亂的頭發(fā)上妒潭,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天悴能,我揣著相機與錄音,去河邊找鬼雳灾。 笑死漠酿,一個胖子當著我的面吹牛,可吹牛的內容都是我干的谎亩。 我是一名探鬼主播炒嘲,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匈庭!你這毒婦竟也來了夫凸?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤阱持,失蹤者是張志新(化名)和其女友劉穎夭拌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衷咽,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鸽扁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了兵罢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片献烦。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡滓窍,死狀恐怖卖词,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情吏夯,我是刑警寧澤此蜈,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站噪生,受9級特大地震影響裆赵,放射性物質發(fā)生泄漏。R本人自食惡果不足惜跺嗽,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一战授、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桨嫁,春花似錦植兰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至畜挨,卻和暖如春筒繁,著一層夾襖步出監(jiān)牢的瞬間噩凹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工毡咏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驮宴,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓血当,卻偏偏與公主長得像幻赚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子臊旭,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容

  • 2017.02.22 可以練習落恼,每當這個時候,腦袋就犯困离熏,我這腦袋真是神奇呀佳谦,一說讓你做事情,你就犯困滋戳,你可不要太...
    Carden閱讀 1,331評論 0 1
  • 烏鎮(zhèn)钻蔑,一個坐落在杭州東北方向,相距只有80公里的景區(qū)奸鸯,卻總是因為各種理由(可能歸根結底是因為懶)咪笑,從未去一睹它的風...
    蘇三書閱讀 382評論 10 4
  • 完美是一種不完美的傷 猶如玫瑰編織的籬笆 燃燒著你的激情 卻總是灼傷你采摘的熱情 完美是一種傷感的情緒 猶如天空中...
    云可彥閱讀 168評論 0 1
  • 我不知道怎么描述這種失落。 這是不甘心的預料中的失望真的出現(xiàn)的感覺娄涩。 我從沒得到過被許諾了的東西窗怒,但我知道那些難處...
    茶湯鯊魚閱讀 201評論 0 1
  • 1、目的&目標 分身術的第一節(jié)課老師先簡要的給我們舉行了開營儀式蓄拣,告訴我們此次課程的目的...
    up善小水閱讀 507評論 2 0