最近在學(xué)習(xí)Facebook的pop框架域庇,所以就想整理一下屋谭,方便以后學(xué)習(xí)回憶耐亏。
首先說(shuō)一下,學(xué)習(xí)這一方面需要了解的一些內(nèi)容:CADisplayLink郭怪、CAShapeLayer支示、CALayer、CATransform3D鄙才、CGAffineTransform颂鸿、UIBezierPath、UIGestureRecognizer攒庵。
CADisplayLink
CADisplayLink是OC中使用的定時(shí)器的一種(其他2個(gè)分別是NStimer嘴纺、GCD),它允許應(yīng)用程序?qū)⑵淅L圖與顯示器的刷新率同步叙甸。
CADisplayLink的高達(dá)60FPS颖医,iOS設(shè)備的屏幕刷新頻率是固定的,CADisplayLink在正常情況下會(huì)在每次刷新結(jié)束都被調(diào)用裆蒸,精確度相當(dāng)高熔萧,基本和屏幕刷新是同步的。使用場(chǎng)合相對(duì)專(zhuān)一僚祷,適合做UI的不停重繪佛致,比如自定義動(dòng)畫(huà)引擎或者視頻播放的渲染。
NSTimer的精確度就顯得低了點(diǎn)辙谜,比如NSTimer的觸發(fā)時(shí)間到的時(shí)候俺榆,runloop如果在阻塞狀態(tài),觸發(fā)時(shí)間就會(huì)推遲到下一個(gè)runloop周期装哆。并且 NSTimer新增了tolerance屬性罐脊,讓用戶(hù)可以設(shè)置可以容忍的觸發(fā)的時(shí)間的延遲范圍。
<b>POP動(dòng)畫(huà)的流暢性就歸功于CADisplayLink高達(dá)60的FPS</b>
CALayer
在創(chuàng)建UIView對(duì)象時(shí)蜕琴,UIView內(nèi)部會(huì)自動(dòng)創(chuàng)建一個(gè)層(即CALayer對(duì)象)萍桌,通過(guò)UIView的layer屬性可以訪問(wèn)這個(gè)層。當(dāng)UIView需要顯示到屏幕上時(shí)凌简,會(huì)調(diào)用drawRect:方法進(jìn)行繪圖上炎,并且會(huì)將所有內(nèi)容繪制在自己的層上,繪圖完畢后雏搂,系統(tǒng)會(huì)將層拷貝到屏幕上藕施,于是就完成了UIView的顯示。
換句話說(shuō)凸郑,UIView本身不具備顯示的功能裳食,是它內(nèi)部的CALayer層才有顯示功能。
注意2個(gè)屬性:
anchorPoint 錨點(diǎn):在當(dāng)前l(fā)ayer中取一點(diǎn)來(lái)計(jì)算改點(diǎn)在父視圖中的position芙沥。 默認(rèn)(0.5胞谈,0.5)
position: 錨點(diǎn)在父視圖中的位置尘盼,可以來(lái)修改當(dāng)前view的frame。
CAShapeLayer
屬于CALayer的子類(lèi)烦绳,通常用它來(lái)畫(huà)一個(gè)layer層。
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2) radius:self.bounds.size.width / 2 startAngle:0 endAngle:M_PI * 2 clockwise:YES];
CAShapeLayer *bgcircular = [[CAShapeLayer alloc] init];
bgcircular.path = path.CGPath;
bgcircular.borderWidth = 5;
bgcircular.strokeStart = 0;
bgcircular.strokeEnd = 1;
bgcircular.strokeColor = [UIColor grayColor].CGColor;
bgcircular.fillColor = [UIColor clearColor].CGColor;
[self.layer addSublayer:bgcircular];
UIBezierPath
用來(lái)輔助畫(huà)CAShapeLayer
CATransform3D
CATransform3D應(yīng)用于layer層配紫,相對(duì)于它邊界的錨點(diǎn)進(jìn)行縮放径密、位移、旋轉(zhuǎn)的變化躺孝。CATransform3D是居于4階矩陣而變化的享扔,所以需要了解關(guān)于矩陣的基本算法。
位移
/* Returns a transform that translates by '(tx, ty, tz)':
* t' = [1 0 0 0; 0 1 0 0; 0 0 1 0; tx ty tz 1]. */
CA_EXTERN CATransform3D CATransform3DMakeTranslation (CGFloat tx,
CGFloat ty, CGFloat tz)
CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);
縮放
/* Returns a transform that scales by `(sx, sy, sz)':
* t' = [sx 0 0 0; 0 sy 0 0; 0 0 sz 0; 0 0 0 1]. */
CA_EXTERN CATransform3D CATransform3DMakeScale (CGFloat sx, CGFloat sy,
CGFloat sz)
CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);
旋轉(zhuǎn)
/* Returns a transform that rotates by 'angle' radians about the vector
* '(x, y, z)'. If the vector has length zero the identity transform is
* returned. */
CA_EXTERN CATransform3D CATransform3DMakeRotation (CGFloat angle, CGFloat x,
CGFloat y, CGFloat z)
CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);