iOS核心動(dòng)畫高級(jí)技巧(筆記)——(五)專用圖層

CAShapeLayer

  • CAShapeLayer是一個(gè)通過矢量圖形而不是bitmap來繪制的圖層子類。你指定諸如顏色和線寬等屬性导坟,用CGPath來定義想要繪制的圖形,最后CAShapeLayer就自動(dòng)渲染出來了圈澈。當(dāng)然惫周,你也可以用Core Graphics直接向原始的CALyer的內(nèi)容中繪制一個(gè)路徑,相比直下康栈,使用CAShapeLayer有以下一些優(yōu)點(diǎn):
    1.渲染快速递递。CAShapeLayer使用了硬件加速喷橙,繪制同一圖形會(huì)比用Core Graphics快很多。
    2.高效使用內(nèi)存登舞。一個(gè)CAShapeLayer不需要像普通CALayer一樣創(chuàng)建一個(gè)寄宿圖形贰逾,所以無論有多大,都不會(huì)占用太多的內(nèi)存菠秒。
    3.不會(huì)被圖層邊界剪裁掉疙剑。一個(gè)CAShapeLayer可以在邊界之外繪制。你的圖層路徑不會(huì)像在使用Core Graphics的普通CALayer一樣被剪裁掉(如我們?cè)诘诙滤姡?br> 4.不會(huì)出現(xiàn)像素化践叠。當(dāng)你給CAShapeLayer做3D變換時(shí)言缤,它不像一個(gè)有寄宿圖的普通圖層一樣變得像素化。

      var myPath = UIBezierPath()
      ......
      let shapeLayer = CAShapeLayer()
      shapeLayer.path = myPath.CGPath
    

CATextLayer

CATransformLayer

  • CATransformLayer不同于普通的CALayer禁灼,因?yàn)樗荒茱@示它自己的內(nèi)容轧简。只有當(dāng)存在了一個(gè)能作用域子圖層的變換它才真正存在。CATransformLayer并不平面化它的子圖層匾二,所以它能夠用于構(gòu)造一個(gè)層級(jí)的3D結(jié)構(gòu)

CAGradientLayer

  • CAGradientLayer是用來生成兩種或更多顏色平滑漸變的。用Core Graphics復(fù)制一個(gè)CAGradientLayer并將內(nèi)容繪制到一個(gè)普通圖層的寄宿圖也是有可能的拳芙,但是CAGradientLayer的真正好處在于繪制使用了硬件加速察藐。
    將漸變色彩放在一個(gè)數(shù)組中,并賦給colors屬性舟扎。這個(gè)數(shù)組成員接受CGColorRef類型的值分飞。
    CAGradientLayer也有startPointendPoint屬性,他們決定了漸變的方向睹限。這兩個(gè)參數(shù)是以單位坐標(biāo)系進(jìn)行的定義譬猫,所以左上角坐標(biāo)是{0, 0},右下角坐標(biāo)是{1, 1}羡疗。
    locations屬性是一個(gè)浮點(diǎn)數(shù)值的數(shù)組(以NSNumber包裝)染服。這些浮點(diǎn)數(shù)定義了colors屬性中每個(gè)不同顏色的位置,同樣的叨恨,也是以單位坐標(biāo)系進(jìn)行標(biāo)定柳刮。0.0代表著漸變的開始,1.0代表著結(jié)束痒钝。locations數(shù)組并不是強(qiáng)制要求的秉颗,但是如果你給它賦值了就一定要確保locations的數(shù)組大小和colors數(shù)組大小一定要相同,否則你將會(huì)得到一個(gè)空白的漸變送矩。

      let gradientLayer = CAGradientLayer()
      gradientLayer.frame = self.containerView.bounds
      self.containerView.layer.addSublayer(gradientLayer)
      gradientLayer.colors = [UIColor.blueColor().CGColor, UIColor.redColor().CGColor,UIColor.yellowColor().CGColor]
      gradientLayer.locations = [0,1.0/3.0,2.0/3.0]
      gradientLayer.startPoint = CGPointMake(0, 0)
      gradientLayer.endPoint = CGPointMake(1, 1)
    
CAGradientLayer

CAReplicatorLayer

  • CAReplicatorLayer的目的是為了高效生成許多相似的圖層蚕甥。它會(huì)繪制一個(gè)或多個(gè)圖層的子圖層,并在每個(gè)復(fù)制體上應(yīng)用不同的變換栋荸。instanceCount屬性指定了圖層需要重復(fù)多少次菇怀。instanceTransform指定了一個(gè)CATransform3D3D變換凭舶。(基于上一次變換)
    let replicator = CAReplicatorLayer()
    replicator.frame = CGRectMake(0, 0, 100, 100)
    self.view.layer.addSublayer(replicator)

      replicator.instanceCount = 5
      
      var transform = CATransform3DIdentity
      transform = CATransform3DTranslate(transform, 0, 50, 0)
      transform = CATransform3DTranslate(transform, 50, 0, 0)
      replicator.instanceTransform = transform
      
      replicator.instanceAlphaOffset = -0.1
      
      let layer = CALayer()
      layer.frame = CGRectMake(50, 50, 50, 50)
      layer.backgroundColor = UIColor.redColor().CGColor
      replicator.addSublayer(layer)
    

注意:
replicator相當(dāng)于layer的父視圖,默認(rèn)layer超出replicator的部分也可以顯示(可通過 masksToBounds設(shè)置)敏释。

CAReplicatorLayer
  • 反射

使用CAReplicatorLayer并應(yīng)用一個(gè)負(fù)比例變換于一個(gè)復(fù)制圖層库快,你就可以創(chuàng)建指定視圖(或整個(gè)視圖層次)內(nèi)容的鏡像圖片,這樣就創(chuàng)建了一個(gè)實(shí)時(shí)的『反射』效果钥顽。

    let replicator = CAReplicatorLayer()
    replicator.frame = CGRectMake(20, 80, 100, 100)
    self.view.layer.addSublayer(replicator)
    
    replicator.instanceCount = 2
    replicator.instanceAlphaOffset = -0.5
    
    let image = UIImageView(image: UIImage(named: "face"))
    image.frame = replicator.bounds
    
    var transform = CATransform3DIdentity
    let distance = image.frame.size.height
    transform = CATransform3DTranslate(transform, 0, distance, 0)
    transform = CATransform3DScale(transform, 1, -1, 0)
    replicator.instanceTransform = transform

    replicator.addSublayer(image.layer)
反射

CAScrollLayer

CATiledLayer

  • CATiledLayer為載入大圖造成的性能問題提供了一個(gè)解決方案:將大圖分解成小片然后將他們單獨(dú)按需載入义屏。

CAEmitterLayer

  • CAEmitterLayer是一個(gè)高性能的粒子引擎,被用來創(chuàng)建實(shí)時(shí)例子動(dòng)畫如:煙霧蜂大,火闽铐,雨等等這些效果。
    CAEmitterLayer看上去像是許多CAEmitterCell的容器奶浦,這些CAEmitierCell定義了一個(gè)例子效果兄墅。你將會(huì)為不同的例子效果定義一個(gè)或多個(gè)CAEmitterCell作為模版,同時(shí)CAEmitterLayer負(fù)責(zé)基于這些模版實(shí)例化一個(gè)粒子流澳叉。一個(gè)CAEmitterCell類似于一個(gè)CALayer:它有一個(gè)contents屬性可以定義為一個(gè)CGImage隙咸,另外還有一些可設(shè)置屬性控制著表現(xiàn)和行為。

CAEAGLLayer

AVPlayerLayer

  • AVPlayerLayer是用來在iOS上播放視頻的成洗。他是高級(jí)接口例如MPMoivePlayer的底層實(shí)現(xiàn)五督,提供了顯示視頻的底層控制。AVPlayerLayer的使用相當(dāng)簡單:你可以用+playerLayerWithPlayer:方法創(chuàng)建一個(gè)已經(jīng)綁定了視頻播放器的圖層瓶殃,或者你可以先創(chuàng)建一個(gè)圖層充包,然后用player屬性綁定一個(gè)AVPlayer實(shí)例。
    因?yàn)?code>AVPlayerLayer是CALayer的子類遥椿,它繼承了父類的所有特性基矮。我們并不會(huì)受限于要在一個(gè)矩形中播放視頻;還可以顯示3D冠场,圓角家浇,有色邊框,蒙板慈鸠,陰影等效果蓝谨。
    let url = NSBundle.mainBundle().URLForResource("cdc", withExtension: "mp4")

      let player = AVPlayer(URL: url!)
      let playerLayer = AVPlayerLayer(player: player)
      
      playerLayer.frame = self.containerView.bounds
      self.containerView.layer.addSublayer(playerLayer)
      
      var transform = CATransform3DIdentity
      transform.m34 = -1 / 500.0
      transform = CATransform3DRotate(transform, CGFloat(M_PI_4), 1, 0, 0)
      playerLayer.transform = transform
      
      playerLayer.cornerRadius = 20
      playerLayer.borderColor = UIColor.blackColor().CGColor
      playerLayer.borderWidth = 5
      
      player.play()
    
AVPlayerLayer
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市青团,隨后出現(xiàn)的幾起案子譬巫,更是在濱河造成了極大的恐慌,老刑警劉巖督笆,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芦昔,死亡現(xiàn)場離奇詭異,居然都是意外死亡娃肿,警方通過查閱死者的電腦和手機(jī)咕缎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門珠十,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凭豪,你說我怎么就攤上這事焙蹭。” “怎么了嫂伞?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵孔厉,是天一觀的道長搁骑。 經(jīng)常有香客問我巫糙,道長敬扛,這世上最難降的妖魔是什么尼酿? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮秉撇,結(jié)果婚禮上针肥,老公的妹妹穿的比我還像新娘书幕。我一直安慰自己匙监,他們只是感情好凡橱,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著亭姥,像睡著了一般梭纹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上致份,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音础拨,去河邊找鬼氮块。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诡宗,可吹牛的內(nèi)容都是我干的滔蝉。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼塔沃,長吁一口氣:“原來是場噩夢啊……” “哼蝠引!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛀柴,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤螃概,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鸽疾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吊洼,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年制肮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冒窍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片递沪。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖综液,靈堂內(nèi)的尸體忽然破棺而出款慨,到底是詐尸還是另有隱情,我是刑警寧澤谬莹,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布檩奠,位于F島的核電站,受9級(jí)特大地震影響届良,放射性物質(zhì)發(fā)生泄漏笆凌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一士葫、第九天 我趴在偏房一處隱蔽的房頂上張望乞而。 院中可真熱鬧,春花似錦慢显、人聲如沸爪模。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屋灌。三九已至,卻和暖如春应狱,著一層夾襖步出監(jiān)牢的瞬間共郭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國打工疾呻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留除嘹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓岸蜗,卻偏偏與公主長得像尉咕,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子璃岳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

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