iOS核心動畫-CABasicAnimation

1: 什么是CABasicAnimation

CABasicAnimation是核心動畫中的一個類,其父類是CAPropertyAnimation单刁,其子類是CASpringAnimation所刀,它的祖父是CAAnimation睹欲。它主要用于制作比較單一的動畫泣崩,例如昔头,平移、縮放考杉、旋轉、顏色漸變舰始、邊框的值的變化等崇棠,也就是將layer的某個屬性值從一個值到另一個值的變化。

2: 屬性說明

屬性 說明
duration 動畫的時長
beginTime 指定動畫開始的時間
repeatCount 重復的次數(shù)(PS:一直重復為 HUGE_VALF)
repeatDuration 設置動畫的時間
timingFunction 動畫的速度變化[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]
autoreverses 動畫結束時是否執(zhí)行逆動畫
fromValue 屬性的起始值
toValue 屬性的結束時的值
byValue 所改變屬性相同起始值的改變量

3: 實例化

/* Creates a new animation object with its `keyPath' property set to
 * 'path'. 
創(chuàng)建一個新的動畫丸卷,其“keyPath”為“路徑”枕稀。
*/
+ (instancetype)animationWithKeyPath:(nullable NSString *)path;

下面是對path比較全面的總結,每個keypath對應一種屬性值的變化,其中涉及到顏色變化的都必須使用CGColor萎坷,因為對應是對layer的屬性凹联。

#ifndef AnimationKeyPathName_h
#define AnimationKeyPathName_h
#import <Foundation/Foundation.h>

#pragma mark- CATransform3D Key Paths
/** 
 *  @brief  旋轉x,y,z分別是繞x,y,z軸旋轉 
 */
static NSString *kCARotation = @"transform.rotation";
static NSString *kCARotationX = @"transform.rotation.x";
static NSString *kCARotationY = @"transform.rotation.y";
static NSString *kCARotationZ = @"transform.rotation.z";

/** 
 *  @brief  縮放x,y,z分別是對x,y,z方向進行縮放
 */
static NSString *kCAScale = @"transform.scale";
static NSString *kCAScaleX = @"transform.scale.x";
static NSString *kCAScaleY = @"transform.scale.y";
static NSString *kCAScaleZ = @"transform.scale.z";

/** 
 *  @brief  平移x,y,z同上
 */
static NSString *kCATranslation = @"transform.translation";
static NSString *kCATranslationX = @"transform.translation.x";
static NSString *kCATranslationY = @"transform.translation.y";
static NSString *kCATranslationZ = @"transform.translation.z";

#pragma mark- 平面
/** 
 *  @brief  CGPoint中心點改變位置,針對平面 
 */
static NSString *kCAPosition = @"position";
static NSString *kCAPositionX = @"position.x";
static NSString *kCAPositionY = @"position.y";

/** 
 *  @brief  CGRect 
 */
static NSString *kCABoundsSize = @"bounds.size";
static NSString *kCABoundsSizeW = @"bounds.size.width";
static NSString *kCABoundsSizeH = @"bounds.size.height";
static NSString *kCABoundsOriginX = @"bounds.origin.x";
static NSString *kCABoundsOriginY = @"bounds.origin.y";

/** 
 *  @brief  透明度 
 */
static NSString *kCAOpacity = @"opacity";
/** 
 *  @brief  背景色 
 */
static NSString *kCABackgroundColor = @"backgroundColor";
/** 
 *  @brief  圓角 
 */
static NSString *kCACornerRadius = @"cornerRadius";
/** 
 *  @brief   邊框 
 */
static NSString *kCABorderWidth = @"borderWidth";
/** 
 *  @brief  陰影顏色
 */
static NSString *kCAShadowColor = @"shadowColor";
/** 
 *  @brief  偏移量CGSize
 */
static NSString *kCAShadowOffset = @"shadowOffset";
/** 
 *  @brief  陰影透明度
 */
static NSString *kCAShadowOpacity = @"shadowOpacity";
/** 
 *  @brief  陰影圓角 
 */
static NSString *kCAShadowRadius = @"shadowRadius";

#endif /* AnimationKeyPathName_h */

4:簡單用法

4.1 位移動畫

 //使用CABasicAnimation創(chuàng)建基礎動畫
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
    animation.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, SCREEN_HEIGHT/2-75)];
    animation.toValue = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH, SCREEN_HEIGHT/2-75)];
    animation.duration = 2.0f;
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    [_demoView.layer addAnimation:animation forKey:@"positionAnimation"];
ps:
    //如果fillMode=kCAFillModeForwards和removedOnComletion=NO哆档,那么在動畫執(zhí)行完畢后蔽挠,圖層會保持顯示動畫執(zhí)行后的狀態(tài)。但在實質上瓜浸,圖層的屬性值還是動畫執(zhí)行前的初始值澳淑,并沒有真正被改變。
    //animation.duration.fillMode = kCAFillModeForwards;
    //animation.duration.removedOnCompletion = NO;

4.2 透明度動畫

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
    animation.fromValue = [NSNumber numberWithFloat:1.0f];
    animation.toValue = [NSNumber numberWithFloat:0.2f];
    animation.duration = 1.0f;
    [_demoView.layer addAnimation:animation forKey:@"opacityAniamtion"];

4.3 縮放動畫

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];//同上
    animation.toValue = [NSNumber numberWithFloat:2.0f];
    animation.duration = 1.0f;
    [_demoView.layer addAnimation:animation forKey:@"scaleAnimation"];

4.4 旋轉動畫

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];//繞著z軸為矢量插佛,進行旋轉(@"transform.rotation.z"==@@"transform.rotation")
    animation.toValue = [NSNumber numberWithFloat:M_PI];
    animation.duration = 1.0f;
    [_demoView.layer addAnimation:animation forKey:@"rotateAnimation"];

4.5 背景色變化動畫

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
    animation.toValue =(id) [UIColor greenColor].CGColor;
    animation.duration = 1.0f;
    [_demoView.layer addAnimation:animation forKey:@"backgroundAnimation"];

4.6 組動畫

CABasicAnimation *positionAnima = [CABasicAnimation animationWithKeyPath:@"position.y"];
positionAnima.fromValue = @(self.imageView.center.y);
positionAnima.toValue = @(self.imageView.center.y-30);
positionAnima.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];

CABasicAnimation *transformAnima = [CABasicAnimation animationWithKeyPath:@"transform.rotation.y"];
transformAnima.fromValue = @(0);
transformAnima.toValue = @(M_PI);
transformAnima.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

CAAnimationGroup *animation = [CAAnimationGroup animation];
animaGroup.duration = 2.0f;
animaGroup.fillMode = kCAFillModeForwards;
animaGroup.removedOnCompletion = NO;
animaGroup.animations = @[positionAnima,transformAnima];

[_demoView.layer addAnimation:animaGroup forKey:@"Animation"];

5: 獲取動畫開始和結束時的事件

添加代理事件

animation.delegate = self;
ps:會有循環(huán)引用,暫未解決!

實現(xiàn)代理方法

//動畫開始時
- (void)animationDidStart:(CAAnimation *)anim
{
    if ([anim isEqual:[self.imageView.layer animationForKey:@"Animation"]]) {
        NSLog(@"動畫組執(zhí)行了");
    }
}
//動畫結束時
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
    //方法中的flag參數(shù)表明了動畫是自然結束還是被打斷,比如調用了removeAnimationForKey:方法或removeAnimationForKey方法杠巡,flag為NO,如果是正常結束雇寇,flag為YES氢拥。
    NSLog(@"結束了");
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锨侯,隨后出現(xiàn)的幾起案子兄一,更是在濱河造成了極大的恐慌,老刑警劉巖识腿,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件出革,死亡現(xiàn)場離奇詭異,居然都是意外死亡渡讼,警方通過查閱死者的電腦和手機骂束,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來成箫,“玉大人展箱,你說我怎么就攤上這事〉挪” “怎么了混驰?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長皂贩。 經(jīng)常有香客問我栖榨,道長,這世上最難降的妖魔是什么明刷? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任婴栽,我火速辦了婚禮,結果婚禮上辈末,老公的妹妹穿的比我還像新娘愚争。我一直安慰自己映皆,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布轰枝。 她就那樣靜靜地躺著捅彻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鞍陨。 梳的紋絲不亂的頭發(fā)上步淹,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音湾戳,去河邊找鬼贤旷。 笑死,一個胖子當著我的面吹牛砾脑,可吹牛的內容都是我干的幼驶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼韧衣,長吁一口氣:“原來是場噩夢啊……” “哼盅藻!你這毒婦竟也來了?” 一聲冷哼從身側響起畅铭,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤氏淑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后硕噩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體假残,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年炉擅,在試婚紗的時候發(fā)現(xiàn)自己被綠了辉懒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡谍失,死狀恐怖眶俩,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情快鱼,我是刑警寧澤颠印,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站抹竹,受9級特大地震影響线罕,放射性物質發(fā)生泄漏。R本人自食惡果不足惜柒莉,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一闻坚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兢孝,春花似錦窿凤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至窗轩,卻和暖如春夯秃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痢艺。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工仓洼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堤舒。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓色建,卻偏偏與公主長得像,于是被迫代替她去往敵國和親舌缤。 傳聞我的和親對象是個殘疾皇子箕戳,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容