iOS CALayer動(dòng)畫

隱式動(dòng)畫

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

每一個(gè)UIView內(nèi)部都默認(rèn)有著一個(gè)CALayer谎倔,稱之為Root Layer(根層)亮曹,而所有的非Root Layer茅糜,即手動(dòng)創(chuàng)建的CALayer對(duì)象都默認(rèn)存在著隱式動(dòng)畫七芭,當(dāng)對(duì)這些手動(dòng)創(chuàng)建的CALayer的部分屬性進(jìn)行修改時(shí),就會(huì)默認(rèn)產(chǎn)生一些動(dòng)畫效果蔑赘,而這些屬性則稱之為可動(dòng)畫屬性--Animatable Properties狸驳。例如:bounds、backgroundColor米死、position等都是動(dòng)畫屬性锌历。

當(dāng)然,默認(rèn)的隱式動(dòng)畫也可以通過(guò)CATransaction來(lái)關(guān)閉:

    
[CATransaction begin];
[CATransaction setDisableActions:YES];
self.myview.layer.position = CGPointMake(10, 10);
[CATransaction commit];

這里CALayer有兩個(gè)非常重要的屬性:


@property CGPoint position;
@property CGPoint anchorPoint;
  • position屬性:用來(lái)設(shè)置CALayer在分層中的位置峦筒,以父層的左上角為原點(diǎn)究西。
  • anchorPoint屬性:錨點(diǎn),是描述CALayer自身的物喷,決定著CALayer上哪個(gè)點(diǎn)定位在position屬性所在的父層的位置卤材,以自身的左上角為原點(diǎn)遮斥,默認(rèn)為CALayer的中點(diǎn)(0.5,0.5)扇丛,注意錨點(diǎn)的x术吗、y取值范圍為0~1。

隱式動(dòng)畫舉例:

  • 效果:
  • 實(shí)現(xiàn)代碼:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [CATransaction begin];
    //設(shè)置事務(wù)有沒(méi)有動(dòng)畫
    [CATransaction setDisableActions:NO];
    //設(shè)置事務(wù)動(dòng)畫的執(zhí)行時(shí)長(zhǎng).
    [CATransaction setAnimationDuration:1];
    
    self.layer.bounds = CGRectMake(0, 0, arc4random_uniform(200), arc4random_uniform(200));
    self.layer.position = CGPointMake(arc4random_uniform(300), arc4random_uniform(400));
    self.layer.backgroundColor = [self randomColor].CGColor;
    self.layer.cornerRadius = arc4random_uniform(50);
    [CATransaction commit];
}

- (UIColor *)randomColor{
    
    CGFloat r = arc4random_uniform(256) /255.0;
    CGFloat g = arc4random_uniform(256) /255.0;
    CGFloat b = arc4random_uniform(256) /255.0;
    
    return [UIColor colorWithRed:r green:g blue:b alpha:1];
}

核心動(dòng)畫

這里主要介紹iOS的幾種核心動(dòng)畫帆精。

  • 基本動(dòng)畫
  • 關(guān)鍵幀動(dòng)畫
  • 動(dòng)畫組
  • 轉(zhuǎn)場(chǎng)動(dòng)畫

核心動(dòng)畫(Core Animation)的動(dòng)畫執(zhí)行過(guò)程都是在后臺(tái)線程操作的较屿,不會(huì)阻塞主線程。

動(dòng)畫的繼承關(guān)系如下圖:

核心動(dòng)畫的使用步驟:

  1. 首先要有一個(gè)CALayer
  2. 初始化一個(gè)CAAnimation對(duì)象卓练,設(shè)置相關(guān)動(dòng)畫屬性
  3. 調(diào)用CALayer的addAnimation:forKey:方法隘蝎,將CAAnimation對(duì)象添加到CALayer中,開(kāi)始動(dòng)畫
  4. 調(diào)用CALayer的removeAnimationForKey:方法可停止CALayer中的動(dòng)畫

注意:CAAnimation是所有動(dòng)畫對(duì)象的父類襟企,負(fù)責(zé)控制動(dòng)畫的持續(xù)時(shí)間和速度嘱么,是個(gè)抽象類,不能直接使用顽悼,需使用它的子類曼振。CAAnimation的CAPropertyAnimation子類,也是抽象類蔚龙,不可直接使用冰评,需使用它的兩個(gè)子類CABasicAnimation和CAKeyframeAnimation。

使用效果

CABasicAnimation

  • 效果
  • 實(shí)現(xiàn)代碼:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    CABasicAnimation *anim = [CABasicAnimation animation];
    anim.keyPath = @"position";
    anim.toValue = [NSValue valueWithCGPoint:CGPointMake(200, 400)];
    anim.removedOnCompletion = NO;
    //保存動(dòng)畫最前面效果
    anim.fillMode = kCAFillModeForwards;
    
    [self.redView.layer addAnimation:anim forKey:nil];
    
}

CAKeyframeAnimation

  • 效果:
  • 實(shí)現(xiàn)代碼:

    CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
    
    anim.keyPath = @"position";
    
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    [path moveToPoint:CGPointMake(140, 100)];
    
    [path addLineToPoint:CGPointMake(160, 100)];
    
    anim.path = path.CGPath;
    
    anim.repeatCount = MAXFLOAT;
    
    anim.autoreverses = YES;
    
    anim.duration = 1;
    
    [self.iconV.layer addAnimation:anim forKey:nil];

CATransition

  • 效果:
  • 實(shí)現(xiàn)代碼:

typedef enum : NSUInteger {
    Fade = 1,                   //淡入淡出
    Push,                       //推擠
    Reveal,                     //揭開(kāi)
    MoveIn,                     //覆蓋
    Cube,                       //立方體
    SuckEffect,                 //吮吸
    OglFlip,                    //翻轉(zhuǎn)
    RippleEffect,               //波紋
    PageCurl,                   //翻頁(yè)
    PageUnCurl,                 //反翻頁(yè)
    CameraIrisHollowOpen,       //開(kāi)鏡頭
    CameraIrisHollowClose,      //關(guān)鏡頭
    CurlDown,                   //下翻頁(yè)
    CurlUp,                     //上翻頁(yè)
    FlipFromLeft,               //左翻轉(zhuǎn)
    FlipFromRight,              //右翻轉(zhuǎn)
     
} AnimationType;

- (void)CATransition{
    
    //轉(zhuǎn)場(chǎng)代碼必須得要和轉(zhuǎn)場(chǎng)動(dòng)畫在同一個(gè)方法當(dāng)中.
    //創(chuàng)建動(dòng)畫
    CATransition *anim = [CATransition animation];
    
    //設(shè)置轉(zhuǎn)場(chǎng)類型
    anim.type = @"pageCurl";
    
    //設(shè)置轉(zhuǎn)場(chǎng)的方向
    anim.subtype = kCATransitionFromTop;
    //設(shè)置動(dòng)畫的開(kāi)始點(diǎn).
    anim.startProgress = 0.2;
    //設(shè)置動(dòng)畫的結(jié)束點(diǎn).
    anim.endProgress = 0.8;
    
    anim.duration = 1;
    [self.imageV.layer addAnimation:anim forKey:nil];
      
}

CAAnimationGroup

  • 效果:
  • 實(shí)現(xiàn)代碼:

-(void)touchesBegan:(nonnull NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event{
    
    CAAnimationGroup *group = [CAAnimationGroup animation];
    
    //縮放
    CABasicAnimation *scaleAnim = [CABasicAnimation animation];
    //設(shè)置屬性
    scaleAnim.keyPath = @"transform.scale";
    scaleAnim.toValue = @0.5;

    
    //平移
    CABasicAnimation *Anim = [CABasicAnimation animation];
    //設(shè)置屬性
    Anim.keyPath = @"position.y";
    Anim.toValue = @(400);
    group.animations = @[scaleAnim,Anim];
    
    
    group.removedOnCompletion = NO;
    group.fillMode  = kCAFillModeForwards;
    //添加動(dòng)畫
    [self.redView.layer addAnimation:group forKey:nil];
    
}

這里要區(qū)分好UIView動(dòng)畫和核心動(dòng)畫的使用場(chǎng)景木羹,核心動(dòng)畫只作用在layer集索,核心動(dòng)畫修改的值都是假像,它的真實(shí)位置沒(méi)有發(fā)生變化汇跨。需要交互的用UIView,不需要進(jìn)行交互時(shí)兩個(gè)都可以使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妆距,一起剝皮案震驚了整個(gè)濱河市穷遂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌娱据,老刑警劉巖蚪黑,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異中剩,居然都是意外死亡忌穿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門结啼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)掠剑,“玉大人,你說(shuō)我怎么就攤上這事郊愧∑右耄” “怎么了井佑?”我有些...
    開(kāi)封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)眠寿。 經(jīng)常有香客問(wèn)我躬翁,道長(zhǎng),這世上最難降的妖魔是什么盯拱? 我笑而不...
    開(kāi)封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任盒发,我火速辦了婚禮,結(jié)果婚禮上狡逢,老公的妹妹穿的比我還像新娘宁舰。我一直安慰自己,他們只是感情好甚侣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布明吩。 她就那樣靜靜地躺著,像睡著了一般殷费。 火紅的嫁衣襯著肌膚如雪印荔。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天详羡,我揣著相機(jī)與錄音仍律,去河邊找鬼。 笑死实柠,一個(gè)胖子當(dāng)著我的面吹牛水泉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窒盐,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼草则,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蟹漓?” 一聲冷哼從身側(cè)響起炕横,我...
    開(kāi)封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎葡粒,沒(méi)想到半個(gè)月后份殿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嗽交,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年卿嘲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夫壁。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拾枣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盒让,到底是詐尸還是另有隱情放前,我是刑警寧澤忿磅,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站凭语,受9級(jí)特大地震影響葱她,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜似扔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一吨些、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧炒辉,春花似錦豪墅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至缝裤,卻和暖如春屏轰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背憋飞。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工霎苗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榛做。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓唁盏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親检眯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子厘擂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

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

  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果,實(shí)現(xiàn)這些動(dòng)畫的過(guò)程并不復(fù)雜锰瘸,今天將帶大家一窺ios動(dòng)畫全貌驴党。在這里你可以看...
    每天刷兩次牙閱讀 8,495評(píng)論 6 30
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果,實(shí)現(xiàn)這些動(dòng)畫的過(guò)程并不復(fù)雜获茬,今天將帶大家一窺iOS動(dòng)畫全貌。在這里你可以看...
    F麥子閱讀 5,113評(píng)論 5 13
  • 在iOS實(shí)際開(kāi)發(fā)中常用的動(dòng)畫無(wú)非是以下四種:UIView動(dòng)畫倔既,核心動(dòng)畫恕曲,幀動(dòng)畫,自定義轉(zhuǎn)場(chǎng)動(dòng)畫渤涌。 1.UIView...
    請(qǐng)叫我周小帥閱讀 3,098評(píng)論 1 23
  • 前言 本文只要描述了iOS中的Core Animation(核心動(dòng)畫:隱式動(dòng)畫佩谣、顯示動(dòng)畫)、貝塞爾曲線实蓬、UIVie...
    GitHubPorter閱讀 3,628評(píng)論 7 11
  • 最近在做iOS界面轉(zhuǎn)場(chǎng)的動(dòng)畫茸俭,寫完轉(zhuǎn)場(chǎng)入口后基本元素還是回歸到我們常用的基本動(dòng)畫代碼吊履,有關(guān)動(dòng)畫的帖子網(wǎng)絡(luò)上一搜一大...
    大雄記閱讀 5,478評(píng)論 0 18