[學(xué)習(xí)筆記]_核心動(dòng)畫

出處:小碼哥大神班5期


CALayer的基本操作


1.CALayer的簡介

CALayer又稱做層档叔,每個(gè)view內(nèi)部都有一個(gè)layer這樣的屬性藻烤。UIView因?yàn)镃ALayer層统刮,才具有顯示功能表牢。我們可以通過操作CALayer對(duì)象,對(duì)UIView進(jìn)行一些外觀屬性的調(diào)整沐悦。比如設(shè)置陰影成洗、圓角、邊框等所踊。

2.操作layer改變UIView的外觀

    //設(shè)置圓角
    view.layer.cornerRadius = 5;
    
    //設(shè)置陰影不透明度泌枪,默認(rèn)圖層是有陰影的,只不過是透明的
    view.layer.shadowOpacity = 1;
    //設(shè)置陰影圓角
    view.layer.shadowRadius = 10;
    //設(shè)置陰影顏色
    view.layer.shadowColor = [UIColor grayColor].CGColor;
    //設(shè)置陰影位置的偏移量
    view.layer.shadowOffset = CGSizeMake(10, 10);

    //設(shè)置邊框
    view.layer.borderWidth = 2;
    view.layer.borderColor = [UIColor blackColor].CGColor;

效果:

CALayer操作秕岛,改變view的外觀.png

3.操作layer改變UIImageViewView的外觀

    //設(shè)置圖片邊框
    imageV.layer.borderWidth = 2;
    imageV.layer.borderColor = [UIColor orangeColor].CGColor;
    //設(shè)置圖片圓角半徑
    imageV.layer.cornerRadius = 100;
    //裁剪超出區(qū)域部分的的圖片
    imageV.layer.masksToBounds = YES;
    /*
     注:UIImageView當(dāng)中的ImageView并不是直接添加在層上面的碌燕,這是添加在layer當(dāng)中的
     contents里,我們?cè)O(shè)置所有屬性只作用在層上面继薛,對(duì)contents里面的東西并不起作用修壕,所有以我們
     看不到圖片有圓角的效果,可以把maskToBounds這個(gè)屬性設(shè)為yes遏考,
     當(dāng)設(shè)為yes慈鸠,就會(huì)把超過根層以外的東西都給裁剪掉。
     */

效果:


CALayer操作imageV.png

4.layer的CATransform3D屬性

只有旋轉(zhuǎn)的時(shí)候才可以看出3d效果
可以通過kvc的方式進(jìn)行設(shè)置屬性灌具,
但是CATransform3DMakeRotation的值是一個(gè)結(jié)構(gòu)體青团,所以用kvc進(jìn)行設(shè)置時(shí)要把結(jié)構(gòu)體轉(zhuǎn)成對(duì)象

NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 0, 0)];
      [_imageView.layer setValue:value forKeyPath:@"transform.scale"];

什么時(shí)候用kvc

  • 當(dāng)需要做一些快速縮放,平移咖楣,二維的旋轉(zhuǎn)是用kvc.
    后面forKeyPath屬性值不是亂寫的督笆,蘋果文檔當(dāng)中給了相關(guān)的屬性。
//平移    
[UIView animateWithDuration:1 animations:^{
        self.imageV.layer.transform = CATransform3DMakeTranslation(-50, -100, 1);
    }];    

//縮放
    [UIView animateWithDuration:1 animations:^{
        [self.imageV.layer setValue:@(0.5) forKeyPath:@"transform.scale"];
    }];


//旋轉(zhuǎn)

    [UIView animateWithDuration:1 animations:^{
        self.imageV.layer.transform =CATransform3DMakeRotation(M_PI , 1, 0, 0);  
    }];

效果:

旋轉(zhuǎn)平移縮放.gif

自定義CALayer


1.如何自定義layer

自定義CALayer的方式和創(chuàng)建UIView的方式非常相似诱贿。

CALayer *layer = [CALayer layer];
     layer.frame = CGRectMake(50, 50, 100, 100);
     layer.backgroundColor = [UIColor redColor].CGColor;
     [self.view.layer addSublayer:layer];
//給layer設(shè)置圖片
layer.contents = (id)[UIImage imageNamed:@"阿貍頭像"].CGImage;

2.關(guān)于CALayer的疑惑

  • 為什么要使用CGImageRef娃肿、CGColorRef

為了保證可移植性咕缎,QuartzCore不能使用UIImage、UIColor只能使用CGImageRef料扰、CGColorRef

  • UIView和CALayer都能夠顯示圖形凭豪,該怎么選擇?

對(duì)比CALayer晒杈,UIView多了一個(gè)事件處理功能嫂伞。也就是說CALayer不能處理用戶的觸摸事件,而UIView可以桐智。所以如果顯示的東西需要跟用戶進(jìn)行交互的話末早,用UIView烟馅;如果不需要的話用CALayer说庭;因?yàn)镃ALayer的性能會(huì)高一些,因此它少了事件處理功能郑趁,更加輕量級(jí)刊驴。


3.position和anchorpoint

position和anchorpoint是CALayer的兩個(gè)屬性。
以前修改一個(gè)空間的位置都是通過frame的方式進(jìn)行修改」讶螅現(xiàn)在利用CALayer的position和anchorpoint也能夠修改控件的位置
position:它是用來設(shè)置當(dāng)前的layer在父控件當(dāng)中的位置的.所以它的坐標(biāo)原點(diǎn)是以父控件的左上角為坐標(biāo)原點(diǎn)捆憎; anchorpoint:它是決定CALayer身上哪一個(gè)會(huì)在position屬性所指的位置,anchorpoint是以當(dāng)前的layer左上角為原點(diǎn)梭纹;它的取值范圍是0~1躲惰,默認(rèn)值是(0.5,0.5)的位置变抽,anchorpoint又稱錨點(diǎn)础拨,就是把錨點(diǎn)定到position所指的位置
兩者結(jié)合使用:想要修改某個(gè)控件的位置,可以先設(shè)置它的position點(diǎn)绍载,設(shè)置完畢后诡宗,在設(shè)置layer身上的anchorpoint錨點(diǎn)。


4.隱式動(dòng)畫

  • 什么是隱式動(dòng)畫

了解什么是隱式動(dòng)畫之前击儡,要先了解什么是根曾和非根層塔沃。
根層:UIView內(nèi)部自動(dòng)關(guān)聯(lián)著的那個(gè)layer,我們稱著為根層阳谍。
非根層:自己手動(dòng)創(chuàng)建的層蛀柴,稱著為非根層。
隱式動(dòng)畫就是當(dāng)非根層的部分屬性進(jìn)行修改時(shí)矫夯,自動(dòng)產(chǎn)生的一些動(dòng)畫效果鸽疾。

  • 如何取消隱式動(dòng)畫?

首先要了解動(dòng)畫底層是怎么做的茧痒,動(dòng)畫的底層是包裝成一個(gè)事物來進(jìn)行的肮韧。
什么是事務(wù)?
很多操作綁定在一起,當(dāng)這些操作執(zhí)行完畢后弄企,才去執(zhí)行下一個(gè)操作超燃。

//開啟事務(wù)
[CATransaction begin];
//設(shè)置事務(wù)沒有動(dòng)畫
[CATransaction setDisableActions:yes];
//設(shè)置動(dòng)畫執(zhí)行時(shí)長
[CATransaction setAnimationDuration:2];
//提交事務(wù)
[CATransaction commit];

6.CABasicAnimation基礎(chǔ)核心動(dòng)畫

核心動(dòng)畫是作用在層上面的。
動(dòng)畫的本質(zhì)是改變圖層的某一個(gè)屬性拘领。
CABasicAnimation *anim = [CABasicAnimation animation];
圖層有哪些屬性意乓,這里才能寫哪些屬性。
anim.keyPath = @"transform.scale";
anim.toValue = @0.5;
//告訴動(dòng)畫完成時(shí)不要移除
anim.removedOnCompletion = NO;
//保存動(dòng)畫最前面的效果
anim.fillMode = kCAFillModeForwards;
//把動(dòng)畫添加到層上面
[view.layer addAnimation:anim forkey:nil];

7.UIView與核心動(dòng)畫的對(duì)比

  • UIView和核心動(dòng)畫的區(qū)別

核心動(dòng)畫只能添加到CALayer
核心動(dòng)畫一切都是假象约素,并不會(huì)改變真實(shí)的值届良。

  • 什么時(shí)候使用UIView動(dòng)畫

如果需要與用戶交互就使用UIView動(dòng)畫。
不需要就使用核心動(dòng)畫

  • 什么場景使用核心動(dòng)畫最多

在轉(zhuǎn)場動(dòng)畫中圣猎,核心動(dòng)畫的類型比較多士葫。
根據(jù)一個(gè)路徑做動(dòng)畫,只能用核心動(dòng)畫(幀動(dòng)畫)
動(dòng)畫組:同時(shí)做多個(gè)動(dòng)畫


練習(xí)項(xiàng)目

時(shí)鐘效果

時(shí)鐘效果.gif

代碼:

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *clockView;

//秒針的層
@property (weak,nonatomic) CALayer *secondLayer;

//分針的層
@property (weak,nonatomic) CALayer *minuteLayer;

//時(shí)針的層
@property (weak,nonatomic) CALayer *hourLayer;

@end

@implementation ViewController
//每一秒轉(zhuǎn)的度數(shù)
#define secondA 6

//每一分轉(zhuǎn)的度數(shù)
#define minuteA 6

//每一小時(shí)要轉(zhuǎn)的度數(shù)
#define hourA 30

//角度轉(zhuǎn)弧度
#define angleRad(angle) ((angle)/180 * M_PI)

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //每一秒轉(zhuǎn)6度送悔,獲取當(dāng)前多少秒*6得到要轉(zhuǎn)的角度
    
    
    
    //添加秒針
   self.secondLayer = [self addShiZhenWithHeight:80 width:1 color:[UIColor redColor]];
    
    //添加分針
    self.minuteLayer = [self addShiZhenWithHeight:70 width:3 color:[UIColor blackColor]];
    
    //添加時(shí)針
    self.hourLayer = [self addShiZhenWithHeight:50 width:4 color:[UIColor blackColor]];
    
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
    
    [self timeChange];
}

//添加時(shí)針
- (CALayer *)addShiZhenWithHeight:(CGFloat)height width : (CGFloat)width color:(UIColor *)color
{
    //實(shí)例化一個(gè)層
    CALayer *layer = [[CALayer alloc] init];
    
    //設(shè)置層的大小
    layer.frame = CGRectMake(self.clockView.frame.size.width * 0.5, self.clockView.frame.size.height * 0.5, width, height);
    
    //設(shè)置層的背景顏色
    layer.backgroundColor = color.CGColor;
    //設(shè)置層的位置
    layer.position = CGPointMake(self.clockView.frame.size.width * 0.5, self.clockView.frame.size.height * 0.5);
    layer.anchorPoint = CGPointMake(0.5, 1);
//    layer.transform = CATransform3DMakeRotation(M_PI, 0, 0, 1);
    //添加到父層
    [self.clockView.layer addSublayer:layer];
    return layer;
}

- (void)timeChange
{
    //獲取系統(tǒng)日歷
    NSCalendar * calendar = [NSCalendar currentCalendar];
    //components:日歷單元:年慢显,月,日欠啤,時(shí)荚藻,分,秒
    //fromDate:當(dāng)前的日期
    //- (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)date;
    
    NSDateComponents *cmp = [calendar components:NSCalendarUnitSecond|NSCalendarUnitMinute|NSCalendarUnitHour fromDate:[NSDate date]];
    
    //獲取當(dāng)前是多少秒
    NSInteger curSecond = cmp.second;
    //秒針要轉(zhuǎn)的度數(shù)
    CGFloat curSecondA = curSecond*secondA;
    self.secondLayer.transform = CATransform3DMakeRotation(angleRad(curSecondA), 0, 0, 1);
    
    //獲取當(dāng)前是多少分
    NSInteger curMinute = cmp.minute;
    //分針要轉(zhuǎn)的度數(shù)
    CGFloat curMinuteA = curMinute * minuteA;
    self.minuteLayer.transform = CATransform3DMakeRotation(angleRad(curMinuteA), 0, 0, 1);
    
    //獲取當(dāng)前是幾時(shí)
    NSInteger curHour = cmp.hour;
    //時(shí)針要轉(zhuǎn)的度數(shù)+每改變一分時(shí)針要轉(zhuǎn)0.5度
    CGFloat curHourA = curHour * hourA + curMinute * 0.5;
    self.hourLayer.transform = CATransform3DMakeRotation(angleRad(curHourA), 0, 0, 1);
     
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末洁段,一起剝皮案震驚了整個(gè)濱河市应狱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祠丝,老刑警劉巖疾呻,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纽疟,居然都是意外死亡罐韩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門污朽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來散吵,“玉大人,你說我怎么就攤上這事蟆肆》溃” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵炎功,是天一觀的道長枚冗。 經(jīng)常有香客問我,道長蛇损,這世上最難降的妖魔是什么赁温? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任坛怪,我火速辦了婚禮,結(jié)果婚禮上股囊,老公的妹妹穿的比我還像新娘袜匿。我一直安慰自己,他們只是感情好稚疹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布居灯。 她就那樣靜靜地躺著,像睡著了一般内狗。 火紅的嫁衣襯著肌膚如雪怪嫌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天柳沙,我揣著相機(jī)與錄音岩灭,去河邊找鬼。 笑死偎行,一個(gè)胖子當(dāng)著我的面吹牛川背,可吹牛的內(nèi)容都是我干的贰拿。 我是一名探鬼主播蛤袒,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼膨更!你這毒婦竟也來了妙真?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤荚守,失蹤者是張志新(化名)和其女友劉穎珍德,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矗漾,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锈候,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敞贡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泵琳。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖誊役,靈堂內(nèi)的尸體忽然破棺而出获列,到底是詐尸還是另有隱情,我是刑警寧澤蛔垢,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布击孩,位于F島的核電站,受9級(jí)特大地震影響鹏漆,放射性物質(zhì)發(fā)生泄漏巩梢。R本人自食惡果不足惜创泄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望括蝠。 院中可真熱鬧验烧,春花似錦、人聲如沸又跛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慨蓝。三九已至感混,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間礼烈,已是汗流浹背弧满。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留此熬,地道東北人庭呜。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像犀忱,于是被迫代替她去往敵國和親募谎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果阴汇,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜数冬,今天將帶大家一窺ios動(dòng)畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,490評(píng)論 6 30
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果搀庶,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜拐纱,今天將帶大家一窺iOS動(dòng)畫全貌。在這里你可以看...
    F麥子閱讀 5,111評(píng)論 5 13
  • 在iOS實(shí)際開發(fā)中常用的動(dòng)畫無非是以下四種:UIView動(dòng)畫哥倔,核心動(dòng)畫秸架,幀動(dòng)畫,自定義轉(zhuǎn)場動(dòng)畫咆蒿。 1.UIView...
    請(qǐng)叫我周小帥閱讀 3,097評(píng)論 1 23
  • "小畫板程序"完成"小畫板"程序东抹。 下載地址:http://git.oschina.net/changyou/my...
    _淺墨_閱讀 689評(píng)論 0 5
  • CALayer - 在iOS中,你能看得見摸得著的東西基本上都是UIView蜡秽,比如一個(gè)按鈕府阀、一個(gè)文本標(biāo)簽、一個(gè)文本...
    Hevin_Chen閱讀 1,140評(píng)論 0 10