動(dòng)手實(shí)現(xiàn) Twitter 的啟動(dòng)動(dòng)畫

當(dāng)我第一次打開 twitter 的時(shí)候,就被它的啟動(dòng)動(dòng)畫驚艷到了。然而分析一下這個(gè)動(dòng)畫其實(shí)也不難實(shí)現(xiàn),于是趕緊做一個(gè)出來(lái)看看。

整個(gè)動(dòng)畫效果能夠拆分為以下幾步:

  • 布置一個(gè)與 LaunchScreen 相同的界面
  • 讓視圖中間的 Logo 先縮小后放大直至蓋滿整個(gè)屏幕
  • Logo 在放大過程中逐漸變透明
  • Initial View Controller 的內(nèi)容稍微放大后恢復(fù)原狀

拆分完之后就好辦咯,一步步來(lái)實(shí)現(xiàn)吧~

先布個(gè)界面吧

由于后面需要讓 logo 變透明,我們選擇用 mask 來(lái)實(shí)現(xiàn)。

let logoLayer = CALayer()
logoLayer.bounds = CGRect(x: 0, y: 0, width: 100, height: 100)
logoLayer.position = view.center
logoLayer.contents = UIImage(named: "logo")?.cgImage
view.layer.mask = logoLayer

好了,小鳥出來(lái)了。

但一開始這個(gè) logo 并不是透明的,于是先在其上蓋一層白色的 view,并改一下背景顏色吧。

let shelterView = UIView(frame: view.frame)
shelterView.backgroundColor = .white
view.addSubview(shelterView)

window!.backgroundColor = UIColor(red: 29 / 255.0, green: 161 / 255.0, blue: 242 / 255.0, alpha: 1)

棒,第一步完成。

那接著做 Logo 的縮小放大吧

這里我們用 CAKeyframeAnimation,讓這個(gè)縮放動(dòng)作一氣呵成。設(shè)置好開始時(shí)間、持續(xù)時(shí)間和各個(gè)關(guān)鍵幀,最后讓它保持動(dòng)畫最后的狀態(tài)。

let logoAnimation = CAKeyframeAnimation(keyPath: "bounds")
logoAnimation.beginTime = CACurrentMediaTime() + 1
logoAnimation.duration = 1
logoAnimation.keyTimes = [0, 0.4, 1]
logoAnimation.values = [NSValue(cgRect: CGRect(x: 0, y: 0, width: 100, height: 100)),
                    NSValue(cgRect: CGRect(x: 0, y: 0, width: 85, height: 85)),
                    NSValue(cgRect: CGRect(x: 0, y: 0, width: 4500, height: 4500))]
logoAnimation.timingFunctions = [CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut),
                             CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault)]
logoAnimation.isRemovedOnCompletion = false
logoAnimation.fillMode = kCAFillModeForwards
logoLayer.add(logoAnimation, forKey: "zoomAnimation")

又好了。

順道把 Logo 透明也帶上

這個(gè)算好漸變透明的時(shí)間就好。

UIView.animate(withDuration: 0.3, delay: 1.4, options: .curveLinear, animations: {
    shelterView.alpha = 0
}) { (_) in
    shelterView.removeFromSuperview()
    view.layer.mask = nil
}

最后,讓初始界面顛一下

道理跟第二步相同,就不說了~

let mainViewAnimation = CAKeyframeAnimation(keyPath: "transform")
mainViewAnimation.beginTime = CACurrentMediaTime() + 1.1
mainViewAnimation.duration = 0.6
mainViewAnimation.keyTimes = [0, 0.5, 1]
mainViewAnimation.values = [NSValue(caTransform3D: CATransform3DIdentity),
                            NSValue(caTransform3D: CATransform3DScale(CATransform3DIdentity, 1.1, 1.1, 1)),
                            NSValue(caTransform3D: CATransform3DIdentity)]
view.layer.add(mainViewAnimation, forKey: "transformAnimation")
view.layer.transform = CATransform3DIdentity

Done.

需要完整代碼的可以來(lái)這里下~

Github: TwitterLauncher

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,720評(píng)論 25 709
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,026評(píng)論 4 61
  • 呂皖:“喲喲喲,今天太陽(yáng)是不是西邊升起,東邊落下呀?!?李暢目不轉(zhuǎn)睛地盯著手上的書,道:“是的,因?yàn)槟惚换@球撞壞了...
    萬(wàn)我靜閱讀 572評(píng)論 0 1
  • 既然不知道珍惜,那就讓他失去一次
    檸妤閱讀 171評(píng)論 0 0
  • 整潔的辦公桌能讓你把所有的注意力都集中在手頭的工作上。不管你做什么,整潔的辦公桌都是你專心工作的關(guān)鍵。 如果你的辦...
    summer7d閱讀 523評(píng)論 0 0

友情鏈接更多精彩內(nèi)容