iOS中CAReplicatorLayer的介紹和使用

CAReplicatorLayer

CAReplicatorLayer的目的是為了高效生成許多相似的圖層蝙泼。它會繪制一個或多個圖層的子圖層拳缠,并在每個復制體上應用不同的變換肥惭,復制的出來的layer和原來的子layer擁有相同的動效舅巷。它能夠重建包括自己在內(nèi)的n個copies套硼,這些copies是原layer中的所有sublayers垫毙,并且任何對原layer的sublayers設置的transform是可以積累的(accumulative)

CAReplicatorLayer屬性

  • 設置實例顯示屬性(Setting Instance Display Properties)
   /* The number of copies to create, including the source object.
     * Default value is one (i.e. no extra copies). Animatable. */
    // 創(chuàng)建副本的數(shù)量霹疫,包括原對象,默認有一個综芥,可動畫屬性
    open var instanceCount: Int

    /* The temporal delay between replicated copies. Defaults to zero.
     * Animatable. */
    // 顯示延時
    open var instanceDelay: CFTimeInterval

    
    /* The matrix applied to instance k-1 to produce instance k. The matrix
     * is applied relative to the center of the replicator layer, i.e. the
     * superlayer of each replicated sublayer. Defaults to the identity
     * matrix. Animatable. */
    // 對實例進行變換
    open var instanceTransform: CATransform3D
  • 修改實例幾何(Modifying Instance Layer Geometry)
  /* Defines whether this layer flattens its sublayers into its plane or
     * not (i.e. whether it's treated similarly to a transform layer or
     * not). Defaults to NO. If YES, the standard restrictions apply (see
     * CATransformLayer.h). */
   // 
    open var preservesDepth: Bool
  • 訪問實例顏色值(Accessing Instance Color Values)
    /* The color to multiply the first object by (the source object). Defaults
     * to opaque white. Animatable. */
    open var instanceColor: CGColor?

    /* The color components added to the color of instance k-1 to produce
     * the modulation color of instance k. Defaults to the clear color (no
     * change). Animatable. */
    open var instanceRedOffset: Float
    open var instanceGreenOffset: Float
    open var instanceBlueOffset: Float
    open var instanceAlphaOffset: Float

實戰(zhàn)

創(chuàng)建5個漸變的正方形

 // 創(chuàng)建replicatorLayer
 let replicatorLayer = CAReplicatorLayer()
 replicatorLayer.frame = CGRect(x: 10, y: 100, width: 75, height: 75)

  // 創(chuàng)建子layer
 let redSquare = CALayer()
 redSquare.backgroundColor = UIColor.white.cgColor
 redSquare.frame = CGRect(x: 0, y: 0, width: 75, height: 75)

 // 設置實例的個數(shù)
 let instanceCount = 5
 replicatorLayer.instanceCount = instanceCount
 // 沿著x軸移動80丽蝎,80是正方形寬度75和間距5之和
 replicatorLayer.instanceTransform = CATransform3DMakeTranslation(80, 0, 0)

// 設置顏色
let offsetStep = -1 / Float(instanceCount)
replicatorLayer.instanceBlueOffset = offsetStep
replicatorLayer.instanceGreenOffset = offsetStep

replicatorLayer.addSublayer(redSquare)
view.layer.addSublayer(replicatorLayer)

效果如下

屏幕快照 2018-11-19 下午5.35.25.png

反射效果

使用CAReplicatorLayer并應用一個負比例變換于一個復制圖層,你就可以創(chuàng)建指定視圖(或整個視圖層次)內(nèi)容的鏡像圖片膀藐,這樣就創(chuàng)建了一個實時的反射效果屠阻。

 // 創(chuàng)建replicatorLayer
 let replicatorLayer = CAReplicatorLayer()
 replicatorLayer.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
 //注意:是包括自己在內(nèi)總共為2個對象
 replicatorLayer.instanceCount = 2

 // 創(chuàng)建transform
 var transform = CATransform3DIdentity
 let verticalOffset: CGFloat = replicatorLayer.bounds.height
 // 沿y軸移動verticalOffset高度
 transform = CATransform3DTranslate(transform, 0, verticalOffset + 2, 0)
 // 沿著z軸旋轉180度
 transform = CATransform3DRotate(transform, CGFloat.pi, 0, 0, 1)
 // 使用transform
 replicatorLayer.instanceTransform = transform
 replicatorLayer.instanceAlphaOffset = -0.6

 // 添加子layer
 let subLayer = CALayer()
 subLayer.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
 subLayer.contents = UIImage(named: "4")?.cgImage
 replicatorLayer.addSublayer(subLayer)

效果如下

屏幕快照 2018-11-21 下午4.49.13.png

音量柱動畫

 func musicAnimation() {
     // 創(chuàng)建replicatorLayer
     let replicatorLayer = CAReplicatorLayer()
     let height: CGFloat = 230
     replicatorLayer.frame = CGRect(x: 100, y: 100, width: height, height: height)
     replicatorLayer.backgroundColor = UIColor.gray.cgColor
     view.layer.addSublayer(replicatorLayer)

     // 創(chuàng)建音量條
     let volumeLayer = CALayer()
     volumeLayer.backgroundColor = UIColor.cyan.cgColor
     let volumeWidth: CGFloat = 30
     volumeLayer.bounds = CGRect(x: 0, y: 0, width: volumeWidth, height: 100);
     volumeLayer.anchorPoint = CGPoint(x: 0, y: 1)
     volumeLayer.position = CGPoint(x: 0, y: height)
     view.layer.addSublayer(volumeLayer)

     // 對音量條添加動畫
     let animation = CABasicAnimation(keyPath: "transform.scale.y")
     animation.toValue = 0
     animation.duration = 1.0
     animation.repeatCount = Float.infinity
     animation.autoreverses = true
     volumeLayer.add(animation, forKey: nil)

     replicatorLayer.addSublayer(volumeLayer)

     // 設置音量條個數(shù)
     replicatorLayer.instanceCount = 6
     // 設置延時
     replicatorLayer.instanceDelay = 0.35
     // 設置透明度遞減
     replicatorLayer.instanceAlphaOffset = -0.15
     // 對每個音量震動條移動40
     replicatorLayer.instanceTransform = CATransform3DMakeTranslation(volumeWidth + 10, 0, 0)
 }

效果如下

2018-11-21 17-36-04.2018-11-21 17_36_18.gif

 func dotLoading() {
     let replicatorLayer = CAReplicatorLayer()
     replicatorLayer.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
     replicatorLayer.position = view.center
     view.layer.addSublayer(replicatorLayer)

     // 添加小圓點
     let dotLayer = CALayer()
     dotLayer.bounds = CGRect(x: 0, y: 0, width: 10, height: 10)
     dotLayer.position = CGPoint(x: 50, y: 20)
     dotLayer.backgroundColor = UIColor(red: 0.1, green: 0.1, blue: 0.1, alpha: 0.6).cgColor
     dotLayer.cornerRadius = 5;
     dotLayer.masksToBounds = true
     replicatorLayer.addSublayer(dotLayer)

     // 添加縮放動畫
     let animation = CABasicAnimation(keyPath: "transform.scale")
     animation.duration = 1
     animation.fromValue = 1
     animation.toValue = 0.1
     animation.repeatCount = Float.infinity
     dotLayer.add(animation, forKey: nil)

     // 設置個數(shù)
     let count = 12
     replicatorLayer.instanceCount = count
     // 每次旋轉的角度等于 2π / 12
     replicatorLayer.instanceTransform = CATransform3DMakeRotation((2 * CGFloat.pi) / CGFloat(count) , 0, 0, 1)
     // 添加延遲
     replicatorLayer.instanceDelay = CFTimeInterval(1.0 / CGFloat(count))

     // 解決最開始旋轉銜接效果
     dotLayer.transform = CATransform3DMakeScale(0.01, 0.01, 0.01);
 }

效果如下

2018-11-21 17-53-55.2018-11-21 17_54_05.gif

參考

CAReplicatorLayer

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市额各,隨后出現(xiàn)的幾起案子国觉,更是在濱河造成了極大的恐慌,老刑警劉巖虾啦,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件麻诀,死亡現(xiàn)場離奇詭異,居然都是意外死亡傲醉,警方通過查閱死者的電腦和手機蝇闭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硬毕,“玉大人呻引,你說我怎么就攤上這事≌蜒常” “怎么了苞七?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵藐守,是天一觀的道長挪丢。 經(jīng)常有香客問我蹂风,道長,這世上最難降的妖魔是什么乾蓬? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任惠啄,我火速辦了婚禮,結果婚禮上任内,老公的妹妹穿的比我還像新娘撵渡。我一直安慰自己,他們只是感情好死嗦,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布趋距。 她就那樣靜靜地躺著,像睡著了一般越除。 火紅的嫁衣襯著肌膚如雪节腐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天摘盆,我揣著相機與錄音翼雀,去河邊找鬼。 笑死孩擂,一個胖子當著我的面吹牛狼渊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播类垦,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狈邑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚤认?” 一聲冷哼從身側響起米苹,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烙懦,沒想到半個月后驱入,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡氯析,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年亏较,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掩缓。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡雪情,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出你辣,到底是詐尸還是另有隱情巡通,我是刑警寧澤尘执,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站宴凉,受9級特大地震影響誊锭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弥锄,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一丧靡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧籽暇,春花似錦温治、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绸狐,卻和暖如春卤恳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背六孵。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工纬黎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人劫窒。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓本今,卻偏偏與公主長得像,于是被迫代替她去往敵國和親主巍。 傳聞我的和親對象是個殘疾皇子冠息,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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