麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

iOS核心動(dòng)畫高級(jí)技巧之圖層變換和專用圖層(二)

2019-11-14 18:42:31
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

iOS核心動(dòng)畫高級(jí)技巧之CALayer(一)

iOS核心動(dòng)畫高級(jí)技巧之圖層變換和專用圖層(二)
iOS核心動(dòng)畫高級(jí)技巧之核心動(dòng)畫(三)
iOS核心動(dòng)畫高級(jí)技巧之性能(四)
iOS核心動(dòng)畫高級(jí)技巧之動(dòng)畫總結(jié)(五)
 
 
 

  仿射變換

  iOS仿射變換是CGAffineTransform,仿射變換的特點(diǎn)是變換后的圖形對(duì)邊依然是平行的,它包括 CGAffineTransformMakeRotation(CGFloat angle) / CGAffineTransformMakeScale(CGFloat sx, CGFloat sy) / CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty),直接看代碼

 1 blueView = UIView() 2 blueView.frame = CGRectMake(50, 100, 100, 100) 3 blueView.backgroundColor = UIColor.blueColor() 4 self.view.addSubview(blueView) 5  6 yellowView = UIView() 7 yellowView.frame = CGRectMake(50 + 200 / 1.414, 100, 100, 100)//注意yellowView的水平位置,和blueView作對(duì)比 8 yellowView.backgroundColor = UIColor.yellowColor() 9 self.view.addSubview(yellowView)10 11 blueView.transform = CGAffineTransformIdentity  //初始化transform12 blueView.transform = CGAffineTransformMakeScale(0.5, 0.5 )  //縮小0.5倍13 blueView.transform = CGAffineTransformRotate(blueView.transform, CGFloat(M_PI_4))   //旋轉(zhuǎn)pi/414 blueView.transform = CGAffineTransformTranslate(blueView.transform, 400, 0) //平移400

   這里只需要注意transform的疊加互相之間是有影響的,blueView縮小了0.5倍和旋轉(zhuǎn)了45°,所以本來(lái)應(yīng)該在水平位置上平移400的最后在45°方向平移了200,所以在水平方向平移的距離大約是200/1.414,和yellowView形成對(duì)比.

  3D變換

  3D變換和仿射變換不同,雖然它也是乘以一個(gè)二維向量,但是它是4x4的二維向量,而仿射變換是2x3的向量,而且3D變換可以通過(guò)直接改變向量的單個(gè)的值來(lái)設(shè)置向量,比如transform.m11 / transform.m44 對(duì)應(yīng)的就是向量上對(duì)應(yīng)位置的值,由于是3維空間的變換,所以有些不同,仿射的旋轉(zhuǎn)等價(jià)于3D變換的Z軸旋轉(zhuǎn),它的x,y的組合向量可以使它向傾斜的角度(如45°)旋轉(zhuǎn),而平移忽略掉Z軸上的就是一樣的,縮放也是忽略掉Z軸上的就行.而由于是3D變換縮放會(huì)使平移縮放對(duì)應(yīng)比例,而x/y/z軸的旋轉(zhuǎn)都不會(huì)使它的方向改變,這是由于矩陣的值表示的范圍廣,不會(huì)互相影響.

1 blueLayer.transform = CATransform3DIdentity  //初始化transform2 blueLayer.transform = CATransform3DMakeScale(0.5, 0.5, 0)  //縮小0.5倍3 blueLayer.transform = CATransform3DRotate(blueLayer.transform,CGFloat( M_PI_4 ), 0.0,  1.0, 0) //旋轉(zhuǎn)pi/44 blueLayer.transform = CATransform3DTranslate(blueLayer.transform,400, 0, 0)     //平移400

   由于3D變換分成多個(gè)方向的,所以沿X或Y方向的旋轉(zhuǎn)就像縮放了一樣,可以通過(guò)設(shè)置向量對(duì)應(yīng)的值來(lái)修復(fù)這個(gè)效果,讓它看上去更真實(shí)一點(diǎn),結(jié)果它會(huì)有一個(gè)傾斜角度,有一個(gè)投影效果,這樣當(dāng)你做平移的時(shí)候會(huì)改變顯示的大小,所以一般不要一起用了,而要讓這個(gè)效果有效,需要在初始化transform時(shí)就設(shè)置m34的值(這個(gè)值最好在-1/500.0 到 -1/5000.0之間),放到后面沒(méi)有效果,在后面也不能用scale放大縮小,不然會(huì)覆蓋這個(gè)值.所以這個(gè)效果基本是單獨(dú)拿出來(lái)顯示效果的.

1 var transform = CATransform3DIdentity //初始化transform2 transform.m34 = -1 / 500.0 //設(shè)置m34的值3 // transform = CATransform3DScale( transform, 0.5, 0.5, 0) //縮小0.5倍,這里不能用4 transform = CATransform3DRotate(transform,CGFloat( M_PI_4 ), 0.0,  1.0, 0) //旋轉(zhuǎn)pi/45 transform = CATransform3DTranslate(transform,400, 0, 0)     //平移4006 blueLayer.transform = transform

  當(dāng)你在投射的方向平移足夠大的距離,它最后的成像就是一個(gè)點(diǎn)了,這個(gè)點(diǎn)一般是圖層的anchorPoint點(diǎn),如果是一個(gè)圖層的好幾個(gè)子圖層都需要這種效果,那么直接設(shè)置它的父圖層transform的m34為-1/ 500.0 然后設(shè)置它的sublayerTransform屬性,當(dāng)設(shè)置它的子layer的rotote屬性那個(gè)子layer就會(huì)有對(duì)應(yīng)的投射效果. 如:outLayer.sublayerTransform = outLayer.transform

   如果旋轉(zhuǎn)180°從背面去看layer,layer會(huì)顯示出和layer對(duì)稱的的圖片,因?yàn)閘ayer是雙面繪制的,但如果有文字就會(huì)看起來(lái)很混亂并且浪費(fèi)GPU資源,所以最好能夠禁用它,而layer提供了這個(gè)屬性:doubleSided,值為true雙面為false則為單面.

  內(nèi)外層layer的選擇可以相互疊加和抵消,這個(gè)在Z軸上的旋轉(zhuǎn)是可以的,但是在X/Y上并不是這樣的,是由于它們并不處于同一個(gè)3D空間內(nèi),同時(shí)需要注意的是,如果使用m34這個(gè)特殊的向量值做投影,每次先給一個(gè)transform初始化為CATransform3DIdentity,然后直接設(shè)置m34的值然后做旋轉(zhuǎn)等,再賦值給layer的transform

  專用圖層

 CAShapeLayer

  CAShapeLayer 是專門用來(lái)繪畫形狀的layer,它對(duì)比畫圖有很大的優(yōu)勢(shì),它使用了硬件加速,所以繪圖速度很快,它不需要寄宿圖片所以不會(huì)使用太多內(nèi)存,它也不會(huì)和普通圖層一樣被裁剪掉,而且它不會(huì)被像素化,最后就不會(huì)模糊.你可以設(shè)置lineWith(線寬,用點(diǎn)表示單位)/ lineCap(線條結(jié)尾的樣子)和lineJoin(線條之間的結(jié)合點(diǎn)的樣子),但是只有一次設(shè)置的機(jī)會(huì).CAShapeLayer還可以單獨(dú)設(shè)置圓角,下面是代碼和對(duì)應(yīng)的兩個(gè)運(yùn)行效果,前面一個(gè)線條的人另一個(gè)是3個(gè)圓角的直角矩形.

DEMO1:
1
let shapePath = UIBezierPath() 2 shapePath.moveToPoint(CGPointMake(175, 100)) 3 shapePath.addArcWithCenter(CGPointMake(150, 100), radius: 25, startAngle: 0, endAngle:CGFloat( 2 * M_PI ), clockwise: true) 4 shapePath.moveToPoint(CGPointMake(150, 125)) 5 shapePath.addLineToPoint(CGPointMake(150, 175)) 6 shapePath.addLineToPoint(CGPointMake(125, 225)) 7 shapePath.moveToPoint(CGPointMake(150, 175)) 8 shapePath.addLineToPoint(CGPointMake(175, 225)) 9 shapePath.moveToPoint(CGPointMake(100, 150))10 shapePath.addLineToPoint(CGPointMake(200, 150))11 12 let shapeLayer = CAShapeLayer()13 shapeLayer.strokeColor = UIColor.redColor().CGColor14 shapeLayer.fillColor = UIColor.clearColor().CGColor15 shapeLayer.lineWidth = 516 shapeLayer.lineJoin = kCALineJoinRound17 shapeLayer.lineCap = kCALineCaPRound18 shapeLayer.path = shapePath.CGPath19 self.view.layer.addSublayer(shapeLayer)
DEMO2:
1
var rect = CGRectMake(50, 50, 100, 100);2 var radii = CGSizeMake(20, 20);3 var corners = UIRectCorner.TopRight | UIRectCorner.BottomRight | UIRectCorner.BottomLeft4 var shapePath = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, cornerRadii: radii) 

 

 CATextLayer

   可以在layer中直接用Core Graphics直接寫入文字,這就是UILabel的實(shí)現(xiàn)方式,如果直接在圖層上記錄文本將是一件很麻煩的事,iOS提供了CATextLayer來(lái)實(shí)現(xiàn)layer上顯示文本,它本身使用了Core text ,渲染速度很快.

 1 var textLayer = CATextLayer() 2 textLayer.frame = CGRectMake(100, 100, 200, 300) 3 self.view.layer.addSublayer(textLayer) 4  5 //設(shè)置它的屬性 6 textLayer.foregroundColor = UIColor.redColor().CGColor 7 textLayer.alignmentMode = kCAAlignmentJustified 8 textLayer.wrapped = true 9 10 //它的font是CGFont類型,需要大小字體分開(kāi)設(shè)置11 var font = UIFont.systemFontOfSize(24)12 textLayer.font = CGFontCreateWithFontName(font.fontName)13 textLayer.fontSize = font.pointSize14 15 var textStr = "hello kitty hi nohhhh no wo  shi lllll aaaaawo  jiojhello kitty hi nohhhh no wo  shi lllll aaaaawo  jioj"16 textLayer.string = textStr17 18 //它c(diǎn)ontentScale默認(rèn)是1,為了讓它以retina的質(zhì)量來(lái)顯示,設(shè)置為219 textLayer.contentsScale = UIScreen.mainScreen().scale

    這里也可以用NSAttributedString富文本,但是由于swift類型轉(zhuǎn)換的問(wèn)題挺麻煩的,不寫demo了.

CATransformLayer

  這個(gè)圖層類解決了圖層間的層級(jí)關(guān)系,如下面這個(gè)demo所示:如果是CALayer旋轉(zhuǎn)就沒(méi)有層級(jí),如果是CATransformLayer,它就有了層級(jí)

 1 //outLayer = CALayer() 2 outLayer = CATransformLayer() //如果是上面這個(gè)普通的CALayer它如果旋轉(zhuǎn)就不會(huì)有雙層的效果 3  4  5 outLayer.frame = CGRectMake(50, 50, 300, 300) 6 outLayer.backgroundColor = UIColor.grayColor().CGColor 7 self.view.layer.addSublayer(outLayer) 8  9 var transform = CATransform3DIdentity //初始化transform10 transform.m34 = -1 / 500.0 //設(shè)置m34的值11 transform = CATransform3DRotate(transform,CGFloat( M_PI_2 ), 0.0,  1.0, 0) //旋轉(zhuǎn)pi/412 outLayer.transform = transform13 14 //outLayer.sublayerTransform = transform15 16 17 blueLayer = CALayer()18 blueLayer.frame = CGRectMake(50, 50, 200, 200)19 blueLayer.backgroundColor = UIColor.blueColor().CGColor20 outLayer.addSublayer(blueLayer)21 22 23 var blueLayerTransform = CATransform3DIdentity;24 blueLayerTransform  = CATransform3DTranslate(blueLayerTransform, 0, 0, 50);25 blueLayer.transform = blueLayerTransform;26 27 redLayer = CALayer()28 redLayer.frame = CGRectMake(50, 50, 200, 200)29 redLayer.backgroundColor = UIColor.redColor().CGColor30 outLayer.addSublayer(redLayer)31 32 var fromValue = CATransform3DIdentity33 fromValue.m34 = -1 / 500.034 fromValue = CATransform3DRotate(fromValue, 0, 0, 1, 0)35 36 var toValue = CATransform3DIdentity37 toValue.m34 = -1 / 500.038 toValue = CATransform3DRotate(toValue, CGFloat( M_PI ), 0, 1, 0)39 40 var basicAnimation = CABasicAnimation(keyPath: "transform")41 basicAnimation.duration = 1.042 basicAnimation.fromValue = NSValue(CATransform3D:fromValue)43 basicAnimation.toValue = NSValue(CATransform3D:toValue)44 outLayer.transform = toValue45 outLayer.addAnimation(basicAnimation, forKey: "transform3D")
View Code

 CAGradientLayer

   CAGradientLayer它主要是可以設(shè)置漸變色,通過(guò)colors屬性和,startPoint和endPoint設(shè)置過(guò)渡顏色和位置,這時(shí)候設(shè)置背景色是沒(méi)有用的

1 gradientLayer = CAGradientLayer()2 gradientLayer.frame = CGRectMake(50, 50, 300, 300)3 gradientLayer.backgroundColor = UIColor.grayColor().CGColor4 self.view.layer.addSublayer(gradientLayer)5 6 gradientLayer.colors = [UIColor.redColor().CGColor,UIColor.blueColor().CGColor, UIColor.greenColor().CGColor]7 gradientLayer.startPoint = CGPointMake(0, 0)8 gradientLayer.endPoint = CGPointMake(1, 1)

    它還有一個(gè)locations屬性,可以設(shè)置每個(gè)漸變色的間距,這個(gè)數(shù)組的長(zhǎng)度需要和colors數(shù)組的長(zhǎng)度相同,location的值是按endPoint的值來(lái)說(shuō)的,不是是多少及時(shí)多少

CAReplicatorLayer

   CAReplicatorLayer可以使用在需要?jiǎng)?chuàng)建多個(gè)同樣的layer只是軌跡顏色有規(guī)則的變化的時(shí)候,它會(huì)把它的子圖層有規(guī)律的重復(fù)展示出來(lái),而可以設(shè)置它重復(fù)的次數(shù)/每次漸變的顏色遞增遞減值/每次transform變換的路徑.

 1 repeatLayer = CAReplicatorLayer() 2 repeatLayer.frame = CGRectMake(50, 50, 300, 300) 3 repeatLayer.backgroundColor = UIColor.grayColor().CGColor 4 self.view.layer.addSublayer(repeatLayer) 5  6 var transform = CATransform3DIdentity 7 transform = CATransform3DTranslate(transform, 0, 100, 0); 8 transform = CATransform3DRotate(transform, CGFloat( M_PI / 5.0 ), 0, 0, 1); 9 transform = CATransform3DTranslate(transform, 0, -100, 0);10 repeatLayer.instanceTransform = transform;11 12 repeatLayer.instanceCount = 1013 14 repeatLayer.instanceBlueOffset = -0.115 repeatLayer.instanceRedOffset = -0.116 17 var layer  = CALayer()18 layer.frame = CGRect(x: 125, y: 125, width: 50, height: 50)19 layer.backgroundColor = UIColor.whiteColor().CGColor20 repeatLayer.addSublayer(layer) 

   它最后的結(jié)果就是一圈顏色遞變的正方形,它可以做動(dòng)畫中一個(gè)飛機(jī)的路徑等效果.它的一個(gè)重要實(shí)際用處就是做倒影,因?yàn)槿绻鰣D層的復(fù)制的話,倒影不可能跟著原layer做實(shí)時(shí)更新,而CAReplicatorLayer就可以做到.

 1 reflectionLayer = CAReplicatorLayer() 2 var img = UIImage(named: "3333.jpg") 3 reflectionLayer.frame = CGRectMake((self.view.bounds.size.width - img!.size.width) / 2 , 100, img!.size.width, img!.size.height * 1.5) 4 reflectionLayer.backgroundColor = UIColor.grayColor().CGColor 5 self.view.layer.addSublayer(reflectionLayer) 6  7 var transform = CATransform3DIdentity 8 transform = CATransform3DScale(transform, 1, -0.5, 1); 9 transform = CATransform3DTranslate(transform, 0, -img!.size.height * 3 / 4 + 2, 0.0);10 reflectionLayer.instanceTransform = transform;11 12 reflectionLayer.instanceCount = 213 14 var imageLayer  = CALayer()15 imageLayer.frame = CGRect(x: 0, y: 0, width: img!.size.width, height: img!.size.height)16 imageLayer.backgroundColor = UIColor.whiteColor().CGColor17 imageLayer.contents = img!.CGImage18 //layer.anchorPoint = CGPointMake(0, 0)19 reflectionLayer.addSublayer(imageLayer)20 21 //設(shè)置透明度,在外面用個(gè)層來(lái)設(shè)置22 var gradientLayer = CAGradientLayer()23 gradientLayer.colors = [UIColor.whiteColor().colorWithAlphaComponent(0.2).CGColor, UIColor.whiteColor().CGColor]24 gradientLayer.frame = CGRectMake(reflectionLayer.frame.origin.x , reflectionLayer.frame.origin.y + reflectionLayer.frame.size.height / 3.0 * 2, reflectionLayer.frame.size.width, reflectionLayer.frame.size.height / 2)25 self.view.layer.addSublayer(gradientLayer)26 27 28 //設(shè)置文字29 var textLayer = CATextLayer()30 textLayer.frame = CGRectMake(80, 50, 200, 300)31 self.view.layer.addSublayer(textLayer)32 33 //設(shè)置它的屬性34 textLayer.foregroundColor = UIColor.redColor().CGColor35 textLayer.alignmentMode = kCAAlignmentJustified36 textLayer.wrapped = true37 38 //它的font是CGFont類型,需要大小字體分開(kāi)設(shè)置39 var font = UIFont.systemFontOfSize(24)40 textLayer.font = CGFontCreateWithFontName(font.fontName)41 textLayer.fontSize = font.pointSize42 43 var textStr = "What a fuck!"44 textLayer.string = textStr45 46 //它c(diǎn)ontentScale默認(rèn)是1,為了讓它以retina的質(zhì)量來(lái)顯示,設(shè)置為247 textLayer.contentsScale = UIScreen.mainScreen().scale48 49 imageLayer.addSublayer(textLayer)50 51 52 var basicAnimation = CABasicAnimation(keyPath: "position.y")53 basicAnimation.duration = 2.054 basicAnimation.fromValue =  Float( textLayer.position.y  )55 var toValue:Float = Float( textLayer.position.y  + 100.0)56 basicAnimation.toValue = NSNumber(float: toValue)57 basicAnimation.removedOnCompletion = true58 basicAnimation.fillMode = kCAFillModeForwards59 textLayer.addAnimation(basicAnimation, forKey: nil)60 61 // textLayer.frame.origin.y = CGFloat( toValue)62 textLayer.position = CGPointMake(textLayer.position.x, textLayer.position.y  + 100.0)
View Code

 CAScrollLayer 

  CAScrollLayer和UIScrollView類似,它和CALayer相比多了個(gè)scrollPoint的方法,如果要用這個(gè)方法可以使用CAScrollLayer

1 NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: NSSelectorFromString("setPosition"), userInfo: nil, repeats: false)2 3 func setPosition () {4     self.scrollLayer.scrollToPoint(CGPointMake(0, 100))5 }

 CATiledLayer

  CATiledLayer的可以做到圖片/PDF等的分割顯示,如果一個(gè)一張圖片分辨率超過(guò)2048*2048(因平臺(tái)不同),超過(guò)了OpenGL最大紋理尺寸,所以會(huì)有性能問(wèn)題,一個(gè)PDF一般也比較大,所以容易出現(xiàn)性能問(wèn)題(后面會(huì)單獨(dú)寫一個(gè)demo)

 CAEmitterLayer

  CAEmitterLayer能模仿粒子反射,如果火焰等,能控制粒子顏色/放射的速率,透明度,方向,個(gè)數(shù)等.

 1 emitterLayer = CAEmitterLayer() 2 emitterLayer.frame = CGRectMake(100 , 100, 200, 200) 3 emitterLayer.backgroundColor = UIColor.grayColor().CGColor 4 self.view.layer.addSublayer(emitterLayer) 5  6 emitterLayer.renderMode = kCAEmitterLayerAdditive 7 emitterLayer.emitterPosition = CGPointMake(emitterLayer.frame.size.width / 2, emitterLayer.frame.size.height / 2) 8  9 var cell = CAEmitterCell()10 cell.contents = UIImage(named: "lizi.png")?.CGImage11 cell.birthRate = 10 //粒子出現(xiàn)的速率12 cell.lifetime = 4.0 //聲明周期,秒13 cell.emissionRange = 2 //發(fā)射的方向14 15 cell.color = UIColor(red: 1, green: 1, blue: 0.5, alpha: 1).CGColor //粒子的顏色16 cell.alphaspeed = -0.4 //透明度改變速率17 cell.velocity = 50//粒子運(yùn)動(dòng)速度18 cell.velocityRange = 100//粒子速度范圍,約束速度19 20 emitterLayer.emitterCells = [cell]

 CAEAGLLayer

   它是一個(gè)提供用OpenGL ES來(lái)繪圖的layer,它可以預(yù)先假設(shè)要繪制的類型,快速繪制,它可以配合GLKit中的CLKView使用,具體demo專門寫.

AVFoundation

   它是foundation框架里的,但是和layer的使用是一致的,demo如下

 1 var urlStr = NSBundle.mainBundle().pathForResource("1.mp4", ofType: nil) 2 var url = NSURL(fileURLWithPath: urlStr!) 3 var player = AVPlayer(URL: url) 4  5 var playLayer = AVPlayerLayer(player: player) 6 playLayer.frame = CGRectMake(0, 0,400, 300) 7 playLayer.backgroundColor = UIColor.grayColor().CGColor 8 self.view.layer.addSublayer(playLayer) 9 10 player.play()

 

 


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲综人网 | 精品国产一区二区三区久久久蜜月 | 国产精品视频免费在线观看 | 鲁丝片一区二区三区免费入口 | 国产91一区 | 性爱视频在线免费 | 欧美日韩在线播放 | 久久影院午夜 | 亚洲午夜精品视频 | 久久金品 | 国产精品自在线拍 | 黄色小视频在线免费看 | 精品国产91久久久久久久妲己 | 爱高潮www亚洲精品 欧美黄色一级片视频 | 日韩精品一二三区 | 黄色片免费在线 | 久草亚洲视频 | 美女视频大全网站免费 | 青青草成人av | 国产一区二区在线免费播放 | 久久逼网| av在线免费看网址 | www久久艹 | 国产精品免费麻豆入口 | 国产精品视频yy9299一区 | 成人在线第一页 | 亚洲性综合网 | 国产成人综合在线观看 | 日本成人午夜视频 | 羞羞草视频 | 国产一区二区三区四区在线 | 国产亚洲精品久久久久久久软件 | 黄色毛片a级| 99精品热视频 | 欧美日韩大片在线观看 | 今井夏帆av一区二区 | 久色亚洲| 看免费的毛片 | 国产精品视频一区二区噜噜 | 亚洲第一成人久久网站 | 中国免费一级毛片 |