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
也有startPoint
和endPoint
屬性,他們決定了漸變的方向睹限。這兩個(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)
CAReplicatorLayer
-
CAReplicatorLayer
的目的是為了高效生成許多相似的圖層蚕甥。它會(huì)繪制一個(gè)或多個(gè)圖層的子圖層,并在每個(gè)復(fù)制體上應(yīng)用不同的變換栋荸。instanceCount
屬性指定了圖層需要重復(fù)多少次菇怀。instanceTransform
指定了一個(gè)CATransform3D
3D變換凭舶。(基于上一次變換)
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
并應(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()