CALayer的一些效果展示

前言

本篇主要寫一些基于CALayer及其子類做的一些效果诫尽,結(jié)合CAAnimation做的好看常用的動畫肢预。代碼在Github Example读存,廢話不多說我們先看展示圖

當前展示的效果

音樂播放器常用控件
系統(tǒng)加載中控件
毛玻璃蒙版效果

音樂播放器控件.gif
系統(tǒng)加載中控件.gif

關(guān)鍵代碼

音樂播放器常用控件

在音樂播放的app中我們經(jīng)常看到這個控件航攒,其實這個控件寫起來很是簡單磺陡,我們現(xiàn)在使用CAReplicatorLayer 來做這個效果 【為了方便演示,代碼對控件進行放大演示】


    func drawreplicatoreLayer() {
//        控件的長寬
        let rtWidth:CGFloat = 150,rtheight:CGFloat = 120
        
        let replicatoreLayer = CAReplicatorLayer()
        replicatoreLayer.frame = CGRect(x: 0.0, y: 0.0, width: rtWidth, height: rtheight)
        replicatoreLayer.position = view.center
        view.layer.addSublayer(replicatoreLayer)
    
//        需要的重復(fù)的個數(shù)
        let instanceCount:Int = 3
//        計算每一個的長寬
        let itemLayerW:CGFloat = rtWidth/CGFloat(2*instanceCount+1)
        let itemLayerH:CGFloat = rtheight/4.0*3.0

        let itemLayer = CALayer()
        itemLayer.frame = CGRect(x: itemLayerW, y: rtheight-itemLayerH, width: itemLayerW, height: itemLayerH)
        itemLayer.cornerRadius = itemLayerH/20.0
        itemLayer.backgroundColor = UIColor.red.cgColor
        replicatoreLayer.addSublayer(itemLayer)
        
        let move = CABasicAnimation(keyPath: "position.y")
        move.toValue = itemLayer.position.y + itemLayerH-itemLayerH/5.0
        move.duration = 0.5
        move.autoreverses = true
        move.repeatCount = Float.infinity
        itemLayer.add(move, forKey: nil)
        
        replicatoreLayer.instanceCount = 3
        replicatoreLayer.instanceTransform = CATransform3DMakeTranslation(2*itemLayerW, 0.0, 0.0)
        replicatoreLayer.instanceDelay = 0.33
        replicatoreLayer.masksToBounds=true
        
    }

系統(tǒng)加載中控件

首先我們創(chuàng)建一個父容器someView

let someView = UIView.init()
    func createParentView(){
        var w:CGFloat,h:CGFloat;
//        系統(tǒng)的控件是20 寬高  我們?yōu)榱苏故具M行放大處理
        w=self.view.frame.width/4.0
//        w=20.0
        h=w
        someView.frame=CGRect.init(x: 0, y: 0, width: w, height: h)
        someView.center=view.center
        self.view.addSubview(someView)
    }

創(chuàng)建活動指示器的Layer

 func activityIndicatorLayerAnimation(){
        
        // 1
        let replicatorLayer = CAReplicatorLayer()
        replicatorLayer.frame = someView.bounds
        someView.layer.addSublayer(replicatorLayer)
        
        // 2
        let instanceCount = 12  //系統(tǒng)的控件是12個
        replicatorLayer.instanceCount = instanceCount
        replicatorLayer.instanceDelay = CFTimeInterval(1 / 30.0) //延遲時間
        replicatorLayer.preservesDepth = false
        
        // 3 顏色偏移
        let  AlphaOffset:Float = 0.1
        replicatorLayer.instanceAlphaOffset = AlphaOffset
        // 4  計算角度
        let angle = Float(M_PI * 2.0)/Float(instanceCount)
        replicatorLayer.instanceTransform = CATransform3DMakeRotation(CGFloat(angle), 0.0, 0.0, 1.0)        
      // 5
        let instanceLayer = CALayer()
        //第一個出現(xiàn)計算位置 我們這里計算的 正中心最下面的那一個item
        let  layerHeight: CGFloat = replicatorLayer.frame.width/3.0
        let  layerWidth: CGFloat = layerHeight/3.0
         instanceLayer.frame = CGRect(x: (someView.bounds.width-layerWidth)/2.0, y: (someView.bounds.height-layerHeight), width: layerWidth, height: layerHeight)
        
        instanceLayer.backgroundColor = UIColor.gray.cgColor
        instanceLayer.cornerRadius = layerWidth/2.0 //圓角
        replicatorLayer.addSublayer(instanceLayer)        
//         6 添加動畫
        let fadeAnimation = CABasicAnimation(keyPath: "opacity")
        fadeAnimation.fromValue = 0.6
        fadeAnimation.toValue = AlphaOffset
        fadeAnimation.duration = 1
        fadeAnimation.repeatCount = Float(Int.max)
        instanceLayer.add(fadeAnimation, forKey: "FadeAnimation")
        
    }

以上就是CAReplicatorLayer 的簡單使用漠畜,如果對CAReplicatorLayer有疑惑請翻閱developer CAReplicatorLayer

毛玻璃的蒙版效果

代碼和講解

 func creatMaskAnimation() {
//        1 定義常量
        let maskWidth:CGFloat = 180
        let maskY:CGFloat = 100

        //        2 創(chuàng)建路徑
        let maskPath = CGMutablePath.init()

        let outsidePath = CGPath.init(rect: self.visualView.bounds, transform: nil)
        
        let insidePath = CGPath.init(rect: CGRect.init(x: (self.view.bounds.width-maskWidth)/2.0, y: maskY, width: maskWidth, height: maskWidth), transform: nil)
        
        maskPath.addPath(outsidePath)
        maskPath.addPath(insidePath)
        
//        3 創(chuàng)建 CAShapeLayer
        let maskLayer = CAShapeLayer.init()
        maskLayer.fillRule="even-odd"
        maskLayer.path = maskPath
        
//        經(jīng)過測試 使用 visualView.Layer.mask 蒙版得以保留币他,但毛玻璃效果沒有了 錯誤寫法
//        self.visualView.layer.mask=maskLayer
        
//        4 正確寫法應(yīng)該使用UIView.mask
        let maskView = UIView.init(frame: self.view.bounds)
        maskView.backgroundColor = UIColor.black
        maskView.layer.mask = maskLayer
        
        self.visualView.mask = maskView

    }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市憔狞,隨后出現(xiàn)的幾起案子蝴悉,更是在濱河造成了極大的恐慌,老刑警劉巖瘾敢,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拍冠,死亡現(xiàn)場離奇詭異,居然都是意外死亡簇抵,警方通過查閱死者的電腦和手機庆杜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碟摆,“玉大人欣福,你說我怎么就攤上這事〗孤模” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵雏逾,是天一觀的道長嘉裤。 經(jīng)常有香客問我,道長栖博,這世上最難降的妖魔是什么屑宠? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮仇让,結(jié)果婚禮上典奉,老公的妹妹穿的比我還像新娘。我一直安慰自己丧叽,他們只是感情好卫玖,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著踊淳,像睡著了一般假瞬。 火紅的嫁衣襯著肌膚如雪陕靠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天脱茉,我揣著相機與錄音剪芥,去河邊找鬼。 笑死琴许,一個胖子當著我的面吹牛税肪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播榜田,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼益兄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了串慰?” 一聲冷哼從身側(cè)響起偏塞,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎邦鲫,沒想到半個月后灸叼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡庆捺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年古今,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滔以。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡捉腥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出你画,到底是詐尸還是另有隱情抵碟,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布坏匪,位于F島的核電站拟逮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏适滓。R本人自食惡果不足惜敦迄,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凭迹。 院中可真熱鬧罚屋,春花似錦、人聲如沸嗅绸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鱼鸠。三九已至尖滚,卻和暖如春喉刘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背漆弄。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工睦裳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撼唾。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓廉邑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親倒谷。 傳聞我的和親對象是個殘疾皇子蛛蒙,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,754評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件渤愁、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,059評論 4 62
  • 劉嘉玲曾經(jīng)說牵祟,女人一定要經(jīng)濟上獨立,自己賺錢自己花抖格;生活上要獨立诺苹,凡事要有最壞的打算;思想上要獨立雹拄,要懂得欣賞自己...
    沐瑾姑娘閱讀 119評論 0 0
  • 《一個月一道小坎翩肌,邁過去。再接再厲禁悠!~【融冰男性孕期日記】(30)》 作者:沈融冰 時間:2017.8.18周五 ...
    融冰先生閱讀 530評論 1 2
  • 越來越發(fā)現(xiàn)原來兩個人在一起溝通很重要念祭,我們之間已經(jīng)是第四年的婚姻了,現(xiàn)在也有一個可愛的女兒绷蹲。我跟大部分的女人都一樣...
    夕木安吉閱讀 201評論 0 0